From 3b10a3f9b81229e3fec028fe173b3e7de69f65b6 Mon Sep 17 00:00:00 2001 From: Bradford Wetmore Date: Mon, 21 May 2012 15:42:15 -0700 Subject: [PATCH 001/241] 7167656: Multiple Seeders are being created Reviewed-by: smarks, mduigou, ahgross --- .../sun/security/provider/SecureRandom.java | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/jdk/src/share/classes/sun/security/provider/SecureRandom.java b/jdk/src/share/classes/sun/security/provider/SecureRandom.java index e79e9d7f49a..fa88334e1c3 100644 --- a/jdk/src/share/classes/sun/security/provider/SecureRandom.java +++ b/jdk/src/share/classes/sun/security/provider/SecureRandom.java @@ -56,12 +56,6 @@ implements java.io.Serializable { private static final long serialVersionUID = 3581829991155417889L; - /** - * This static object will be seeded by SeedGenerator, and used - * to seed future instances of SecureRandom - */ - private static SecureRandom seeder; - private static final int DIGEST_SIZE = 20; private transient MessageDigest digest; private byte[] state; @@ -172,6 +166,28 @@ implements java.io.Serializable { state[0]++; } + /** + * This static object will be seeded by SeedGenerator, and used + * to seed future instances of SHA1PRNG SecureRandoms. + * + * Bloch, Effective Java Second Edition: Item 71 + */ + private static class SeederHolder { + + private static final SecureRandom seeder; + + static { + /* + * Call to SeedGenerator.generateSeed() to add additional + * seed material (likely from the Native implementation). + */ + seeder = new SecureRandom(SeedGenerator.getSystemEntropy()); + byte [] b = new byte[DIGEST_SIZE]; + SeedGenerator.generateSeed(b); + seeder.engineSetSeed(b); + } + } + /** * Generates a user-specified number of random bytes. * @@ -183,13 +199,8 @@ implements java.io.Serializable { byte[] output = remainder; if (state == null) { - if (seeder == null) { - seeder = new SecureRandom(SeedGenerator.getSystemEntropy()); - seeder.engineSetSeed(engineGenerateSeed(DIGEST_SIZE)); - } - byte[] seed = new byte[DIGEST_SIZE]; - seeder.engineNextBytes(seed); + SeederHolder.seeder.engineNextBytes(seed); state = digest.digest(seed); } From 0a84e90eea0f3b6b7593ea5d554ada224b8c1725 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Wed, 23 May 2012 12:11:25 -0700 Subject: [PATCH 002/241] 7158801: Improve VM CompileOnly option Fixed buffer overflow during parsing flags -XX:CompileCommand=, -XX:CompileOnly= and command lines in .hotspot_compiler file. Reviewed-by: never --- hotspot/src/share/vm/compiler/compilerOracle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hotspot/src/share/vm/compiler/compilerOracle.cpp b/hotspot/src/share/vm/compiler/compilerOracle.cpp index 07bc969b872..ce78ccbb501 100644 --- a/hotspot/src/share/vm/compiler/compilerOracle.cpp +++ b/hotspot/src/share/vm/compiler/compilerOracle.cpp @@ -572,7 +572,7 @@ void CompilerOracle::parse_from_file() { char token[1024]; int pos = 0; int c = getc(stream); - while(c != EOF) { + while(c != EOF && pos < (sizeof(token)-1)) { if (c == '\n') { token[pos++] = '\0'; parse_from_line(token); @@ -593,7 +593,7 @@ void CompilerOracle::parse_from_string(const char* str, void (*parse_line)(char* int pos = 0; const char* sp = str; int c = *sp++; - while (c != '\0') { + while (c != '\0' && pos < (sizeof(token)-1)) { if (c == '\n') { token[pos++] = '\0'; parse_line(token); From 52f39f95df16df5d3f5c9c6df42cacb2778f3a45 Mon Sep 17 00:00:00 2001 From: Sean Mullan Date: Fri, 8 Jun 2012 11:02:47 -0400 Subject: [PATCH 003/241] 7163198: Tightened package accessibility 7169887: Tightened package accessibility Reviewed-by: vinnie, hawtin --- jdk/src/share/lib/security/java.security | 4 ++-- jdk/src/share/lib/security/java.security-macosx | 4 ++-- jdk/src/share/lib/security/java.security-solaris | 4 ++-- jdk/src/share/lib/security/java.security-windows | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jdk/src/share/lib/security/java.security b/jdk/src/share/lib/security/java.security index e8ca7bd7eea..3bb8597654c 100644 --- a/jdk/src/share/lib/security/java.security +++ b/jdk/src/share/lib/security/java.security @@ -145,7 +145,7 @@ keystore.type=jks # passed to checkPackageAccess unless the # corresponding RuntimePermission ("accessClassInPackage."+package) has # been granted. -package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils. +package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils.,com.sun.org.glassfish.external.,com.sun.org.glassfish.gmbal. # # List of comma-separated packages that start with or equal this string @@ -157,7 +157,7 @@ package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun. # by default, none of the class loaders supplied with the JDK call # checkPackageDefinition. # -package.definition=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils. +package.definition=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils.,com.sun.org.glassfish.external.,com.sun.org.glassfish.gmbal. # # Determines whether this properties file can be appended to diff --git a/jdk/src/share/lib/security/java.security-macosx b/jdk/src/share/lib/security/java.security-macosx index 1c04236e5d6..689172f40d6 100644 --- a/jdk/src/share/lib/security/java.security-macosx +++ b/jdk/src/share/lib/security/java.security-macosx @@ -146,7 +146,7 @@ keystore.type=jks # passed to checkPackageAccess unless the # corresponding RuntimePermission ("accessClassInPackage."+package) has # been granted. -package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,apple.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils. +package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,apple.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils.,com.sun.org.glassfish.external.,com.sun.org.glassfish.gmbal. # # List of comma-separated packages that start with or equal this string @@ -158,7 +158,7 @@ package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun. # by default, none of the class loaders supplied with the JDK call # checkPackageDefinition. # -package.definition=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,apple.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils. +package.definition=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,apple.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils.,com.sun.org.glassfish.external.,com.sun.org.glassfish.gmbal. # # Determines whether this properties file can be appended to diff --git a/jdk/src/share/lib/security/java.security-solaris b/jdk/src/share/lib/security/java.security-solaris index 87a6f1ea5b4..1c5062c4c8b 100644 --- a/jdk/src/share/lib/security/java.security-solaris +++ b/jdk/src/share/lib/security/java.security-solaris @@ -147,7 +147,7 @@ keystore.type=jks # passed to checkPackageAccess unless the # corresponding RuntimePermission ("accessClassInPackage."+package) has # been granted. -package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils. +package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils.,com.sun.org.glassfish.external.,com.sun.org.glassfish.gmbal. # # List of comma-separated packages that start with or equal this string @@ -159,7 +159,7 @@ package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun. # by default, none of the class loaders supplied with the JDK call # checkPackageDefinition. # -package.definition=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils. +package.definition=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils.,com.sun.org.glassfish.external.,com.sun.org.glassfish.gmbal. # # Determines whether this properties file can be appended to diff --git a/jdk/src/share/lib/security/java.security-windows b/jdk/src/share/lib/security/java.security-windows index e7c36d8c470..c98c0c95865 100644 --- a/jdk/src/share/lib/security/java.security-windows +++ b/jdk/src/share/lib/security/java.security-windows @@ -146,7 +146,7 @@ keystore.type=jks # passed to checkPackageAccess unless the # corresponding RuntimePermission ("accessClassInPackage."+package) has # been granted. -package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils. +package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils.,com.sun.org.glassfish.external.,com.sun.org.glassfish.gmbal. # # List of comma-separated packages that start with or equal this string @@ -158,7 +158,7 @@ package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun. # by default, none of the class loaders supplied with the JDK call # checkPackageDefinition. # -package.definition=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils. +package.definition=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils.,com.sun.org.glassfish.external.,com.sun.org.glassfish.gmbal. # # Determines whether this properties file can be appended to From c39971d4f1ae6df04f0679219e623c1783149c4b Mon Sep 17 00:00:00 2001 From: Keith McGuigan Date: Fri, 8 Jun 2012 12:49:12 -0400 Subject: [PATCH 004/241] 7158804: Improve config file parsing Check buffer length when reading Reviewed-by: dholmes, dcubed --- .../src/share/vm/compiler/compilerOracle.cpp | 4 +-- hotspot/src/share/vm/runtime/arguments.cpp | 2 +- hotspot/test/runtime/7158804/Test7158804.sh | 30 +++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 hotspot/test/runtime/7158804/Test7158804.sh diff --git a/hotspot/src/share/vm/compiler/compilerOracle.cpp b/hotspot/src/share/vm/compiler/compilerOracle.cpp index ce78ccbb501..8fe558a9492 100644 --- a/hotspot/src/share/vm/compiler/compilerOracle.cpp +++ b/hotspot/src/share/vm/compiler/compilerOracle.cpp @@ -572,7 +572,7 @@ void CompilerOracle::parse_from_file() { char token[1024]; int pos = 0; int c = getc(stream); - while(c != EOF && pos < (sizeof(token)-1)) { + while(c != EOF && pos < (int)(sizeof(token)-1)) { if (c == '\n') { token[pos++] = '\0'; parse_from_line(token); @@ -593,7 +593,7 @@ void CompilerOracle::parse_from_string(const char* str, void (*parse_line)(char* int pos = 0; const char* sp = str; int c = *sp++; - while (c != '\0' && pos < (sizeof(token)-1)) { + while (c != '\0' && pos < (int)(sizeof(token)-1)) { if (c == '\n') { token[pos++] = '\0'; parse_line(token); diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index d3d7b7eabe1..7eceb7f984f 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -860,7 +860,7 @@ bool Arguments::process_settings_file(const char* file_name, bool should_exist, bool result = true; int c = getc(stream); - while(c != EOF) { + while(c != EOF && pos < (int)(sizeof(token)-1)) { if (in_white_space) { if (in_comment) { if (c == '\n') in_comment = false; diff --git a/hotspot/test/runtime/7158804/Test7158804.sh b/hotspot/test/runtime/7158804/Test7158804.sh new file mode 100644 index 00000000000..bce5197dfbe --- /dev/null +++ b/hotspot/test/runtime/7158804/Test7158804.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# + +## +## @test Test7158804.sh +## @bug 7158804 +## @summary Improve config file parsing +## @run shell Test7158804.sh +## + +if [ "${TESTJAVA}" = "" ] +then + echo "TESTJAVA not set. Test cannot execute. Failed." + exit 1 +fi +echo "TESTJAVA=${TESTJAVA}" + +rm -f .hotspotrc +echo -XX:+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >.hotspotrc +${TESTJAVA}/bin/java ${TESTVMOPTS} -XX:+IgnoreUnrecognizedVMOptions -XX:Flags=.hotspotrc -version +if [ $? -ne 0 ] +then + echo "Test Failed" + exit 1 +fi +rm -f .hotspotrc +exit 0 From a15896d20e9470d22e8cb97c1e51d94d7b9d760c Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Fri, 15 Jun 2012 09:51:09 +0800 Subject: [PATCH 005/241] 6631398: FilePermission improved path checking Reviewed-by: mullan, skoivu, jdn --- jdk/src/share/classes/java/io/FilePermission.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/share/classes/java/io/FilePermission.java b/jdk/src/share/classes/java/io/FilePermission.java index a5781f3fb00..2555a77644d 100644 --- a/jdk/src/share/classes/java/io/FilePermission.java +++ b/jdk/src/share/classes/java/io/FilePermission.java @@ -418,7 +418,7 @@ public final class FilePermission extends Permission implements Serializable { */ public int hashCode() { - return this.cpath.hashCode(); + return 0; } /** From d87e57ac8aaa1902baeadb3a73aa757a3505fda1 Mon Sep 17 00:00:00 2001 From: Sean Mullan Date: Mon, 18 Jun 2012 10:00:55 -0400 Subject: [PATCH 006/241] 7172522: Improve DomainCombiner checking Reviewed-by: vinnie, ahgross --- jdk/src/share/classes/java/security/AccessController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jdk/src/share/classes/java/security/AccessController.java b/jdk/src/share/classes/java/security/AccessController.java index 97383f54a46..8a8eadea62d 100644 --- a/jdk/src/share/classes/java/security/AccessController.java +++ b/jdk/src/share/classes/java/security/AccessController.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -293,7 +293,7 @@ public final class AccessController { DomainCombiner dc = null; AccessControlContext acc = getStackAccessControlContext(); if (acc == null || (dc = acc.getAssignedCombiner()) == null) { - return AccessController.doPrivileged(action); + return AccessController.doPrivileged(action, acc); } return AccessController.doPrivileged(action, preserveCombiner(dc)); } @@ -389,7 +389,7 @@ public final class AccessController { DomainCombiner dc = null; AccessControlContext acc = getStackAccessControlContext(); if (acc == null || (dc = acc.getAssignedCombiner()) == null) { - return AccessController.doPrivileged(action); + return AccessController.doPrivileged(action, acc); } return AccessController.doPrivileged(action, preserveCombiner(dc)); } From 63cf10e50057789d99c83d231c14cb3005c663ad Mon Sep 17 00:00:00 2001 From: Stuart Marks Date: Thu, 21 Jun 2012 00:20:49 -0700 Subject: [PATCH 007/241] 7093490: adjust package access in rmiregistry Reviewed-by: ahgross, coffeys, dmocek --- jdk/src/share/classes/sun/rmi/registry/RegistryImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jdk/src/share/classes/sun/rmi/registry/RegistryImpl.java b/jdk/src/share/classes/sun/rmi/registry/RegistryImpl.java index 34579c204de..e086f79c1bf 100644 --- a/jdk/src/share/classes/sun/rmi/registry/RegistryImpl.java +++ b/jdk/src/share/classes/sun/rmi/registry/RegistryImpl.java @@ -405,7 +405,8 @@ public class RegistryImpl extends java.rmi.server.RemoteServer */ perms.add(new SocketPermission("*", "connect,accept")); - perms.add(new RuntimePermission("accessClassInPackage.sun.*")); + perms.add(new RuntimePermission("accessClassInPackage.sun.jvmstat.*")); + perms.add(new RuntimePermission("accessClassInPackage.sun.jvm.hotspot.*")); perms.add(new FilePermission("<>", "read")); From 9a307c8287e7cc0594d41bf877ef6263a0ec1b4c Mon Sep 17 00:00:00 2001 From: Dmitry Samersoff Date: Fri, 22 Jun 2012 16:22:22 +0400 Subject: [PATCH 008/241] 7158796: Tighten properties checking in EnvHelp Move getProperty call out of computeBooleanFromString Reviewed-by: skoivu, sla --- .../remote/internal/ServerNotifForwarder.java | 6 +- .../com/sun/jmx/remote/util/EnvHelp.java | 76 +++++-------------- .../management/remote/rmi/RMIConnector.java | 6 +- .../remote/rmi/RMIConnectorServer.java | 5 +- 4 files changed, 26 insertions(+), 67 deletions(-) diff --git a/jdk/src/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java b/jdk/src/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java index ba071411608..58ccfb45280 100644 --- a/jdk/src/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java +++ b/jdk/src/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java @@ -68,9 +68,9 @@ public class ServerNotifForwarder { this.notifBuffer = notifBuffer; this.connectionId = connectionId; connectionTimeout = EnvHelp.getServerConnectionTimeout(env); - checkNotificationEmission = EnvHelp.computeBooleanFromString( - env, - "jmx.remote.x.check.notification.emission",false); + + String stringBoolean = (String) env.get("jmx.remote.x.check.notification.emission"); + checkNotificationEmission = EnvHelp.computeBooleanFromString( stringBoolean ); notificationAccessController = EnvHelp.getNotificationAccessController(env); } diff --git a/jdk/src/share/classes/com/sun/jmx/remote/util/EnvHelp.java b/jdk/src/share/classes/com/sun/jmx/remote/util/EnvHelp.java index e61d9d09d60..b8bf9d37a0f 100644 --- a/jdk/src/share/classes/com/sun/jmx/remote/util/EnvHelp.java +++ b/jdk/src/share/classes/com/sun/jmx/remote/util/EnvHelp.java @@ -665,97 +665,57 @@ public class EnvHelp { * Computes a boolean value from a string value retrieved from a * property in the given map. * - * @param env the environment map. - * @param prop the name of the property in the environment map whose - * returned string value must be converted into a boolean value. - * @param systemProperty if true, consult a system property of the - * same name if there is no entry in the environment map. + * @param stringBoolean the string value that must be converted + * into a boolean value. * * @return *
    - *
  • {@code false} if {@code env.get(prop)} is {@code null}
  • + *
  • {@code false} if {@code stringBoolean} is {@code null}
  • *
  • {@code false} if - * {@code ((String)env.get(prop)).equalsIgnoreCase("false")} + * {@code stringBoolean.equalsIgnoreCase("false")} * is {@code true}
  • *
  • {@code true} if - * {@code ((String)env.get(prop)).equalsIgnoreCase("true")} + * {@code stringBoolean.equalsIgnoreCase("true")} * is {@code true}
  • *
* - * @throws IllegalArgumentException if {@code env} is {@code null} or - * {@code env.get(prop)} is not {@code null} and + * @throws IllegalArgumentException if * {@code ((String)env.get(prop)).equalsIgnoreCase("false")} and * {@code ((String)env.get(prop)).equalsIgnoreCase("true")} are * {@code false}. - * @throws ClassCastException if {@code env.get(prop)} cannot be cast - * to {@code String}. */ - public static boolean computeBooleanFromString( - Map env, String prop, boolean systemProperty) { - - if (env == null) - throw new IllegalArgumentException("env map cannot be null"); - + public static boolean computeBooleanFromString(String stringBoolean) { // returns a default value of 'false' if no property is found... - return computeBooleanFromString(env,prop,systemProperty,false); + return computeBooleanFromString(stringBoolean,false); } /** * Computes a boolean value from a string value retrieved from a * property in the given map. * - * @param env the environment map. - * @param prop the name of the property in the environment map whose - * returned string value must be converted into a boolean value. - * @param systemProperty if true, consult a system property of the - * same name if there is no entry in the environment map. + * @param stringBoolean the string value that must be converted + * into a boolean value. * @param defaultValue a default value to return in case no property * was defined. * * @return *
    - *
  • {@code defaultValue} if {@code env.get(prop)} is {@code null} - * and {@code systemProperty} is {@code false}
  • - *
  • {@code defaultValue} if {@code env.get(prop)} is {@code null} - * and {@code systemProperty} is {@code true} and - * {@code System.getProperty(prop)} is {@code null}
  • - *
  • {@code false} if {@code env.get(prop)} is {@code null} - * and {@code systemProperty} is {@code true} and - * {@code System.getProperty(prop).equalsIgnoreCase("false")} - * is {@code true}
  • - *
  • {@code true} if {@code env.get(prop)} is {@code null} - * and {@code systemProperty} is {@code true} and - * {@code System.getProperty(prop).equalsIgnoreCase("true")} - * is {@code true}
  • + *
  • {@code defaultValue} if {@code stringBoolean} + * is {@code null}
  • *
  • {@code false} if - * {@code ((String)env.get(prop)).equalsIgnoreCase("false")} + * {@code stringBoolean.equalsIgnoreCase("false")} * is {@code true}
  • *
  • {@code true} if - * {@code ((String)env.get(prop)).equalsIgnoreCase("true")} + * {@code stringBoolean.equalsIgnoreCase("true")} * is {@code true}
  • *
* - * @throws IllegalArgumentException if {@code env} is {@code null} or - * {@code env.get(prop)} is not {@code null} and + * @throws IllegalArgumentException if * {@code ((String)env.get(prop)).equalsIgnoreCase("false")} and * {@code ((String)env.get(prop)).equalsIgnoreCase("true")} are * {@code false}. - * @throws ClassCastException if {@code env.get(prop)} cannot be cast - * to {@code String}. */ - public static boolean computeBooleanFromString( - Map env, String prop, - boolean systemProperty, boolean defaultValue) { - - if (env == null) - throw new IllegalArgumentException("env map cannot be null"); - - String stringBoolean = (String) env.get(prop); - if (stringBoolean == null && systemProperty) { - stringBoolean = - AccessController.doPrivileged(new GetPropertyAction(prop)); - } - + public static boolean computeBooleanFromString( String stringBoolean, boolean defaultValue) { if (stringBoolean == null) return defaultValue; else if (stringBoolean.equalsIgnoreCase("true")) @@ -763,8 +723,8 @@ public class EnvHelp { else if (stringBoolean.equalsIgnoreCase("false")) return false; else - throw new IllegalArgumentException(prop + - " must be \"true\" or \"false\" instead of \"" + + throw new IllegalArgumentException( + "Property value must be \"true\" or \"false\" instead of \"" + stringBoolean + "\""); } diff --git a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnector.java b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnector.java index f5359f9b12c..f6d17d6cc08 100644 --- a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnector.java +++ b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnector.java @@ -277,9 +277,9 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable // Check for secure RMIServer stub if the corresponding // client-side environment property is set to "true". // - boolean checkStub = EnvHelp.computeBooleanFromString( - usemap, - "jmx.remote.x.check.stub",false); + String stringBoolean = (String) usemap.get("jmx.remote.x.check.stub"); + boolean checkStub = EnvHelp.computeBooleanFromString(stringBoolean); + if (checkStub) checkStub(stub, rmiServerImplStubClass); // Connect IIOP Stub if needed. diff --git a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectorServer.java b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectorServer.java index 909b9cb0d47..da92f49f70b 100644 --- a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectorServer.java +++ b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectorServer.java @@ -412,9 +412,8 @@ public class RMIConnectorServer extends JMXConnectorServer { if (tracing) logger.trace("start", "Using external directory: " + jndiUrl); - final boolean rebind = EnvHelp.computeBooleanFromString( - attributes, - JNDI_REBIND_ATTRIBUTE,false); + String stringBoolean = (String) attributes.get(JNDI_REBIND_ATTRIBUTE); + final boolean rebind = EnvHelp.computeBooleanFromString( stringBoolean ); if (tracing) logger.trace("start", JNDI_REBIND_ATTRIBUTE + "=" + rebind); From 5e84600efcf5392e04e12a6b56aa4104c241022d Mon Sep 17 00:00:00 2001 From: Dmitry Samersoff Date: Fri, 22 Jun 2012 18:19:48 +0400 Subject: [PATCH 009/241] 7169888: Narrowing resource definitions in JMX RMI connector CPU bug, we can't put offending calls outside doPrivileged, but narrow granted permissions. Reviewed-by: ahgross, fparain --- .../remote/rmi/RMIConnectionImpl.java | 89 ++++++++++--------- 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java index f322af0f2bc..9449210e897 100644 --- a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java +++ b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java @@ -25,6 +25,30 @@ package javax.management.remote.rmi; +import java.io.IOException; +import java.rmi.MarshalledObject; +import java.rmi.UnmarshalException; +import java.rmi.server.Unreferenced; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.Permission; +import java.security.PermissionCollection; +import java.security.Permissions; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.security.ProtectionDomain; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import javax.management.*; +import javax.management.remote.JMXServerErrorException; +import javax.management.remote.NotificationResult; +import javax.management.remote.TargetedNotification; +import javax.security.auth.Subject; + import static com.sun.jmx.mbeanserver.Util.cast; import com.sun.jmx.remote.internal.ServerCommunicatorAdmin; import com.sun.jmx.remote.internal.ServerNotifForwarder; @@ -35,44 +59,6 @@ import com.sun.jmx.remote.util.ClassLogger; import com.sun.jmx.remote.util.EnvHelp; import com.sun.jmx.remote.util.OrderClassLoaders; -import java.io.IOException; -import java.rmi.MarshalledObject; -import java.rmi.UnmarshalException; -import java.rmi.server.Unreferenced; -import java.security.AccessControlContext; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.Arrays; -import java.util.Collections; -import java.util.Map; -import java.util.Set; - -import javax.management.Attribute; -import javax.management.AttributeList; -import javax.management.AttributeNotFoundException; -import javax.management.InstanceAlreadyExistsException; -import javax.management.InstanceNotFoundException; -import javax.management.IntrospectionException; -import javax.management.InvalidAttributeValueException; -import javax.management.ListenerNotFoundException; -import javax.management.MBeanException; -import javax.management.MBeanInfo; -import javax.management.MBeanRegistrationException; -import javax.management.MBeanServer; -import javax.management.NotCompliantMBeanException; -import javax.management.NotificationFilter; -import javax.management.ObjectInstance; -import javax.management.ObjectName; -import javax.management.QueryExp; -import javax.management.ReflectionException; -import javax.management.RuntimeOperationsException; -import javax.management.remote.JMXServerErrorException; -import javax.management.remote.NotificationResult; -import javax.management.remote.TargetedNotification; -import javax.security.auth.Subject; - /** *

Implementation of the {@link RMIConnection} interface. User * code will not usually reference this class.

@@ -143,6 +129,7 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { this.mbeanServer = rmiServer.getMBeanServer(); final ClassLoader dcl = defaultClassLoader; + this.classLoaderWithRepository = AccessController.doPrivileged( new PrivilegedAction() { @@ -151,13 +138,29 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { mbeanServer.getClassLoaderRepository(), dcl); } - }); + }, + + withPermissions( new MBeanPermission("*", "getClassLoaderRepository"), + new RuntimePermission("createClassLoader")) + ); + serverCommunicatorAdmin = new RMIServerCommunicatorAdmin(EnvHelp.getServerConnectionTimeout(env)); this.env = env; } + private static AccessControlContext withPermissions(Permission ... perms){ + Permissions col = new Permissions(); + + for (Permission thePerm : perms ) { + col.add(thePerm); + } + + final ProtectionDomain pd = new ProtectionDomain(null, col); + return new AccessControlContext( new ProtectionDomain[] { pd }); + } + private synchronized ServerNotifForwarder getServerNotifFwd() { // Lazily created when first use. Mainly when // addNotificationListener is first called. @@ -1330,7 +1333,9 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { public ClassLoader run() throws InstanceNotFoundException { return mbeanServer.getClassLoader(name); } - }); + }, + withPermissions(new MBeanPermission("*", "getClassLoader")) + ); } catch (PrivilegedActionException pe) { throw (InstanceNotFoundException) extractException(pe); } @@ -1345,7 +1350,9 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { public Object run() throws InstanceNotFoundException { return mbeanServer.getClassLoaderFor(name); } - }); + }, + withPermissions(new MBeanPermission("*", "getClassLoaderFor")) + ); } catch (PrivilegedActionException pe) { throw (InstanceNotFoundException) extractException(pe); } From 1c29d4299bf222478eb9fb59540a8f631c5aaa7d Mon Sep 17 00:00:00 2001 From: Xue-Lei Andrew Fan Date: Sat, 28 Jul 2012 19:42:50 -0700 Subject: [PATCH 010/241] 7186286: TLS implementation to better adhere to RFC Also reviewed by Alexander Fomin , Andrew Gross, Sean Coffey Reviewed-by: valeriep, wetmore --- .../sun/security/ssl/HandshakeInStream.java | 13 ++++- .../classes/sun/security/ssl/Handshaker.java | 4 +- .../security/ssl/RSAClientKeyExchange.java | 56 ++++++++++++------- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/jdk/src/share/classes/sun/security/ssl/HandshakeInStream.java b/jdk/src/share/classes/sun/security/ssl/HandshakeInStream.java index f6ca477efe2..81c84643f14 100644 --- a/jdk/src/share/classes/sun/security/ssl/HandshakeInStream.java +++ b/jdk/src/share/classes/sun/security/ssl/HandshakeInStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -190,6 +190,7 @@ public class HandshakeInStream extends InputStream { byte[] getBytes8() throws IOException { int len = getInt8(); + verifyLength(len); byte b[] = new byte[len]; read(b, 0, len); @@ -198,6 +199,7 @@ public class HandshakeInStream extends InputStream { public byte[] getBytes16() throws IOException { int len = getInt16(); + verifyLength(len); byte b[] = new byte[len]; read(b, 0, len); @@ -206,10 +208,19 @@ public class HandshakeInStream extends InputStream { byte[] getBytes24() throws IOException { int len = getInt24(); + verifyLength(len); byte b[] = new byte[len]; read(b, 0, len); return b; } + // Is a length greater than available bytes in the record? + private void verifyLength(int len) throws SSLException { + if (len > available()) { + throw new SSLException( + "Not enough data to fill declared vector size"); + } + } + } diff --git a/jdk/src/share/classes/sun/security/ssl/Handshaker.java b/jdk/src/share/classes/sun/security/ssl/Handshaker.java index 4fb7fec7d61..38dd491f99f 100644 --- a/jdk/src/share/classes/sun/security/ssl/Handshaker.java +++ b/jdk/src/share/classes/sun/security/ssl/Handshaker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1063,7 +1063,6 @@ abstract class Handshaker { if (debug != null && Debug.isOn("handshake")) { System.out.println("RSA master secret generation error:"); e.printStackTrace(System.out); - System.out.println("Generating new random premaster secret"); } if (requestedVersion != null) { @@ -1130,7 +1129,6 @@ abstract class Handshaker { System.out.println("RSA PreMasterSecret version error: expected" + protocolVersion + " or " + requestedVersion + ", decrypted: " + premasterVersion); - System.out.println("Generating new random premaster secret"); } preMasterSecret = RSAClientKeyExchange.generateDummySecret(requestedVersion); diff --git a/jdk/src/share/classes/sun/security/ssl/RSAClientKeyExchange.java b/jdk/src/share/classes/sun/security/ssl/RSAClientKeyExchange.java index 1c0d6921091..36fda8c39cb 100644 --- a/jdk/src/share/classes/sun/security/ssl/RSAClientKeyExchange.java +++ b/jdk/src/share/classes/sun/security/ssl/RSAClientKeyExchange.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,7 @@ import javax.crypto.spec.*; import javax.net.ssl.*; import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; +import sun.security.util.KeyLength; /** * This is the client key exchange message (CLIENT --> SERVER) used with @@ -192,26 +193,38 @@ final class RSAClientKeyExchange extends HandshakeMessage { "unable to get the plaintext of the premaster secret"); } - // We are not always able to get the encoded key of the - // premaster secret. Pass the cheking to master secret + int keySize = KeyLength.getKeySize(secretKey); + if (keySize > 0 && keySize != 384) { // 384 = 48 * 8 + if (debug != null && Debug.isOn("handshake")) { + System.out.println( + "incorrect length of premaster secret: " + + (keySize/8)); + } + + return generateDummySecret(clientHelloVersion); + } + + // The key size is exactly 48 bytes or not accessible. + // + // Conservatively, pass the checking to master secret // calculation. return secretKey; } else if (encoded.length == 48) { // check the version if (clientHelloVersion.major == encoded[0] && clientHelloVersion.minor == encoded[1]) { + return secretKey; - } else if (clientHelloVersion.v <= ProtocolVersion.TLS10.v) { + } else if (clientHelloVersion.v <= ProtocolVersion.TLS10.v && + currentVersion.major == encoded[0] && + currentVersion.minor == encoded[1]) { /* - * we never checked the client_version in server side - * for TLS v1.0 and SSL v3.0. For compatibility, we - * maintain this behavior. + * For compatibility, we maintain the behavior that the + * version in pre_master_secret can be the negotiated + * version for TLS v1.0 and SSL v3.0. */ - if (currentVersion.major == encoded[0] && - currentVersion.minor == encoded[1]) { - this.protocolVersion = currentVersion; - return secretKey; - } + this.protocolVersion = currentVersion; + return secretKey; } if (debug != null && Debug.isOn("handshake")) { @@ -220,22 +233,23 @@ final class RSAClientKeyExchange extends HandshakeMessage { ", while PreMasterSecret.client_version is " + ProtocolVersion.valueOf(encoded[0], encoded[1])); } + + return generateDummySecret(clientHelloVersion); } else { if (debug != null && Debug.isOn("handshake")) { System.out.println( "incorrect length of premaster secret: " + encoded.length); } + + return generateDummySecret(clientHelloVersion); } } - if (debug != null && Debug.isOn("handshake")) { - if (failoverException != null) { - System.out.println("Error decrypting premaster secret:"); - failoverException.printStackTrace(System.out); - } - - System.out.println("Generating random secret"); + if (debug != null && Debug.isOn("handshake") && + failoverException != null) { + System.out.println("Error decrypting premaster secret:"); + failoverException.printStackTrace(System.out); } return generateDummySecret(clientHelloVersion); @@ -243,6 +257,10 @@ final class RSAClientKeyExchange extends HandshakeMessage { // generate a premaster secret with the specified version number static SecretKey generateDummySecret(ProtocolVersion version) { + if (debug != null && Debug.isOn("handshake")) { + System.out.println("Generating a random fake premaster secret"); + } + try { String s = ((version.v >= ProtocolVersion.TLS12.v) ? "SunTls12RsaPremasterSecret" : "SunTlsRsaPremasterSecret"); From e5fbf0148998595f148f340e8f663afa5a99eefa Mon Sep 17 00:00:00 2001 From: Sean Mullan Date: Wed, 15 Aug 2012 15:31:30 -0400 Subject: [PATCH 011/241] 7189490: More improvements to DomainCombiner checking Reviewed-by: ahgross, jdn, vinnie --- .../java/security/AccessController.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/jdk/src/share/classes/java/security/AccessController.java b/jdk/src/share/classes/java/security/AccessController.java index 8a8eadea62d..4e790ffc8da 100644 --- a/jdk/src/share/classes/java/security/AccessController.java +++ b/jdk/src/share/classes/java/security/AccessController.java @@ -290,11 +290,11 @@ public final class AccessController { */ public static T doPrivilegedWithCombiner(PrivilegedAction action) { - DomainCombiner dc = null; AccessControlContext acc = getStackAccessControlContext(); - if (acc == null || (dc = acc.getAssignedCombiner()) == null) { - return AccessController.doPrivileged(action, acc); + if (acc == null) { + return AccessController.doPrivileged(action); } + DomainCombiner dc = acc.getAssignedCombiner(); return AccessController.doPrivileged(action, preserveCombiner(dc)); } @@ -386,11 +386,11 @@ public final class AccessController { public static T doPrivilegedWithCombiner (PrivilegedExceptionAction action) throws PrivilegedActionException { - DomainCombiner dc = null; AccessControlContext acc = getStackAccessControlContext(); - if (acc == null || (dc = acc.getAssignedCombiner()) == null) { - return AccessController.doPrivileged(action, acc); + if (acc == null) { + return AccessController.doPrivileged(action); } + DomainCombiner dc = acc.getAssignedCombiner(); return AccessController.doPrivileged(action, preserveCombiner(dc)); } @@ -417,7 +417,12 @@ public final class AccessController { // perform 'combine' on the caller of doPrivileged, // even if the caller is from the bootclasspath ProtectionDomain[] pds = new ProtectionDomain[] {callerPd}; - return new AccessControlContext(combiner.combine(pds, null), combiner); + if (combiner == null) { + return new AccessControlContext(pds); + } else { + return new AccessControlContext(combiner.combine(pds, null), + combiner); + } } From 9f27d2af4c0366b2ae376c510b28a80c17ac90ee Mon Sep 17 00:00:00 2001 From: Chris Hegarty Date: Thu, 16 Aug 2012 15:02:34 +0100 Subject: [PATCH 012/241] 7189103: Executors needs to maintain state Reviewed-by: dholmes, hawtin --- .../java/util/concurrent/Executors.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/jdk/src/share/classes/java/util/concurrent/Executors.java b/jdk/src/share/classes/java/util/concurrent/Executors.java index 4ff71418422..78708f8d773 100644 --- a/jdk/src/share/classes/java/util/concurrent/Executors.java +++ b/jdk/src/share/classes/java/util/concurrent/Executors.java @@ -530,18 +530,17 @@ public class Executors { return AccessController.doPrivileged( new PrivilegedExceptionAction() { public T run() throws Exception { - ClassLoader savedcl = null; Thread t = Thread.currentThread(); - try { - ClassLoader cl = t.getContextClassLoader(); - if (ccl != cl) { - t.setContextClassLoader(ccl); - savedcl = cl; - } + ClassLoader cl = t.getContextClassLoader(); + if (ccl == cl) { return task.call(); - } finally { - if (savedcl != null) - t.setContextClassLoader(savedcl); + } else { + t.setContextClassLoader(ccl); + try { + return task.call(); + } finally { + t.setContextClassLoader(cl); + } } } }, acc); From 6b158b4089e2baccdbc8c2c90b28b6440c2fa76a Mon Sep 17 00:00:00 2001 From: Harold Seigel Date: Wed, 10 Oct 2012 17:04:33 -0400 Subject: [PATCH 013/241] 7199068: NPG: SharedSkipVerify is meaningless Remove the SharedSkipVerify flag Reviewed-by: kamg, sspitsyn, coleenp --- hotspot/src/share/vm/classfile/javaClasses.cpp | 3 +-- hotspot/src/share/vm/memory/universe.cpp | 4 ---- hotspot/src/share/vm/oops/klass.cpp | 7 +++---- hotspot/src/share/vm/runtime/globals.hpp | 4 ---- hotspot/src/share/vm/runtime/handles.cpp | 2 +- hotspot/src/share/vm/runtime/handles.hpp | 8 ++++---- 6 files changed, 9 insertions(+), 19 deletions(-) diff --git a/hotspot/src/share/vm/classfile/javaClasses.cpp b/hotspot/src/share/vm/classfile/javaClasses.cpp index 7e8c39cdd3b..d74a6174a99 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.cpp +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp @@ -413,8 +413,7 @@ char* java_lang_String::as_utf8_string(oop java_string, int start, int len) { } bool java_lang_String::equals(oop java_string, jchar* chars, int len) { - assert(SharedSkipVerify || - java_string->klass() == SystemDictionary::String_klass(), + assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string"); typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); diff --git a/hotspot/src/share/vm/memory/universe.cpp b/hotspot/src/share/vm/memory/universe.cpp index f8e733bb49b..8fe747939af 100644 --- a/hotspot/src/share/vm/memory/universe.cpp +++ b/hotspot/src/share/vm/memory/universe.cpp @@ -1243,10 +1243,6 @@ void Universe::print_heap_after_gc(outputStream* st, bool ignore_extended) { } void Universe::verify(bool silent, VerifyOption option) { - if (SharedSkipVerify) { - return; - } - // The use of _verify_in_progress is a temporary work around for // 6320749. Don't bother with a creating a class to set and clear // it since it is only used in this method and the control flow is diff --git a/hotspot/src/share/vm/oops/klass.cpp b/hotspot/src/share/vm/oops/klass.cpp index 94546f0d71a..06a99aff6b0 100644 --- a/hotspot/src/share/vm/oops/klass.cpp +++ b/hotspot/src/share/vm/oops/klass.cpp @@ -356,12 +356,11 @@ void Klass::set_next_sibling(Klass* s) { } void Klass::append_to_sibling_list() { - debug_only(if (!SharedSkipVerify) verify();) + debug_only(verify();) // add ourselves to superklass' subklass list InstanceKlass* super = superklass(); if (super == NULL) return; // special case: class Object - assert(SharedSkipVerify || - (!super->is_interface() // interfaces cannot be supers + assert((!super->is_interface() // interfaces cannot be supers && (super->superklass() == NULL || !is_interface())), "an interface can only be a subklass of Object"); Klass* prev_first_subklass = super->subklass_oop(); @@ -371,7 +370,7 @@ void Klass::append_to_sibling_list() { } // make ourselves the superklass' first subklass super->set_subklass(this); - debug_only(if (!SharedSkipVerify) verify();) + debug_only(verify();) } void Klass::remove_from_sibling_list() { diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index 0bef41fadab..cdefd82e4f5 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -3542,10 +3542,6 @@ class CommandLineFlags { product(uintx, SharedDummyBlockSize, 0, \ "Size of dummy block used to shift heap addresses (in bytes)") \ \ - diagnostic(bool, SharedSkipVerify, false, \ - "Skip assert() and verify() which page-in unwanted shared " \ - "objects. ") \ - \ diagnostic(bool, EnableInvokeDynamic, true, \ "support JSR 292 (method handles, invokedynamic, " \ "anonymous classes") \ diff --git a/hotspot/src/share/vm/runtime/handles.cpp b/hotspot/src/share/vm/runtime/handles.cpp index 0ba6c984ef8..cb53088ee69 100644 --- a/hotspot/src/share/vm/runtime/handles.cpp +++ b/hotspot/src/share/vm/runtime/handles.cpp @@ -48,7 +48,7 @@ oop* HandleArea::allocate_handle(oop obj) { assert(_handle_mark_nesting > 1, "memory leak: allocating handle outside HandleMark"); assert(_no_handle_mark_nesting == 0, "allocating handle inside NoHandleMark"); - assert(SharedSkipVerify || obj->is_oop(), "sanity check"); + assert(obj->is_oop(), "sanity check"); return real_allocate_handle(obj); } diff --git a/hotspot/src/share/vm/runtime/handles.hpp b/hotspot/src/share/vm/runtime/handles.hpp index 4a2e9ff8252..cab3dc581f9 100644 --- a/hotspot/src/share/vm/runtime/handles.hpp +++ b/hotspot/src/share/vm/runtime/handles.hpp @@ -110,11 +110,11 @@ class Handle VALUE_OBJ_CLASS_SPEC { /* Constructors */ \ type##Handle () : Handle() {} \ type##Handle (type##Oop obj) : Handle((oop)obj) { \ - assert(SharedSkipVerify || is_null() || ((oop)obj)->is_a(), \ + assert(is_null() || ((oop)obj)->is_a(), \ "illegal type"); \ } \ type##Handle (Thread* thread, type##Oop obj) : Handle(thread, (oop)obj) { \ - assert(SharedSkipVerify || is_null() || ((oop)obj)->is_a(), "illegal type"); \ + assert(is_null() || ((oop)obj)->is_a(), "illegal type"); \ } \ \ /* Operators for ease of use */ \ @@ -201,11 +201,11 @@ class instanceKlassHandle : public KlassHandle { /* Constructors */ instanceKlassHandle () : KlassHandle() {} instanceKlassHandle (const Klass* k) : KlassHandle(k) { - assert(SharedSkipVerify || k == NULL || k->oop_is_instance(), + assert(k == NULL || k->oop_is_instance(), "illegal type"); } instanceKlassHandle (Thread* thread, const Klass* k) : KlassHandle(thread, k) { - assert(SharedSkipVerify || k == NULL || k->oop_is_instance(), + assert(k == NULL || k->oop_is_instance(), "illegal type"); } /* Access to klass part */ From 04a9a141937e4781ba1ebd793d69e94296097b81 Mon Sep 17 00:00:00 2001 From: Keith McGuigan Date: Thu, 11 Oct 2012 14:27:54 -0400 Subject: [PATCH 014/241] 7054345: Support version 52.0 class file in HotSpot Accept classfiles with major version 52 Reviewed-by: coleenp, acorn --- hotspot/src/share/vm/classfile/classFileParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index 5d260d56492..c9a2c44d002 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -67,7 +67,7 @@ #define JAVA_CLASSFILE_MAGIC 0xCAFEBABE #define JAVA_MIN_SUPPORTED_VERSION 45 -#define JAVA_MAX_SUPPORTED_VERSION 51 +#define JAVA_MAX_SUPPORTED_VERSION 52 #define JAVA_MAX_SUPPORTED_MINOR_VERSION 0 // Used for two backward compatibility reasons: From b296b69382c85f74286499dc941fb18b5c53fb03 Mon Sep 17 00:00:00 2001 From: Kevin Walls Date: Mon, 15 Oct 2012 16:48:48 +0100 Subject: [PATCH 015/241] 7195151: Multiplatform tescase for 6929067 Reviewed-by: kamg, kvn --- hotspot/test/runtime/6929067/Test6929067.sh | 89 ++++++++++++++++++--- 1 file changed, 78 insertions(+), 11 deletions(-) diff --git a/hotspot/test/runtime/6929067/Test6929067.sh b/hotspot/test/runtime/6929067/Test6929067.sh index c08aa6b8f09..e4b649df82b 100644 --- a/hotspot/test/runtime/6929067/Test6929067.sh +++ b/hotspot/test/runtime/6929067/Test6929067.sh @@ -4,6 +4,7 @@ ## @test Test6929067.sh ## @bug 6929067 ## @summary Stack guard pages should be removed when thread is detached +## @compile T.java ## @run shell Test6929067.sh ## @@ -33,31 +34,97 @@ case "$OS" in ;; esac -# Choose arch: i386 or amd64 (test is Linux-specific) +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -Xinternalversion > vm_version.out 2>&1 + +# Bitness: # Cannot simply look at TESTVMOPTS as -d64 is not # passed if there is only a 64-bit JVM available. -${TESTJAVA}/bin/java ${TESTVMOPTS} -version 2>1 | grep "64-Bit" >/dev/null +grep "64-Bit" vm_version.out > ${NULL} if [ "$?" = "0" ] then - ARCH=amd64 + COMP_FLAG="-m64" else - ARCH=i386 + COMP_FLAG="-m32" fi -LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${ARCH}/client:/usr/openwin/lib:/usr/dt/lib:/usr/lib:$LD_LIBRARY_PATH + +# Architecture: +# Translate uname output to JVM directory name, but permit testing +# 32-bit x86 on an x64 platform. +ARCH=`uname -m` +case "$ARCH" in + x86_64) + if [ "$COMP_FLAG" = "-m32" ]; then + ARCH=i386 + else + ARCH=amd64 + fi + ;; + ppc64) + if [ "$COMP_FLAG" = "-m32" ]; then + ARCH=ppc + else + ARCH=ppc64 + fi + ;; + sparc64) + if [ "$COMP_FLAG" = "-m32" ]; then + ARCH=sparc + else + ARCH=sparc64 + fi + ;; + arm*) + # 32-bit ARM machine: compiler may not recognise -m32 + COMP_FLAG="" + ARCH=arm + ;; + aarch64) + # 64-bit arm machine, could be testing 32 or 64-bit: + if [ "$COMP_FLAG" = "-m32" ]; then + ARCH=arm + else + ARCH=aarch64 + fi + ;; + i586) + ARCH=i386 + ;; + i686) + ARCH=i386 + ;; + # Assuming other ARCH values need no translation +esac + + +# VM type: need to know server or client +VMTYPE=client +grep Server vm_version.out > ${NULL} +if [ "$?" = "0" ] +then + VMTYPE=server +fi + + +LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${ARCH}/${VMTYPE}:/usr/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH -THIS_DIR=`pwd` - -cp ${TESTSRC}${FS}invoke.c ${THIS_DIR} -cp ${TESTSRC}${FS}T.java ${THIS_DIR} +cp ${TESTSRC}${FS}invoke.c . +# Copy the result of our @compile action: +cp ${TESTCLASSES}${FS}T.class . ${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -fullversion -${TESTJAVA}${FS}bin${FS}javac T.java +echo "Architecture: ${ARCH}" +echo "Compilation flag: ${COMP_FLAG}" +echo "VM type: ${VMTYPE}" + +gcc -DLINUX ${COMP_FLAG} -o invoke \ + -I${TESTJAVA}/include -I${TESTJAVA}/include/linux \ + -L${TESTJAVA}/jre/lib/${ARCH}/${VMTYPE} \ + -ljvm -lpthread invoke.c -gcc -o invoke -I${TESTJAVA}/include -I${TESTJAVA}/include/linux invoke.c ${TESTJAVA}/jre/lib/${ARCH}/client/libjvm.so ./invoke exit $? From 228b4f6d7f0b8e27a5eddb7e31f0abe16e33c395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20B=C3=A4ckman?= Date: Tue, 28 Aug 2012 15:15:29 +0200 Subject: [PATCH 016/241] 7093328: JVMTI: jvmtiPrimitiveFieldCallback always report 0's for static primitives Reviewed-by: dholmes, dcubed --- hotspot/src/share/vm/prims/jvmtiTagMap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp index 22871642434..c3e744bd32e 100644 --- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp +++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp @@ -1135,7 +1135,7 @@ static jint invoke_primitive_field_callback_for_static_fields // get offset and field value int offset = field->field_offset(); - address addr = (address)klass + offset; + address addr = (address)klass->java_mirror() + offset; jvalue value; copy_to_jvalue(&value, addr, value_type); From 84603e4d94b7a0504aa1284a341c24a8ab9284f2 Mon Sep 17 00:00:00 2001 From: Chris Hegarty Date: Wed, 29 Aug 2012 14:05:37 +0100 Subject: [PATCH 017/241] 7189567: java net obselete protocol Reviewed-by: alanb, ahgross --- jdk/make/sun/net/FILES_java.gmk | 2 - .../net/www/protocol/gopher/GopherClient.java | 357 ------------------ .../sun/net/www/protocol/gopher/Handler.java | 100 ----- jdk/test/java/net/URL/Test.java | 4 - 4 files changed, 463 deletions(-) delete mode 100644 jdk/src/share/classes/sun/net/www/protocol/gopher/GopherClient.java delete mode 100644 jdk/src/share/classes/sun/net/www/protocol/gopher/Handler.java diff --git a/jdk/make/sun/net/FILES_java.gmk b/jdk/make/sun/net/FILES_java.gmk index 6c140abc68b..9c5feb4457e 100644 --- a/jdk/make/sun/net/FILES_java.gmk +++ b/jdk/make/sun/net/FILES_java.gmk @@ -128,8 +128,6 @@ FILES_java = \ sun/net/www/content/audio/x_wav.java \ sun/net/www/protocol/ftp/Handler.java \ sun/net/www/protocol/ftp/FtpURLConnection.java \ - sun/net/www/protocol/gopher/GopherClient.java \ - sun/net/www/protocol/gopher/Handler.java \ sun/net/www/protocol/mailto/Handler.java \ sun/net/www/protocol/mailto/MailToURLConnection.java \ sun/net/idn/Punycode.java \ diff --git a/jdk/src/share/classes/sun/net/www/protocol/gopher/GopherClient.java b/jdk/src/share/classes/sun/net/www/protocol/gopher/GopherClient.java deleted file mode 100644 index 03470634a37..00000000000 --- a/jdk/src/share/classes/sun/net/www/protocol/gopher/GopherClient.java +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package sun.net.www.protocol.gopher; - -import java.io.*; -import java.util.*; -import java.net.*; -import sun.net.www.*; -import sun.net.NetworkClient; -import java.net.URL; -import java.net.URLStreamHandler; - -import sun.security.action.GetBooleanAction; - -/** Class to maintain the state of a gopher fetch and handle the protocol */ -public class GopherClient extends NetworkClient implements Runnable { - - /* The following three data members are left in for binary - * backwards-compatibility. Unfortunately, HotJava sets them directly - * when it wants to change the settings. The new design has us not - * cache these, so this is unnecessary, but eliminating the data members - * would break HJB 1.1 under JDK 1.2. - * - * These data members are not used, and their values are meaningless. - * REMIND: Take them out for JDK 2.0! - */ - - /** - * @deprecated - */ - @Deprecated - public static boolean useGopherProxy; - - /** - * @deprecated - */ - @Deprecated - public static String gopherProxyHost; - - /** - * @deprecated - */ - @Deprecated - public static int gopherProxyPort; - - - static { - useGopherProxy = java.security.AccessController.doPrivileged( - new sun.security.action.GetBooleanAction("gopherProxySet")) - .booleanValue(); - - gopherProxyHost = java.security.AccessController.doPrivileged( - new sun.security.action.GetPropertyAction("gopherProxyHost")); - - gopherProxyPort = java.security.AccessController.doPrivileged( - new sun.security.action.GetIntegerAction("gopherProxyPort", 80)) - .intValue(); - } - - PipedOutputStream os; - URL u; - int gtype; - String gkey; - sun.net.www.URLConnection connection; - - GopherClient(sun.net.www.URLConnection connection) { - this.connection = connection; - } - - /** - * @return true if gopher connections should go through a proxy, according - * to system properties. - */ - public static boolean getUseGopherProxy() { - return java.security.AccessController.doPrivileged( - new GetBooleanAction("gopherProxySet")).booleanValue(); - } - - /** - * @return the proxy host to use, or null if nothing is set. - */ - public static String getGopherProxyHost() { - String host = java.security.AccessController.doPrivileged( - new sun.security.action.GetPropertyAction("gopherProxyHost")); - if ("".equals(host)) { - host = null; - } - return host; - } - - /** - * @return the proxy port to use. Will default reasonably. - */ - public static int getGopherProxyPort() { - return java.security.AccessController.doPrivileged( - new sun.security.action.GetIntegerAction("gopherProxyPort", 80)) - .intValue(); - } - - /** Given a url, setup to fetch the gopher document it refers to */ - InputStream openStream(URL u) throws IOException { - this.u = u; - this.os = os; - int i = 0; - String s = u.getFile(); - int limit = s.length(); - int c = '1'; - while (i < limit && (c = s.charAt(i)) == '/') - i++; - gtype = c == '/' ? '1' : c; - if (i < limit) - i++; - gkey = s.substring(i); - - openServer(u.getHost(), u.getPort() <= 0 ? 70 : u.getPort()); - - MessageHeader msgh = new MessageHeader(); - - switch (gtype) { - case '0': - case '7': - msgh.add("content-type", "text/plain"); - break; - case '1': - msgh.add("content-type", "text/html"); - break; - case 'g': - case 'I': - msgh.add("content-type", "image/gif"); - break; - default: - msgh.add("content-type", "content/unknown"); - break; - } - if (gtype != '7') { - serverOutput.print(decodePercent(gkey) + "\r\n"); - serverOutput.flush(); - } else if ((i = gkey.indexOf('?')) >= 0) { - serverOutput.print(decodePercent(gkey.substring(0, i) + "\t" + - gkey.substring(i + 1) + "\r\n")); - serverOutput.flush(); - msgh.add("content-type", "text/html"); - } else { - msgh.add("content-type", "text/html"); - } - connection.setProperties(msgh); - if (msgh.findValue("content-type") == "text/html") { - os = new PipedOutputStream(); - PipedInputStream ret = new PipedInputStream(); - ret.connect(os); - new Thread(this).start(); - return ret; - } - return new GopherInputStream(this, serverInput); - } - - /** Translate all the instances of %NN into the character they represent */ - private String decodePercent(String s) { - if (s == null || s.indexOf('%') < 0) - return s; - int limit = s.length(); - char d[] = new char[limit]; - int dp = 0; - for (int sp = 0; sp < limit; sp++) { - int c = s.charAt(sp); - if (c == '%' && sp + 2 < limit) { - int s1 = s.charAt(sp + 1); - int s2 = s.charAt(sp + 2); - if ('0' <= s1 && s1 <= '9') - s1 = s1 - '0'; - else if ('a' <= s1 && s1 <= 'f') - s1 = s1 - 'a' + 10; - else if ('A' <= s1 && s1 <= 'F') - s1 = s1 - 'A' + 10; - else - s1 = -1; - if ('0' <= s2 && s2 <= '9') - s2 = s2 - '0'; - else if ('a' <= s2 && s2 <= 'f') - s2 = s2 - 'a' + 10; - else if ('A' <= s2 && s2 <= 'F') - s2 = s2 - 'A' + 10; - else - s2 = -1; - if (s1 >= 0 && s2 >= 0) { - c = (s1 << 4) | s2; - sp += 2; - } - } - d[dp++] = (char) c; - } - return new String(d, 0, dp); - } - - /** Turn special characters into the %NN form */ - private String encodePercent(String s) { - if (s == null) - return s; - int limit = s.length(); - char d[] = null; - int dp = 0; - for (int sp = 0; sp < limit; sp++) { - int c = s.charAt(sp); - if (c <= ' ' || c == '"' || c == '%') { - if (d == null) - d = s.toCharArray(); - if (dp + 3 >= d.length) { - char nd[] = new char[dp + 10]; - System.arraycopy(d, 0, nd, 0, dp); - d = nd; - } - d[dp] = '%'; - int dig = (c >> 4) & 0xF; - d[dp + 1] = (char) (dig < 10 ? '0' + dig : 'A' - 10 + dig); - dig = c & 0xF; - d[dp + 2] = (char) (dig < 10 ? '0' + dig : 'A' - 10 + dig); - dp += 3; - } else { - if (d != null) { - if (dp >= d.length) { - char nd[] = new char[dp + 10]; - System.arraycopy(d, 0, nd, 0, dp); - d = nd; - } - d[dp] = (char) c; - } - dp++; - } - } - return d == null ? s : new String(d, 0, dp); - } - - /** This method is run as a seperate thread when an incoming gopher - document requires translation to html */ - public void run() { - int qpos = -1; - try { - if (gtype == '7' && (qpos = gkey.indexOf('?')) < 0) { - PrintStream ps = new PrintStream(os, false, encoding); - ps.print("Searchable Gopher Index\n

Searchable Gopher Index

\n\n"); - } else if (gtype != '1' && gtype != '7') { - byte buf[] = new byte[2048]; - try { - int n; - while ((n = serverInput.read(buf)) >= 0) - os.write(buf, 0, n); - } catch(Exception e) { - } - } else { - PrintStream ps = new PrintStream(os, false, encoding); - String title = null; - if (gtype == '7') - title = "Results of searching for \"" + gkey.substring(qpos + 1) - + "\" on " + u.getHost(); - else - title = "Gopher directory " + gkey + " from " + u.getHost(); - ps.print(""); - ps.print(title); - ps.print("\n\n

"); - ps.print(title); - ps.print("

\n"); - BufferedReader ds = new BufferedReader(new InputStreamReader(serverInput)); - String s; - while ((s = ds.readLine()) != null) { - int len = s.length(); - while (len > 0 && s.charAt(len - 1) <= ' ') - len--; - if (len <= 0) - continue; - int key = s.charAt(0); - int t1 = s.indexOf('\t'); - int t2 = t1 > 0 ? s.indexOf('\t', t1 + 1) : -1; - int t3 = t2 > 0 ? s.indexOf('\t', t2 + 1) : -1; - if (t3 < 0) { - // ps.print("
"+s+"\n"); - continue; - } - String port = t3 + 1 < len ? ":" + s.substring(t3 + 1, len) : ""; - String host = t2 + 1 < t3 ? s.substring(t2 + 1, t3) : u.getHost(); - ps.print("
\n"); - ps.print("
\n"); - ps.print(s.substring(1, t1) + "\n"); - } - ps.print("
\n"); - ps.close(); - } - - } catch (UnsupportedEncodingException e) { - throw new InternalError(encoding+ " encoding not found", e); - } catch (IOException e) { - } finally { - try { - closeServer(); - os.close(); - } catch (IOException e2) { - } - } - } -} - -/** An input stream that does nothing more than hold on to the NetworkClient - that created it. This is used when only the input stream is needed, and - the network client needs to be closed when the input stream is closed. */ -class GopherInputStream extends FilterInputStream { - NetworkClient parent; - - GopherInputStream(NetworkClient o, InputStream fd) { - super(fd); - parent = o; - } - - public void close() { - try { - parent.closeServer(); - super.close(); - } catch (IOException e) { - } - } -} diff --git a/jdk/src/share/classes/sun/net/www/protocol/gopher/Handler.java b/jdk/src/share/classes/sun/net/www/protocol/gopher/Handler.java deleted file mode 100644 index 800985960a3..00000000000 --- a/jdk/src/share/classes/sun/net/www/protocol/gopher/Handler.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.net.www.protocol.gopher; - -import java.io.*; -import java.util.*; -import sun.net.NetworkClient; -import java.net.URL; -import java.net.URLStreamHandler; -import java.net.Proxy; -import java.net.InetSocketAddress; -import java.net.SocketPermission; -import java.security.Permission; -import sun.net.www.protocol.http.HttpURLConnection; - -/** - * A class to handle the gopher protocol. - */ - -public class Handler extends java.net.URLStreamHandler { - - protected int getDefaultPort() { - return 70; - } - - public java.net.URLConnection openConnection(URL u) - throws IOException { - return openConnection(u, null); - } - - public java.net.URLConnection openConnection(URL u, Proxy p) - throws IOException { - - - /* if set for proxy usage then go through the http code to get */ - /* the url connection. */ - if (p == null && GopherClient.getUseGopherProxy()) { - String host = GopherClient.getGopherProxyHost(); - if (host != null) { - InetSocketAddress saddr = InetSocketAddress.createUnresolved(host, GopherClient.getGopherProxyPort()); - - p = new Proxy(Proxy.Type.HTTP, saddr); - } - } - if (p != null) { - return new HttpURLConnection(u, p); - } - - return new GopherURLConnection(u); - } -} - -class GopherURLConnection extends sun.net.www.URLConnection { - - Permission permission; - - GopherURLConnection(URL u) { - super(u); - } - - public void connect() throws IOException { - } - - public InputStream getInputStream() throws IOException { - return new GopherClient(this).openStream(url); - } - - public Permission getPermission() { - if (permission == null) { - int port = url.getPort(); - port = port < 0 ? 70 : port; - String host = url.getHost() + ":" + url.getPort(); - permission = new SocketPermission(host, "connect"); - } - return permission; - } -} diff --git a/jdk/test/java/net/URL/Test.java b/jdk/test/java/net/URL/Test.java index 58c88182723..5a0909efe26 100644 --- a/jdk/test/java/net/URL/Test.java +++ b/jdk/test/java/net/URL/Test.java @@ -322,10 +322,6 @@ public class Test { test("ftp://ftp.is.co.za/rfc/rfc1808.txt") .s("ftp").h("ftp.is.co.za").p("/rfc/rfc1808.txt").z(); - test("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles") - .s("gopher").h("spinaltap.micro.umn.edu") - .p("/00/Weather/California/Los%20Angeles").z(); - test("http://www.math.uio.no/faq/compression-faq/part1.html") .s("http").h("www.math.uio.no").p("/faq/compression-faq/part1.html").z(); From c6f43f359973f7ee8826c4ed250f38668e94e5dc Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Sat, 8 Sep 2012 20:31:42 +0100 Subject: [PATCH 018/241] 7169884: LogManager checks do not work correctly for sub-types Reviewed-by: mchung, ahgross --- .../java/util/logging/FileHandler.java | 12 +++++----- .../classes/java/util/logging/Handler.java | 16 ++++++------- .../classes/java/util/logging/LogManager.java | 23 ++++++++++--------- .../classes/java/util/logging/Logger.java | 16 ++++++------- .../java/util/logging/MemoryHandler.java | 2 +- .../java/util/logging/StreamHandler.java | 2 +- 6 files changed, 36 insertions(+), 35 deletions(-) diff --git a/jdk/src/share/classes/java/util/logging/FileHandler.java b/jdk/src/share/classes/java/util/logging/FileHandler.java index fb3b67c4d92..b9a5d73c341 100644 --- a/jdk/src/share/classes/java/util/logging/FileHandler.java +++ b/jdk/src/share/classes/java/util/logging/FileHandler.java @@ -220,7 +220,7 @@ public class FileHandler extends StreamHandler { * @exception NullPointerException if pattern property is an empty String. */ public FileHandler() throws IOException, SecurityException { - checkAccess(); + checkPermission(); configure(); openFiles(); } @@ -246,7 +246,7 @@ public class FileHandler extends StreamHandler { if (pattern.length() < 1 ) { throw new IllegalArgumentException(); } - checkAccess(); + checkPermission(); configure(); this.pattern = pattern; this.limit = 0; @@ -278,7 +278,7 @@ public class FileHandler extends StreamHandler { if (pattern.length() < 1 ) { throw new IllegalArgumentException(); } - checkAccess(); + checkPermission(); configure(); this.pattern = pattern; this.limit = 0; @@ -315,7 +315,7 @@ public class FileHandler extends StreamHandler { if (limit < 0 || count < 1 || pattern.length() < 1) { throw new IllegalArgumentException(); } - checkAccess(); + checkPermission(); configure(); this.pattern = pattern; this.limit = limit; @@ -354,7 +354,7 @@ public class FileHandler extends StreamHandler { if (limit < 0 || count < 1 || pattern.length() < 1) { throw new IllegalArgumentException(); } - checkAccess(); + checkPermission(); configure(); this.pattern = pattern; this.limit = limit; @@ -367,7 +367,7 @@ public class FileHandler extends StreamHandler { // configured instance variables. private void openFiles() throws IOException { LogManager manager = LogManager.getLogManager(); - manager.checkAccess(); + manager.checkPermission(); if (count < 1) { throw new IllegalArgumentException("file count = " + count); } diff --git a/jdk/src/share/classes/java/util/logging/Handler.java b/jdk/src/share/classes/java/util/logging/Handler.java index 1317b572d92..fd04c2cb496 100644 --- a/jdk/src/share/classes/java/util/logging/Handler.java +++ b/jdk/src/share/classes/java/util/logging/Handler.java @@ -111,7 +111,7 @@ public abstract class Handler { * the caller does not have LoggingPermission("control"). */ public void setFormatter(Formatter newFormatter) throws SecurityException { - checkAccess(); + checkPermission(); // Check for a null pointer: newFormatter.getClass(); formatter = newFormatter; @@ -140,7 +140,7 @@ public abstract class Handler { */ public void setEncoding(String encoding) throws SecurityException, java.io.UnsupportedEncodingException { - checkAccess(); + checkPermission(); if (encoding != null) { try { if(!java.nio.charset.Charset.isSupported(encoding)) { @@ -175,7 +175,7 @@ public abstract class Handler { * the caller does not have LoggingPermission("control"). */ public void setFilter(Filter newFilter) throws SecurityException { - checkAccess(); + checkPermission(); filter = newFilter; } @@ -199,7 +199,7 @@ public abstract class Handler { * the caller does not have LoggingPermission("control"). */ public void setErrorManager(ErrorManager em) { - checkAccess(); + checkPermission(); if (em == null) { throw new NullPointerException(); } @@ -213,7 +213,7 @@ public abstract class Handler { * the caller does not have LoggingPermission("control"). */ public ErrorManager getErrorManager() { - checkAccess(); + checkPermission(); return errorManager; } @@ -253,7 +253,7 @@ public abstract class Handler { if (newLevel == null) { throw new NullPointerException(); } - checkAccess(); + checkPermission(); logLevel = newLevel; } @@ -296,9 +296,9 @@ public abstract class Handler { // If "sealed" is true, we check that the caller has // appropriate security privileges to update Handler // state and if not throw a SecurityException. - void checkAccess() throws SecurityException { + void checkPermission() throws SecurityException { if (sealed) { - manager.checkAccess(); + manager.checkPermission(); } } } diff --git a/jdk/src/share/classes/java/util/logging/LogManager.java b/jdk/src/share/classes/java/util/logging/LogManager.java index 24f61b46f74..bfdf83f93da 100644 --- a/jdk/src/share/classes/java/util/logging/LogManager.java +++ b/jdk/src/share/classes/java/util/logging/LogManager.java @@ -314,7 +314,7 @@ public class LogManager { */ public void addPropertyChangeListener(PropertyChangeListener l) throws SecurityException { PropertyChangeListener listener = Objects.requireNonNull(l); - checkAccess(); + checkPermission(); synchronized (listenerMap) { // increment the registration count if already registered Integer value = listenerMap.get(listener); @@ -338,7 +338,7 @@ public class LogManager { * the caller does not have LoggingPermission("control"). */ public void removePropertyChangeListener(PropertyChangeListener l) throws SecurityException { - checkAccess(); + checkPermission(); if (l != null) { PropertyChangeListener listener = l; synchronized (listenerMap) { @@ -793,7 +793,7 @@ public class LogManager { * @exception IOException if there are IO problems reading the configuration. */ public void readConfiguration() throws IOException, SecurityException { - checkAccess(); + checkPermission(); // if a configuration class is specified, load it and use it. String cname = System.getProperty("java.util.logging.config.class"); @@ -851,7 +851,7 @@ public class LogManager { */ public void reset() throws SecurityException { - checkAccess(); + checkPermission(); synchronized (this) { props = new Properties(); // Since we are doing a reset we no longer want to initialize @@ -936,7 +936,7 @@ public class LogManager { * @exception IOException if there are problems reading from the stream. */ public void readConfiguration(InputStream ins) throws IOException, SecurityException { - checkAccess(); + checkPermission(); reset(); // Load the properties @@ -1113,8 +1113,13 @@ public class LogManager { loadLoggerHandlers(rootLogger, null, "handlers"); } + private final Permission controlPermission = new LoggingPermission("control", null); - private Permission ourPermission = new LoggingPermission("control", null); + void checkPermission() { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(controlPermission); + } /** * Check that the current context is trusted to modify the logging @@ -1127,11 +1132,7 @@ public class LogManager { * the caller does not have LoggingPermission("control"). */ public void checkAccess() throws SecurityException { - SecurityManager sm = System.getSecurityManager(); - if (sm == null) { - return; - } - sm.checkPermission(ourPermission); + checkPermission(); } // Nested class to represent a node in our tree of named loggers. diff --git a/jdk/src/share/classes/java/util/logging/Logger.java b/jdk/src/share/classes/java/util/logging/Logger.java index aebf63ed5e8..f1d6f729b91 100644 --- a/jdk/src/share/classes/java/util/logging/Logger.java +++ b/jdk/src/share/classes/java/util/logging/Logger.java @@ -276,13 +276,13 @@ public class Logger { this.manager = manager; } - private void checkAccess() throws SecurityException { + private void checkPermission() throws SecurityException { if (!anonymous) { if (manager == null) { // Complete initialization of the global Logger. manager = LogManager.getLogManager(); } - manager.checkAccess(); + manager.checkPermission(); } } @@ -482,7 +482,7 @@ public class Logger { * the caller does not have LoggingPermission("control"). */ public void setFilter(Filter newFilter) throws SecurityException { - checkAccess(); + checkPermission(); filter = newFilter; } @@ -1168,7 +1168,7 @@ public class Logger { * the caller does not have LoggingPermission("control"). */ public void setLevel(Level newLevel) throws SecurityException { - checkAccess(); + checkPermission(); synchronized (treeLock) { levelObject = newLevel; updateEffectiveLevel(); @@ -1223,7 +1223,7 @@ public class Logger { public void addHandler(Handler handler) throws SecurityException { // Check for null handler handler.getClass(); - checkAccess(); + checkPermission(); handlers.add(handler); } @@ -1237,7 +1237,7 @@ public class Logger { * the caller does not have LoggingPermission("control"). */ public void removeHandler(Handler handler) throws SecurityException { - checkAccess(); + checkPermission(); if (handler == null) { return; } @@ -1265,7 +1265,7 @@ public class Logger { * the caller does not have LoggingPermission("control"). */ public void setUseParentHandlers(boolean useParentHandlers) { - checkAccess(); + checkPermission(); this.useParentHandlers = useParentHandlers; } @@ -1420,7 +1420,7 @@ public class Logger { if (parent == null) { throw new NullPointerException(); } - manager.checkAccess(); + manager.checkPermission(); doSetParent(parent); } diff --git a/jdk/src/share/classes/java/util/logging/MemoryHandler.java b/jdk/src/share/classes/java/util/logging/MemoryHandler.java index 2c297301d92..06c0930ed5c 100644 --- a/jdk/src/share/classes/java/util/logging/MemoryHandler.java +++ b/jdk/src/share/classes/java/util/logging/MemoryHandler.java @@ -238,7 +238,7 @@ public class MemoryHandler extends Handler { throw new NullPointerException(); } LogManager manager = LogManager.getLogManager(); - checkAccess(); + checkPermission(); pushLevel = newLevel; } diff --git a/jdk/src/share/classes/java/util/logging/StreamHandler.java b/jdk/src/share/classes/java/util/logging/StreamHandler.java index 9ed9e57b768..f6407ec2bfd 100644 --- a/jdk/src/share/classes/java/util/logging/StreamHandler.java +++ b/jdk/src/share/classes/java/util/logging/StreamHandler.java @@ -249,7 +249,7 @@ public class StreamHandler extends Handler { } private synchronized void flushAndClose() throws SecurityException { - checkAccess(); + checkPermission(); if (writer != null) { try { if (!doneHeader) { From 7004635879b74a308e9f47af207cc4972d974ccd Mon Sep 17 00:00:00 2001 From: Stuart Marks Date: Mon, 10 Sep 2012 16:05:53 -0700 Subject: [PATCH 019/241] 7195919: (sl) ServiceLoader can throw CCE without needing to create instance Reviewed-by: ahgross, alanb, dmeetry --- .../share/classes/java/util/ServiceLoader.java | 15 +++++++++++---- jdk/src/share/classes/sun/misc/Service.java | 12 ++++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/jdk/src/share/classes/java/util/ServiceLoader.java b/jdk/src/share/classes/java/util/ServiceLoader.java index 62aa9dd2453..37176c677a9 100644 --- a/jdk/src/share/classes/java/util/ServiceLoader.java +++ b/jdk/src/share/classes/java/util/ServiceLoader.java @@ -358,14 +358,21 @@ public final class ServiceLoader } String cn = nextName; nextName = null; + Class c = null; try { - S p = service.cast(Class.forName(cn, true, loader) - .newInstance()); - providers.put(cn, p); - return p; + c = Class.forName(cn, false, loader); } catch (ClassNotFoundException x) { fail(service, "Provider " + cn + " not found"); + } + if (!service.isAssignableFrom(c)) { + fail(service, + "Provider " + cn + " not a subtype"); + } + try { + S p = service.cast(c.newInstance()); + providers.put(cn, p); + return p; } catch (Throwable x) { fail(service, "Provider " + cn + " could not be instantiated: " + x, diff --git a/jdk/src/share/classes/sun/misc/Service.java b/jdk/src/share/classes/sun/misc/Service.java index 37d39b43019..d74abbd1cb3 100644 --- a/jdk/src/share/classes/sun/misc/Service.java +++ b/jdk/src/share/classes/sun/misc/Service.java @@ -284,12 +284,20 @@ public final class Service { } String cn = nextName; nextName = null; + Class c = null; try { - return service.cast(Class.forName(cn, true, loader).newInstance()); + c = Class.forName(cn, false, loader); } catch (ClassNotFoundException x) { fail(service, "Provider " + cn + " not found"); - } catch (Exception x) { + } + if (!service.isAssignableFrom(c)) { + fail(service, + "Provider " + cn + " not a subtype"); + } + try { + return service.cast(c.newInstance()); + } catch (Throwable x) { fail(service, "Provider " + cn + " could not be instantiated: " + x, x); From e539ff810a49ab7948c7a7194b371849b5afedad Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Tue, 11 Sep 2012 12:57:09 +0400 Subject: [PATCH 020/241] 7195549: Better bean object persistence Reviewed-by: art, ahgross --- .../sun/beans/decoder/PropertyElementHandler.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/jdk/src/share/classes/com/sun/beans/decoder/PropertyElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/PropertyElementHandler.java index f20829385d4..8f4c40cac93 100644 --- a/jdk/src/share/classes/com/sun/beans/decoder/PropertyElementHandler.java +++ b/jdk/src/share/classes/com/sun/beans/decoder/PropertyElementHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,8 @@ import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import sun.reflect.misc.MethodUtil; + /** * This class is intended to handle <property> element. * This element simplifies access to the properties. @@ -168,11 +170,11 @@ final class PropertyElementHandler extends AccessorElementHandler { private static Object getPropertyValue(Object bean, String name, Integer index) throws IllegalAccessException, IntrospectionException, InvocationTargetException, NoSuchMethodException { Class type = bean.getClass(); if (index == null) { - return findGetter(type, name).invoke(bean); + return MethodUtil.invoke(findGetter(type, name), bean, new Object[] {}); } else if (type.isArray() && (name == null)) { return Array.get(bean, index); } else { - return findGetter(type, name, int.class).invoke(bean, index); + return MethodUtil.invoke(findGetter(type, name, int.class), bean, new Object[] {index}); } } @@ -197,11 +199,11 @@ final class PropertyElementHandler extends AccessorElementHandler { : null; if (index == null) { - findSetter(type, name, param).invoke(bean, value); + MethodUtil.invoke(findSetter(type, name, param), bean, new Object[] {value}); } else if (type.isArray() && (name == null)) { Array.set(bean, index, value); } else { - findSetter(type, name, int.class, param).invoke(bean, index, value); + MethodUtil.invoke(findSetter(type, name, int.class, param), bean, new Object[] {index, value}); } } From 41e85e364f92496350236119d170ae7544ca7518 Mon Sep 17 00:00:00 2001 From: Pavel Porvatov Date: Tue, 11 Sep 2012 15:59:24 +0400 Subject: [PATCH 021/241] 7195194: Better data validation for Swing Reviewed-by: art, ahgross --- jdk/src/share/classes/javax/swing/text/DefaultFormatter.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jdk/src/share/classes/javax/swing/text/DefaultFormatter.java b/jdk/src/share/classes/javax/swing/text/DefaultFormatter.java index 5e003b55bca..b67966ab70a 100644 --- a/jdk/src/share/classes/javax/swing/text/DefaultFormatter.java +++ b/jdk/src/share/classes/javax/swing/text/DefaultFormatter.java @@ -24,6 +24,8 @@ */ package javax.swing.text; +import sun.reflect.misc.ConstructorUtil; + import java.io.Serializable; import java.lang.reflect.*; import java.text.ParseException; @@ -245,7 +247,7 @@ public class DefaultFormatter extends JFormattedTextField.AbstractFormatter Constructor cons; try { - cons = vc.getConstructor(new Class[] { String.class }); + cons = ConstructorUtil.getConstructor(vc, new Class[]{String.class}); } catch (NoSuchMethodException nsme) { cons = null; From 37bddeb62b9d7ad691307af49cca841856427a98 Mon Sep 17 00:00:00 2001 From: Jon Masamitsu Date: Tue, 18 Sep 2012 23:35:42 -0700 Subject: [PATCH 022/241] 7045397: NPG: Add freelists to class loader arenas Reviewed-by: coleenp, stefank, jprovino, ohair --- hotspot/make/excludeSrc.make | 6 +- .../concurrentMarkSweep/adaptiveFreeList.cpp | 175 ++++ .../concurrentMarkSweep/adaptiveFreeList.hpp | 232 ++++++ .../compactibleFreeListSpace.cpp | 81 +- .../compactibleFreeListSpace.hpp | 12 +- .../concurrentMarkSweepGeneration.cpp | 4 +- .../concurrentMarkSweep/freeChunk.hpp | 2 +- .../concurrentMarkSweep/vmStructs_cms.hpp | 20 +- .../shared/vmGCOperations.hpp | 2 +- .../share/vm/memory/binaryTreeDictionary.cpp | 770 ++++++++++-------- .../share/vm/memory/binaryTreeDictionary.hpp | 207 ++--- .../share/vm/memory/freeBlockDictionary.cpp | 5 + .../share/vm/memory/freeBlockDictionary.hpp | 2 +- hotspot/src/share/vm/memory/freeList.cpp | 100 +-- hotspot/src/share/vm/memory/freeList.hpp | 211 +---- hotspot/src/share/vm/memory/metablock.hpp | 103 +++ hotspot/src/share/vm/memory/metachunk.hpp | 133 +++ hotspot/src/share/vm/memory/metaspace.cpp | 668 +++++---------- hotspot/src/share/vm/memory/metaspace.hpp | 6 +- hotspot/src/share/vm/runtime/vmStructs.cpp | 31 +- 20 files changed, 1547 insertions(+), 1223 deletions(-) create mode 100644 hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp create mode 100644 hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp create mode 100644 hotspot/src/share/vm/memory/metablock.hpp create mode 100644 hotspot/src/share/vm/memory/metachunk.hpp diff --git a/hotspot/make/excludeSrc.make b/hotspot/make/excludeSrc.make index 00a1e3a706e..721aea5c7e5 100644 --- a/hotspot/make/excludeSrc.make +++ b/hotspot/make/excludeSrc.make @@ -79,10 +79,10 @@ ifeq ($(INCLUDE_ALTERNATE_GCS), false) CXXFLAGS += -DSERIALGC CFLAGS += -DSERIALGC Src_Files_EXCLUDE += \ - binaryTreeDictionary.cpp cmsAdaptiveSizePolicy.cpp cmsCollectorPolicy.cpp \ + cmsAdaptiveSizePolicy.cpp cmsCollectorPolicy.cpp \ cmsGCAdaptivePolicyCounters.cpp cmsLockVerifier.cpp cmsPermGen.cpp compactibleFreeListSpace.cpp \ - concurrentMarkSweepGeneration.cpp concurrentMarkSweepThread.cpp freeBlockDictionary.cpp \ - freeChunk.cpp freeList.cpp promotionInfo.cpp vmCMSOperations.cpp collectionSetChooser.cpp \ + concurrentMarkSweepGeneration.cpp concurrentMarkSweepThread.cpp \ + freeChunk.cpp adaptiveFreeList.cpp promotionInfo.cpp vmCMSOperations.cpp collectionSetChooser.cpp \ concurrentG1Refine.cpp concurrentG1RefineThread.cpp concurrentMark.cpp concurrentMarkThread.cpp \ dirtyCardQueue.cpp g1AllocRegion.cpp g1BlockOffsetTable.cpp g1CollectedHeap.cpp g1GCPhaseTimes.cpp \ g1CollectorPolicy.cpp g1ErgoVerbose.cpp g1_globals.cpp g1HRPrinter.cpp g1MarkSweep.cpp \ diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp new file mode 100644 index 00000000000..01e0e8745a1 --- /dev/null +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp" +#include "gc_implementation/concurrentMarkSweep/freeChunk.hpp" +#include "memory/freeBlockDictionary.hpp" +#include "memory/sharedHeap.hpp" +#include "runtime/globals.hpp" +#include "runtime/mutex.hpp" +#include "runtime/vmThread.hpp" + +template <> +void AdaptiveFreeList::print_on(outputStream* st, const char* c) const { + if (c != NULL) { + st->print("%16s", c); + } else { + st->print(SIZE_FORMAT_W(16), size()); + } + st->print("\t" + SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" + SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\n", + bfr_surp(), surplus(), desired(), prev_sweep(), before_sweep(), + count(), coal_births(), coal_deaths(), split_births(), split_deaths()); +} + +template +AdaptiveFreeList::AdaptiveFreeList() : FreeList(), _hint(0) { + init_statistics(); +} + +template +AdaptiveFreeList::AdaptiveFreeList(Chunk* fc) : FreeList(fc), _hint(0) { + init_statistics(); +#ifndef PRODUCT + _allocation_stats.set_returned_bytes(size() * HeapWordSize); +#endif +} + +template +void AdaptiveFreeList::initialize() { + FreeList::initialize(); + set_hint(0); + init_statistics(true /* split_birth */); +} + +template +void AdaptiveFreeList::reset(size_t hint) { + FreeList::reset(); + set_hint(hint); +} + +#ifndef PRODUCT +template +void AdaptiveFreeList::assert_proper_lock_protection_work() const { + assert(protecting_lock() != NULL, "Don't call this directly"); + assert(ParallelGCThreads > 0, "Don't call this directly"); + Thread* thr = Thread::current(); + if (thr->is_VM_thread() || thr->is_ConcurrentGC_thread()) { + // assert that we are holding the freelist lock + } else if (thr->is_GC_task_thread()) { + assert(protecting_lock()->owned_by_self(), "FreeList RACE DETECTED"); + } else if (thr->is_Java_thread()) { + assert(!SafepointSynchronize::is_at_safepoint(), "Should not be executing"); + } else { + ShouldNotReachHere(); // unaccounted thread type? + } +} +#endif +template +void AdaptiveFreeList::init_statistics(bool split_birth) { + _allocation_stats.initialize(split_birth); +} + +template +size_t AdaptiveFreeList::get_better_size() { + + // A candidate chunk has been found. If it is already under + // populated and there is a hinT, REturn the hint(). Else + // return the size of this chunk. + if (surplus() <= 0) { + if (hint() != 0) { + return hint(); + } else { + return size(); + } + } else { + // This list has a surplus so use it. + return size(); + } +} + + +template +void AdaptiveFreeList::return_chunk_at_head(Chunk* chunk) { + assert_proper_lock_protection(); + return_chunk_at_head(chunk, true); +} + +template +void AdaptiveFreeList::return_chunk_at_head(Chunk* chunk, bool record_return) { + FreeList::return_chunk_at_head(chunk, record_return); +#ifdef ASSERT + if (record_return) { + increment_returned_bytes_by(size()*HeapWordSize); + } +#endif +} + +template +void AdaptiveFreeList::return_chunk_at_tail(Chunk* chunk) { + return_chunk_at_tail(chunk, true); +} + +template +void AdaptiveFreeList::return_chunk_at_tail(Chunk* chunk, bool record_return) { + FreeList::return_chunk_at_tail(chunk, record_return); +#ifdef ASSERT + if (record_return) { + increment_returned_bytes_by(size()*HeapWordSize); + } +#endif +} + +#ifndef PRODUCT +template +void AdaptiveFreeList::verify_stats() const { + // The +1 of the LH comparand is to allow some "looseness" in + // checking: we usually call this interface when adding a block + // and we'll subsequently update the stats; we cannot update the + // stats beforehand because in the case of the large-block BT + // dictionary for example, this might be the first block and + // in that case there would be no place that we could record + // the stats (which are kept in the block itself). + assert((_allocation_stats.prev_sweep() + _allocation_stats.split_births() + + _allocation_stats.coal_births() + 1) // Total Production Stock + 1 + >= (_allocation_stats.split_deaths() + _allocation_stats.coal_deaths() + + (ssize_t)count()), // Total Current Stock + depletion + err_msg("FreeList " PTR_FORMAT " of size " SIZE_FORMAT + " violates Conservation Principle: " + "prev_sweep(" SIZE_FORMAT ")" + " + split_births(" SIZE_FORMAT ")" + " + coal_births(" SIZE_FORMAT ") + 1 >= " + " split_deaths(" SIZE_FORMAT ")" + " coal_deaths(" SIZE_FORMAT ")" + " + count(" SSIZE_FORMAT ")", + this, size(), _allocation_stats.prev_sweep(), _allocation_stats.split_births(), + _allocation_stats.split_births(), _allocation_stats.split_deaths(), + _allocation_stats.coal_deaths(), count())); +} +#endif + +// Needs to be after the definitions have been seen. +template class AdaptiveFreeList; diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp new file mode 100644 index 00000000000..8b56bb11d76 --- /dev/null +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_MEMORY_ADAPTIVEFREELIST_HPP +#define SHARE_VM_MEMORY_ADAPTIVEFREELIST_HPP + +#include "memory/freeList.hpp" +#include "gc_implementation/shared/allocationStats.hpp" + +class CompactibleFreeListSpace; + +// A class for maintaining a free list of Chunk's. The FreeList +// maintains a the structure of the list (head, tail, etc.) plus +// statistics for allocations from the list. The links between items +// are not part of FreeList. The statistics are +// used to make decisions about coalescing Chunk's when they +// are swept during collection. +// +// See the corresponding .cpp file for a description of the specifics +// for that implementation. + +class Mutex; + +template +class AdaptiveFreeList : public FreeList { + friend class CompactibleFreeListSpace; + friend class VMStructs; + // friend class PrintTreeCensusClosure; + + size_t _hint; // next larger size list with a positive surplus + + AllocationStats _allocation_stats; // allocation-related statistics + + public: + + AdaptiveFreeList(); + AdaptiveFreeList(Chunk* fc); + + using FreeList::assert_proper_lock_protection; +#ifdef ASSERT + using FreeList::protecting_lock; +#endif + using FreeList::count; + using FreeList::size; + using FreeList::verify_chunk_in_free_list; + using FreeList::getFirstNChunksFromList; + using FreeList::print_on; + void return_chunk_at_head(Chunk* fc, bool record_return); + void return_chunk_at_head(Chunk* fc); + void return_chunk_at_tail(Chunk* fc, bool record_return); + void return_chunk_at_tail(Chunk* fc); + using FreeList::return_chunk_at_tail; + using FreeList::remove_chunk; + using FreeList::prepend; + using FreeList::print_labels_on; + using FreeList::get_chunk_at_head; + + // Initialize. + void initialize(); + + // Reset the head, tail, hint, and count of a free list. + void reset(size_t hint); + + void assert_proper_lock_protection_work() const PRODUCT_RETURN; + + void print_on(outputStream* st, const char* c = NULL) const; + + size_t hint() const { + return _hint; + } + void set_hint(size_t v) { + assert_proper_lock_protection(); + assert(v == 0 || size() < v, "Bad hint"); + _hint = v; + } + + size_t get_better_size(); + + // Accessors for statistics + void init_statistics(bool split_birth = false); + + AllocationStats* allocation_stats() { + assert_proper_lock_protection(); + return &_allocation_stats; + } + + ssize_t desired() const { + return _allocation_stats.desired(); + } + void set_desired(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_desired(v); + } + void compute_desired(float inter_sweep_current, + float inter_sweep_estimate, + float intra_sweep_estimate) { + assert_proper_lock_protection(); + _allocation_stats.compute_desired(count(), + inter_sweep_current, + inter_sweep_estimate, + intra_sweep_estimate); + } + ssize_t coal_desired() const { + return _allocation_stats.coal_desired(); + } + void set_coal_desired(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_coal_desired(v); + } + + ssize_t surplus() const { + return _allocation_stats.surplus(); + } + void set_surplus(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_surplus(v); + } + void increment_surplus() { + assert_proper_lock_protection(); + _allocation_stats.increment_surplus(); + } + void decrement_surplus() { + assert_proper_lock_protection(); + _allocation_stats.decrement_surplus(); + } + + ssize_t bfr_surp() const { + return _allocation_stats.bfr_surp(); + } + void set_bfr_surp(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_bfr_surp(v); + } + ssize_t prev_sweep() const { + return _allocation_stats.prev_sweep(); + } + void set_prev_sweep(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_prev_sweep(v); + } + ssize_t before_sweep() const { + return _allocation_stats.before_sweep(); + } + void set_before_sweep(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_before_sweep(v); + } + + ssize_t coal_births() const { + return _allocation_stats.coal_births(); + } + void set_coal_births(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_coal_births(v); + } + void increment_coal_births() { + assert_proper_lock_protection(); + _allocation_stats.increment_coal_births(); + } + + ssize_t coal_deaths() const { + return _allocation_stats.coal_deaths(); + } + void set_coal_deaths(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_coal_deaths(v); + } + void increment_coal_deaths() { + assert_proper_lock_protection(); + _allocation_stats.increment_coal_deaths(); + } + + ssize_t split_births() const { + return _allocation_stats.split_births(); + } + void set_split_births(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_split_births(v); + } + void increment_split_births() { + assert_proper_lock_protection(); + _allocation_stats.increment_split_births(); + } + + ssize_t split_deaths() const { + return _allocation_stats.split_deaths(); + } + void set_split_deaths(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_split_deaths(v); + } + void increment_split_deaths() { + assert_proper_lock_protection(); + _allocation_stats.increment_split_deaths(); + } + +#ifndef PRODUCT + // For debugging. The "_returned_bytes" in all the lists are summed + // and compared with the total number of bytes swept during a + // collection. + size_t returned_bytes() const { return _allocation_stats.returned_bytes(); } + void set_returned_bytes(size_t v) { _allocation_stats.set_returned_bytes(v); } + void increment_returned_bytes_by(size_t v) { + _allocation_stats.set_returned_bytes(_allocation_stats.returned_bytes() + v); + } + // Stats verification + void verify_stats() const; +#endif // NOT PRODUCT +}; + +#endif // SHARE_VM_MEMORY_ADAPTIVEFREELIST_HPP diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp index eac32b1eaea..2f43c987669 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp @@ -91,7 +91,7 @@ CompactibleFreeListSpace::CompactibleFreeListSpace(BlockOffsetSharedArray* bs, _collector(NULL) { assert(sizeof(FreeChunk) / BytesPerWord <= MinChunkSize, - "FreeChunk is larger than expected"); + "FreeChunk is larger than expected"); _bt.set_space(this); initialize(mr, SpaceDecorator::Clear, SpaceDecorator::Mangle); // We have all of "mr", all of which we place in the dictionary @@ -101,14 +101,14 @@ CompactibleFreeListSpace::CompactibleFreeListSpace(BlockOffsetSharedArray* bs, // implementation, namely, the simple binary tree (splaying // temporarily disabled). switch (dictionaryChoice) { + case FreeBlockDictionary::dictionaryBinaryTree: + _dictionary = new BinaryTreeDictionary(mr); + break; case FreeBlockDictionary::dictionarySplayTree: case FreeBlockDictionary::dictionarySkipList: default: warning("dictionaryChoice: selected option not understood; using" " default BinaryTreeDictionary implementation instead."); - case FreeBlockDictionary::dictionaryBinaryTree: - _dictionary = new BinaryTreeDictionary(mr, use_adaptive_freelists); - break; } assert(_dictionary != NULL, "CMS dictionary initialization"); // The indexed free lists are initially all empty and are lazily @@ -453,7 +453,7 @@ const { reportIndexedFreeListStatistics(); gclog_or_tty->print_cr("Layout of Indexed Freelists"); gclog_or_tty->print_cr("---------------------------"); - FreeList::print_labels_on(st, "size"); + AdaptiveFreeList::print_labels_on(st, "size"); for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { _indexedFreeList[i].print_on(gclog_or_tty); for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; @@ -1319,7 +1319,7 @@ FreeChunk* CompactibleFreeListSpace::getChunkFromGreater(size_t numWords) { size_t currSize = numWords + MinChunkSize; assert(currSize % MinObjAlignment == 0, "currSize should be aligned"); for (i = currSize; i < IndexSetSize; i += IndexSetStride) { - FreeList* fl = &_indexedFreeList[i]; + AdaptiveFreeList* fl = &_indexedFreeList[i]; if (fl->head()) { ret = getFromListGreater(fl, numWords); assert(ret == NULL || ret->is_free(), "Should be returning a free chunk"); @@ -1702,7 +1702,9 @@ CompactibleFreeListSpace::returnChunkToDictionary(FreeChunk* chunk) { _dictionary->return_chunk(chunk); #ifndef PRODUCT if (CMSCollector::abstract_state() != CMSCollector::Sweeping) { - TreeChunk::as_TreeChunk(chunk)->list()->verify_stats(); + TreeChunk* tc = TreeChunk::as_TreeChunk(chunk); + TreeList* tl = tc->list(); + tl->verify_stats(); } #endif // PRODUCT } @@ -1745,7 +1747,7 @@ CompactibleFreeListSpace::addChunkToFreeListsAtEndRecordingStats( { MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag); ec = dictionary()->find_largest_dict(); // get largest block - if (ec != NULL && ec->end() == chunk) { + if (ec != NULL && ec->end() == (uintptr_t*) chunk) { // It's a coterminal block - we can coalesce. size_t old_size = ec->size(); coalDeath(old_size); @@ -1850,11 +1852,11 @@ FreeChunk* CompactibleFreeListSpace::bestFitSmall(size_t numWords) { the excess is >= MIN_CHUNK. */ size_t start = align_object_size(numWords + MinChunkSize); if (start < IndexSetSize) { - FreeList* it = _indexedFreeList; + AdaptiveFreeList* it = _indexedFreeList; size_t hint = _indexedFreeList[start].hint(); while (hint < IndexSetSize) { assert(hint % MinObjAlignment == 0, "hint should be aligned"); - FreeList *fl = &_indexedFreeList[hint]; + AdaptiveFreeList *fl = &_indexedFreeList[hint]; if (fl->surplus() > 0 && fl->head() != NULL) { // Found a list with surplus, reset original hint // and split out a free chunk which is returned. @@ -1873,7 +1875,7 @@ FreeChunk* CompactibleFreeListSpace::bestFitSmall(size_t numWords) { } /* Requires fl->size >= numWords + MinChunkSize */ -FreeChunk* CompactibleFreeListSpace::getFromListGreater(FreeList* fl, +FreeChunk* CompactibleFreeListSpace::getFromListGreater(AdaptiveFreeList* fl, size_t numWords) { FreeChunk *curr = fl->head(); size_t oldNumWords = curr->size(); @@ -2155,7 +2157,7 @@ void CompactibleFreeListSpace::beginSweepFLCensus( assert_locked(); size_t i; for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { - FreeList* fl = &_indexedFreeList[i]; + AdaptiveFreeList* fl = &_indexedFreeList[i]; if (PrintFLSStatistics > 1) { gclog_or_tty->print("size[%d] : ", i); } @@ -2174,7 +2176,7 @@ void CompactibleFreeListSpace::setFLSurplus() { assert_locked(); size_t i; for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { - FreeList *fl = &_indexedFreeList[i]; + AdaptiveFreeList *fl = &_indexedFreeList[i]; fl->set_surplus(fl->count() - (ssize_t)((double)fl->desired() * CMSSmallSplitSurplusPercent)); } @@ -2185,7 +2187,7 @@ void CompactibleFreeListSpace::setFLHints() { size_t i; size_t h = IndexSetSize; for (i = IndexSetSize - 1; i != 0; i -= IndexSetStride) { - FreeList *fl = &_indexedFreeList[i]; + AdaptiveFreeList *fl = &_indexedFreeList[i]; fl->set_hint(h); if (fl->surplus() > 0) { h = i; @@ -2197,7 +2199,7 @@ void CompactibleFreeListSpace::clearFLCensus() { assert_locked(); size_t i; for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { - FreeList *fl = &_indexedFreeList[i]; + AdaptiveFreeList *fl = &_indexedFreeList[i]; fl->set_prev_sweep(fl->count()); fl->set_coal_births(0); fl->set_coal_deaths(0); @@ -2224,7 +2226,7 @@ void CompactibleFreeListSpace::endSweepFLCensus(size_t sweep_count) { bool CompactibleFreeListSpace::coalOverPopulated(size_t size) { if (size < SmallForDictionary) { - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; return (fl->coal_desired() < 0) || ((int)fl->count() > fl->coal_desired()); } else { @@ -2234,14 +2236,14 @@ bool CompactibleFreeListSpace::coalOverPopulated(size_t size) { void CompactibleFreeListSpace::smallCoalBirth(size_t size) { assert(size < SmallForDictionary, "Size too large for indexed list"); - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; fl->increment_coal_births(); fl->increment_surplus(); } void CompactibleFreeListSpace::smallCoalDeath(size_t size) { assert(size < SmallForDictionary, "Size too large for indexed list"); - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; fl->increment_coal_deaths(); fl->decrement_surplus(); } @@ -2250,7 +2252,7 @@ void CompactibleFreeListSpace::coalBirth(size_t size) { if (size < SmallForDictionary) { smallCoalBirth(size); } else { - dictionary()->dict_census_udpate(size, + dictionary()->dict_census_update(size, false /* split */, true /* birth */); } @@ -2260,7 +2262,7 @@ void CompactibleFreeListSpace::coalDeath(size_t size) { if(size < SmallForDictionary) { smallCoalDeath(size); } else { - dictionary()->dict_census_udpate(size, + dictionary()->dict_census_update(size, false /* split */, false /* birth */); } @@ -2268,14 +2270,14 @@ void CompactibleFreeListSpace::coalDeath(size_t size) { void CompactibleFreeListSpace::smallSplitBirth(size_t size) { assert(size < SmallForDictionary, "Size too large for indexed list"); - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; fl->increment_split_births(); fl->increment_surplus(); } void CompactibleFreeListSpace::smallSplitDeath(size_t size) { assert(size < SmallForDictionary, "Size too large for indexed list"); - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; fl->increment_split_deaths(); fl->decrement_surplus(); } @@ -2284,7 +2286,7 @@ void CompactibleFreeListSpace::split_birth(size_t size) { if (size < SmallForDictionary) { smallSplitBirth(size); } else { - dictionary()->dict_census_udpate(size, + dictionary()->dict_census_update(size, true /* split */, true /* birth */); } @@ -2294,7 +2296,7 @@ void CompactibleFreeListSpace::splitDeath(size_t size) { if (size < SmallForDictionary) { smallSplitDeath(size); } else { - dictionary()->dict_census_udpate(size, + dictionary()->dict_census_update(size, true /* split */, false /* birth */); } @@ -2517,10 +2519,10 @@ void CompactibleFreeListSpace::verifyIndexedFreeList(size_t size) const { #ifndef PRODUCT void CompactibleFreeListSpace::check_free_list_consistency() const { - assert(_dictionary->min_size() <= IndexSetSize, + assert((TreeChunk::min_size() <= IndexSetSize), "Some sizes can't be allocated without recourse to" " linear allocation buffers"); - assert(BinaryTreeDictionary::min_tree_chunk_size*HeapWordSize == sizeof(TreeChunk), + assert((TreeChunk::min_size()*HeapWordSize == sizeof(TreeChunk)), "else MIN_TREE_CHUNK_SIZE is wrong"); assert(IndexSetStart != 0, "IndexSetStart not initialized"); assert(IndexSetStride != 0, "IndexSetStride not initialized"); @@ -2529,15 +2531,15 @@ void CompactibleFreeListSpace::check_free_list_consistency() const { void CompactibleFreeListSpace::printFLCensus(size_t sweep_count) const { assert_lock_strong(&_freelistLock); - FreeList total; + AdaptiveFreeList total; gclog_or_tty->print("end sweep# " SIZE_FORMAT "\n", sweep_count); - FreeList::print_labels_on(gclog_or_tty, "size"); + AdaptiveFreeList::print_labels_on(gclog_or_tty, "size"); size_t total_free = 0; for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { - const FreeList *fl = &_indexedFreeList[i]; + const AdaptiveFreeList *fl = &_indexedFreeList[i]; total_free += fl->count() * fl->size(); if (i % (40*IndexSetStride) == 0) { - FreeList::print_labels_on(gclog_or_tty, "size"); + AdaptiveFreeList::print_labels_on(gclog_or_tty, "size"); } fl->print_on(gclog_or_tty); total.set_bfr_surp( total.bfr_surp() + fl->bfr_surp() ); @@ -2620,7 +2622,7 @@ HeapWord* CFLS_LAB::alloc(size_t word_sz) { res = _cfls->getChunkFromDictionaryExact(word_sz); if (res == NULL) return NULL; } else { - FreeList* fl = &_indexedFreeList[word_sz]; + AdaptiveFreeList* fl = &_indexedFreeList[word_sz]; if (fl->count() == 0) { // Attempt to refill this local free list. get_from_global_pool(word_sz, fl); @@ -2640,7 +2642,7 @@ HeapWord* CFLS_LAB::alloc(size_t word_sz) { // Get a chunk of blocks of the right size and update related // book-keeping stats -void CFLS_LAB::get_from_global_pool(size_t word_sz, FreeList* fl) { +void CFLS_LAB::get_from_global_pool(size_t word_sz, AdaptiveFreeList* fl) { // Get the #blocks we want to claim size_t n_blks = (size_t)_blocks_to_claim[word_sz].average(); assert(n_blks > 0, "Error"); @@ -2722,7 +2724,7 @@ void CFLS_LAB::retire(int tid) { if (num_retire > 0) { _cfls->_indexedFreeList[i].prepend(&_indexedFreeList[i]); // Reset this list. - _indexedFreeList[i] = FreeList(); + _indexedFreeList[i] = AdaptiveFreeList(); _indexedFreeList[i].set_size(i); } } @@ -2736,7 +2738,7 @@ void CFLS_LAB::retire(int tid) { } } -void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n, FreeList* fl) { +void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n, AdaptiveFreeList* fl) { assert(fl->count() == 0, "Precondition."); assert(word_sz < CompactibleFreeListSpace::IndexSetSize, "Precondition"); @@ -2752,12 +2754,12 @@ void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n (cur_sz < CompactibleFreeListSpace::IndexSetSize) && (CMSSplitIndexedFreeListBlocks || k <= 1); k++, cur_sz = k * word_sz) { - FreeList fl_for_cur_sz; // Empty. + AdaptiveFreeList fl_for_cur_sz; // Empty. fl_for_cur_sz.set_size(cur_sz); { MutexLockerEx x(_indexedFreeListParLocks[cur_sz], Mutex::_no_safepoint_check_flag); - FreeList* gfl = &_indexedFreeList[cur_sz]; + AdaptiveFreeList* gfl = &_indexedFreeList[cur_sz]; if (gfl->count() != 0) { // nn is the number of chunks of size cur_sz that // we'd need to split k-ways each, in order to create @@ -2832,12 +2834,11 @@ void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n MutexLockerEx x(parDictionaryAllocLock(), Mutex::_no_safepoint_check_flag); while (n > 0) { - fc = dictionary()->get_chunk(MAX2(n * word_sz, - _dictionary->min_size()), + fc = dictionary()->get_chunk(MAX2(n * word_sz, _dictionary->min_size()), FreeBlockDictionary::atLeast); if (fc != NULL) { _bt.allocated((HeapWord*)fc, fc->size(), true /* reducing */); // update _unallocated_blk - dictionary()->dict_census_udpate(fc->size(), + dictionary()->dict_census_update(fc->size(), true /*split*/, false /*birth*/); break; @@ -2890,7 +2891,7 @@ void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n fc->set_size(prefix_size); if (rem >= IndexSetSize) { returnChunkToDictionary(rem_fc); - dictionary()->dict_census_udpate(rem, true /*split*/, true /*birth*/); + dictionary()->dict_census_update(rem, true /*split*/, true /*birth*/); rem_fc = NULL; } // Otherwise, return it to the small list below. diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp index 4d247356d50..1b3d93ed248 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp @@ -25,6 +25,7 @@ #ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP #define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP +#include "gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp" #include "gc_implementation/concurrentMarkSweep/promotionInfo.hpp" #include "memory/binaryTreeDictionary.hpp" #include "memory/blockOffsetTable.inline.hpp" @@ -38,6 +39,7 @@ class CompactibleFreeListSpace; class BlkClosure; class BlkClosureCareful; +class FreeChunk; class UpwardsObjectClosure; class ObjectClosureCareful; class Klass; @@ -131,7 +133,7 @@ class CompactibleFreeListSpace: public CompactibleSpace { FreeBlockDictionary::DictionaryChoice _dictionaryChoice; FreeBlockDictionary* _dictionary; // ptr to dictionary for large size blocks - FreeList _indexedFreeList[IndexSetSize]; + AdaptiveFreeList _indexedFreeList[IndexSetSize]; // indexed array for small size blocks // allocation stategy bool _fitStrategy; // Use best fit strategy. @@ -168,7 +170,7 @@ class CompactibleFreeListSpace: public CompactibleSpace { // If the count of "fl" is negative, it's absolute value indicates a // number of free chunks that had been previously "borrowed" from global // list of size "word_sz", and must now be decremented. - void par_get_chunk_of_blocks(size_t word_sz, size_t n, FreeList* fl); + void par_get_chunk_of_blocks(size_t word_sz, size_t n, AdaptiveFreeList* fl); // Allocation helper functions // Allocate using a strategy that takes from the indexed free lists @@ -214,7 +216,7 @@ class CompactibleFreeListSpace: public CompactibleSpace { // and return it. The split off remainder is returned to // the free lists. The old name for getFromListGreater // was lookInListGreater. - FreeChunk* getFromListGreater(FreeList* fl, size_t numWords); + FreeChunk* getFromListGreater(AdaptiveFreeList* fl, size_t numWords); // Get a chunk in the indexed free list or dictionary, // by considering a larger chunk and splitting it. FreeChunk* getChunkFromGreater(size_t numWords); @@ -621,7 +623,7 @@ class CFLS_LAB : public CHeapObj { CompactibleFreeListSpace* _cfls; // Our local free lists. - FreeList _indexedFreeList[CompactibleFreeListSpace::IndexSetSize]; + AdaptiveFreeList _indexedFreeList[CompactibleFreeListSpace::IndexSetSize]; // Initialized from a command-line arg. @@ -634,7 +636,7 @@ class CFLS_LAB : public CHeapObj { size_t _num_blocks [CompactibleFreeListSpace::IndexSetSize]; // Internal work method - void get_from_global_pool(size_t word_sz, FreeList* fl); + void get_from_global_pool(size_t word_sz, AdaptiveFreeList* fl); public: CFLS_LAB(CompactibleFreeListSpace* cfls); diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index ac8b70017e0..475f2b8fee1 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -9143,7 +9143,7 @@ void ASConcurrentMarkSweepGeneration::shrink_by(size_t desired_bytes) { size_t shrinkable_size_in_bytes = chunk_at_end->size(); size_t aligned_shrinkable_size_in_bytes = align_size_down(shrinkable_size_in_bytes, os::vm_page_size()); - assert(unallocated_start <= chunk_at_end->end(), + assert(unallocated_start <= (HeapWord*) chunk_at_end->end(), "Inconsistent chunk at end of space"); size_t bytes = MIN2(desired_bytes, aligned_shrinkable_size_in_bytes); size_t word_size_before = heap_word_size(_virtual_space.committed_size()); @@ -9210,7 +9210,7 @@ void ASConcurrentMarkSweepGeneration::shrink_by(size_t desired_bytes) { assert(_cmsSpace->unallocated_block() <= _cmsSpace->end(), "Inconsistency at end of space"); - assert(chunk_at_end->end() == _cmsSpace->end(), + assert(chunk_at_end->end() == (uintptr_t*) _cmsSpace->end(), "Shrinking is inconsistent"); return; } diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp index 21934bca81c..8376e8798d8 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp @@ -133,7 +133,7 @@ class FreeChunk VALUE_OBJ_CLASS_SPEC { } // Return the address past the end of this chunk - HeapWord* end() const { return ((HeapWord*) this) + size(); } + uintptr_t* end() const { return ((uintptr_t*) this) + size(); } // debugging void verify() const PRODUCT_RETURN; diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp index c393a55285c..b722779b897 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp @@ -25,6 +25,8 @@ #ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_VMSTRUCTS_CMS_HPP #define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_VMSTRUCTS_CMS_HPP +typedef BinaryTreeDictionary AFLBinaryTreeDictionary; + #define VM_STRUCTS_CMS(nonstatic_field, \ volatile_nonstatic_field, \ static_field) \ @@ -38,14 +40,8 @@ nonstatic_field(CMSCollector, _markBitMap, CMSBitMap) \ nonstatic_field(ConcurrentMarkSweepGeneration, _cmsSpace, CompactibleFreeListSpace*) \ static_field(ConcurrentMarkSweepThread, _collector, CMSCollector*) \ - volatile_nonstatic_field(FreeChunk, _size, size_t) \ - nonstatic_field(FreeChunk, _next, FreeChunk*) \ - nonstatic_field(FreeChunk, _prev, FreeChunk*) \ nonstatic_field(LinearAllocBlock, _word_size, size_t) \ - nonstatic_field(FreeList, _size, size_t) \ - nonstatic_field(FreeList, _count, ssize_t) \ - nonstatic_field(BinaryTreeDictionary,_total_size, size_t) \ - nonstatic_field(CompactibleFreeListSpace, _dictionary, FreeBlockDictionary*) \ + nonstatic_field(AFLBinaryTreeDictionary, _total_size, size_t) \ nonstatic_field(CompactibleFreeListSpace, _indexedFreeList[0], FreeList) \ nonstatic_field(CompactibleFreeListSpace, _smallLinearAllocBlock, LinearAllocBlock) @@ -60,19 +56,17 @@ declare_toplevel_type(CMSCollector) \ declare_toplevel_type(CMSBitMap) \ declare_toplevel_type(FreeChunk) \ + declare_toplevel_type(Metablock) \ declare_toplevel_type(ConcurrentMarkSweepThread*) \ declare_toplevel_type(ConcurrentMarkSweepGeneration*) \ declare_toplevel_type(SurrogateLockerThread*) \ declare_toplevel_type(CompactibleFreeListSpace*) \ declare_toplevel_type(CMSCollector*) \ - declare_toplevel_type(FreeChunk*) \ - declare_toplevel_type(BinaryTreeDictionary*) \ - declare_toplevel_type(FreeBlockDictionary*) \ - declare_toplevel_type(FreeList*) \ - declare_toplevel_type(FreeList) \ + declare_toplevel_type(AFLBinaryTreeDictionary*) \ declare_toplevel_type(LinearAllocBlock) \ declare_toplevel_type(FreeBlockDictionary) \ - declare_type(BinaryTreeDictionary, FreeBlockDictionary) + declare_type(AFLBinaryTreeDictionary, FreeBlockDictionary) \ + declare_type(AFLBinaryTreeDictionary, FreeBlockDictionary) \ #define VM_INT_CONSTANTS_CMS(declare_constant) \ declare_constant(Generation::ConcurrentMarkSweep) \ diff --git a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp index 3966877e489..285ef97e378 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp @@ -191,7 +191,7 @@ class VM_GenCollectFull: public VM_GC_Operation { class VM_CollectForMetadataAllocation: public VM_GC_Operation { private: MetaWord* _result; - size_t _size; // size of object to be allocated + size_t _size; // size of object to be allocated Metaspace::MetadataType _mdtype; ClassLoaderData* _loader_data; public: diff --git a/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp b/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp index 08a9b033432..f79d149f1e5 100644 --- a/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp +++ b/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp @@ -25,9 +25,15 @@ #include "precompiled.hpp" #include "gc_implementation/shared/allocationStats.hpp" #include "memory/binaryTreeDictionary.hpp" +#include "memory/freeList.hpp" +#include "memory/freeBlockDictionary.hpp" +#include "memory/metablock.hpp" +#include "memory/metachunk.hpp" #include "runtime/globals.hpp" #include "utilities/ostream.hpp" #ifndef SERIALGC +#include "gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp" +#include "gc_implementation/concurrentMarkSweep/freeChunk.hpp" #include "gc_implementation/shared/spaceDecorator.hpp" #include "gc_implementation/concurrentMarkSweep/freeChunk.hpp" #endif // SERIALGC @@ -37,15 +43,18 @@ // This is currently used in the Concurrent Mark&Sweep implementation. //////////////////////////////////////////////////////////////////////////////// -template -TreeChunk* TreeChunk::as_TreeChunk(Chunk* fc) { +template class FreeList_t> +size_t TreeChunk::_min_tree_chunk_size = sizeof(TreeChunk)/HeapWordSize; + +template class FreeList_t> +TreeChunk* TreeChunk::as_TreeChunk(Chunk_t* fc) { // Do some assertion checking here. - return (TreeChunk*) fc; + return (TreeChunk*) fc; } -template -void TreeChunk::verify_tree_chunk_list() const { - TreeChunk* nextTC = (TreeChunk*)next(); +template class FreeList_t> +void TreeChunk::verify_tree_chunk_list() const { + TreeChunk* nextTC = (TreeChunk*)next(); if (prev() != NULL) { // interior list node shouldn'r have tree fields guarantee(embedded_list()->parent() == NULL && embedded_list()->left() == NULL && embedded_list()->right() == NULL, "should be clear"); @@ -57,53 +66,113 @@ void TreeChunk::verify_tree_chunk_list() const { } } +template class FreeList_t> +TreeList::TreeList() {} -template -TreeList* TreeList::as_TreeList(TreeChunk* tc) { +template class FreeList_t> +TreeList* +TreeList::as_TreeList(TreeChunk* tc) { // This first free chunk in the list will be the tree list. - assert(tc->size() >= BinaryTreeDictionary::min_tree_chunk_size, "Chunk is too small for a TreeChunk"); - TreeList* tl = tc->embedded_list(); + assert((tc->size() >= (TreeChunk::min_size())), + "Chunk is too small for a TreeChunk"); + TreeList* tl = tc->embedded_list(); + tl->initialize(); tc->set_list(tl); -#ifdef ASSERT - tl->set_protecting_lock(NULL); -#endif - tl->set_hint(0); tl->set_size(tc->size()); tl->link_head(tc); tl->link_tail(tc); tl->set_count(1); - tl->init_statistics(true /* split_birth */); - tl->set_parent(NULL); - tl->set_left(NULL); - tl->set_right(NULL); + return tl; } -template -TreeList* TreeList::as_TreeList(HeapWord* addr, size_t size) { - TreeChunk* tc = (TreeChunk*) addr; - assert(size >= BinaryTreeDictionary::min_tree_chunk_size, "Chunk is too small for a TreeChunk"); - // The space in the heap will have been mangled initially but - // is not remangled when a free chunk is returned to the free list + +template class FreeList_t> +TreeList* +get_chunk(size_t size, enum FreeBlockDictionary::Dither dither) { + FreeBlockDictionary::verify_par_locked(); + Chunk_t* res = get_chunk_from_tree(size, dither); + assert(res == NULL || res->is_free(), + "Should be returning a free chunk"); + assert(dither != FreeBlockDictionary::exactly || + res->size() == size, "Not correct size"); + return res; +} + +template class FreeList_t> +TreeList* +TreeList::as_TreeList(HeapWord* addr, size_t size) { + TreeChunk* tc = (TreeChunk*) addr; + assert((size >= TreeChunk::min_size()), + "Chunk is too small for a TreeChunk"); + // The space will have been mangled initially but + // is not remangled when a Chunk_t is returned to the free list // (since it is used to maintain the chunk on the free list). - assert((ZapUnusedHeapArea && - SpaceMangler::is_mangled((HeapWord*) tc->size_addr()) && - SpaceMangler::is_mangled((HeapWord*) tc->prev_addr()) && - SpaceMangler::is_mangled((HeapWord*) tc->next_addr())) || - (tc->size() == 0 && tc->prev() == NULL && tc->next() == NULL), - "Space should be clear or mangled"); + tc->assert_is_mangled(); tc->set_size(size); tc->link_prev(NULL); tc->link_next(NULL); - TreeList* tl = TreeList::as_TreeList(tc); + TreeList* tl = TreeList::as_TreeList(tc); return tl; } -template -TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk* tc) { - TreeList* retTL = this; - Chunk* list = head(); +#ifndef SERIALGC +// Specialize for AdaptiveFreeList which tries to avoid +// splitting a chunk of a size that is under populated in favor of +// an over populated size. The general get_better_list() just returns +// the current list. +template <> +TreeList* +TreeList::get_better_list( + BinaryTreeDictionary* dictionary) { + // A candidate chunk has been found. If it is already under + // populated, get a chunk associated with the hint for this + // chunk. + + TreeList* curTL = this; + if (surplus() <= 0) { + /* Use the hint to find a size with a surplus, and reset the hint. */ + TreeList* hintTL = this; + while (hintTL->hint() != 0) { + assert(hintTL->hint() > hintTL->size(), + "hint points in the wrong direction"); + hintTL = dictionary->find_list(hintTL->hint()); + assert(curTL != hintTL, "Infinite loop"); + if (hintTL == NULL || + hintTL == curTL /* Should not happen but protect against it */ ) { + // No useful hint. Set the hint to NULL and go on. + curTL->set_hint(0); + break; + } + assert(hintTL->size() > curTL->size(), "hint is inconsistent"); + if (hintTL->surplus() > 0) { + // The hint led to a list that has a surplus. Use it. + // Set the hint for the candidate to an overpopulated + // size. + curTL->set_hint(hintTL->size()); + // Change the candidate. + curTL = hintTL; + break; + } + } + } + return curTL; +} +#endif // SERIALGC + +template class FreeList_t> +TreeList* +TreeList::get_better_list( + BinaryTreeDictionary* dictionary) { + return this; +} + +template class FreeList_t> +TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk* tc) { + + TreeList* retTL = this; + Chunk_t* list = head(); assert(!list || list != list->next(), "Chunk on list twice"); assert(tc != NULL, "Chunk being removed is NULL"); assert(parent() == NULL || this == parent()->left() || @@ -112,13 +181,13 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunkprev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); - Chunk* prevFC = tc->prev(); - TreeChunk* nextTC = TreeChunk::as_TreeChunk(tc->next()); + Chunk_t* prevFC = tc->prev(); + TreeChunk* nextTC = TreeChunk::as_TreeChunk(tc->next()); assert(list != NULL, "should have at least the target chunk"); // Is this the first item on the list? if (tc == list) { - // The "getChunk..." functions for a TreeList will not return the + // The "getChunk..." functions for a TreeList will not return the // first chunk in the list unless it is the last chunk in the list // because the first chunk is also acting as the tree node. // When coalescing happens, however, the first chunk in the a tree @@ -127,8 +196,8 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk from the first chunk to the next chunk and update all - // the TreeList pointers in the chunks in the list. + // TreeList from the first chunk to the next chunk and update all + // the TreeList pointers in the chunks in the list. if (nextTC == NULL) { assert(prevFC == NULL, "Not last chunk in the list"); set_tail(NULL); @@ -141,11 +210,11 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk* curTC = nextTC; curTC != NULL; - curTC = TreeChunk::as_TreeChunk(curTC->next())) { + for (TreeChunk* curTC = nextTC; curTC != NULL; + curTC = TreeChunk::as_TreeChunk(curTC->next())) { curTC->set_list(retTL); } - // Fix the parent to point to the new TreeList. + // Fix the parent to point to the new TreeList. if (retTL->parent() != NULL) { if (this == retTL->parent()->left()) { retTL->parent()->set_left(retTL); @@ -176,9 +245,9 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunklink_after(nextTC); } - // Below this point the embeded TreeList being used for the + // Below this point the embeded TreeList being used for the // tree node may have changed. Don't use "this" - // TreeList*. + // TreeList*. // chunk should still be a free chunk (bit set in _prev) assert(!retTL->head() || retTL->size() == retTL->head()->size(), "Wrong sized chunk in list"); @@ -188,7 +257,7 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunkset_list(NULL); bool prev_found = false; bool next_found = false; - for (Chunk* curFC = retTL->head(); + for (Chunk_t* curFC = retTL->head(); curFC != NULL; curFC = curFC->next()) { assert(curFC != tc, "Chunk is still in list"); if (curFC == prevFC) { @@ -215,8 +284,8 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk -void TreeList::return_chunk_at_tail(TreeChunk* chunk) { +template class FreeList_t> +void TreeList::return_chunk_at_tail(TreeChunk* chunk) { assert(chunk != NULL, "returning NULL chunk"); assert(chunk->list() == this, "list should be set for chunk"); assert(tail() != NULL, "The tree list is embedded in the first chunk"); @@ -225,12 +294,12 @@ void TreeList::return_chunk_at_tail(TreeChunk* chunk) { assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); - Chunk* fc = tail(); + Chunk_t* fc = tail(); fc->link_after(chunk); link_tail(chunk); assert(!tail() || size() == tail()->size(), "Wrong sized chunk in list"); - increment_count(); + FreeList_t::increment_count(); debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); @@ -238,10 +307,10 @@ void TreeList::return_chunk_at_tail(TreeChunk* chunk) { // Add this chunk at the head of the list. "At the head of the list" // is defined to be after the chunk pointer to by head(). This is -// because the TreeList is embedded in the first TreeChunk in the -// list. See the definition of TreeChunk. -template -void TreeList::return_chunk_at_head(TreeChunk* chunk) { +// because the TreeList is embedded in the first TreeChunk in the +// list. See the definition of TreeChunk. +template class FreeList_t> +void TreeList::return_chunk_at_head(TreeChunk* chunk) { assert(chunk->list() == this, "list should be set for chunk"); assert(head() != NULL, "The tree list is embedded in the first chunk"); assert(chunk != NULL, "returning NULL chunk"); @@ -249,7 +318,7 @@ void TreeList::return_chunk_at_head(TreeChunk* chunk) { assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); - Chunk* fc = head()->next(); + Chunk_t* fc = head()->next(); if (fc != NULL) { chunk->link_after(fc); } else { @@ -258,28 +327,38 @@ void TreeList::return_chunk_at_head(TreeChunk* chunk) { } head()->link_after(chunk); assert(!head() || size() == head()->size(), "Wrong sized chunk in list"); - increment_count(); + FreeList_t::increment_count(); debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); } -template -TreeChunk* TreeList::head_as_TreeChunk() { - assert(head() == NULL || TreeChunk::as_TreeChunk(head())->list() == this, - "Wrong type of chunk?"); - return TreeChunk::as_TreeChunk(head()); +template class FreeList_t> +void TreeChunk::assert_is_mangled() const { + assert((ZapUnusedHeapArea && + SpaceMangler::is_mangled((HeapWord*) Chunk_t::size_addr()) && + SpaceMangler::is_mangled((HeapWord*) Chunk_t::prev_addr()) && + SpaceMangler::is_mangled((HeapWord*) Chunk_t::next_addr())) || + (size() == 0 && prev() == NULL && next() == NULL), + "Space should be clear or mangled"); } -template -TreeChunk* TreeList::first_available() { +template class FreeList_t> +TreeChunk* TreeList::head_as_TreeChunk() { + assert(head() == NULL || (TreeChunk::as_TreeChunk(head())->list() == this), + "Wrong type of chunk?"); + return TreeChunk::as_TreeChunk(head()); +} + +template class FreeList_t> +TreeChunk* TreeList::first_available() { assert(head() != NULL, "The head of the list cannot be NULL"); - Chunk* fc = head()->next(); - TreeChunk* retTC; + Chunk_t* fc = head()->next(); + TreeChunk* retTC; if (fc == NULL) { retTC = head_as_TreeChunk(); } else { - retTC = TreeChunk::as_TreeChunk(fc); + retTC = TreeChunk::as_TreeChunk(fc); } assert(retTC->list() == this, "Wrong type of chunk."); return retTC; @@ -288,41 +367,32 @@ TreeChunk* TreeList::first_available() { // Returns the block with the largest heap address amongst // those in the list for this size; potentially slow and expensive, // use with caution! -template -TreeChunk* TreeList::largest_address() { +template class FreeList_t> +TreeChunk* TreeList::largest_address() { assert(head() != NULL, "The head of the list cannot be NULL"); - Chunk* fc = head()->next(); - TreeChunk* retTC; + Chunk_t* fc = head()->next(); + TreeChunk* retTC; if (fc == NULL) { retTC = head_as_TreeChunk(); } else { // walk down the list and return the one with the highest // heap address among chunks of this size. - Chunk* last = fc; + Chunk_t* last = fc; while (fc->next() != NULL) { if ((HeapWord*)last < (HeapWord*)fc) { last = fc; } fc = fc->next(); } - retTC = TreeChunk::as_TreeChunk(last); + retTC = TreeChunk::as_TreeChunk(last); } assert(retTC->list() == this, "Wrong type of chunk."); return retTC; } -template -BinaryTreeDictionary::BinaryTreeDictionary(bool adaptive_freelists, bool splay) : - _splay(splay), _adaptive_freelists(adaptive_freelists), - _total_size(0), _total_free_blocks(0), _root(0) {} - -template -BinaryTreeDictionary::BinaryTreeDictionary(MemRegion mr, - bool adaptive_freelists, - bool splay): - _adaptive_freelists(adaptive_freelists), _splay(splay) -{ - assert(mr.word_size() >= BinaryTreeDictionary::min_tree_chunk_size, "minimum chunk size"); +template class FreeList_t> +BinaryTreeDictionary::BinaryTreeDictionary(MemRegion mr) { + assert((mr.byte_size() > min_size()), "minimum chunk size"); reset(mr); assert(root()->left() == NULL, "reset check failed"); @@ -333,52 +403,48 @@ BinaryTreeDictionary::BinaryTreeDictionary(MemRegion mr, assert(total_free_blocks() == 1, "reset check failed"); } -template -void BinaryTreeDictionary::inc_total_size(size_t inc) { +template class FreeList_t> +void BinaryTreeDictionary::inc_total_size(size_t inc) { _total_size = _total_size + inc; } -template -void BinaryTreeDictionary::dec_total_size(size_t dec) { +template class FreeList_t> +void BinaryTreeDictionary::dec_total_size(size_t dec) { _total_size = _total_size - dec; } -template -void BinaryTreeDictionary::reset(MemRegion mr) { - assert(mr.word_size() >= BinaryTreeDictionary::min_tree_chunk_size, "minimum chunk size"); - set_root(TreeList::as_TreeList(mr.start(), mr.word_size())); +template class FreeList_t> +void BinaryTreeDictionary::reset(MemRegion mr) { + assert((mr.byte_size() > min_size()), "minimum chunk size"); + set_root(TreeList::as_TreeList(mr.start(), mr.word_size())); set_total_size(mr.word_size()); set_total_free_blocks(1); } -template -void BinaryTreeDictionary::reset(HeapWord* addr, size_t byte_size) { +template class FreeList_t> +void BinaryTreeDictionary::reset(HeapWord* addr, size_t byte_size) { MemRegion mr(addr, heap_word_size(byte_size)); reset(mr); } -template -void BinaryTreeDictionary::reset() { +template class FreeList_t> +void BinaryTreeDictionary::reset() { set_root(NULL); set_total_size(0); set_total_free_blocks(0); } // Get a free block of size at least size from tree, or NULL. -// If a splay step is requested, the removal algorithm (only) incorporates -// a splay step as follows: -// . the search proceeds down the tree looking for a possible -// match. At the (closest) matching location, an appropriate splay step is applied -// (zig, zig-zig or zig-zag). A chunk of the appropriate size is then returned -// if available, and if it's the last chunk, the node is deleted. A deteleted -// node is replaced in place by its tree successor. -template -TreeChunk* -BinaryTreeDictionary::get_chunk_from_tree(size_t size, enum FreeBlockDictionary::Dither dither, bool splay) +template class FreeList_t> +TreeChunk* +BinaryTreeDictionary::get_chunk_from_tree( + size_t size, + enum FreeBlockDictionary::Dither dither) { - TreeList *curTL, *prevTL; - TreeChunk* retTC = NULL; - assert(size >= BinaryTreeDictionary::min_tree_chunk_size, "minimum chunk size"); + TreeList *curTL, *prevTL; + TreeChunk* retTC = NULL; + + assert((size >= min_size()), "minimum chunk size"); if (FLSVerifyDictionary) { verify_tree(); } @@ -398,7 +464,7 @@ BinaryTreeDictionary::get_chunk_from_tree(size_t size, enum FreeBlockDict } if (curTL == NULL) { // couldn't find exact match - if (dither == FreeBlockDictionary::exactly) return NULL; + if (dither == FreeBlockDictionary::exactly) return NULL; // try and find the next larger size by walking back up the search path for (curTL = prevTL; curTL != NULL;) { @@ -410,46 +476,9 @@ BinaryTreeDictionary::get_chunk_from_tree(size_t size, enum FreeBlockDict } if (curTL != NULL) { assert(curTL->size() >= size, "size inconsistency"); - if (adaptive_freelists()) { - // A candidate chunk has been found. If it is already under - // populated, get a chunk associated with the hint for this - // chunk. - if (curTL->surplus() <= 0) { - /* Use the hint to find a size with a surplus, and reset the hint. */ - TreeList* hintTL = curTL; - while (hintTL->hint() != 0) { - assert(hintTL->hint() == 0 || hintTL->hint() > hintTL->size(), - "hint points in the wrong direction"); - hintTL = find_list(hintTL->hint()); - assert(curTL != hintTL, "Infinite loop"); - if (hintTL == NULL || - hintTL == curTL /* Should not happen but protect against it */ ) { - // No useful hint. Set the hint to NULL and go on. - curTL->set_hint(0); - break; - } - assert(hintTL->size() > size, "hint is inconsistent"); - if (hintTL->surplus() > 0) { - // The hint led to a list that has a surplus. Use it. - // Set the hint for the candidate to an overpopulated - // size. - curTL->set_hint(hintTL->size()); - // Change the candidate. - curTL = hintTL; - break; - } - // The evm code reset the hint of the candidate as - // at an interim point. Why? Seems like this leaves - // the hint pointing to a list that didn't work. - // curTL->set_hint(hintTL->size()); - } - } - } - // don't waste time splaying if chunk's singleton - if (splay && curTL->head()->next() != NULL) { - semi_splay_step(curTL); - } + curTL = curTL->get_better_list(this); + retTC = curTL->first_available(); assert((retTC != NULL) && (curTL->count() > 0), "A list in the binary tree should not be NULL"); @@ -465,9 +494,9 @@ BinaryTreeDictionary::get_chunk_from_tree(size_t size, enum FreeBlockDict return retTC; } -template -TreeList* BinaryTreeDictionary::find_list(size_t size) const { - TreeList* curTL; +template class FreeList_t> +TreeList* BinaryTreeDictionary::find_list(size_t size) const { + TreeList* curTL; for (curTL = root(); curTL != NULL;) { if (curTL->size() == size) { // exact match break; @@ -484,10 +513,10 @@ TreeList* BinaryTreeDictionary::find_list(size_t size) const { } -template -bool BinaryTreeDictionary::verify_chunk_in_free_list(Chunk* tc) const { +template class FreeList_t> +bool BinaryTreeDictionary::verify_chunk_in_free_list(Chunk_t* tc) const { size_t size = tc->size(); - TreeList* tl = find_list(size); + TreeList* tl = find_list(size); if (tl == NULL) { return false; } else { @@ -495,9 +524,9 @@ bool BinaryTreeDictionary::verify_chunk_in_free_list(Chunk* tc) const { } } -template -Chunk* BinaryTreeDictionary::find_largest_dict() const { - TreeList *curTL = root(); +template class FreeList_t> +Chunk_t* BinaryTreeDictionary::find_largest_dict() const { + TreeList *curTL = root(); if (curTL != NULL) { while(curTL->right() != NULL) curTL = curTL->right(); return curTL->largest_address(); @@ -510,15 +539,15 @@ Chunk* BinaryTreeDictionary::find_largest_dict() const { // chunk in a list on a tree node, just unlink it. // If it is the last chunk in the list (the next link is NULL), // remove the node and repair the tree. -template -TreeChunk* -BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { +template class FreeList_t> +TreeChunk* +BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { assert(tc != NULL, "Should not call with a NULL chunk"); assert(tc->is_free(), "Header is not marked correctly"); - TreeList *newTL, *parentTL; - TreeChunk* retTC; - TreeList* tl = tc->list(); + TreeList *newTL, *parentTL; + TreeChunk* retTC; + TreeList* tl = tc->list(); debug_only( bool removing_only_chunk = false; if (tl == _root) { @@ -538,8 +567,8 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { retTC = tc; // Removing this chunk can have the side effect of changing the node - // (TreeList*) in the tree. If the node is the root, update it. - TreeList* replacementTL = tl->remove_chunk_replace_if_needed(tc); + // (TreeList*) in the tree. If the node is the root, update it. + TreeList* replacementTL = tl->remove_chunk_replace_if_needed(tc); assert(tc->is_free(), "Chunk should still be free"); assert(replacementTL->parent() == NULL || replacementTL == replacementTL->parent()->left() || @@ -549,17 +578,18 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { assert(replacementTL->parent() == NULL, "Incorrectly replacing root"); set_root(replacementTL); } - debug_only( +#ifdef ASSERT if (tl != replacementTL) { assert(replacementTL->head() != NULL, "If the tree list was replaced, it should not be a NULL list"); - TreeList* rhl = replacementTL->head_as_TreeChunk()->list(); - TreeList* rtl = TreeChunk::as_TreeChunk(replacementTL->tail())->list(); + TreeList* rhl = replacementTL->head_as_TreeChunk()->list(); + TreeList* rtl = + TreeChunk::as_TreeChunk(replacementTL->tail())->list(); assert(rhl == replacementTL, "Broken head"); assert(rtl == replacementTL, "Broken tail"); assert(replacementTL->size() == tc->size(), "Broken size"); } - ) +#endif // Does the tree need to be repaired? if (replacementTL->count() == 0) { @@ -574,7 +604,7 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { } else if (replacementTL->right() == NULL) { // right is NULL newTL = replacementTL->left(); - debug_only(replacementTL->clearLeft();) + debug_only(replacementTL->clear_left();) } else { // we have both children, so, by patriarchal convention, // my replacement is least node in right sub-tree complicated_splice = true; @@ -623,7 +653,7 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { newTL->set_right(replacementTL->right()); debug_only( replacementTL->clear_right(); - replacementTL->clearLeft(); + replacementTL->clear_left(); ) } assert(replacementTL->right() == NULL && @@ -644,21 +674,21 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { verify_tree(); } assert(!removing_only_chunk || _root == NULL, "root should be NULL"); - return TreeChunk::as_TreeChunk(retTC); + return TreeChunk::as_TreeChunk(retTC); } // Remove the leftmost node (lm) in the tree and return it. // If lm has a right child, link it to the left node of // the parent of lm. -template -TreeList* BinaryTreeDictionary::remove_tree_minimum(TreeList* tl) { +template class FreeList_t> +TreeList* BinaryTreeDictionary::remove_tree_minimum(TreeList* tl) { assert(tl != NULL && tl->parent() != NULL, "really need a proper sub-tree"); // locate the subtree minimum by walking down left branches - TreeList* curTL = tl; + TreeList* curTL = tl; for (; curTL->left() != NULL; curTL = curTL->left()); // obviously curTL now has at most one child, a right child if (curTL != root()) { // Should this test just be removed? - TreeList* parentTL = curTL->parent(); + TreeList* parentTL = curTL->parent(); if (parentTL->left() == curTL) { // curTL is a left child parentTL->set_left(curTL->right()); } else { @@ -685,31 +715,14 @@ TreeList* BinaryTreeDictionary::remove_tree_minimum(TreeList -void BinaryTreeDictionary::semi_splay_step(TreeList* tc) { - // apply a semi-splay step at the given node: - // . if root, norting needs to be done - // . if child of root, splay once - // . else zig-zig or sig-zag depending on path from grandparent - if (root() == tc) return; - warning("*** Splaying not yet implemented; " - "tree operations may be inefficient ***"); -} - -template -void BinaryTreeDictionary::insert_chunk_in_tree(Chunk* fc) { - TreeList *curTL, *prevTL; +template class FreeList_t> +void BinaryTreeDictionary::insert_chunk_in_tree(Chunk_t* fc) { + TreeList *curTL, *prevTL; size_t size = fc->size(); - assert(size >= BinaryTreeDictionary::min_tree_chunk_size, "too small to be a TreeList"); + assert((size >= min_size()), + err_msg(SIZE_FORMAT " is too small to be a TreeChunk " SIZE_FORMAT, + size, min_size())); if (FLSVerifyDictionary) { verify_tree(); } @@ -729,9 +742,9 @@ void BinaryTreeDictionary::insert_chunk_in_tree(Chunk* fc) { curTL = curTL->right(); } } - TreeChunk* tc = TreeChunk::as_TreeChunk(fc); + TreeChunk* tc = TreeChunk::as_TreeChunk(fc); // This chunk is being returned to the binary tree. Its embedded - // TreeList should be unused at this point. + // TreeList should be unused at this point. tc->initialize(); if (curTL != NULL) { // exact match tc->set_list(curTL); @@ -739,8 +752,8 @@ void BinaryTreeDictionary::insert_chunk_in_tree(Chunk* fc) { } else { // need a new node in tree tc->clear_next(); tc->link_prev(NULL); - TreeList* newTL = TreeList::as_TreeList(tc); - assert(((TreeChunk*)tc)->list() == newTL, + TreeList* newTL = TreeList::as_TreeList(tc); + assert(((TreeChunk*)tc)->list() == newTL, "List was not initialized correctly"); if (prevTL == NULL) { // we are the only tree node assert(root() == NULL, "control point invariant"); @@ -768,30 +781,30 @@ void BinaryTreeDictionary::insert_chunk_in_tree(Chunk* fc) { } } -template -size_t BinaryTreeDictionary::max_chunk_size() const { - FreeBlockDictionary::verify_par_locked(); - TreeList* tc = root(); +template class FreeList_t> +size_t BinaryTreeDictionary::max_chunk_size() const { + FreeBlockDictionary::verify_par_locked(); + TreeList* tc = root(); if (tc == NULL) return 0; for (; tc->right() != NULL; tc = tc->right()); return tc->size(); } -template -size_t BinaryTreeDictionary::total_list_length(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_list_length(TreeList* tl) const { size_t res; res = tl->count(); #ifdef ASSERT size_t cnt; - Chunk* tc = tl->head(); + Chunk_t* tc = tl->head(); for (cnt = 0; tc != NULL; tc = tc->next(), cnt++); assert(res == cnt, "The count is not being maintained correctly"); #endif return res; } -template -size_t BinaryTreeDictionary::total_size_in_tree(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_size_in_tree(TreeList* tl) const { if (tl == NULL) return 0; return (tl->size() * total_list_length(tl)) + @@ -799,8 +812,8 @@ size_t BinaryTreeDictionary::total_size_in_tree(TreeList* tl) cons total_size_in_tree(tl->right()); } -template -double BinaryTreeDictionary::sum_of_squared_block_sizes(TreeList* const tl) const { +template class FreeList_t> +double BinaryTreeDictionary::sum_of_squared_block_sizes(TreeList* const tl) const { if (tl == NULL) { return 0.0; } @@ -811,8 +824,8 @@ double BinaryTreeDictionary::sum_of_squared_block_sizes(TreeList* return curr; } -template -size_t BinaryTreeDictionary::total_free_blocks_in_tree(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_free_blocks_in_tree(TreeList* tl) const { if (tl == NULL) return 0; return total_list_length(tl) + @@ -820,28 +833,28 @@ size_t BinaryTreeDictionary::total_free_blocks_in_tree(TreeList* t total_free_blocks_in_tree(tl->right()); } -template -size_t BinaryTreeDictionary::num_free_blocks() const { +template class FreeList_t> +size_t BinaryTreeDictionary::num_free_blocks() const { assert(total_free_blocks_in_tree(root()) == total_free_blocks(), "_total_free_blocks inconsistency"); return total_free_blocks(); } -template -size_t BinaryTreeDictionary::tree_height_helper(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::tree_height_helper(TreeList* tl) const { if (tl == NULL) return 0; return 1 + MAX2(tree_height_helper(tl->left()), tree_height_helper(tl->right())); } -template -size_t BinaryTreeDictionary::treeHeight() const { +template class FreeList_t> +size_t BinaryTreeDictionary::tree_height() const { return tree_height_helper(root()); } -template -size_t BinaryTreeDictionary::total_nodes_helper(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_nodes_helper(TreeList* tl) const { if (tl == NULL) { return 0; } @@ -849,14 +862,18 @@ size_t BinaryTreeDictionary::total_nodes_helper(TreeList* tl) cons total_nodes_helper(tl->right()); } -template -size_t BinaryTreeDictionary::total_nodes_in_tree(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_nodes_in_tree(TreeList* tl) const { return total_nodes_helper(root()); } -template -void BinaryTreeDictionary::dict_census_udpate(size_t size, bool split, bool birth){ - TreeList* nd = find_list(size); +template class FreeList_t> +void BinaryTreeDictionary::dict_census_update(size_t size, bool split, bool birth){} + +#ifndef SERIALGC +template <> +void BinaryTreeDictionary::dict_census_update(size_t size, bool split, bool birth){ + TreeList* nd = find_list(size); if (nd) { if (split) { if (birth) { @@ -882,16 +899,26 @@ void BinaryTreeDictionary::dict_census_udpate(size_t size, bool split, bo // This is a birth associated with a LinAB. The chunk // for the LinAB is not in the dictionary. } +#endif // SERIALGC -template -bool BinaryTreeDictionary::coal_dict_over_populated(size_t size) { +template class FreeList_t> +bool BinaryTreeDictionary::coal_dict_over_populated(size_t size) { + // For the general type of freelists, encourage coalescing by + // returning true. + return true; +} + +#ifndef SERIALGC +template <> +bool BinaryTreeDictionary::coal_dict_over_populated(size_t size) { if (FLSAlwaysCoalesceLarge) return true; - TreeList* list_of_size = find_list(size); + TreeList* list_of_size = find_list(size); // None of requested size implies overpopulated. return list_of_size == NULL || list_of_size->coal_desired() <= 0 || list_of_size->count() > list_of_size->coal_desired(); } +#endif // SERIALGC // Closures for walking the binary tree. // do_list() walks the free list in a node applying the closure @@ -899,19 +926,18 @@ bool BinaryTreeDictionary::coal_dict_over_populated(size_t size) { // do_tree() walks the nodes in the binary tree applying do_list() // to each list at each node. -template +template class FreeList_t> class TreeCensusClosure : public StackObj { protected: - virtual void do_list(FreeList* fl) = 0; + virtual void do_list(FreeList_t* fl) = 0; public: - virtual void do_tree(TreeList* tl) = 0; + virtual void do_tree(TreeList* tl) = 0; }; -template -class AscendTreeCensusClosure : public TreeCensusClosure { - using TreeCensusClosure::do_list; +template class FreeList_t> +class AscendTreeCensusClosure : public TreeCensusClosure { public: - void do_tree(TreeList* tl) { + void do_tree(TreeList* tl) { if (tl != NULL) { do_tree(tl->left()); do_list(tl); @@ -920,11 +946,10 @@ class AscendTreeCensusClosure : public TreeCensusClosure { } }; -template -class DescendTreeCensusClosure : public TreeCensusClosure { - using TreeCensusClosure::do_list; +template class FreeList_t> +class DescendTreeCensusClosure : public TreeCensusClosure { public: - void do_tree(TreeList* tl) { + void do_tree(TreeList* tl) { if (tl != NULL) { do_tree(tl->right()); do_list(tl); @@ -935,8 +960,8 @@ class DescendTreeCensusClosure : public TreeCensusClosure { // For each list in the tree, calculate the desired, desired // coalesce, count before sweep, and surplus before sweep. -template -class BeginSweepClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class BeginSweepClosure : public AscendTreeCensusClosure { double _percentage; float _inter_sweep_current; float _inter_sweep_estimate; @@ -951,32 +976,36 @@ class BeginSweepClosure : public AscendTreeCensusClosure { _inter_sweep_estimate(inter_sweep_estimate), _intra_sweep_estimate(intra_sweep_estimate) { } - void do_list(FreeList* fl) { + void do_list(FreeList* fl) {} + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { double coalSurplusPercent = _percentage; fl->compute_desired(_inter_sweep_current, _inter_sweep_estimate, _intra_sweep_estimate); fl->set_coal_desired((ssize_t)((double)fl->desired() * coalSurplusPercent)); fl->set_before_sweep(fl->count()); fl->set_bfr_surp(fl->surplus()); } +#endif // SERIALGC }; // Used to search the tree until a condition is met. // Similar to TreeCensusClosure but searches the // tree and returns promptly when found. -template +template class FreeList_t> class TreeSearchClosure : public StackObj { protected: - virtual bool do_list(FreeList* fl) = 0; + virtual bool do_list(FreeList_t* fl) = 0; public: - virtual bool do_tree(TreeList* tl) = 0; + virtual bool do_tree(TreeList* tl) = 0; }; #if 0 // Don't need this yet but here for symmetry. -template -class AscendTreeSearchClosure : public TreeSearchClosure { +template class FreeList_t> +class AscendTreeSearchClosure : public TreeSearchClosure { public: - bool do_tree(TreeList* tl) { + bool do_tree(TreeList* tl) { if (tl != NULL) { if (do_tree(tl->left())) return true; if (do_list(tl)) return true; @@ -987,11 +1016,10 @@ class AscendTreeSearchClosure : public TreeSearchClosure { }; #endif -template -class DescendTreeSearchClosure : public TreeSearchClosure { - using TreeSearchClosure::do_list; +template class FreeList_t> +class DescendTreeSearchClosure : public TreeSearchClosure { public: - bool do_tree(TreeList* tl) { + bool do_tree(TreeList* tl) { if (tl != NULL) { if (do_tree(tl->right())) return true; if (do_list(tl)) return true; @@ -1003,17 +1031,17 @@ class DescendTreeSearchClosure : public TreeSearchClosure { // Searches the tree for a chunk that ends at the // specified address. -template -class EndTreeSearchClosure : public DescendTreeSearchClosure { +template class FreeList_t> +class EndTreeSearchClosure : public DescendTreeSearchClosure { HeapWord* _target; - Chunk* _found; + Chunk_t* _found; public: EndTreeSearchClosure(HeapWord* target) : _target(target), _found(NULL) {} - bool do_list(FreeList* fl) { - Chunk* item = fl->head(); + bool do_list(FreeList_t* fl) { + Chunk_t* item = fl->head(); while (item != NULL) { - if (item->end() == _target) { + if (item->end() == (uintptr_t*) _target) { _found = item; return true; } @@ -1021,22 +1049,22 @@ class EndTreeSearchClosure : public DescendTreeSearchClosure { } return false; } - Chunk* found() { return _found; } + Chunk_t* found() { return _found; } }; -template -Chunk* BinaryTreeDictionary::find_chunk_ends_at(HeapWord* target) const { - EndTreeSearchClosure etsc(target); +template class FreeList_t> +Chunk_t* BinaryTreeDictionary::find_chunk_ends_at(HeapWord* target) const { + EndTreeSearchClosure etsc(target); bool found_target = etsc.do_tree(root()); assert(found_target || etsc.found() == NULL, "Consistency check"); assert(!found_target || etsc.found() != NULL, "Consistency check"); return etsc.found(); } -template -void BinaryTreeDictionary::begin_sweep_dict_census(double coalSurplusPercent, +template class FreeList_t> +void BinaryTreeDictionary::begin_sweep_dict_census(double coalSurplusPercent, float inter_sweep_current, float inter_sweep_estimate, float intra_sweep_estimate) { - BeginSweepClosure bsc(coalSurplusPercent, inter_sweep_current, + BeginSweepClosure bsc(coalSurplusPercent, inter_sweep_current, inter_sweep_estimate, intra_sweep_estimate); bsc.do_tree(root()); @@ -1045,84 +1073,91 @@ void BinaryTreeDictionary::begin_sweep_dict_census(double coalSurplusPerc // Closures and methods for calculating total bytes returned to the // free lists in the tree. #ifndef PRODUCT -template -class InitializeDictReturnedBytesClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class InitializeDictReturnedBytesClosure : public AscendTreeCensusClosure { public: - void do_list(FreeList* fl) { + void do_list(FreeList_t* fl) { fl->set_returned_bytes(0); } }; -template -void BinaryTreeDictionary::initialize_dict_returned_bytes() { - InitializeDictReturnedBytesClosure idrb; +template class FreeList_t> +void BinaryTreeDictionary::initialize_dict_returned_bytes() { + InitializeDictReturnedBytesClosure idrb; idrb.do_tree(root()); } -template -class ReturnedBytesClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class ReturnedBytesClosure : public AscendTreeCensusClosure { size_t _dict_returned_bytes; public: ReturnedBytesClosure() { _dict_returned_bytes = 0; } - void do_list(FreeList* fl) { + void do_list(FreeList_t* fl) { _dict_returned_bytes += fl->returned_bytes(); } size_t dict_returned_bytes() { return _dict_returned_bytes; } }; -template -size_t BinaryTreeDictionary::sum_dict_returned_bytes() { - ReturnedBytesClosure rbc; +template class FreeList_t> +size_t BinaryTreeDictionary::sum_dict_returned_bytes() { + ReturnedBytesClosure rbc; rbc.do_tree(root()); return rbc.dict_returned_bytes(); } // Count the number of entries in the tree. -template -class treeCountClosure : public DescendTreeCensusClosure { +template class FreeList_t> +class treeCountClosure : public DescendTreeCensusClosure { public: uint count; treeCountClosure(uint c) { count = c; } - void do_list(FreeList* fl) { + void do_list(FreeList_t* fl) { count++; } }; -template -size_t BinaryTreeDictionary::total_count() { - treeCountClosure ctc(0); +template class FreeList_t> +size_t BinaryTreeDictionary::total_count() { + treeCountClosure ctc(0); ctc.do_tree(root()); return ctc.count; } #endif // PRODUCT // Calculate surpluses for the lists in the tree. -template -class setTreeSurplusClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class setTreeSurplusClosure : public AscendTreeCensusClosure { double percentage; public: setTreeSurplusClosure(double v) { percentage = v; } - void do_list(FreeList* fl) { + void do_list(FreeList* fl) {} + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { double splitSurplusPercent = percentage; fl->set_surplus(fl->count() - (ssize_t)((double)fl->desired() * splitSurplusPercent)); } +#endif // SERIALGC }; -template -void BinaryTreeDictionary::set_tree_surplus(double splitSurplusPercent) { - setTreeSurplusClosure sts(splitSurplusPercent); +template class FreeList_t> +void BinaryTreeDictionary::set_tree_surplus(double splitSurplusPercent) { + setTreeSurplusClosure sts(splitSurplusPercent); sts.do_tree(root()); } // Set hints for the lists in the tree. -template -class setTreeHintsClosure : public DescendTreeCensusClosure { +template class FreeList_t> +class setTreeHintsClosure : public DescendTreeCensusClosure { size_t hint; public: setTreeHintsClosure(size_t v) { hint = v; } - void do_list(FreeList* fl) { + void do_list(FreeList* fl) {} + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { fl->set_hint(hint); assert(fl->hint() == 0 || fl->hint() > fl->size(), "Current hint is inconsistent"); @@ -1130,35 +1165,40 @@ class setTreeHintsClosure : public DescendTreeCensusClosure { hint = fl->size(); } } +#endif // SERIALGC }; -template -void BinaryTreeDictionary::set_tree_hints(void) { - setTreeHintsClosure sth(0); +template class FreeList_t> +void BinaryTreeDictionary::set_tree_hints(void) { + setTreeHintsClosure sth(0); sth.do_tree(root()); } // Save count before previous sweep and splits and coalesces. -template -class clearTreeCensusClosure : public AscendTreeCensusClosure { - void do_list(FreeList* fl) { +template class FreeList_t> +class clearTreeCensusClosure : public AscendTreeCensusClosure { + void do_list(FreeList* fl) {} + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { fl->set_prev_sweep(fl->count()); fl->set_coal_births(0); fl->set_coal_deaths(0); fl->set_split_births(0); fl->set_split_deaths(0); } +#endif // SERIALGC }; -template -void BinaryTreeDictionary::clear_tree_census(void) { - clearTreeCensusClosure ctc; +template class FreeList_t> +void BinaryTreeDictionary::clear_tree_census(void) { + clearTreeCensusClosure ctc; ctc.do_tree(root()); } // Do reporting and post sweep clean up. -template -void BinaryTreeDictionary::end_sweep_dict_census(double splitSurplusPercent) { +template class FreeList_t> +void BinaryTreeDictionary::end_sweep_dict_census(double splitSurplusPercent) { // Does walking the tree 3 times hurt? set_tree_surplus(splitSurplusPercent); set_tree_hints(); @@ -1169,9 +1209,9 @@ void BinaryTreeDictionary::end_sweep_dict_census(double splitSurplusPerce } // Print summary statistics -template -void BinaryTreeDictionary::report_statistics() const { - FreeBlockDictionary::verify_par_locked(); +template class FreeList_t> +void BinaryTreeDictionary::report_statistics() const { + FreeBlockDictionary::verify_par_locked(); gclog_or_tty->print("Statistics for BinaryTreeDictionary:\n" "------------------------------------\n"); size_t total_size = total_chunk_size(debug_only(NULL)); @@ -1182,36 +1222,47 @@ void BinaryTreeDictionary::report_statistics() const { if (free_blocks > 0) { gclog_or_tty->print("Av. Block Size: %d\n", total_size/free_blocks); } - gclog_or_tty->print("Tree Height: %d\n", treeHeight()); + gclog_or_tty->print("Tree Height: %d\n", tree_height()); } // Print census information - counts, births, deaths, etc. // for each list in the tree. Also print some summary // information. -template -class PrintTreeCensusClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class PrintTreeCensusClosure : public AscendTreeCensusClosure { int _print_line; size_t _total_free; - FreeList _total; + FreeList_t _total; public: PrintTreeCensusClosure() { _print_line = 0; _total_free = 0; } - FreeList* total() { return &_total; } + FreeList_t* total() { return &_total; } size_t total_free() { return _total_free; } - void do_list(FreeList* fl) { + void do_list(FreeList* fl) { if (++_print_line >= 40) { - FreeList::print_labels_on(gclog_or_tty, "size"); + FreeList_t::print_labels_on(gclog_or_tty, "size"); _print_line = 0; } fl->print_on(gclog_or_tty); _total_free += fl->count() * fl->size() ; total()->set_count( total()->count() + fl->count() ); - total()->set_bfr_surp( total()->bfr_surp() + fl->bfr_surp() ); + } + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { + if (++_print_line >= 40) { + FreeList_t::print_labels_on(gclog_or_tty, "size"); + _print_line = 0; + } + fl->print_on(gclog_or_tty); + _total_free += fl->count() * fl->size() ; + total()->set_count( total()->count() + fl->count() ); + total()->set_bfr_surp( total()->bfr_surp() + fl->bfr_surp() ); total()->set_surplus( total()->split_deaths() + fl->surplus() ); - total()->set_desired( total()->desired() + fl->desired() ); + total()->set_desired( total()->desired() + fl->desired() ); total()->set_prev_sweep( total()->prev_sweep() + fl->prev_sweep() ); total()->set_before_sweep(total()->before_sweep() + fl->before_sweep()); total()->set_coal_births( total()->coal_births() + fl->coal_births() ); @@ -1219,18 +1270,32 @@ class PrintTreeCensusClosure : public AscendTreeCensusClosure { total()->set_split_births(total()->split_births() + fl->split_births()); total()->set_split_deaths(total()->split_deaths() + fl->split_deaths()); } +#endif // SERIALGC }; -template -void BinaryTreeDictionary::print_dict_census(void) const { +template class FreeList_t> +void BinaryTreeDictionary::print_dict_census(void) const { gclog_or_tty->print("\nBinaryTree\n"); - FreeList::print_labels_on(gclog_or_tty, "size"); - PrintTreeCensusClosure ptc; + FreeList_t::print_labels_on(gclog_or_tty, "size"); + PrintTreeCensusClosure ptc; ptc.do_tree(root()); - FreeList* total = ptc.total(); - FreeList::print_labels_on(gclog_or_tty, " "); + FreeList_t* total = ptc.total(); + FreeList_t::print_labels_on(gclog_or_tty, " "); +} + +#ifndef SERIALGC +template <> +void BinaryTreeDictionary::print_dict_census(void) const { + + gclog_or_tty->print("\nBinaryTree\n"); + AdaptiveFreeList::print_labels_on(gclog_or_tty, "size"); + PrintTreeCensusClosure ptc; + ptc.do_tree(root()); + + AdaptiveFreeList* total = ptc.total(); + AdaptiveFreeList::print_labels_on(gclog_or_tty, " "); total->print_on(gclog_or_tty, "TOTAL\t"); gclog_or_tty->print( "total_free(words): " SIZE_FORMAT_W(16) @@ -1242,9 +1307,10 @@ void BinaryTreeDictionary::print_dict_census(void) const { (double)(total->desired() - total->count()) /(total->desired() != 0 ? (double)total->desired() : 1.0)); } +#endif // SERIALGC -template -class PrintFreeListsClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class PrintFreeListsClosure : public AscendTreeCensusClosure { outputStream* _st; int _print_line; @@ -1253,14 +1319,14 @@ class PrintFreeListsClosure : public AscendTreeCensusClosure { _st = st; _print_line = 0; } - void do_list(FreeList* fl) { + void do_list(FreeList_t* fl) { if (++_print_line >= 40) { - FreeList::print_labels_on(_st, "size"); + FreeList_t::print_labels_on(_st, "size"); _print_line = 0; } fl->print_on(gclog_or_tty); size_t sz = fl->size(); - for (Chunk* fc = fl->head(); fc != NULL; + for (Chunk_t* fc = fl->head(); fc != NULL; fc = fc->next()) { _st->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s", fc, (HeapWord*)fc + sz, @@ -1269,11 +1335,11 @@ class PrintFreeListsClosure : public AscendTreeCensusClosure { } }; -template -void BinaryTreeDictionary::print_free_lists(outputStream* st) const { +template class FreeList_t> +void BinaryTreeDictionary::print_free_lists(outputStream* st) const { - FreeList::print_labels_on(st, "size"); - PrintFreeListsClosure pflc(st); + FreeList_t::print_labels_on(st, "size"); + PrintFreeListsClosure pflc(st); pflc.do_tree(root()); } @@ -1281,18 +1347,18 @@ void BinaryTreeDictionary::print_free_lists(outputStream* st) const { // . _root has no parent // . parent and child point to each other // . each node's key correctly related to that of its child(ren) -template -void BinaryTreeDictionary::verify_tree() const { +template class FreeList_t> +void BinaryTreeDictionary::verify_tree() const { guarantee(root() == NULL || total_free_blocks() == 0 || total_size() != 0, "_total_size should't be 0?"); guarantee(root() == NULL || root()->parent() == NULL, "_root shouldn't have parent"); verify_tree_helper(root()); } -template -size_t BinaryTreeDictionary::verify_prev_free_ptrs(TreeList* tl) { +template class FreeList_t> +size_t BinaryTreeDictionary::verify_prev_free_ptrs(TreeList* tl) { size_t ct = 0; - for (Chunk* curFC = tl->head(); curFC != NULL; curFC = curFC->next()) { + for (Chunk_t* curFC = tl->head(); curFC != NULL; curFC = curFC->next()) { ct++; assert(curFC->prev() == NULL || curFC->prev()->is_free(), "Chunk should be free"); @@ -1303,8 +1369,8 @@ size_t BinaryTreeDictionary::verify_prev_free_ptrs(TreeList* tl) { // Note: this helper is recursive rather than iterative, so use with // caution on very deep trees; and watch out for stack overflow errors; // In general, to be used only for debugging. -template -void BinaryTreeDictionary::verify_tree_helper(TreeList* tl) const { +template class FreeList_t> +void BinaryTreeDictionary::verify_tree_helper(TreeList* tl) const { if (tl == NULL) return; guarantee(tl->size() != 0, "A list must has a size"); @@ -1332,15 +1398,25 @@ void BinaryTreeDictionary::verify_tree_helper(TreeList* tl) const verify_tree_helper(tl->right()); } -template -void BinaryTreeDictionary::verify() const { +template class FreeList_t> +void BinaryTreeDictionary::verify() const { verify_tree(); guarantee(total_size() == total_size_in_tree(root()), "Total Size inconsistency"); } +template class TreeList; +template class BinaryTreeDictionary; +template class TreeChunk; + +template class TreeList; +template class BinaryTreeDictionary; +template class TreeChunk; + + #ifndef SERIALGC // Explicitly instantiate these types for FreeChunk. -template class BinaryTreeDictionary; -template class TreeChunk; -template class TreeList; +template class TreeList; +template class BinaryTreeDictionary; +template class TreeChunk; + #endif // SERIALGC diff --git a/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp b/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp index 4ab60c2dcc1..5efe8aaa46a 100644 --- a/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp +++ b/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp @@ -37,77 +37,78 @@ // A TreeList is a FreeList which can be used to maintain a // binary tree of free lists. -template class TreeChunk; -template class BinaryTreeDictionary; -template class AscendTreeCensusClosure; -template class DescendTreeCensusClosure; -template class DescendTreeSearchClosure; +template class FreeList_t> class TreeChunk; +template class FreeList_t> class BinaryTreeDictionary; +template class FreeList_t> class AscendTreeCensusClosure; +template class FreeList_t> class DescendTreeCensusClosure; +template class FreeList_t> class DescendTreeSearchClosure; -template -class TreeList: public FreeList { - friend class TreeChunk; - friend class BinaryTreeDictionary; - friend class AscendTreeCensusClosure; - friend class DescendTreeCensusClosure; - friend class DescendTreeSearchClosure; +template class FreeList_t> +class TreeList : public FreeList_t { + friend class TreeChunk; + friend class BinaryTreeDictionary; + friend class AscendTreeCensusClosure; + friend class DescendTreeCensusClosure; + friend class DescendTreeSearchClosure; - TreeList* _parent; - TreeList* _left; - TreeList* _right; + TreeList* _parent; + TreeList* _left; + TreeList* _right; protected: - TreeList* parent() const { return _parent; } - TreeList* left() const { return _left; } - TreeList* right() const { return _right; } - // Explicitly import these names into our namespace to fix name lookup with templates - using FreeList::head; - using FreeList::set_head; + TreeList* parent() const { return _parent; } + TreeList* left() const { return _left; } + TreeList* right() const { return _right; } - using FreeList::tail; - using FreeList::set_tail; - using FreeList::link_tail; + // Wrapper on call to base class, to get the template to compile. + Chunk_t* head() const { return FreeList_t::head(); } + Chunk_t* tail() const { return FreeList_t::tail(); } + void set_head(Chunk_t* head) { FreeList_t::set_head(head); } + void set_tail(Chunk_t* tail) { FreeList_t::set_tail(tail); } - using FreeList::increment_count; - NOT_PRODUCT(using FreeList::increment_returned_bytes_by;) - using FreeList::verify_chunk_in_free_list; - using FreeList::size; + size_t size() const { return FreeList_t::size(); } // Accessors for links in tree. - void set_left(TreeList* tl) { + void set_left(TreeList* tl) { _left = tl; if (tl != NULL) tl->set_parent(this); } - void set_right(TreeList* tl) { + void set_right(TreeList* tl) { _right = tl; if (tl != NULL) tl->set_parent(this); } - void set_parent(TreeList* tl) { _parent = tl; } + void set_parent(TreeList* tl) { _parent = tl; } - void clearLeft() { _left = NULL; } + void clear_left() { _left = NULL; } void clear_right() { _right = NULL; } void clear_parent() { _parent = NULL; } - void initialize() { clearLeft(); clear_right(), clear_parent(); } + void initialize() { clear_left(); clear_right(), clear_parent(); FreeList_t::initialize(); } // For constructing a TreeList from a Tree chunk or // address and size. - static TreeList* as_TreeList(TreeChunk* tc); - static TreeList* as_TreeList(HeapWord* addr, size_t size); + TreeList(); + static TreeList* + as_TreeList(TreeChunk* tc); + static TreeList* as_TreeList(HeapWord* addr, size_t size); // Returns the head of the free list as a pointer to a TreeChunk. - TreeChunk* head_as_TreeChunk(); + TreeChunk* head_as_TreeChunk(); // Returns the first available chunk in the free list as a pointer // to a TreeChunk. - TreeChunk* first_available(); + TreeChunk* first_available(); // Returns the block with the largest heap address amongst // those in the list for this size; potentially slow and expensive, // use with caution! - TreeChunk* largest_address(); + TreeChunk* largest_address(); + + TreeList* get_better_list( + BinaryTreeDictionary* dictionary); // remove_chunk_replace_if_needed() removes the given "tc" from the TreeList. // If "tc" is the first chunk in the list, it is also the @@ -115,10 +116,10 @@ class TreeList: public FreeList { // returns the possibly replaced TreeList* for the node in // the tree. It also updates the parent of the original // node to point to the new node. - TreeList* remove_chunk_replace_if_needed(TreeChunk* tc); + TreeList* remove_chunk_replace_if_needed(TreeChunk* tc); // See FreeList. - void return_chunk_at_head(TreeChunk* tc); - void return_chunk_at_tail(TreeChunk* tc); + void return_chunk_at_head(TreeChunk* tc); + void return_chunk_at_tail(TreeChunk* tc); }; // A TreeChunk is a subclass of a Chunk that additionally @@ -134,52 +135,54 @@ class TreeList: public FreeList { // on the free list for a node in the tree and is only removed if // it is the last chunk on the free list. -template -class TreeChunk : public Chunk { - friend class TreeList; - TreeList* _list; - TreeList _embedded_list; // if non-null, this chunk is on _list +template class FreeList_t> +class TreeChunk : public Chunk_t { + friend class TreeList; + TreeList* _list; + TreeList _embedded_list; // if non-null, this chunk is on _list + + static size_t _min_tree_chunk_size; + protected: - TreeList* embedded_list() const { return (TreeList*) &_embedded_list; } - void set_embedded_list(TreeList* v) { _embedded_list = *v; } + TreeList* embedded_list() const { return (TreeList*) &_embedded_list; } + void set_embedded_list(TreeList* v) { _embedded_list = *v; } public: - TreeList* list() { return _list; } - void set_list(TreeList* v) { _list = v; } - static TreeChunk* as_TreeChunk(Chunk* fc); + TreeList* list() { return _list; } + void set_list(TreeList* v) { _list = v; } + static TreeChunk* as_TreeChunk(Chunk_t* fc); // Initialize fields in a TreeChunk that should be // initialized when the TreeChunk is being added to // a free list in the tree. void initialize() { embedded_list()->initialize(); } - Chunk* next() const { return Chunk::next(); } - Chunk* prev() const { return Chunk::prev(); } - size_t size() const volatile { return Chunk::size(); } + Chunk_t* next() const { return Chunk_t::next(); } + Chunk_t* prev() const { return Chunk_t::prev(); } + size_t size() const volatile { return Chunk_t::size(); } + + static size_t min_size() { + return _min_tree_chunk_size; + } // debugging void verify_tree_chunk_list() const; + void assert_is_mangled() const; }; -template -class BinaryTreeDictionary: public FreeBlockDictionary { +template class FreeList_t> +class BinaryTreeDictionary: public FreeBlockDictionary { friend class VMStructs; - bool _splay; - bool _adaptive_freelists; size_t _total_size; size_t _total_free_blocks; - TreeList* _root; + TreeList* _root; // private accessors - bool splay() const { return _splay; } - void set_splay(bool v) { _splay = v; } void set_total_size(size_t v) { _total_size = v; } virtual void inc_total_size(size_t v); virtual void dec_total_size(size_t v); - size_t total_free_blocks() const { return _total_free_blocks; } void set_total_free_blocks(size_t v) { _total_free_blocks = v; } - TreeList* root() const { return _root; } - void set_root(TreeList* v) { _root = v; } - bool adaptive_freelists() { return _adaptive_freelists; } + TreeList* root() const { return _root; } + void set_root(TreeList* v) { _root = v; } // This field is added and can be set to point to the // the Mutex used to synchronize access to the @@ -191,54 +194,55 @@ class BinaryTreeDictionary: public FreeBlockDictionary { // return it. If the chunk // is the last chunk of that size, remove the node for that size // from the tree. - TreeChunk* get_chunk_from_tree(size_t size, enum FreeBlockDictionary::Dither dither, bool splay); - // Return a list of the specified size or NULL from the tree. - // The list is not removed from the tree. - TreeList* find_list (size_t size) const; + TreeChunk* get_chunk_from_tree(size_t size, enum FreeBlockDictionary::Dither dither); // Remove this chunk from the tree. If the removal results // in an empty list in the tree, remove the empty list. - TreeChunk* remove_chunk_from_tree(TreeChunk* tc); + TreeChunk* remove_chunk_from_tree(TreeChunk* tc); // Remove the node in the trees starting at tl that has the // minimum value and return it. Repair the tree as needed. - TreeList* remove_tree_minimum(TreeList* tl); - void semi_splay_step(TreeList* tl); + TreeList* remove_tree_minimum(TreeList* tl); // Add this free chunk to the tree. - void insert_chunk_in_tree(Chunk* freeChunk); + void insert_chunk_in_tree(Chunk_t* freeChunk); public: - static const size_t min_tree_chunk_size = sizeof(TreeChunk)/HeapWordSize; + // Return a list of the specified size or NULL from the tree. + // The list is not removed from the tree. + TreeList* find_list (size_t size) const; void verify_tree() const; // verify that the given chunk is in the tree. - bool verify_chunk_in_free_list(Chunk* tc) const; + bool verify_chunk_in_free_list(Chunk_t* tc) const; private: - void verify_tree_helper(TreeList* tl) const; - static size_t verify_prev_free_ptrs(TreeList* tl); + void verify_tree_helper(TreeList* tl) const; + static size_t verify_prev_free_ptrs(TreeList* tl); // Returns the total number of chunks in the list. - size_t total_list_length(TreeList* tl) const; + size_t total_list_length(TreeList* tl) const; // Returns the total number of words in the chunks in the tree // starting at "tl". - size_t total_size_in_tree(TreeList* tl) const; + size_t total_size_in_tree(TreeList* tl) const; // Returns the sum of the square of the size of each block // in the tree starting at "tl". - double sum_of_squared_block_sizes(TreeList* const tl) const; + double sum_of_squared_block_sizes(TreeList* const tl) const; // Returns the total number of free blocks in the tree starting // at "tl". - size_t total_free_blocks_in_tree(TreeList* tl) const; - size_t num_free_blocks() const; - size_t treeHeight() const; - size_t tree_height_helper(TreeList* tl) const; - size_t total_nodes_in_tree(TreeList* tl) const; - size_t total_nodes_helper(TreeList* tl) const; + size_t total_free_blocks_in_tree(TreeList* tl) const; + size_t num_free_blocks() const; + size_t tree_height() const; + size_t tree_height_helper(TreeList* tl) const; + size_t total_nodes_in_tree(TreeList* tl) const; + size_t total_nodes_helper(TreeList* tl) const; public: // Constructor - BinaryTreeDictionary(bool adaptive_freelists, bool splay = false); - BinaryTreeDictionary(MemRegion mr, bool adaptive_freelists, bool splay = false); + BinaryTreeDictionary() : + _total_size(0), _total_free_blocks(0), _root(0) {} + + BinaryTreeDictionary(MemRegion mr); // Public accessors size_t total_size() const { return _total_size; } + size_t total_free_blocks() const { return _total_free_blocks; } // Reset the dictionary to the initial conditions with // a single free chunk. @@ -249,23 +253,24 @@ class BinaryTreeDictionary: public FreeBlockDictionary { // Return a chunk of size "size" or greater from // the tree. - // want a better dynamic splay strategy for the future. - Chunk* get_chunk(size_t size, enum FreeBlockDictionary::Dither dither) { - FreeBlockDictionary::verify_par_locked(); - Chunk* res = get_chunk_from_tree(size, dither, splay()); + Chunk_t* get_chunk(size_t size, enum FreeBlockDictionary::Dither dither) { + FreeBlockDictionary::verify_par_locked(); + Chunk_t* res = get_chunk_from_tree(size, dither); assert(res == NULL || res->is_free(), "Should be returning a free chunk"); + assert(dither != FreeBlockDictionary::exactly || + res->size() == size, "Not correct size"); return res; } - void return_chunk(Chunk* chunk) { - FreeBlockDictionary::verify_par_locked(); + void return_chunk(Chunk_t* chunk) { + FreeBlockDictionary::verify_par_locked(); insert_chunk_in_tree(chunk); } - void remove_chunk(Chunk* chunk) { - FreeBlockDictionary::verify_par_locked(); - remove_chunk_from_tree((TreeChunk*)chunk); + void remove_chunk(Chunk_t* chunk) { + FreeBlockDictionary::verify_par_locked(); + remove_chunk_from_tree((TreeChunk*)chunk); assert(chunk->is_free(), "Should still be a free chunk"); } @@ -281,19 +286,19 @@ class BinaryTreeDictionary: public FreeBlockDictionary { } size_t min_size() const { - return min_tree_chunk_size; + return TreeChunk::min_size(); } double sum_of_squared_block_sizes() const { return sum_of_squared_block_sizes(root()); } - Chunk* find_chunk_ends_at(HeapWord* target) const; + Chunk_t* find_chunk_ends_at(HeapWord* target) const; // Find the list with size "size" in the binary tree and update // the statistics in the list according to "split" (chunk was // split or coalesce) and "birth" (chunk was added or removed). - void dict_census_udpate(size_t size, bool split, bool birth); + void dict_census_update(size_t size, bool split, bool birth); // Return true if the dictionary is overpopulated (more chunks of // this size than desired) for size "size". bool coal_dict_over_populated(size_t size); @@ -307,7 +312,7 @@ class BinaryTreeDictionary: public FreeBlockDictionary { // statistics for the sweep. void end_sweep_dict_census(double splitSurplusPercent); // Return the largest free chunk in the tree. - Chunk* find_largest_dict() const; + Chunk_t* find_largest_dict() const; // Accessors for statistics void set_tree_surplus(double splitSurplusPercent); void set_tree_hints(void); diff --git a/hotspot/src/share/vm/memory/freeBlockDictionary.cpp b/hotspot/src/share/vm/memory/freeBlockDictionary.cpp index 13b4daa89ad..9b22212817b 100644 --- a/hotspot/src/share/vm/memory/freeBlockDictionary.cpp +++ b/hotspot/src/share/vm/memory/freeBlockDictionary.cpp @@ -27,6 +27,8 @@ #include "gc_implementation/concurrentMarkSweep/freeChunk.hpp" #endif // SERIALGC #include "memory/freeBlockDictionary.hpp" +#include "memory/metablock.hpp" +#include "memory/metachunk.hpp" #ifdef TARGET_OS_FAMILY_linux # include "thread_linux.inline.hpp" #endif @@ -62,6 +64,9 @@ template void FreeBlockDictionary::verify_par_locked() cons } #endif +template class FreeBlockDictionary; +template class FreeBlockDictionary; + #ifndef SERIALGC // Explicitly instantiate for FreeChunk template class FreeBlockDictionary; diff --git a/hotspot/src/share/vm/memory/freeBlockDictionary.hpp b/hotspot/src/share/vm/memory/freeBlockDictionary.hpp index 573cfed3a4b..2502e362d9c 100644 --- a/hotspot/src/share/vm/memory/freeBlockDictionary.hpp +++ b/hotspot/src/share/vm/memory/freeBlockDictionary.hpp @@ -66,7 +66,7 @@ class FreeBlockDictionary: public CHeapObj { virtual void reset(HeapWord* addr, size_t size) = 0; virtual void reset() = 0; - virtual void dict_census_udpate(size_t size, bool split, bool birth) = 0; + virtual void dict_census_update(size_t size, bool split, bool birth) = 0; virtual bool coal_dict_over_populated(size_t size) = 0; virtual void begin_sweep_dict_census(double coalSurplusPercent, float inter_sweep_current, float inter_sweep_estimate, diff --git a/hotspot/src/share/vm/memory/freeList.cpp b/hotspot/src/share/vm/memory/freeList.cpp index a5fbc06ee0a..f5cd80545c0 100644 --- a/hotspot/src/share/vm/memory/freeList.cpp +++ b/hotspot/src/share/vm/memory/freeList.cpp @@ -25,6 +25,8 @@ #include "precompiled.hpp" #include "memory/freeBlockDictionary.hpp" #include "memory/freeList.hpp" +#include "memory/metablock.hpp" +#include "memory/metachunk.hpp" #include "memory/sharedHeap.hpp" #include "runtime/globals.hpp" #include "runtime/mutex.hpp" @@ -49,8 +51,6 @@ FreeList::FreeList() : { _size = 0; _count = 0; - _hint = 0; - init_statistics(); } template @@ -62,34 +62,50 @@ FreeList::FreeList(Chunk* fc) : { _size = fc->size(); _count = 1; - _hint = 0; - init_statistics(); -#ifndef PRODUCT - _allocation_stats.set_returned_bytes(size() * HeapWordSize); -#endif } template -void FreeList::reset(size_t hint) { +void FreeList::link_head(Chunk* v) { + assert_proper_lock_protection(); + set_head(v); + // If this method is not used (just set the head instead), + // this check can be avoided. + if (v != NULL) { + v->link_prev(NULL); + } +} + + + +template +void FreeList::reset() { + // Don't set the _size to 0 because this method is + // used with a existing list that has a size but which has + // been emptied. + // Don't clear the _protecting_lock of an existing list. set_count(0); set_head(NULL); set_tail(NULL); - set_hint(hint); } template -void FreeList::init_statistics(bool split_birth) { - _allocation_stats.initialize(split_birth); +void FreeList::initialize() { +#ifdef ASSERT + // Needed early because it might be checked in other initializing code. + set_protecting_lock(NULL); +#endif + reset(); + set_size(0); } -template -Chunk* FreeList::get_chunk_at_head() { +template +Chunk_t* FreeList::get_chunk_at_head() { assert_proper_lock_protection(); assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); - Chunk* fc = head(); + Chunk_t* fc = head(); if (fc != NULL) { - Chunk* nextFC = fc->next(); + Chunk_t* nextFC = fc->next(); if (nextFC != NULL) { // The chunk fc being removed has a "next". Set the "next" to the // "prev" of fc. @@ -197,11 +213,6 @@ void FreeList::return_chunk_at_head(Chunk* chunk, bool record_return) { link_tail(chunk); } increment_count(); // of # of chunks in list - DEBUG_ONLY( - if (record_return) { - increment_returned_bytes_by(size()*HeapWordSize); - } - ) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); assert(head() == NULL || head()->size() == size(), "wrong item on list"); @@ -233,11 +244,6 @@ void FreeList::return_chunk_at_tail(Chunk* chunk, bool record_return) { } link_tail(chunk); increment_count(); // of # of chunks in list - DEBUG_ONLY( - if (record_return) { - increment_returned_bytes_by(size()*HeapWordSize); - } - ) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); assert(head() == NULL || head()->size() == size(), "wrong item on list"); @@ -273,7 +279,7 @@ void FreeList::prepend(FreeList* fl) { } } -// verify_chunk_in_free_list() is used to verify that an item is in this free list. +// verify_chunk_in_free_lists() is used to verify that an item is in this free list. // It is used as a debugging aid. template bool FreeList::verify_chunk_in_free_list(Chunk* fc) const { @@ -293,41 +299,15 @@ bool FreeList::verify_chunk_in_free_list(Chunk* fc) const { } #ifndef PRODUCT -template -void FreeList::verify_stats() const { - // The +1 of the LH comparand is to allow some "looseness" in - // checking: we usually call this interface when adding a block - // and we'll subsequently update the stats; we cannot update the - // stats beforehand because in the case of the large-block BT - // dictionary for example, this might be the first block and - // in that case there would be no place that we could record - // the stats (which are kept in the block itself). - assert((_allocation_stats.prev_sweep() + _allocation_stats.split_births() - + _allocation_stats.coal_births() + 1) // Total Production Stock + 1 - >= (_allocation_stats.split_deaths() + _allocation_stats.coal_deaths() - + (ssize_t)count()), // Total Current Stock + depletion - err_msg("FreeList " PTR_FORMAT " of size " SIZE_FORMAT - " violates Conservation Principle: " - "prev_sweep(" SIZE_FORMAT ")" - " + split_births(" SIZE_FORMAT ")" - " + coal_births(" SIZE_FORMAT ") + 1 >= " - " split_deaths(" SIZE_FORMAT ")" - " coal_deaths(" SIZE_FORMAT ")" - " + count(" SSIZE_FORMAT ")", - this, _size, _allocation_stats.prev_sweep(), _allocation_stats.split_births(), - _allocation_stats.split_births(), _allocation_stats.split_deaths(), - _allocation_stats.coal_deaths(), count())); -} - template void FreeList::assert_proper_lock_protection_work() const { - assert(_protecting_lock != NULL, "Don't call this directly"); + assert(protecting_lock() != NULL, "Don't call this directly"); assert(ParallelGCThreads > 0, "Don't call this directly"); Thread* thr = Thread::current(); if (thr->is_VM_thread() || thr->is_ConcurrentGC_thread()) { // assert that we are holding the freelist lock } else if (thr->is_GC_task_thread()) { - assert(_protecting_lock->owned_by_self(), "FreeList RACE DETECTED"); + assert(protecting_lock()->owned_by_self(), "FreeList RACE DETECTED"); } else if (thr->is_Java_thread()) { assert(!SafepointSynchronize::is_at_safepoint(), "Should not be executing"); } else { @@ -350,21 +330,17 @@ void FreeList::print_labels_on(outputStream* st, const char* c) { // to the call is a non-null string, it is printed in the first column; // otherwise, if the argument is null (the default), then the size of the // (free list) block is printed in the first column. -template -void FreeList::print_on(outputStream* st, const char* c) const { +template +void FreeList::print_on(outputStream* st, const char* c) const { if (c != NULL) { st->print("%16s", c); } else { st->print(SIZE_FORMAT_W(16), size()); } - st->print("\t" - SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" - SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\n", - bfr_surp(), surplus(), desired(), prev_sweep(), before_sweep(), - count(), coal_births(), coal_deaths(), split_births(), split_deaths()); } +template class FreeList; +template class FreeList; #ifndef SERIALGC -// Needs to be after the definitions have been seen. template class FreeList; #endif // SERIALGC diff --git a/hotspot/src/share/vm/memory/freeList.hpp b/hotspot/src/share/vm/memory/freeList.hpp index a982cfbda97..37438cc3888 100644 --- a/hotspot/src/share/vm/memory/freeList.hpp +++ b/hotspot/src/share/vm/memory/freeList.hpp @@ -40,23 +40,19 @@ class CompactibleFreeListSpace; // for that implementation. class Mutex; -template class TreeList; -template class PrintTreeCensusClosure; -template +template class FreeList VALUE_OBJ_CLASS_SPEC { friend class CompactibleFreeListSpace; friend class VMStructs; - friend class PrintTreeCensusClosure; private: - Chunk* _head; // Head of list of free chunks - Chunk* _tail; // Tail of list of free chunks + Chunk_t* _head; // Head of list of free chunks + Chunk_t* _tail; // Tail of list of free chunks size_t _size; // Size in Heap words of each chunk ssize_t _count; // Number of entries in list - size_t _hint; // next larger size list with a positive surplus - AllocationStats _allocation_stats; // allocation-related statistics + protected: #ifdef ASSERT Mutex* _protecting_lock; @@ -71,10 +67,6 @@ class FreeList VALUE_OBJ_CLASS_SPEC { #endif } - // Initialize the allocation statistics. - protected: - void init_statistics(bool split_birth = false); - void set_count(ssize_t v) { _count = v;} void increment_count() { _count++; } @@ -89,52 +81,48 @@ class FreeList VALUE_OBJ_CLASS_SPEC { // Construct a list without any entries. FreeList(); // Construct a list with "fc" as the first (and lone) entry in the list. - FreeList(Chunk* fc); + FreeList(Chunk_t* fc); - // Reset the head, tail, hint, and count of a free list. - void reset(size_t hint); + // Do initialization + void initialize(); + + // Reset the head, tail, and count of a free list. + void reset(); // Declare the current free list to be protected by the given lock. #ifdef ASSERT - void set_protecting_lock(Mutex* protecting_lock) { - _protecting_lock = protecting_lock; + Mutex* protecting_lock() const { return _protecting_lock; } + void set_protecting_lock(Mutex* v) { + _protecting_lock = v; } #endif // Accessors. - Chunk* head() const { + Chunk_t* head() const { assert_proper_lock_protection(); return _head; } - void set_head(Chunk* v) { + void set_head(Chunk_t* v) { assert_proper_lock_protection(); _head = v; assert(!_head || _head->size() == _size, "bad chunk size"); } // Set the head of the list and set the prev field of non-null // values to NULL. - void link_head(Chunk* v) { - assert_proper_lock_protection(); - set_head(v); - // If this method is not used (just set the head instead), - // this check can be avoided. - if (v != NULL) { - v->link_prev(NULL); - } - } + void link_head(Chunk_t* v); - Chunk* tail() const { + Chunk_t* tail() const { assert_proper_lock_protection(); return _tail; } - void set_tail(Chunk* v) { + void set_tail(Chunk_t* v) { assert_proper_lock_protection(); _tail = v; assert(!_tail || _tail->size() == _size, "bad chunk size"); } // Set the tail of the list and set the next field of non-null // values to NULL. - void link_tail(Chunk* v) { + void link_tail(Chunk_t* v) { assert_proper_lock_protection(); set_tail(v); if (v != NULL) { @@ -152,174 +140,45 @@ class FreeList VALUE_OBJ_CLASS_SPEC { assert_proper_lock_protection(); _size = v; } - ssize_t count() const { - return _count; - } - size_t hint() const { - return _hint; - } - void set_hint(size_t v) { - assert_proper_lock_protection(); - assert(v == 0 || _size < v, "Bad hint"); _hint = v; - } + ssize_t count() const { return _count; } + void set_count(ssize_t v) { _count = v;} - // Accessors for statistics - AllocationStats* allocation_stats() { - assert_proper_lock_protection(); - return &_allocation_stats; - } + size_t get_better_size() { return size(); } - ssize_t desired() const { - return _allocation_stats.desired(); - } - void set_desired(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_desired(v); - } - void compute_desired(float inter_sweep_current, - float inter_sweep_estimate, - float intra_sweep_estimate) { - assert_proper_lock_protection(); - _allocation_stats.compute_desired(_count, - inter_sweep_current, - inter_sweep_estimate, - intra_sweep_estimate); - } - ssize_t coal_desired() const { - return _allocation_stats.coal_desired(); - } - void set_coal_desired(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_coal_desired(v); - } - - ssize_t surplus() const { - return _allocation_stats.surplus(); - } - void set_surplus(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_surplus(v); - } - void increment_surplus() { - assert_proper_lock_protection(); - _allocation_stats.increment_surplus(); - } - void decrement_surplus() { - assert_proper_lock_protection(); - _allocation_stats.decrement_surplus(); - } - - ssize_t bfr_surp() const { - return _allocation_stats.bfr_surp(); - } - void set_bfr_surp(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_bfr_surp(v); - } - ssize_t prev_sweep() const { - return _allocation_stats.prev_sweep(); - } - void set_prev_sweep(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_prev_sweep(v); - } - ssize_t before_sweep() const { - return _allocation_stats.before_sweep(); - } - void set_before_sweep(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_before_sweep(v); - } - - ssize_t coal_births() const { - return _allocation_stats.coal_births(); - } - void set_coal_births(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_coal_births(v); - } - void increment_coal_births() { - assert_proper_lock_protection(); - _allocation_stats.increment_coal_births(); - } - - ssize_t coal_deaths() const { - return _allocation_stats.coal_deaths(); - } - void set_coal_deaths(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_coal_deaths(v); - } - void increment_coal_deaths() { - assert_proper_lock_protection(); - _allocation_stats.increment_coal_deaths(); - } - - ssize_t split_births() const { - return _allocation_stats.split_births(); - } - void set_split_births(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_split_births(v); - } - void increment_split_births() { - assert_proper_lock_protection(); - _allocation_stats.increment_split_births(); - } - - ssize_t split_deaths() const { - return _allocation_stats.split_deaths(); - } - void set_split_deaths(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_split_deaths(v); - } - void increment_split_deaths() { - assert_proper_lock_protection(); - _allocation_stats.increment_split_deaths(); - } - - NOT_PRODUCT( - // For debugging. The "_returned_bytes" in all the lists are summed - // and compared with the total number of bytes swept during a - // collection. - size_t returned_bytes() const { return _allocation_stats.returned_bytes(); } - void set_returned_bytes(size_t v) { _allocation_stats.set_returned_bytes(v); } - void increment_returned_bytes_by(size_t v) { - _allocation_stats.set_returned_bytes(_allocation_stats.returned_bytes() + v); - } - ) + size_t returned_bytes() const { ShouldNotReachHere(); return 0; } + void set_returned_bytes(size_t v) {} + void increment_returned_bytes_by(size_t v) {} // Unlink head of list and return it. Returns NULL if // the list is empty. - Chunk* get_chunk_at_head(); + Chunk_t* get_chunk_at_head(); // Remove the first "n" or "count", whichever is smaller, chunks from the // list, setting "fl", which is required to be empty, to point to them. - void getFirstNChunksFromList(size_t n, FreeList* fl); + void getFirstNChunksFromList(size_t n, FreeList* fl); // Unlink this chunk from it's free list - void remove_chunk(Chunk* fc); + void remove_chunk(Chunk_t* fc); // Add this chunk to this free list. - void return_chunk_at_head(Chunk* fc); - void return_chunk_at_tail(Chunk* fc); + void return_chunk_at_head(Chunk_t* fc); + void return_chunk_at_tail(Chunk_t* fc); // Similar to returnChunk* but also records some diagnostic // information. - void return_chunk_at_head(Chunk* fc, bool record_return); - void return_chunk_at_tail(Chunk* fc, bool record_return); + void return_chunk_at_head(Chunk_t* fc, bool record_return); + void return_chunk_at_tail(Chunk_t* fc, bool record_return); // Prepend "fl" (whose size is required to be the same as that of "this") // to the front of "this" list. - void prepend(FreeList* fl); + void prepend(FreeList* fl); // Verify that the chunk is in the list. // found. Return NULL if "fc" is not found. - bool verify_chunk_in_free_list(Chunk* fc) const; + bool verify_chunk_in_free_list(Chunk_t* fc) const; // Stats verification - void verify_stats() const PRODUCT_RETURN; +// void verify_stats() const { ShouldNotReachHere(); }; // Printing support static void print_labels_on(outputStream* st, const char* c); diff --git a/hotspot/src/share/vm/memory/metablock.hpp b/hotspot/src/share/vm/memory/metablock.hpp new file mode 100644 index 00000000000..220d3614818 --- /dev/null +++ b/hotspot/src/share/vm/memory/metablock.hpp @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +#ifndef SHARE_VM_MEMORY_METABLOCK_HPP +#define SHARE_VM_MEMORY_METABLOCK_HPP + +// Metablock are the unit of allocation from a Chunk. It is initialized +// with the size of the requested allocation. That size is overwritten +// once the allocation returns. +// +// A Metablock may be reused by its SpaceManager but are never moved between +// SpaceManagers. There is no explicit link to the Metachunk +// from which it was allocated. Metablock may be deallocated and +// put on a freelist but the space is never freed, rather +// the Metachunk it is a part of will be deallocated when it's +// associated class loader is collected. + +class Metablock VALUE_OBJ_CLASS_SPEC { + friend class VMStructs; + private: + // Used to align the allocation (see below). + union block_t { + void* _data[3]; + struct header_t { + size_t _word_size; + Metablock* _next; + Metablock* _prev; + } _header; + } _block; + static size_t _min_block_byte_size; + static size_t _overhead; + + typedef union block_t Block; + typedef struct header_t Header; + const Block* block() const { return &_block; } + const Block::header_t* header() const { return &(block()->_header); } + public: + + static Metablock* initialize(MetaWord* p, size_t word_size); + + // This places the body of the block at a 2 word boundary + // because every block starts on a 2 word boundary. Work out + // how to make the body on a 2 word boundary if the block + // starts on a arbitrary boundary. JJJ + + size_t word_size() const { return header()->_word_size; } + void set_word_size(size_t v) { _block._header._word_size = v; } + size_t size() const volatile { return _block._header._word_size; } + void set_size(size_t v) { _block._header._word_size = v; } + Metablock* next() const { return header()->_next; } + void set_next(Metablock* v) { _block._header._next = v; } + Metablock* prev() const { return header()->_prev; } + void set_prev(Metablock* v) { _block._header._prev = v; } + + static size_t min_block_byte_size() { return _min_block_byte_size; } + static size_t overhead() { return _overhead; } + + bool is_free() { return header()->_word_size != 0; } + void clear_next() { set_next(NULL); } + void link_prev(Metablock* ptr) { set_prev(ptr); } + uintptr_t* end() { return ((uintptr_t*) this) + size(); } + bool cantCoalesce() const { return false; } + void link_next(Metablock* ptr) { set_next(ptr); } + void link_after(Metablock* ptr){ + link_next(ptr); + if (ptr != NULL) ptr->link_prev(this); + } + + // Should not be needed in a free list of Metablocks + void markNotFree() { ShouldNotReachHere(); } + + // Debug support +#ifdef ASSERT + void* prev_addr() const { return (void*)&_block._header._prev; } + void* next_addr() const { return (void*)&_block._header._next; } + void* size_addr() const { return (void*)&_block._header._word_size; } +#endif + bool verify_chunk_in_free_list(Metablock* tc) const { return true; } + bool verify_par_locked() { return true; } + + void assert_is_mangled() const {/* Don't check "\*/} +}; +#endif // SHARE_VM_MEMORY_METABLOCK_HPP diff --git a/hotspot/src/share/vm/memory/metachunk.hpp b/hotspot/src/share/vm/memory/metachunk.hpp new file mode 100644 index 00000000000..dd461972a14 --- /dev/null +++ b/hotspot/src/share/vm/memory/metachunk.hpp @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +#ifndef SHARE_VM_MEMORY_METACHUNK_HPP +#define SHARE_VM_MEMORY_METACHUNK_HPP + +// Metachunk - Quantum of allocation from a Virtualspace +// Metachunks are reused (when freed are put on a global freelist) and +// have no permanent association to a SpaceManager. + +// +--------------+ <- end +// | | --+ ---+ +// | | | free | +// | | | | +// | | | | capacity +// | | | | +// | | <- top --+ | +// | | ---+ | +// | | | used | +// | | | | +// | | | | +// +--------------+ <- bottom ---+ ---+ + +class Metachunk VALUE_OBJ_CLASS_SPEC { + // link to support lists of chunks + Metachunk* _next; + Metachunk* _prev; + + MetaWord* _bottom; + MetaWord* _end; + MetaWord* _top; + size_t _word_size; + // Used in a guarantee() so included in the Product builds + // even through it is only for debugging. + bool _is_free; + + // Metachunks are allocated out of a MetadataVirtualSpace and + // and use some of its space to describe itself (plus alignment + // considerations). Metadata is allocated in the rest of the chunk. + // This size is the overhead of maintaining the Metachunk within + // the space. + static size_t _overhead; + + void set_bottom(MetaWord* v) { _bottom = v; } + void set_end(MetaWord* v) { _end = v; } + void set_top(MetaWord* v) { _top = v; } + void set_word_size(size_t v) { _word_size = v; } + public: +#ifdef ASSERT + Metachunk() : _bottom(NULL), _end(NULL), _top(NULL), _is_free(false) {} +#else + Metachunk() : _bottom(NULL), _end(NULL), _top(NULL) {} +#endif + + // Used to add a Metachunk to a list of Metachunks + void set_next(Metachunk* v) { _next = v; assert(v != this, "Boom");} + void set_prev(Metachunk* v) { _prev = v; assert(v != this, "Boom");} + + MetaWord* allocate(size_t word_size); + static Metachunk* initialize(MetaWord* ptr, size_t word_size); + + // Accessors + Metachunk* next() const { return _next; } + Metachunk* prev() const { return _prev; } + MetaWord* bottom() const { return _bottom; } + MetaWord* end() const { return _end; } + MetaWord* top() const { return _top; } + size_t word_size() const { return _word_size; } + size_t size() const volatile { return _word_size; } + void set_size(size_t v) { _word_size = v; } + bool is_free() { return _is_free; } + void set_is_free(bool v) { _is_free = v; } + static size_t overhead() { return _overhead; } + void clear_next() { set_next(NULL); } + void link_prev(Metachunk* ptr) { set_prev(ptr); } + uintptr_t* end() { return ((uintptr_t*) this) + size(); } + bool cantCoalesce() const { return false; } + void link_next(Metachunk* ptr) { set_next(ptr); } + void link_after(Metachunk* ptr){ + link_next(ptr); + if (ptr != NULL) ptr->link_prev(this); + } + + // Reset top to bottom so chunk can be reused. + void reset_empty() { _top = (_bottom + _overhead); } + bool is_empty() { return _top == (_bottom + _overhead); } + + // used (has been allocated) + // free (available for future allocations) + // capacity (total size of chunk) + size_t used_word_size(); + size_t free_word_size(); + size_t capacity_word_size(); + + // Debug support +#ifdef ASSERT + void* prev_addr() const { return (void*)&_prev; } + void* next_addr() const { return (void*)&_next; } + void* size_addr() const { return (void*)&_word_size; } +#endif + bool verify_chunk_in_free_list(Metachunk* tc) const { return true; } + bool verify_par_locked() { return true; } + + void assert_is_mangled() const {/* Don't check "\*/} + +#ifdef ASSERT + void mangle(); +#endif // ASSERT + + void print_on(outputStream* st) const; + void verify(); +}; +#endif // SHARE_VM_MEMORY_METACHUNK_HPP diff --git a/hotspot/src/share/vm/memory/metaspace.cpp b/hotspot/src/share/vm/memory/metaspace.cpp index 0396eef2def..fc2609f2a99 100644 --- a/hotspot/src/share/vm/memory/metaspace.cpp +++ b/hotspot/src/share/vm/memory/metaspace.cpp @@ -24,9 +24,12 @@ #include "precompiled.hpp" #include "gc_interface/collectedHeap.hpp" #include "memory/binaryTreeDictionary.hpp" +#include "memory/freeList.hpp" #include "memory/collectorPolicy.hpp" #include "memory/filemap.hpp" #include "memory/freeList.hpp" +#include "memory/metablock.hpp" +#include "memory/metachunk.hpp" #include "memory/metaspace.hpp" #include "memory/metaspaceShared.hpp" #include "memory/resourceArea.hpp" @@ -37,15 +40,8 @@ #include "utilities/copy.hpp" #include "utilities/debug.hpp" -// Define this macro to deallocate Metablock. If not defined, -// blocks are not yet deallocated and are only mangled. -#undef DEALLOCATE_BLOCKS - -// Easily recognizable patterns -// These patterns can be the same in 32bit or 64bit since -// they only have to be easily recognizable. -const void* metaspace_allocation_leader = (void*) 0X11111111; -const void* metaspace_allocation_trailer = (void*) 0X77777777; +typedef BinaryTreeDictionary BlockTreeDictionary; +typedef BinaryTreeDictionary ChunkTreeDictionary; // Parameters for stress mode testing const uint metadata_deallocate_a_lot_block = 10; @@ -53,7 +49,6 @@ const uint metadata_deallocate_a_lock_chunk = 3; size_t const allocation_from_dictionary_limit = 64 * K; const size_t metadata_chunk_initialize = 0xf7f7f7f7; const size_t metadata_deallocate = 0xf5f5f5f5; -const size_t metadata_space_manager_allocate = 0xf3f3f3f3; MetaWord* last_allocated = 0; @@ -62,11 +57,12 @@ enum ChunkIndex { SmallIndex = 0, MediumIndex = 1, HumongousIndex = 2, - NumberOfFreeLists = 3 + NumberOfFreeLists = 2, + NumberOfInUseLists = 3 }; static ChunkIndex next_chunk_index(ChunkIndex i) { - assert(i < NumberOfFreeLists, "Out of bound"); + assert(i < NumberOfInUseLists, "Out of bound"); return (ChunkIndex) (i+1); } @@ -100,164 +96,13 @@ bool MetaspaceGC::_should_concurrent_collect = false; // the Chunk after the header for the Chunk) where as Metachunks // point to space in a VirtualSpace. To replace Metachunks with // Chunks, change Chunks so that they can be allocated out of a VirtualSpace. -// - -// Metablock are the unit of allocation from a Chunk. It contains -// the size of the requested allocation in a debug build. -// Also in a debug build it has a marker before and after the -// body of the block. The address of the body is the address returned -// by the allocation. -// -// Layout in a debug build. In a product build only the body is present. -// -// +-----------+-----------+------------+ +-----------+ -// | word size | leader | body | ... | trailer | -// +-----------+-----------+------------+ +-----------+ -// -// A Metablock may be reused by its SpaceManager but are never moved between -// SpaceManagers. There is no explicit link to the Metachunk -// from which it was allocated. Metablock are not deallocated, rather -// the Metachunk it is a part of will be deallocated when it's -// associated class loader is collected. -// -// When the word size of a block is passed in to the deallocation -// call the word size no longer needs to be part of a Metablock. - -class Metablock { - friend class VMStructs; - private: - // Used to align the allocation (see below) and for debugging. +size_t Metablock::_min_block_byte_size = sizeof(Metablock); #ifdef ASSERT - struct { - size_t _word_size; - void* _leader; - } _header; - void* _data[1]; -#endif - static size_t _overhead; - -#ifdef ASSERT - void set_word_size(size_t v) { _header._word_size = v; } - void* leader() { return _header._leader; } - void* trailer() { - jlong index = (jlong) _header._word_size - sizeof(_header)/BytesPerWord - 1; - assert(index > 0, err_msg("Bad indexling of trailer %d", index)); - void** ptr = &_data[index]; - return *ptr; - } - void set_leader(void* v) { _header._leader = v; } - void set_trailer(void* v) { - void** ptr = &_data[_header._word_size - sizeof(_header)/BytesPerWord - 1]; - *ptr = v; - } - public: - size_t word_size() { return _header._word_size; } -#endif - public: - - static Metablock* initialize(MetaWord* p, size_t word_size); - - // This places the body of the block at a 2 word boundary - // because every block starts on a 2 word boundary. Work out - // how to make the body on a 2 word boundary if the block - // starts on a arbitrary boundary. JJJ - -#ifdef ASSERT - MetaWord* data() { return (MetaWord*) &_data[0]; } + size_t Metablock::_overhead = + Chunk::aligned_overhead_size(sizeof(Metablock)) / BytesPerWord; #else - MetaWord* data() { return (MetaWord*) this; } + size_t Metablock::_overhead = 0; #endif - static Metablock* metablock_from_data(MetaWord* p) { -#ifdef ASSERT - size_t word_offset = offset_of(Metablock, _data)/BytesPerWord; - Metablock* result = (Metablock*) (p - word_offset); - return result; -#else - return (Metablock*) p; -#endif - } - - static size_t overhead() { return _overhead; } - void verify(); -}; - -// Metachunk - Quantum of allocation from a Virtualspace -// Metachunks are reused (when freed are put on a global freelist) and -// have no permanent association to a SpaceManager. - -// +--------------+ <- end -// | | --+ ---+ -// | | | free | -// | | | | -// | | | | capacity -// | | | | -// | | <- top --+ | -// | | ---+ | -// | | | used | -// | | | | -// | | | | -// +--------------+ <- bottom ---+ ---+ - -class Metachunk VALUE_OBJ_CLASS_SPEC { - // link to support lists of chunks - Metachunk* _next; - - MetaWord* _bottom; - MetaWord* _end; - MetaWord* _top; - size_t _word_size; - - // Metachunks are allocated out of a MetadataVirtualSpace and - // and use some of its space to describe itself (plus alignment - // considerations). Metadata is allocated in the rest of the chunk. - // This size is the overhead of maintaining the Metachunk within - // the space. - static size_t _overhead; - - void set_bottom(MetaWord* v) { _bottom = v; } - void set_end(MetaWord* v) { _end = v; } - void set_top(MetaWord* v) { _top = v; } - void set_word_size(size_t v) { _word_size = v; } - public: - - // Used to add a Metachunk to a list of Metachunks - void set_next(Metachunk* v) { _next = v; assert(v != this, "Boom");} - - Metablock* allocate(size_t word_size); - static Metachunk* initialize(MetaWord* ptr, size_t word_size); - - // Accessors - Metachunk* next() const { return _next; } - MetaWord* bottom() const { return _bottom; } - MetaWord* end() const { return _end; } - MetaWord* top() const { return _top; } - size_t word_size() const { return _word_size; } - static size_t overhead() { return _overhead; } - - // Reset top to bottom so chunk can be reused. - void reset_empty() { _top = (_bottom + _overhead); } - bool is_empty() { return _top == (_bottom + _overhead); } - - // used (has been allocated) - // free (available for future allocations) - // capacity (total size of chunk) - size_t used_word_size(); - size_t free_word_size(); - size_t capacity_word_size(); - -#ifdef ASSERT - void mangle() { - // Mangle the payload of the chunk and not the links that - // maintain list of chunks. - HeapWord* start = (HeapWord*)(bottom() + overhead()); - size_t word_size = capacity_word_size() - overhead(); - Copy::fill_to_words(start, word_size, metadata_chunk_initialize); - } -#endif // ASSERT - - void print_on(outputStream* st) const; - void verify(); -}; // Pointer to list of Metachunks. @@ -292,7 +137,10 @@ class ChunkManager VALUE_OBJ_CLASS_SPEC { // SmallChunk // MediumChunk // HumongousChunk - ChunkList _free_chunks[3]; + ChunkList _free_chunks[NumberOfFreeLists]; + + // HumongousChunk + ChunkTreeDictionary _humongous_dictionary; // ChunkManager in all lists of this type size_t _free_chunks_total; @@ -337,7 +185,9 @@ class ChunkManager VALUE_OBJ_CLASS_SPEC { } ChunkList* free_medium_chunks() { return &_free_chunks[1]; } ChunkList* free_small_chunks() { return &_free_chunks[0]; } - ChunkList* free_humongous_chunks() { return &_free_chunks[2]; } + ChunkTreeDictionary* humongous_dictionary() { + return &_humongous_dictionary; + } ChunkList* free_chunks(ChunkIndex index); @@ -356,41 +206,35 @@ class ChunkManager VALUE_OBJ_CLASS_SPEC { void locked_print_free_chunks(outputStream* st); void locked_print_sum_free_chunks(outputStream* st); + + void print_on(outputStream* st); }; // Used to manage the free list of Metablocks (a block corresponds // to the allocation of a quantum of metadata). class BlockFreelist VALUE_OBJ_CLASS_SPEC { -#ifdef DEALLOCATE_BLOCKS - BinaryTreeDictionary* _dictionary; -#endif - static Metablock* initialize_free_chunk(Metablock* block, size_t word_size); + BlockTreeDictionary* _dictionary; + static Metablock* initialize_free_chunk(MetaWord* p, size_t word_size); -#ifdef DEALLOCATE_BLOCKS // Accessors - BinaryTreeDictionary* dictionary() const { return _dictionary; } -#endif + BlockTreeDictionary* dictionary() const { return _dictionary; } public: BlockFreelist(); ~BlockFreelist(); // Get and return a block to the free list - Metablock* get_block(size_t word_size); - void return_block(Metablock* block, size_t word_size); + MetaWord* get_block(size_t word_size); + void return_block(MetaWord* p, size_t word_size); - size_t totalSize() { -#ifdef DEALLOCATE_BLOCKS - if (dictionary() == NULL) { - return 0; - } else { - return dictionary()->totalSize(); - } -#else + size_t total_size() { + if (dictionary() == NULL) { return 0; -#endif + } else { + return dictionary()->total_size(); } +} void print_on(outputStream* st) const; }; @@ -600,7 +444,6 @@ class VirtualSpaceList : public CHeapObj { }; }; - class Metadebug : AllStatic { // Debugging support for Metaspaces static int _deallocate_block_a_lot_count; @@ -655,7 +498,7 @@ class SpaceManager : public CHeapObj { // List of chunks in use by this SpaceManager. Allocations // are done from the current chunk. The list is used for deallocating // chunks when the SpaceManager is freed. - Metachunk* _chunks_in_use[NumberOfFreeLists]; + Metachunk* _chunks_in_use[NumberOfInUseLists]; Metachunk* _current_chunk; // Virtual space where allocation comes from. @@ -700,24 +543,6 @@ class SpaceManager : public CHeapObj { // Add chunk to the list of chunks in use void add_chunk(Metachunk* v, bool make_current); - // Debugging support - void verify_chunks_in_use_index(ChunkIndex index, Metachunk* v) { - switch (index) { - case 0: - assert(v->word_size() == SmallChunk, "Not a SmallChunk"); - break; - case 1: - assert(v->word_size() == MediumChunk, "Not a MediumChunk"); - break; - case 2: - assert(v->word_size() > MediumChunk, "Not a HumongousChunk"); - break; - default: - assert(false, "Wrong list."); - } - } - - protected: Mutex* lock() const { return _lock; } public: @@ -751,10 +576,10 @@ class SpaceManager : public CHeapObj { MetaWord* allocate(size_t word_size); // Helper for allocations - Metablock* allocate_work(size_t word_size); + MetaWord* allocate_work(size_t word_size); // Returns a block to the per manager freelist - void deallocate(MetaWord* p); + void deallocate(MetaWord* p, size_t word_size); // Based on the allocation size and a minimum chunk size, // returned chunk size (for expanding space for chunk allocation). @@ -763,7 +588,7 @@ class SpaceManager : public CHeapObj { // Called when an allocation from the current chunk fails. // Gets a new chunk (may require getting a new virtual space), // and allocates from that chunk. - Metablock* grow_and_allocate(size_t word_size); + MetaWord* grow_and_allocate(size_t word_size); // debugging support. @@ -780,6 +605,8 @@ class SpaceManager : public CHeapObj { uint const SpaceManager::_small_chunk_limit = 4; + + const char* SpaceManager::_expand_lock_name = "SpaceManager chunk allocation lock"; const int SpaceManager::_expand_lock_rank = Monitor::leaf - 1; @@ -788,39 +615,26 @@ Mutex* const SpaceManager::_expand_lock = SpaceManager::_expand_lock_name, Mutex::_allow_vm_block_flag); -#ifdef ASSERT -size_t Metablock::_overhead = - Chunk::aligned_overhead_size(sizeof(Metablock)) / BytesPerWord; -#else -size_t Metablock::_overhead = 0; -#endif size_t Metachunk::_overhead = Chunk::aligned_overhead_size(sizeof(Metachunk)) / BytesPerWord; // New blocks returned by the Metaspace are zero initialized. // We should fix the constructors to not assume this instead. Metablock* Metablock::initialize(MetaWord* p, size_t word_size) { + if (p == NULL) { + return NULL; + } + Metablock* result = (Metablock*) p; // Clear the memory Copy::fill_to_aligned_words((HeapWord*)result, word_size); #ifdef ASSERT result->set_word_size(word_size); - // Check after work size is set. - result->set_leader((void*) metaspace_allocation_leader); - result->set_trailer((void*) metaspace_allocation_trailer); #endif return result; } -void Metablock::verify() { -#ifdef ASSERT - assert(leader() == metaspace_allocation_leader && - trailer() == metaspace_allocation_trailer, - "block has been corrupted"); -#endif -} - // Metachunk methods Metachunk* Metachunk::initialize(MetaWord* ptr, size_t word_size) { @@ -843,18 +657,13 @@ Metachunk* Metachunk::initialize(MetaWord* ptr, size_t word_size) { } -Metablock* Metachunk::allocate(size_t word_size) { - Metablock* result = NULL; +MetaWord* Metachunk::allocate(size_t word_size) { + MetaWord* result = NULL; // If available, bump the pointer to allocate. if (free_word_size() >= word_size) { - result = Metablock::initialize(_top, word_size); + result = _top; _top = _top + word_size; } -#ifdef ASSERT - assert(result == NULL || - result->word_size() == word_size, - "Block size is not set correctly"); -#endif return result; } @@ -878,103 +687,85 @@ void Metachunk::print_on(outputStream* st) const { bottom(), top(), end(), word_size()); } +#ifdef ASSERT +void Metachunk::mangle() { + // Mangle the payload of the chunk and not the links that + // maintain list of chunks. + HeapWord* start = (HeapWord*)(bottom() + overhead()); + size_t word_size = capacity_word_size() - overhead(); + Copy::fill_to_words(start, word_size, metadata_chunk_initialize); +} +#endif // ASSERT void Metachunk::verify() { #ifdef ASSERT // Cannot walk through the blocks unless the blocks have // headers with sizes. - MetaWord* curr = bottom() + overhead(); - while (curr < top()) { - Metablock* block = (Metablock*) curr; - size_t word_size = block->word_size(); - block->verify(); - curr = curr + word_size; - } + assert(_bottom <= _top && + _top <= _end, + "Chunk has been smashed"); + assert(SpaceManager::is_humongous(_word_size) || + _word_size == SpaceManager::MediumChunk || + _word_size == SpaceManager::SmallChunk, + "Chunk size is wrong"); #endif return; } // BlockFreelist methods -#ifdef DEALLOCATE_BLOCKS BlockFreelist::BlockFreelist() : _dictionary(NULL) {} -#else -BlockFreelist::BlockFreelist() {} -#endif BlockFreelist::~BlockFreelist() { -#ifdef DEALLOCATE_BLOCKS if (_dictionary != NULL) { if (Verbose && TraceMetadataChunkAllocation) { _dictionary->print_free_lists(gclog_or_tty); } delete _dictionary; } -#endif } -Metablock* BlockFreelist::initialize_free_chunk(Metablock* block, size_t word_size) { -#ifdef DEALLOCATE_BLOCKS -#ifdef ASSERT - assert(word_size = block->word_size(), "Wrong chunk size"); -#endif - Metablock* result = block; - result->setSize(word_size); - result->linkPrev(NULL); - result->linkNext(NULL); +Metablock* BlockFreelist::initialize_free_chunk(MetaWord* p, size_t word_size) { + Metablock* block = (Metablock*) p; + block->set_word_size(word_size); + block->set_prev(NULL); + block->set_next(NULL); - return result; -#else - ShouldNotReachHere(); return block; -#endif } -void BlockFreelist::return_block(Metablock* block, size_t word_size) { -#ifdef ASSERT - assert(word_size = block->word_size(), "Block size is wrong");; -#endif - Metablock* free_chunk = initialize_free_chunk(block, word_size); -#ifdef DEALLOCATE_BLOCKS +void BlockFreelist::return_block(MetaWord* p, size_t word_size) { + Metablock* free_chunk = initialize_free_chunk(p, word_size); if (dictionary() == NULL) { - _dictionary = new BinaryTreeDictionary(false /* adaptive_freelists */); + _dictionary = new BlockTreeDictionary(); } - dictionary()->returnChunk(free_chunk); -#endif + dictionary()->return_chunk(free_chunk); } -Metablock* BlockFreelist::get_block(size_t word_size) { -#ifdef DEALLOCATE_BLOCKS +MetaWord* BlockFreelist::get_block(size_t word_size) { if (dictionary() == NULL) { return NULL; } - Metablock* free_chunk = - dictionary()->getChunk(word_size, FreeBlockDictionary::exactly); -#else - Metablock* free_chunk = NULL; -#endif - if (free_chunk == NULL) { + if (word_size < TreeChunk::min_size()) { + // Dark matter. Too small for dictionary. return NULL; } - assert(free_chunk->word_size() == word_size, "Size of chunk is incorrect"); - Metablock* block = Metablock::initialize((MetaWord*) free_chunk, word_size); -#ifdef ASSERT - assert(block->word_size() == word_size, "Block size is not set correctly"); -#endif - return block; + Metablock* free_block = + dictionary()->get_chunk(word_size, FreeBlockDictionary::exactly); + if (free_block == NULL) { + return NULL; + } + + return (MetaWord*) free_block; } void BlockFreelist::print_on(outputStream* st) const { -#ifdef DEALLOCATE_BLOCKS if (dictionary() == NULL) { return; } dictionary()->print_free_lists(st); -#else - return; -#endif } // VirtualSpaceNode methods @@ -1597,14 +1388,11 @@ void Metadebug::deallocate_block_a_lot(SpaceManager* sm, Metadebug::deallocate_block_a_lot_count() % MetaDataDeallocateALotInterval == 0 ) { Metadebug::set_deallocate_block_a_lot_count(0); for (uint i = 0; i < metadata_deallocate_a_lot_block; i++) { - Metablock* dummy_block = sm->allocate_work(raw_word_size); + MetaWord* dummy_block = sm->allocate_work(raw_word_size); if (dummy_block == 0) { break; } -#ifdef ASSERT - assert(dummy_block->word_size() == raw_word_size, "Block size is not set correctly"); -#endif - sm->deallocate(dummy_block->data()); + sm->deallocate(dummy_block, raw_word_size); } } else { Metadebug::inc_deallocate_block_a_lot_count(); @@ -1784,8 +1572,8 @@ void ChunkManager::verify() { } void ChunkManager::locked_verify() { - locked_verify_free_chunks_total(); locked_verify_free_chunks_count(); + locked_verify_free_chunks_total(); } void ChunkManager::locked_print_free_chunks(outputStream* st) { @@ -1803,7 +1591,6 @@ ChunkList* ChunkManager::free_chunks(ChunkIndex index) { return &_free_chunks[index]; } - // These methods that sum the free chunk lists are used in printing // methods that are used in product builds. size_t ChunkManager::sum_free_chunks() { @@ -1818,6 +1605,7 @@ size_t ChunkManager::sum_free_chunks() { result = result + list->sum_list_capacity(); } + result = result + humongous_dictionary()->total_size(); return result; } @@ -1831,6 +1619,7 @@ size_t ChunkManager::sum_free_chunks_count() { } count = count + list->sum_list_count(); } + count = count + humongous_dictionary()->total_free_blocks(); return count; } @@ -1875,23 +1664,24 @@ Metachunk* ChunkManager::free_chunks_get(size_t word_size) { assert_lock_strong(SpaceManager::expand_lock()); locked_verify(); - ChunkList* free_list = find_free_chunks_list(word_size); - assert(free_list != NULL, "Sanity check"); - Metachunk* chunk = free_list->head(); - debug_only(Metachunk* debug_head = chunk;) + Metachunk* chunk = NULL; + if (!SpaceManager::is_humongous(word_size)) { + ChunkList* free_list = find_free_chunks_list(word_size); + assert(free_list != NULL, "Sanity check"); - if (chunk == NULL) { - return NULL; - } + chunk = free_list->head(); + debug_only(Metachunk* debug_head = chunk;) + + if (chunk == NULL) { + return NULL; + } - Metachunk* prev_chunk = chunk; - if (chunk->word_size() == word_size) { - // Chunk is being removed from the chunks free list. - dec_free_chunks_total(chunk->capacity_word_size()); // Remove the chunk as the head of the list. free_list->set_head(chunk->next()); chunk->set_next(NULL); + // Chunk has been removed from the chunks free list. + dec_free_chunks_total(chunk->capacity_word_size()); if (TraceMetadataChunkAllocation && Verbose) { tty->print_cr("ChunkManager::free_chunks_get: free_list " @@ -1899,79 +1689,24 @@ Metachunk* ChunkManager::free_chunks_get(size_t word_size) { free_list, chunk, chunk->word_size()); } } else { - assert(SpaceManager::is_humongous(word_size), - "Should only need to check humongous"); - // This code to find the best fit is just for purposes of - // investigating the loss due to fragmentation on a humongous - // chunk. It will be replace by a binaryTreeDictionary for - // the humongous chunks. - uint count = 0; - Metachunk* best_fit = NULL; - Metachunk* best_fit_prev = NULL; - while (chunk != NULL) { - count++; - if (chunk->word_size() < word_size) { - prev_chunk = chunk; - chunk = chunk->next(); - } else if (chunk->word_size() == word_size) { - break; - } else { - if (best_fit == NULL || - best_fit->word_size() > chunk->word_size()) { - best_fit_prev = prev_chunk; - best_fit = chunk; - } - prev_chunk = chunk; - chunk = chunk->next(); + chunk = humongous_dictionary()->get_chunk( + word_size, + FreeBlockDictionary::atLeast); + + if (chunk != NULL) { + if (TraceMetadataHumongousAllocation) { + size_t waste = chunk->word_size() - word_size; + tty->print_cr("Free list allocate humongous chunk size " SIZE_FORMAT + " for requested size " SIZE_FORMAT + " waste " SIZE_FORMAT, + chunk->word_size(), word_size, waste); } + // Chunk is being removed from the chunks free list. + dec_free_chunks_total(chunk->capacity_word_size()); +#ifdef ASSERT + chunk->set_is_free(false); +#endif } - if (chunk == NULL) { - prev_chunk = best_fit_prev; - chunk = best_fit; - } - if (chunk != NULL) { - if (TraceMetadataHumongousAllocation) { - size_t waste = chunk->word_size() - word_size; - tty->print_cr("Free list allocate humongous chunk size " SIZE_FORMAT - " for requested size " SIZE_FORMAT - " waste " SIZE_FORMAT - " found at " SIZE_FORMAT " of " SIZE_FORMAT, - chunk->word_size(), word_size, waste, - count, free_list->sum_list_count()); - } - // Chunk is being removed from the chunks free list. - dec_free_chunks_total(chunk->capacity_word_size()); - // Remove the chunk if it is at the head of the list. - if (chunk == free_list->head()) { - free_list->set_head(chunk->next()); - - if (TraceMetadataHumongousAllocation) { - tty->print_cr("ChunkManager::free_chunks_get: humongous free_list " - PTR_FORMAT " chunk " PTR_FORMAT " size " SIZE_FORMAT - " new head " PTR_FORMAT, - free_list, chunk, chunk->word_size(), - free_list->head()); - } - } else { - // Remove a chunk in the interior of the list - prev_chunk->set_next(chunk->next()); - - if (TraceMetadataHumongousAllocation) { - tty->print_cr("ChunkManager::free_chunks_get: humongous free_list " - PTR_FORMAT " chunk " PTR_FORMAT " size " SIZE_FORMAT - PTR_FORMAT " prev " PTR_FORMAT " next " PTR_FORMAT, - free_list, chunk, chunk->word_size(), - prev_chunk, chunk->next()); - } - } - chunk->set_next(NULL); - } else { - if (TraceMetadataHumongousAllocation) { - tty->print_cr("ChunkManager::free_chunks_get: New humongous chunk of size " - SIZE_FORMAT, - word_size); - } - } } locked_verify(); return chunk; @@ -2000,12 +1735,18 @@ Metachunk* ChunkManager::chunk_freelist_allocate(size_t word_size) { return chunk; } +void ChunkManager::print_on(outputStream* out) { + if (PrintFLSStatistics != 0) { + humongous_dictionary()->report_statistics(); + } +} + // SpaceManager methods size_t SpaceManager::sum_free_in_chunks_in_use() const { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); size_t free = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { Metachunk* chunk = chunks_in_use(i); while (chunk != NULL) { free += chunk->free_word_size(); @@ -2018,11 +1759,12 @@ size_t SpaceManager::sum_free_in_chunks_in_use() const { size_t SpaceManager::sum_waste_in_chunks_in_use() const { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); size_t result = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { - // Count the free space in all the chunk but not the - // current chunk from which allocations are still being done. + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { + + result += sum_waste_in_chunks_in_use(i); } + return result; } @@ -2033,10 +1775,10 @@ size_t SpaceManager::sum_waste_in_chunks_in_use(ChunkIndex index) const { // Count the free space in all the chunk but not the // current chunk from which allocations are still being done. if (chunk != NULL) { - while (chunk != NULL) { - if (chunk != current_chunk()) { - result += chunk->free_word_size(); - } + Metachunk* prev = chunk; + while (chunk != NULL && chunk != current_chunk()) { + result += chunk->free_word_size(); + prev = chunk; chunk = chunk->next(); count++; } @@ -2047,7 +1789,7 @@ size_t SpaceManager::sum_waste_in_chunks_in_use(ChunkIndex index) const { size_t SpaceManager::sum_capacity_in_chunks_in_use() const { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); size_t sum = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { Metachunk* chunk = chunks_in_use(i); while (chunk != NULL) { // Just changed this sum += chunk->capacity_word_size(); @@ -2061,9 +1803,10 @@ size_t SpaceManager::sum_capacity_in_chunks_in_use() const { size_t SpaceManager::sum_count_in_chunks_in_use() { size_t count = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { count = count + sum_count_in_chunks_in_use(i); } + return count; } @@ -2081,7 +1824,7 @@ size_t SpaceManager::sum_count_in_chunks_in_use(ChunkIndex i) { size_t SpaceManager::sum_used_in_chunks_in_use() const { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); size_t used = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { Metachunk* chunk = chunks_in_use(i); while (chunk != NULL) { used += chunk->used_word_size(); @@ -2139,15 +1882,13 @@ size_t SpaceManager::calc_chunk_size(size_t word_size) { gclog_or_tty->print_cr(" word_size " PTR_FORMAT, word_size); gclog_or_tty->print_cr(" chunk_word_size " PTR_FORMAT, chunk_word_size); - gclog_or_tty->print_cr(" block overhead " PTR_FORMAT - " chunk overhead " PTR_FORMAT, - Metablock::overhead(), + gclog_or_tty->print_cr(" chunk overhead " PTR_FORMAT, Metachunk::overhead()); } return chunk_word_size; } -Metablock* SpaceManager::grow_and_allocate(size_t word_size) { +MetaWord* SpaceManager::grow_and_allocate(size_t word_size) { assert(vs_list()->current_virtual_space() != NULL, "Should have been set"); assert(current_chunk() == NULL || @@ -2180,7 +1921,7 @@ Metablock* SpaceManager::grow_and_allocate(size_t word_size) { void SpaceManager::print_on(outputStream* st) const { for (ChunkIndex i = SmallIndex; - i < NumberOfFreeLists ; + i < NumberOfInUseLists ; i = next_chunk_index(i) ) { st->print_cr(" chunks_in_use " PTR_FORMAT " chunk size " PTR_FORMAT, chunks_in_use(i), @@ -2191,8 +1932,11 @@ void SpaceManager::print_on(outputStream* st) const { sum_waste_in_chunks_in_use(SmallIndex), sum_waste_in_chunks_in_use(MediumIndex), sum_waste_in_chunks_in_use(HumongousIndex)); - // Nothing in them yet - // block_freelists()->print_on(st); + // block free lists + if (block_freelists() != NULL) { + st->print_cr("total in block free lists " SIZE_FORMAT, + block_freelists()->total_size()); + } } SpaceManager::SpaceManager(Mutex* lock, VirtualSpaceList* vs_list) : @@ -2200,7 +1944,7 @@ SpaceManager::SpaceManager(Mutex* lock, VirtualSpaceList* vs_list) : _allocation_total(0), _lock(lock) { Metadebug::init_allocation_fail_alot_count(); - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { _chunks_in_use[i] = NULL; } _current_chunk = NULL; @@ -2262,22 +2006,24 @@ SpaceManager::~SpaceManager() { // Humongous chunks are never the current chunk. Metachunk* humongous_chunks = chunks_in_use(HumongousIndex); - if (humongous_chunks != NULL) { - chunk_manager->free_humongous_chunks()->add_at_head(humongous_chunks); - set_chunks_in_use(HumongousIndex, NULL); + while (humongous_chunks != NULL) { +#ifdef ASSERT + humongous_chunks->set_is_free(true); +#endif + Metachunk* next_humongous_chunks = humongous_chunks->next(); + chunk_manager->humongous_dictionary()->return_chunk(humongous_chunks); + humongous_chunks = next_humongous_chunks; } + set_chunks_in_use(HumongousIndex, NULL); chunk_manager->locked_verify(); } -void SpaceManager::deallocate(MetaWord* p) { +void SpaceManager::deallocate(MetaWord* p, size_t word_size) { assert_lock_strong(_lock); - ShouldNotReachHere(); // Where is this needed. -#ifdef DEALLOCATE_BLOCKS - Metablock* block = Metablock::metablock_from_data(p); - // This is expense but kept it until integration JJJ - assert(contains((address)block), "Block does not belong to this metaspace"); - block_freelists()->return_block(block, word_size); -#endif + size_t min_size = TreeChunk::min_size(); + assert(word_size >= min_size, + err_msg("Should not deallocate dark matter " SIZE_FORMAT, word_size)); + block_freelists()->return_block(p, word_size); } // Adds a chunk to the list of chunks in use. @@ -2366,50 +2112,40 @@ void SpaceManager::add_chunk(Metachunk* new_chunk, bool make_current) { MetaWord* SpaceManager::allocate(size_t word_size) { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); - size_t block_overhead = Metablock::overhead(); // If only the dictionary is going to be used (i.e., no // indexed free list), then there is a minimum size requirement. // MinChunkSize is a placeholder for the real minimum size JJJ - size_t byte_size_with_overhead = (word_size + block_overhead) * BytesPerWord; -#ifdef DEALLOCATE_BLOCKS - size_t raw_bytes_size = MAX2(ARENA_ALIGN(byte_size_with_overhead), - MinChunkSize * BytesPerWord); -#else - size_t raw_bytes_size = ARENA_ALIGN(byte_size_with_overhead); -#endif + size_t byte_size = word_size * BytesPerWord; + + size_t byte_size_with_overhead = byte_size + Metablock::overhead(); + + size_t raw_bytes_size = MAX2(byte_size_with_overhead, + Metablock::min_block_byte_size()); + raw_bytes_size = ARENA_ALIGN(raw_bytes_size); size_t raw_word_size = raw_bytes_size / BytesPerWord; assert(raw_word_size * BytesPerWord == raw_bytes_size, "Size problem"); BlockFreelist* fl = block_freelists(); - Metablock* block = NULL; + MetaWord* p = NULL; // Allocation from the dictionary is expensive in the sense that // the dictionary has to be searched for a size. Don't allocate // from the dictionary until it starts to get fat. Is this // a reasonable policy? Maybe an skinny dictionary is fast enough // for allocations. Do some profiling. JJJ - if (fl->totalSize() > allocation_from_dictionary_limit) { - block = fl->get_block(raw_word_size); + if (fl->total_size() > allocation_from_dictionary_limit) { + p = fl->get_block(raw_word_size); } - if (block == NULL) { - block = allocate_work(raw_word_size); - if (block == NULL) { - return NULL; - } + if (p == NULL) { + p = allocate_work(raw_word_size); } Metadebug::deallocate_block_a_lot(this, raw_word_size); - // Push the allocation past the word containing the size and leader. -#ifdef ASSERT - MetaWord* result = block->data(); - return result; -#else - return (MetaWord*) block; -#endif + return p; } // Returns the address of spaced allocated for "word_size". // This methods does not know about blocks (Metablocks) -Metablock* SpaceManager::allocate_work(size_t word_size) { +MetaWord* SpaceManager::allocate_work(size_t word_size) { assert_lock_strong(_lock); #ifdef ASSERT if (Metadebug::test_metadata_failure()) { @@ -2417,7 +2153,7 @@ Metablock* SpaceManager::allocate_work(size_t word_size) { } #endif // Is there space in the current chunk? - Metablock* result = NULL; + MetaWord* result = NULL; // For DumpSharedSpaces, only allocate out of the current chunk which is // never null because we gave it the size we wanted. Caller reports out @@ -2436,8 +2172,8 @@ Metablock* SpaceManager::allocate_work(size_t word_size) { } if (result > 0) { inc_allocation_total(word_size); - assert(result != (Metablock*) chunks_in_use(MediumIndex), "Head of the list is being allocated"); - assert(result->word_size() == word_size, "Size not set correctly"); + assert(result != (MetaWord*) chunks_in_use(MediumIndex), + "Head of the list is being allocated"); } return result; @@ -2447,13 +2183,13 @@ void SpaceManager::verify() { // If there are blocks in the dictionary, then // verfication of chunks does not work since // being in the dictionary alters a chunk. - if (block_freelists()->totalSize() == 0) { + if (block_freelists()->total_size() == 0) { // Skip the small chunks because their next link points to // medium chunks. This is because the small chunk is the // current chunk (for allocations) until it is full and the // the addition of the next chunk does not NULL the next // like of the small chunk. - for (ChunkIndex i = MediumIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = MediumIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { Metachunk* curr = chunks_in_use(i); while (curr != NULL) { curr->verify(); @@ -2492,7 +2228,7 @@ void SpaceManager::dump(outputStream* const out) const { // Add up statistics for all chunks in this SpaceManager. for (ChunkIndex index = SmallIndex; - index < NumberOfFreeLists; + index < NumberOfInUseLists; index = next_chunk_index(index)) { for (Metachunk* curr = chunks_in_use(index); curr != NULL; @@ -2521,7 +2257,7 @@ void SpaceManager::dump(outputStream* const out) const { #ifdef ASSERT void SpaceManager::mangle_freed_chunks() { for (ChunkIndex index = SmallIndex; - index < NumberOfFreeLists; + index < NumberOfInUseLists; index = next_chunk_index(index)) { for (Metachunk* curr = chunks_in_use(index); curr != NULL; @@ -2833,13 +2569,12 @@ void Metaspace::initialize(Mutex* lock, size_t initial_size) { } } - MetaWord* Metaspace::allocate(size_t word_size, MetadataType mdtype) { // DumpSharedSpaces doesn't use class metadata area (yet) if (mdtype == ClassType && !DumpSharedSpaces) { - return class_vsm()->allocate(word_size); + return class_vsm()->allocate(word_size); } else { - return vsm()->allocate(word_size); + return vsm()->allocate(word_size); } } @@ -2853,6 +2588,7 @@ MetaWord* Metaspace::expand_and_allocate(size_t word_size, MetadataType mdtype) gclog_or_tty->print_cr("Increase capacity to GC from " SIZE_FORMAT " to " SIZE_FORMAT, before_inc, MetaspaceGC::capacity_until_GC()); } + result = allocate(word_size, mdtype); return result; @@ -2889,37 +2625,39 @@ size_t Metaspace::capacity_words(MetadataType mdtype) const { void Metaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) { if (SafepointSynchronize::is_at_safepoint()) { assert(Thread::current()->is_VM_thread(), "should be the VM thread"); - // Don't take lock -#ifdef DEALLOCATE_BLOCKS - if (is_class) { - class_vsm()->deallocate(ptr); - } else { - vsm()->deallocate(ptr); - } -#else + // Don't take Heap_lock + MutexLocker ml(vsm()->lock()); + if (word_size < TreeChunk::min_size()) { + // Dark matter. Too small for dictionary. #ifdef ASSERT - Copy::fill_to_words((HeapWord*)ptr, word_size, metadata_deallocate); + Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5); #endif -#endif - + return; + } + if (is_class) { + class_vsm()->deallocate(ptr, word_size); + } else { + vsm()->deallocate(ptr, word_size); + } } else { MutexLocker ml(vsm()->lock()); -#ifdef DEALLOCATE_BLOCKS - if (is_class) { - class_vsm()->deallocate(ptr); - } else { - vsm()->deallocate(ptr); - } -#else + if (word_size < TreeChunk::min_size()) { + // Dark matter. Too small for dictionary. #ifdef ASSERT - Copy::fill_to_words((HeapWord*)ptr, word_size, metadata_deallocate); -#endif + Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5); #endif + return; + } + if (is_class) { + class_vsm()->deallocate(ptr, word_size); + } else { + vsm()->deallocate(ptr, word_size); + } } } -MetaWord* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, +Metablock* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, bool read_only, MetadataType mdtype, TRAPS) { if (HAS_PENDING_EXCEPTION) { assert(false, "Should not allocate with exception pending"); @@ -2943,7 +2681,7 @@ MetaWord* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, if (result == NULL) { report_out_of_shared_space(read_only ? SharedReadOnly : SharedReadWrite); } - return result; + return Metablock::initialize(result, word_size); } result = loader_data->metaspace_non_null()->allocate(word_size, mdtype); @@ -2951,7 +2689,7 @@ MetaWord* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, if (result == NULL) { // Try to clean out some memory and retry. result = - Universe::heap()->collector_policy()->satisfy_failed_metadata_allocation( + Universe::heap()->collector_policy()->satisfy_failed_metadata_allocation( loader_data, word_size, mdtype); // If result is still null, we are out of memory. @@ -2967,7 +2705,7 @@ MetaWord* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, THROW_OOP_0(Universe::out_of_memory_error_perm_gen()); } } - return result; + return Metablock::initialize(result, word_size); } void Metaspace::print_on(outputStream* out) const { diff --git a/hotspot/src/share/vm/memory/metaspace.hpp b/hotspot/src/share/vm/memory/metaspace.hpp index 169a3b71d29..c42a979cb1d 100644 --- a/hotspot/src/share/vm/memory/metaspace.hpp +++ b/hotspot/src/share/vm/memory/metaspace.hpp @@ -57,12 +57,10 @@ // class ClassLoaderData; +class Metablock; class MetaWord; class Mutex; class outputStream; -class FreeChunk; -template class FreeList; -template class BinaryTreeDictionary; class SpaceManager; // Metaspaces each have a SpaceManager and allocations @@ -128,7 +126,7 @@ class Metaspace : public CHeapObj { size_t capacity_words(MetadataType mdtype) const; size_t waste_words(MetadataType mdtype) const; - static MetaWord* allocate(ClassLoaderData* loader_data, size_t size, + static Metablock* allocate(ClassLoaderData* loader_data, size_t size, bool read_only, MetadataType mdtype, TRAPS); void deallocate(MetaWord* ptr, size_t byte_size, bool is_class); diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index 51e3ab5f753..9159ad945af 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -59,6 +59,7 @@ #include "memory/generation.hpp" #include "memory/generationSpec.hpp" #include "memory/heap.hpp" +#include "memory/metablock.hpp" #include "memory/space.hpp" #include "memory/tenuredGeneration.hpp" #include "memory/universe.hpp" @@ -249,6 +250,7 @@ typedef TwoOopHashtable KlassTwoOopHashtable; typedef Hashtable KlassHashtable; typedef HashtableEntry KlassHashtableEntry; typedef TwoOopHashtable SymbolTwoOopHashtable; +typedef BinaryTreeDictionary MetablockTreeDictionary; //-------------------------------------------------------------------------------- // VM_STRUCTS @@ -1237,7 +1239,15 @@ typedef TwoOopHashtable SymbolTwoOopHashtable; nonstatic_field(AccessFlags, _flags, jint) \ nonstatic_field(elapsedTimer, _counter, jlong) \ nonstatic_field(elapsedTimer, _active, bool) \ - nonstatic_field(InvocationCounter, _counter, unsigned int) + nonstatic_field(InvocationCounter, _counter, unsigned int) \ + volatile_nonstatic_field(FreeChunk, _size, size_t) \ + nonstatic_field(FreeChunk, _next, FreeChunk*) \ + nonstatic_field(FreeChunk, _prev, FreeChunk*) \ + nonstatic_field(FreeList, _size, size_t) \ + nonstatic_field(FreeList, _size, size_t) \ + nonstatic_field(FreeList, _count, ssize_t) \ + nonstatic_field(FreeList, _count, ssize_t) \ + nonstatic_field(MetablockTreeDictionary, _total_size, size_t) /* NOTE that we do not use the last_entry() macro here; it is used */ /* in vmStructs__.hpp's VM_STRUCTS_OS_CPU macro (and must */ @@ -2080,7 +2090,24 @@ typedef TwoOopHashtable SymbolTwoOopHashtable; declare_toplevel_type(Universe) \ declare_toplevel_type(vframeArray) \ declare_toplevel_type(vframeArrayElement) \ - declare_toplevel_type(Annotations*) + declare_toplevel_type(Annotations*) \ + \ + /***************/ \ + /* Miscellaneous types */ \ + /***************/ \ + \ + /* freelist */ \ + declare_toplevel_type(FreeChunk*) \ + declare_toplevel_type(Metablock*) \ + declare_toplevel_type(FreeBlockDictionary*) \ + declare_toplevel_type(FreeList*) \ + declare_toplevel_type(FreeList) \ + declare_toplevel_type(FreeBlockDictionary*) \ + declare_toplevel_type(FreeList*) \ + declare_toplevel_type(FreeList) \ + declare_toplevel_type(MetablockTreeDictionary*) \ + declare_type(MetablockTreeDictionary, FreeBlockDictionary) \ + declare_type(MetablockTreeDictionary, FreeBlockDictionary) /* NOTE that we do not use the last_entry() macro here; it is used */ From 1a3e1b43e0f5a1b16abc8a127dd20680dfa6624c Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Wed, 19 Sep 2012 21:42:21 +0400 Subject: [PATCH 023/241] 7195917: XMLDecoder parsing at close-time should be improved Reviewed-by: art, ahgross --- .../sun/beans/decoder/DocumentHandler.java | 55 ++++++++++++------- .../share/classes/java/beans/XMLDecoder.java | 16 +++++- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/jdk/src/share/classes/com/sun/beans/decoder/DocumentHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/DocumentHandler.java index f454006ab7e..4bbb8f4a201 100644 --- a/jdk/src/share/classes/com/sun/beans/decoder/DocumentHandler.java +++ b/jdk/src/share/classes/com/sun/beans/decoder/DocumentHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,6 +37,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.PrivilegedAction; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; @@ -46,6 +49,8 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; +import sun.misc.SharedSecrets; + /** * The main class to parse JavaBeans XML archive. * @@ -56,11 +61,10 @@ import org.xml.sax.helpers.DefaultHandler; * @see ElementHandler */ public final class DocumentHandler extends DefaultHandler { - private final Map> handlers = new HashMap>(); - - private final Map environment = new HashMap(); - - private final List objects = new ArrayList(); + private final AccessControlContext acc = AccessController.getContext(); + private final Map> handlers = new HashMap<>(); + private final Map environment = new HashMap<>(); + private final List objects = new ArrayList<>(); private Reference loader; private ExceptionListener listener; @@ -351,23 +355,32 @@ public final class DocumentHandler extends DefaultHandler { * * @param input the input source to parse */ - public void parse(InputSource input) { - try { - SAXParserFactory.newInstance().newSAXParser().parse(input, this); + public void parse(final InputSource input) { + if ((this.acc == null) && (null != System.getSecurityManager())) { + throw new SecurityException("AccessControlContext is not set"); } - catch (ParserConfigurationException exception) { - handleException(exception); - } - catch (SAXException wrapper) { - Exception exception = wrapper.getException(); - if (exception == null) { - exception = wrapper; + AccessControlContext stack = AccessController.getContext(); + SharedSecrets.getJavaSecurityAccess().doIntersectionPrivilege(new PrivilegedAction() { + public Void run() { + try { + SAXParserFactory.newInstance().newSAXParser().parse(input, DocumentHandler.this); + } + catch (ParserConfigurationException exception) { + handleException(exception); + } + catch (SAXException wrapper) { + Exception exception = wrapper.getException(); + if (exception == null) { + exception = wrapper; + } + handleException(exception); + } + catch (IOException exception) { + handleException(exception); + } + return null; } - handleException(exception); - } - catch (IOException exception) { - handleException(exception); - } + }, stack, this.acc); } /** diff --git a/jdk/src/share/classes/java/beans/XMLDecoder.java b/jdk/src/share/classes/java/beans/XMLDecoder.java index accef1199c9..2fb2fd0ef4d 100644 --- a/jdk/src/share/classes/java/beans/XMLDecoder.java +++ b/jdk/src/share/classes/java/beans/XMLDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,9 @@ import com.sun.beans.decoder.DocumentHandler; import java.io.Closeable; import java.io.InputStream; import java.io.IOException; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.PrivilegedAction; import org.xml.sax.InputSource; import org.xml.sax.helpers.DefaultHandler; @@ -61,6 +64,7 @@ import org.xml.sax.helpers.DefaultHandler; * @author Philip Milne */ public class XMLDecoder implements AutoCloseable { + private final AccessControlContext acc = AccessController.getContext(); private final DocumentHandler handler = new DocumentHandler(); private final InputSource input; private Object owner; @@ -189,7 +193,15 @@ public class XMLDecoder implements AutoCloseable { return false; } if (this.array == null) { - this.handler.parse(this.input); + if ((this.acc == null) && (null != System.getSecurityManager())) { + throw new SecurityException("AccessControlContext is not set"); + } + AccessController.doPrivileged(new PrivilegedAction() { + public Void run() { + XMLDecoder.this.handler.parse(XMLDecoder.this.input); + return null; + } + }, this.acc); this.array = this.handler.getObjects(); } return true; From 03d65ced3e26f6e5d3d85cc993a1b6c159d5be63 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Wed, 19 Sep 2012 13:58:31 -0700 Subject: [PATCH 024/241] 7198606: Improve VM optimization Remove incorrect code in OptimizeFill optimization. Reviewed-by: roland, twisti --- hotspot/src/share/vm/opto/loopTransform.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hotspot/src/share/vm/opto/loopTransform.cpp b/hotspot/src/share/vm/opto/loopTransform.cpp index 8d88242ffe3..68bca9c3670 100644 --- a/hotspot/src/share/vm/opto/loopTransform.cpp +++ b/hotspot/src/share/vm/opto/loopTransform.cpp @@ -2716,6 +2716,8 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) { result_mem = new (C, 1) ProjNode(call,TypeFunc::Memory); _igvn.register_new_node_with_optimizer(result_mem); +/* Disable following optimization until proper fix (add missing checks). + // If this fill is tightly coupled to an allocation and overwrites // the whole body, allow it to take over the zeroing. AllocateNode* alloc = AllocateNode::Ideal_allocation(base, this); @@ -2739,6 +2741,7 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) { #endif } } +*/ // Redirect the old control and memory edges that are outside the loop. Node* exit = head->loopexit()->proj_out(0); From 0a735e76f68ae912e6eb380c98cc1d7f20d314aa Mon Sep 17 00:00:00 2001 From: John R Rose Date: Thu, 20 Sep 2012 14:02:55 -0700 Subject: [PATCH 025/241] 7196190: Improve method of handling MethodHandles Bind callers to caller-sensitive methods. Reviewed-by: twisti, jjh, vlivanov, ahgross --- .../java/lang/invoke/MethodHandleImpl.java | 171 ++++++++++++++++- .../java/lang/invoke/MethodHandleNatives.java | 97 ++++++++++ .../java/lang/invoke/MethodHandleStatics.java | 4 +- .../java/lang/invoke/MethodHandles.java | 15 +- .../sun/invoke/anon/AnonymousClassLoader.java | 76 +------- .../sun/invoke/util/ValueConversions.java | 14 +- .../lang/invoke/7196190/ClassForNameTest.java | 98 ++++++++++ .../lang/invoke/7196190/GetUnsafeTest.java | 112 +++++++++++ .../java/lang/invoke/7196190/MHProxyTest.java | 181 ++++++++++++++++++ .../lang/invoke/7196190/jtreg.security.policy | 9 + 10 files changed, 699 insertions(+), 78 deletions(-) create mode 100644 jdk/test/java/lang/invoke/7196190/ClassForNameTest.java create mode 100644 jdk/test/java/lang/invoke/7196190/GetUnsafeTest.java create mode 100644 jdk/test/java/lang/invoke/7196190/MHProxyTest.java create mode 100644 jdk/test/java/lang/invoke/7196190/jtreg.security.policy diff --git a/jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java b/jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java index d9822bd7189..6013a417cc5 100644 --- a/jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,14 @@ package java.lang.invoke; -import sun.invoke.util.VerifyType; - +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import sun.invoke.empty.Empty; import sun.invoke.util.ValueConversions; +import sun.invoke.util.VerifyType; import sun.invoke.util.Wrapper; import static java.lang.invoke.LambdaForm.*; import static java.lang.invoke.MethodHandleStatics.*; @@ -781,4 +782,168 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; return mh; } + /** + * Create an alias for the method handle which, when called, + * appears to be called from the same class loader and protection domain + * as hostClass. + * This is an expensive no-op unless the method which is called + * is sensitive to its caller. A small number of system methods + * are in this category, including Class.forName and Method.invoke. + */ + static + MethodHandle bindCaller(MethodHandle mh, Class hostClass) { + return BindCaller.bindCaller(mh, hostClass); + } + + // Put the whole mess into its own nested class. + // That way we can lazily load the code and set up the constants. + private static class BindCaller { + static + MethodHandle bindCaller(MethodHandle mh, Class hostClass) { + // Do not use this function to inject calls into system classes. + if (hostClass == null) { + hostClass = C_Trampoline; + } else if (hostClass.isArray() || + hostClass.isPrimitive() || + hostClass.getName().startsWith("java.") || + hostClass.getName().startsWith("sun.")) { + throw new InternalError(); // does not happen, and should not anyway + } + // For simplicity, convert mh to a varargs-like method. + MethodHandle vamh = prepareForInvoker(mh); + // Cache the result of makeInjectedInvoker once per argument class. + MethodHandle bccInvoker = CV_makeInjectedInvoker.get(hostClass); + return restoreToType(bccInvoker.bindTo(vamh), mh.type()); + } + + // This class ("Trampoline") is known to be inside a dead-end class loader. + // Inject all doubtful calls into this class. + private static Class C_Trampoline; + static { + Class tramp = null; + try { + final int FRAME_COUNT_ARG = 1; // [0] Reflection [1] Trampoline + java.lang.reflect.Method gcc = sun.reflect.Reflection.class.getMethod("getCallerClass", int.class); + tramp = (Class) sun.reflect.misc.MethodUtil.invoke(gcc, null, new Object[]{ FRAME_COUNT_ARG }); + if (tramp.getClassLoader() == BindCaller.class.getClassLoader()) + throw new RuntimeException(tramp.getName()+" class loader"); + } catch (Throwable ex) { + throw new InternalError(ex); + } + C_Trampoline = tramp; + } + + private static MethodHandle makeInjectedInvoker(Class hostClass) { + Class bcc = UNSAFE.defineAnonymousClass(hostClass, T_BYTES, null); + if (hostClass.getClassLoader() != bcc.getClassLoader()) + throw new InternalError(hostClass.getName()+" (CL)"); + try { + if (hostClass.getProtectionDomain() != bcc.getProtectionDomain()) + throw new InternalError(hostClass.getName()+" (PD)"); + } catch (SecurityException ex) { + // Self-check was blocked by security manager. This is OK. + // In fact the whole try body could be turned into an assertion. + } + try { + MethodHandle init = IMPL_LOOKUP.findStatic(bcc, "init", MethodType.methodType(void.class)); + init.invokeExact(); // force initialization of the class + } catch (Throwable ex) { + throw uncaughtException(ex); + } + MethodHandle bccInvoker; + try { + MethodType invokerMT = MethodType.methodType(Object.class, MethodHandle.class, Object[].class); + bccInvoker = IMPL_LOOKUP.findStatic(bcc, "invoke_V", invokerMT); + } catch (ReflectiveOperationException ex) { + throw uncaughtException(ex); + } + // Test the invoker, to ensure that it really injects into the right place. + try { + MethodHandle vamh = prepareForInvoker(MH_checkCallerClass); + Object ok = bccInvoker.invokeExact(vamh, new Object[]{hostClass, bcc}); + } catch (Throwable ex) { + throw new InternalError(ex); + } + return bccInvoker; + } + private static ClassValue CV_makeInjectedInvoker = new ClassValue() { + @Override protected MethodHandle computeValue(Class hostClass) { + return makeInjectedInvoker(hostClass); + } + }; + + // Adapt mh so that it can be called directly from an injected invoker: + private static MethodHandle prepareForInvoker(MethodHandle mh) { + mh = mh.asFixedArity(); + MethodType mt = mh.type(); + int arity = mt.parameterCount(); + MethodHandle vamh = mh.asType(mt.generic()); + vamh.internalForm().compileToBytecode(); // eliminate LFI stack frames + vamh = vamh.asSpreader(Object[].class, arity); + vamh.internalForm().compileToBytecode(); // eliminate LFI stack frames + return vamh; + } + + // Undo the adapter effect of prepareForInvoker: + private static MethodHandle restoreToType(MethodHandle vamh, MethodType type) { + return vamh.asCollector(Object[].class, type.parameterCount()).asType(type); + } + + private static final MethodHandle MH_checkCallerClass; + static { + final Class THIS_CLASS = BindCaller.class; + assert(checkCallerClass(THIS_CLASS, THIS_CLASS)); + try { + MH_checkCallerClass = IMPL_LOOKUP + .findStatic(THIS_CLASS, "checkCallerClass", + MethodType.methodType(boolean.class, Class.class, Class.class)); + assert((boolean) MH_checkCallerClass.invokeExact(THIS_CLASS, THIS_CLASS)); + } catch (Throwable ex) { + throw new InternalError(ex); + } + } + + private static boolean checkCallerClass(Class expected, Class expected2) { + final int FRAME_COUNT_ARG = 2; // [0] Reflection [1] BindCaller [2] Expected + Class actual = sun.reflect.Reflection.getCallerClass(FRAME_COUNT_ARG); + if (actual != expected && actual != expected2) + throw new InternalError("found "+actual.getName()+", expected "+expected.getName() + +(expected == expected2 ? "" : ", or else "+expected2.getName())); + return true; + } + + private static final byte[] T_BYTES; + static { + final Object[] values = {null}; + AccessController.doPrivileged(new PrivilegedAction() { + public Void run() { + try { + Class tClass = T.class; + String tName = tClass.getName(); + String tResource = tName.substring(tName.lastIndexOf('.')+1)+".class"; + java.net.URLConnection uconn = tClass.getResource(tResource).openConnection(); + int len = uconn.getContentLength(); + byte[] bytes = new byte[len]; + try (java.io.InputStream str = uconn.getInputStream()) { + int nr = str.read(bytes); + if (nr != len) throw new java.io.IOException(tResource); + } + values[0] = bytes; + } catch (java.io.IOException ex) { + throw new InternalError(ex); + } + return null; + } + }); + T_BYTES = (byte[]) values[0]; + } + + // The following class is used as a template for Unsafe.defineAnonymousClass: + private static class T { + static void init() { } // side effect: initializes this class + static Object invoke_V(MethodHandle vamh, Object[] args) throws Throwable { + return vamh.invokeExact(args); + } + } + } } diff --git a/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java b/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java index d27256fb337..06a9ba20e69 100644 --- a/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java +++ b/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java @@ -385,4 +385,101 @@ class MethodHandleNatives { throw err; } } + + /** + * Is this method a caller-sensitive method? + * I.e., does it call Reflection.getCallerClass or a similer method + * to ask about the identity of its caller? + */ + // FIXME: Replace this pattern match by an annotation @sun.reflect.CallerSensitive. + static boolean isCallerSensitive(MemberName mem) { + assert(mem.isInvocable()); + Class defc = mem.getDeclaringClass(); + switch (mem.getName()) { + case "doPrivileged": + return defc == java.security.AccessController.class; + case "getUnsafe": + return defc == sun.misc.Unsafe.class; + case "lookup": + return defc == java.lang.invoke.MethodHandles.class; + case "invoke": + return defc == java.lang.reflect.Method.class; + case "get": + case "getBoolean": + case "getByte": + case "getChar": + case "getShort": + case "getInt": + case "getLong": + case "getFloat": + case "getDouble": + case "set": + case "setBoolean": + case "setByte": + case "setChar": + case "setShort": + case "setInt": + case "setLong": + case "setFloat": + case "setDouble": + return defc == java.lang.reflect.Field.class; + case "newInstance": + if (defc == java.lang.reflect.Constructor.class) return true; + if (defc == java.lang.Class.class) return true; + break; + case "forName": + case "getClassLoader": + case "getClasses": + case "getFields": + case "getMethods": + case "getConstructors": + case "getDeclaredClasses": + case "getDeclaredFields": + case "getDeclaredMethods": + case "getDeclaredConstructors": + case "getField": + case "getMethod": + case "getConstructor": + case "getDeclaredField": + case "getDeclaredMethod": + case "getDeclaredConstructor": + return defc == java.lang.Class.class; + case "getConnection": + case "getDriver": + case "getDrivers": + case "deregisterDriver": + return defc == java.sql.DriverManager.class; + case "newUpdater": + if (defc == java.util.concurrent.atomic.AtomicIntegerFieldUpdater.class) return true; + if (defc == java.util.concurrent.atomic.AtomicLongFieldUpdater.class) return true; + if (defc == java.util.concurrent.atomic.AtomicReferenceFieldUpdater.class) return true; + break; + case "getContextClassLoader": + return defc == java.lang.Thread.class; + case "getPackage": + case "getPackages": + return defc == java.lang.Package.class; + case "getParent": + case "getSystemClassLoader": + return defc == java.lang.ClassLoader.class; + case "load": + case "loadLibrary": + if (defc == java.lang.Runtime.class) return true; + if (defc == java.lang.System.class) return true; + break; + case "getCallerClass": + if (defc == sun.reflect.Reflection.class) return true; + if (defc == java.lang.System.class) return true; + break; + case "getCallerClassLoader": + return defc == java.lang.ClassLoader.class; + case "getProxyClass": + case "newProxyInstance": + return defc == java.lang.reflect.Proxy.class; + case "getBundle": + case "clearCache": + return defc == java.util.ResourceBundle.class; + } + return false; + } } diff --git a/jdk/src/share/classes/java/lang/invoke/MethodHandleStatics.java b/jdk/src/share/classes/java/lang/invoke/MethodHandleStatics.java index 3db5712fdeb..50e273804ec 100644 --- a/jdk/src/share/classes/java/lang/invoke/MethodHandleStatics.java +++ b/jdk/src/share/classes/java/lang/invoke/MethodHandleStatics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,7 +108,7 @@ import sun.misc.Unsafe; /*non-public*/ static RuntimeException newIllegalArgumentException(String message, Object obj, Object obj2) { return new IllegalArgumentException(message(message, obj, obj2)); } - /*non-public*/ static Error uncaughtException(Exception ex) { + /*non-public*/ static Error uncaughtException(Throwable ex) { throw new InternalError("uncaught exception", ex); } static Error NYI() { diff --git a/jdk/src/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/share/classes/java/lang/invoke/MethodHandles.java index 5c55f202353..e7007dd2b89 100644 --- a/jdk/src/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/share/classes/java/lang/invoke/MethodHandles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -329,6 +329,7 @@ public class MethodHandles { * where {@code defcPkg} is the package of {@code defc}. * */ + // FIXME in MR1: clarify that the bytecode behavior of a caller-ID method (like Class.forName) is relative to the lookupClass used to create the method handle, not the dynamic caller of the method handle public static final class Lookup { /** The class on behalf of whom the lookup is being performed. */ @@ -1209,6 +1210,7 @@ return mh1; if (method.isMethodHandleInvoke()) return fakeMethodHandleInvoke(method); MethodHandle mh = DirectMethodHandle.make(refc, method); + mh = maybeBindCaller(method, mh); mh = mh.setVarargs(method); if (doRestrict) mh = restrictReceiver(method, mh, lookupClass()); @@ -1217,6 +1219,16 @@ return mh1; private MethodHandle fakeMethodHandleInvoke(MemberName method) { return throwException(method.getReturnType(), UnsupportedOperationException.class); } + private MethodHandle maybeBindCaller(MemberName method, MethodHandle mh) throws IllegalAccessException { + if (allowedModes == TRUSTED || !MethodHandleNatives.isCallerSensitive(method)) + return mh; + Class hostClass = lookupClass; + if ((allowedModes & PRIVATE) == 0) // caller must use full-power lookup + hostClass = null; + MethodHandle cbmh = MethodHandleImpl.bindCaller(mh, hostClass); + // Note: caller will apply varargs after this step happens. + return cbmh; + } private MethodHandle getDirectField(byte refKind, Class refc, MemberName field) throws IllegalAccessException { checkField(refKind, refc, field); MethodHandle mh = DirectMethodHandle.make(refc, field); @@ -1229,6 +1241,7 @@ return mh1; private MethodHandle getDirectConstructor(Class refc, MemberName ctor) throws IllegalAccessException { assert(ctor.isConstructor()); checkAccess(REF_newInvokeSpecial, refc, ctor); + assert(!MethodHandleNatives.isCallerSensitive(ctor)); // maybeBindCaller not relevant here return DirectMethodHandle.make(ctor).setVarargs(ctor); } diff --git a/jdk/src/share/classes/sun/invoke/anon/AnonymousClassLoader.java b/jdk/src/share/classes/sun/invoke/anon/AnonymousClassLoader.java index 3005a452f71..32624b40f97 100644 --- a/jdk/src/share/classes/sun/invoke/anon/AnonymousClassLoader.java +++ b/jdk/src/share/classes/sun/invoke/anon/AnonymousClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -73,74 +73,14 @@ import sun.misc.IOUtils; public class AnonymousClassLoader { final Class hostClass; - // Note: Do not refactor the calls to checkHostClass unless you - // also adjust this constant: - private static int CHC_CALLERS = 3; - - public AnonymousClassLoader() { - this.hostClass = checkHostClass(null); - } - public AnonymousClassLoader(Class hostClass) { - this.hostClass = checkHostClass(hostClass); + // Privileged constructor. + private AnonymousClassLoader(Class hostClass) { + this.hostClass = hostClass; } - private static Class getTopLevelClass(Class clazz) { - for(Class outer = clazz.getDeclaringClass(); outer != null; - outer = outer.getDeclaringClass()) { - clazz = outer; - } - return clazz; - } - - private static Class checkHostClass(Class hostClass) { - // called only from the constructor - // does a context-sensitive check on caller class - // CC[0..3] = {Reflection, this.checkHostClass, this., caller} - Class caller = sun.reflect.Reflection.getCallerClass(CHC_CALLERS); - - if (caller == null) { - // called from the JVM directly - if (hostClass == null) - return AnonymousClassLoader.class; // anything central will do - return hostClass; - } - - if (hostClass == null) - hostClass = caller; // default value is caller itself - - // anonymous class will access hostClass on behalf of caller - Class callee = hostClass; - - if (caller == callee) - // caller can always nominate itself to grant caller's own access rights - return hostClass; - - // normalize caller and callee to their top-level classes: - caller = getTopLevelClass(caller); - callee = getTopLevelClass(callee); - if (caller == callee) - return caller; - - ClassLoader callerCL = caller.getClassLoader(); - if (callerCL == null) { - // caller is trusted code, so accept the proposed hostClass - return hostClass; - } - - // %%% should do something with doPrivileged, because trusted - // code should have a way to execute on behalf of - // partially-trusted clients - - // Does the caller have the right to access the private - // members of the callee? If not, raise an error. - final int ACC_PRIVATE = 2; - try { - sun.reflect.Reflection.ensureMemberAccess(caller, callee, null, ACC_PRIVATE); - } catch (IllegalAccessException ee) { - throw new IllegalArgumentException(ee); - } - - return hostClass; + public static AnonymousClassLoader make(sun.misc.Unsafe unsafe, Class hostClass) { + if (unsafe == null) throw new NullPointerException(); + return new AnonymousClassLoader(hostClass); } public Class loadClass(byte[] classFile) { @@ -249,7 +189,7 @@ public class AnonymousClassLoader { private static int fakeNameCounter = 99999; // ignore two warnings on this line: - static sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe(); + private static sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe(); // preceding line requires that this class be on the boot class path static private final Method defineAnonymousClass; diff --git a/jdk/src/share/classes/sun/invoke/util/ValueConversions.java b/jdk/src/share/classes/sun/invoke/util/ValueConversions.java index 1533f4b2ad2..b2044818f60 100644 --- a/jdk/src/share/classes/sun/invoke/util/ValueConversions.java +++ b/jdk/src/share/classes/sun/invoke/util/ValueConversions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -522,13 +522,19 @@ public class ValueConversions { static { MethodHandle mh = null; try { - java.lang.reflect.Method m = MethodHandles.class + final java.lang.reflect.Method m = MethodHandles.class .getDeclaredMethod("collectArguments", MethodHandle.class, int.class, MethodHandle.class); - m.setAccessible(true); + AccessController.doPrivileged(new PrivilegedAction() { + @Override + public Void run() { + m.setAccessible(true); + return null; + } + }); mh = IMPL_LOOKUP.unreflect(m); - } catch (ReflectiveOperationException | SecurityException ex) { + } catch (ReflectiveOperationException ex) { throw new InternalError(ex); } COLLECT_ARGUMENTS = mh; diff --git a/jdk/test/java/lang/invoke/7196190/ClassForNameTest.java b/jdk/test/java/lang/invoke/7196190/ClassForNameTest.java new file mode 100644 index 00000000000..48ccb2a6463 --- /dev/null +++ b/jdk/test/java/lang/invoke/7196190/ClassForNameTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7196190 + * @summary Improve method of handling MethodHandles + * + * @run main/othervm ClassForNameTest + */ + +import java.lang.invoke.*; +import java.lang.reflect.Method; +import java.util.Arrays; + +public class ClassForNameTest { + final static String NAME = ClassForNameTest.class.getName(); + + public static void main(String[] args) throws Throwable { + { + final MethodType mt = MethodType.methodType(Class.class, String.class); + final MethodHandle mh = MethodHandles.lookup() + .findStatic(Class.class, "forName", mt); + + Class.forName(NAME); + + mh.invoke(NAME); + mh.bindTo(NAME).invoke(); + mh.invokeWithArguments(Arrays.asList(NAME)); + mh.invokeWithArguments(NAME); + Class cls = (Class) mh.invokeExact(NAME); + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodType mt = MethodType.methodType(Object.class, Object.class, Object[].class); + final MethodHandle mh = MethodHandles.lookup() + .findVirtual(Method.class, "invoke", mt) + .bindTo(fnMethod); + + fnMethod.invoke(null, NAME); + + mh.bindTo(null).bindTo(new Object[]{NAME}).invoke(); + mh.invoke(null, new Object[]{NAME}); + mh.invokeWithArguments(null, new Object[]{NAME}); + mh.invokeWithArguments(Arrays.asList(null, new Object[]{NAME})); + Object obj = mh.invokeExact((Object) null, new Object[]{NAME}); + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodType mt = MethodType.methodType(Object.class, Object.class, Object[].class); + + final MethodHandle mh = MethodHandles.lookup() + .bind(fnMethod, "invoke", mt); + + mh.bindTo(null).bindTo(new Object[]{NAME}).invoke(); + mh.invoke(null, new Object[]{NAME}); + mh.invokeWithArguments(null, NAME); + mh.invokeWithArguments(Arrays.asList(null, NAME)); + Object obj = mh.invokeExact((Object) null, new Object[]{NAME}); + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodHandle mh = MethodHandles.lookup().unreflect(fnMethod); + + mh.bindTo(NAME).invoke(); + mh.invoke(NAME); + mh.invokeWithArguments(NAME); + mh.invokeWithArguments(Arrays.asList(NAME)); + Class cls = (Class) mh.invokeExact(NAME); + } + + System.out.println("TEST PASSED"); + } +} diff --git a/jdk/test/java/lang/invoke/7196190/GetUnsafeTest.java b/jdk/test/java/lang/invoke/7196190/GetUnsafeTest.java new file mode 100644 index 00000000000..0fd3cbd8d0f --- /dev/null +++ b/jdk/test/java/lang/invoke/7196190/GetUnsafeTest.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7196190 + * @summary Improve method of handling MethodHandles + * + * @run main/othervm/policy=jtreg.security.policy/secure=java.lang.SecurityManager GetUnsafeTest + */ + +import java.lang.invoke.*; +import java.lang.reflect.Method; +import java.util.Arrays; + +public class GetUnsafeTest { + final static String NAME = "sun.misc.Unsafe"; + + private static boolean isTestFailed = false; + + private static void fail() { + isTestFailed = true; + try { throw new Exception(); } catch (Throwable e) { + StackTraceElement frame = e.getStackTrace()[1]; + System.out.printf("Failed at %s:%d\n", frame.getFileName(), frame.getLineNumber()); + } + } + + public static void main(String[] args) throws Throwable { + { + final MethodType mt = MethodType.methodType(Class.class, String.class); + final MethodHandle mh = MethodHandles.lookup() + .findStatic(Class.class, "forName", mt); + + try { Class.forName(NAME); fail(); } catch (Throwable e) {} + + try { mh.invoke(NAME); fail(); } catch (Throwable e) {} + try { mh.bindTo(NAME).invoke(); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(Arrays.asList(NAME)); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(NAME); fail(); } catch (Throwable e) {} + try { Class cls = (Class) mh.invokeExact(NAME); fail(); } catch (Throwable e) {} + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodType mt = MethodType.methodType(Object.class, Object.class, Object[].class); + final MethodHandle mh = MethodHandles.lookup() + .findVirtual(Method.class, "invoke", mt) + .bindTo(fnMethod); + + try { fnMethod.invoke(null, NAME); fail(); } catch (Throwable e) {} + + try { mh.bindTo(null).bindTo(new Object[]{NAME}).invoke(); fail(); } catch (Throwable e) {} + try { mh.invoke(null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(Arrays.asList(null, new Object[]{NAME})); fail(); } catch (Throwable e) {} + try { Object obj = mh.invokeExact((Object) null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodType mt = MethodType.methodType(Object.class, Object.class, Object[].class); + + final MethodHandle mh = MethodHandles.lookup().bind(fnMethod, "invoke", mt); + + try { mh.bindTo(null).bindTo(new Object[]{NAME}).invoke(); fail(); } catch (Throwable e) {} + try { mh.invoke(null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(null, NAME); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(Arrays.asList(null, NAME)); fail(); } catch (Throwable e) {} + try { Object obj = mh.invokeExact((Object) null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodHandle mh = MethodHandles.lookup().unreflect(fnMethod); + + try { mh.bindTo(NAME).invoke(); fail(); } catch (Throwable e) {} + try { mh.invoke(NAME); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(NAME); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(Arrays.asList(NAME)); fail(); } catch (Throwable e) {} + try { Class cls = (Class) mh.invokeExact(NAME); fail(); } catch (Throwable e) {} + } + + if (!isTestFailed) { + System.out.println("TEST PASSED"); + } else { + System.out.println("TEST FAILED"); + System.exit(1); + } + } +} diff --git a/jdk/test/java/lang/invoke/7196190/MHProxyTest.java b/jdk/test/java/lang/invoke/7196190/MHProxyTest.java new file mode 100644 index 00000000000..5e07f393cb1 --- /dev/null +++ b/jdk/test/java/lang/invoke/7196190/MHProxyTest.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7196190 + * @summary Improve method of handling MethodHandles + * + * @run main/othervm MHProxyTest + */ + +import java.lang.invoke.*; +import java.security.*; +import static java.lang.invoke.MethodHandles.*; +import static java.lang.invoke.MethodType.*; + +public class MHProxyTest { + private static final Class C_Unsafe; + private static final MethodHandle MH_getUnsafe; + static { + // Do these before there is a SM installed. + C_Unsafe = sun.misc.Unsafe.class; // EXPECT A WARNING ON THIS LINE + Lookup lookup = lookup(); + MethodHandle gumh = null; + try { + gumh = lookup.findStatic(C_Unsafe, "getUnsafe", methodType(C_Unsafe)); + } catch (ReflectiveOperationException ex) { + throw new InternalError(ex.toString()); + } + MH_getUnsafe = gumh; + // Try some different lookups: + try { + lookup.in(Object.class).findStatic(C_Unsafe, "getUnsafe", methodType(C_Unsafe)); + } catch (ReflectiveOperationException ex) { + throw new InternalError(ex.toString()); + } + lookup = lookup().in(C_Unsafe); + try { + lookup.in(C_Unsafe).findStatic(C_Unsafe, "getUnsafe", methodType(C_Unsafe)); + } catch (ReflectiveOperationException ex) { + throw new InternalError(ex.toString()); + } + } + + public static void main(String[] args) throws Throwable { + System.setSecurityManager(new SecurityManager()); + Lookup lookup = lookup(); + testBasic(lookup); + testDoPriv(lookup); + testSetVar(); + Lookup l2 = lookup.in(Object.class); + System.out.println("=== "+l2); + testBasic(l2); + testDoPriv(l2); + Lookup l3 = lookup.in(C_Unsafe); + System.out.println("=== "+l3); + testBasic(l3); + testDoPriv(l3); + if (failure != null) + throw failure; + } + + private static Throwable failure; + private static void fail(Throwable ex) { + if (failure == null) + failure = ex; + StackTraceElement frame = new Exception().getStackTrace()[1]; + System.out.printf("Failed at %s:%d: %s\n", frame.getFileName(), frame.getLineNumber(), ex); + } + private static void ok(Throwable ex) { + StackTraceElement frame = new Exception().getStackTrace()[1]; + System.out.printf("OK at %s:%d: %s\n", frame.getFileName(), frame.getLineNumber(), ex); + } + + private static void testBasic(Lookup lookup) throws Throwable { + // Verify that we can't get to this guy under the SM: + try { + MethodHandle badmh = lookup.findStatic(C_Unsafe, "getUnsafe", methodType(C_Unsafe)); + assert(badmh.type() == methodType(C_Unsafe)); + badmh = badmh.asType(badmh.type().generic()); + Object u = C_Unsafe.cast(badmh.invokeExact()); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got mh to getUnsafe!")); + } catch (SecurityException ex) { + ok(ex); + } + try { + Object u = MH_getUnsafe.invokeWithArguments(); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (MH invoke)")); + } catch (SecurityException ex) { + ok(ex); + } + try { + MethodHandle mh = MH_getUnsafe; + mh = mh.asType(mh.type().generic()); + mh = foldArguments(identity(Object.class), mh); + mh = filterReturnValue(mh, identity(Object.class)); + Object u = mh.invokeExact(); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (MH invokeWithArguments)")); + } catch (SecurityException ex) { + ok(ex); + } + } + + private static void testDoPriv(Lookup lookup) throws Throwable { + PrivilegedAction privAct = MethodHandleProxies.asInterfaceInstance(PrivilegedAction.class, MH_getUnsafe); + try { + Object u = AccessController.doPrivileged(privAct); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (static doPriv)")); + } catch (SecurityException ex) { + ok(ex); + } + MethodHandle MH_doPriv = lookup.findStatic(AccessController.class, "doPrivileged", + methodType(Object.class, PrivilegedAction.class)); + MH_doPriv = MH_doPriv.bindTo(privAct); + try { + Object u = MH_doPriv.invoke(); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (MH + doPriv)")); + } catch (SecurityException ex) { + ok(ex); + } + // try one more layer of indirection: + Runnable rbl = MethodHandleProxies.asInterfaceInstance(Runnable.class, MH_doPriv); + try { + rbl.run(); + fail(new AssertionError("got the Unsafe object! (Runnable + MH + doPriv)")); + } catch (SecurityException ex) { + ok(ex); + } + } + + private static void testSetVar() throws Throwable { + { + // Test the box pattern: + Object[] box = new Object[1]; + MethodHandle MH_getFoo = identity(Object.class).bindTo("foo"); + MethodHandle MH_storeToBox = insertArguments(arrayElementSetter(Object[].class), 0, box, 0); + MethodHandle mh = filterReturnValue(MH_getFoo, MH_storeToBox); + mh.invokeExact(); + assert(box[0] == "foo"); + } + { + Object[] box = new Object[1]; + MethodHandle MH_storeToBox = insertArguments(arrayElementSetter(Object[].class), 0, box, 0); + MethodHandle mh = filterReturnValue(MH_getUnsafe.asType(MH_getUnsafe.type().generic()), MH_storeToBox); + try { + mh.invokeExact(); + Object u = box[0]; + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (MH + setElement)")); + } catch (SecurityException ex) { + ok(ex); + } + } + } +} diff --git a/jdk/test/java/lang/invoke/7196190/jtreg.security.policy b/jdk/test/java/lang/invoke/7196190/jtreg.security.policy new file mode 100644 index 00000000000..d32c7af9b3f --- /dev/null +++ b/jdk/test/java/lang/invoke/7196190/jtreg.security.policy @@ -0,0 +1,9 @@ +/* + * security policy used by the test process + * must allow file reads so that jtreg itself can run + */ + +grant { + // standard test activation permissions + permission java.io.FilePermission "*", "read"; +}; From 898b21ebf3d77c37c54cb8e6f2a50d78d6446bd7 Mon Sep 17 00:00:00 2001 From: Frederic Parain Date: Mon, 24 Sep 2012 16:15:27 +0400 Subject: [PATCH 026/241] 7198296: Problem with classloader in JMX Wb classes have to be available for hotspot tests Co-authored-by: Daniel Fuchs Co-authored-by: Jean-Francois Denise Reviewed-by: ahgross, asaha --- .../remote/rmi/RMIConnectionImpl.java | 61 +++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java index 9449210e897..3f880d0a8f9 100644 --- a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java +++ b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -144,6 +144,17 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { new RuntimePermission("createClassLoader")) ); + + this.defaultContextClassLoader = + AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public ClassLoader run() { + return new CombinedClassLoader(Thread.currentThread().getContextClassLoader(), + dcl); + } + }); + serverCommunicatorAdmin = new RMIServerCommunicatorAdmin(EnvHelp.getServerConnectionTimeout(env)); @@ -510,7 +521,7 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { "connectionId=" + connectionId +" unwrapping query with defaultClassLoader."); - queryValue = unwrap(query, defaultClassLoader, QueryExp.class); + queryValue = unwrap(query, defaultContextClassLoader, QueryExp.class); try { final Object params[] = new Object[] { name, queryValue }; @@ -545,7 +556,7 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { "connectionId=" + connectionId +" unwrapping query with defaultClassLoader."); - queryValue = unwrap(query, defaultClassLoader, QueryExp.class); + queryValue = unwrap(query, defaultContextClassLoader, QueryExp.class); try { final Object params[] = new Object[] { name, queryValue }; @@ -1579,7 +1590,8 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { ClassLoader orderCL = AccessController.doPrivileged( new PrivilegedExceptionAction() { public ClassLoader run() throws Exception { - return new OrderClassLoaders(cl1, cl2); + return new CombinedClassLoader(Thread.currentThread().getContextClassLoader(), + new OrderClassLoaders(cl1, cl2)); } } ); @@ -1671,6 +1683,8 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { private final ClassLoader defaultClassLoader; + private final ClassLoader defaultContextClassLoader; + private final ClassLoaderWithRepository classLoaderWithRepository; private boolean terminated = false; @@ -1753,4 +1767,43 @@ public class RMIConnectionImpl implements RMIConnection, Unreferenced { private static final ClassLogger logger = new ClassLogger("javax.management.remote.rmi", "RMIConnectionImpl"); + + private static final class CombinedClassLoader extends ClassLoader { + + private final static class ClassLoaderWrapper extends ClassLoader { + ClassLoaderWrapper(ClassLoader cl) { + super(cl); + } + + @Override + protected Class loadClass(String name, boolean resolve) + throws ClassNotFoundException { + return super.loadClass(name, resolve); + } + }; + + final ClassLoaderWrapper defaultCL; + + private CombinedClassLoader(ClassLoader parent, ClassLoader defaultCL) { + super(parent); + this.defaultCL = new ClassLoaderWrapper(defaultCL); + } + + @Override + protected Class loadClass(String name, boolean resolve) + throws ClassNotFoundException { + try { + super.loadClass(name, resolve); + } catch(Exception e) { + for(Throwable t = e; t != null; t = t.getCause()) { + if(t instanceof SecurityException) { + throw t==e?(SecurityException)t:new SecurityException(t.getMessage(), e); + } + } + } + final Class cl = defaultCL.loadClass(name, resolve); + return cl; + } + + } } From 12bf2c7d5201ace92e558c217dafc89354796f29 Mon Sep 17 00:00:00 2001 From: Jaroslav Bachorik Date: Mon, 24 Sep 2012 17:00:40 +0400 Subject: [PATCH 027/241] 7192975: Issue with JMX reflection Make security check unconditional Reviewed-by: ahgross, asaha --- .../javax/management/modelmbean/DescriptorSupport.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java b/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java index 57b4b46365e..068047967ea 100644 --- a/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java +++ b/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java @@ -1245,13 +1245,12 @@ public class DescriptorSupport return s.substring(1, s.length() - 1); } final String className = s.substring(1, slash); + final Constructor constr; try { + ReflectUtil.checkPackageAccess(className); final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - if (contextClassLoader == null) { - ReflectUtil.checkPackageAccess(className); - } final Class c = Class.forName(className, false, contextClassLoader); constr = c.getConstructor(new Class[] {String.class}); From 989c8e0201c2eb3645e0008c65a6425f3437bad8 Mon Sep 17 00:00:00 2001 From: Abhijit Saha Date: Wed, 26 Sep 2012 09:54:11 -0700 Subject: [PATCH 028/241] 7199488: [TEST] runtime/7158800/InternTest.java failed due to false-positive on PID match Reviewed-by: coleenp --- hotspot/test/runtime/7158800/BadUtf8.java | 1254 - hotspot/test/runtime/7158800/InternTest.java | 80 - hotspot/test/runtime/7158800/Test7158800.sh | 96 - hotspot/test/runtime/7158800/badstrings.txt | 30001 ----------------- 4 files changed, 31431 deletions(-) delete mode 100644 hotspot/test/runtime/7158800/BadUtf8.java delete mode 100644 hotspot/test/runtime/7158800/InternTest.java delete mode 100644 hotspot/test/runtime/7158800/Test7158800.sh delete mode 100644 hotspot/test/runtime/7158800/badstrings.txt diff --git a/hotspot/test/runtime/7158800/BadUtf8.java b/hotspot/test/runtime/7158800/BadUtf8.java deleted file mode 100644 index 8b79762a365..00000000000 --- a/hotspot/test/runtime/7158800/BadUtf8.java +++ /dev/null @@ -1,1254 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 7158800 - * @summary Test that 1200 symbols that hash to the same value triggers - * the symbol table alternate hashing mechanism. There isn't actually a - * way to verify this. - */ -// -// Generate large number of strings that hash to the same value -// to slow down symbol table lookup. - -import java.io.BufferedOutputStream; -import java.io.FileOutputStream; - -public class BadUtf8 { -static String[] strings = { - "EOcLKvbddZyPxYpb", - "DncLKvbdPxmAGrqj", - "DoCjjvbdpxoIHQdY", - "EPCkKvbdqYoHfqEY", - "DnbkKvbdezvYdiUX", - "DnbjjvbdeEoRbXCj", - "EObkKvbdbsCkUEKB", - "EOcLKvbdnUtyjiqf", - "DncLKvbdRWnDcMHc", - "DoCkKvbdrSUkOLAm", - "DncLKvbdfNFwGmJk", - "EPDLKvbdvAdYroFI", - "DoDLKvbdiGibyViu", - "DncLKvbdYqNEhmFR", - "DoCkKvbdEARhlzXX", - "DncLKvbdSZjHsCvA", - "DncKjvbdqTsgRqkU", - "DnbjjvbdqAiFAXHd", - "EPDKjvbdGcjvJaij", - "DnbkKvbdwtldpxkn", - "DoDKjvbdYkrETnMN", - "EPCjjvbdbBWEfQQX", - "EPCjjvbduMXwAtBX", - "DncLKvbdbsCkTcia", - "DoCjjvbdczYpYZRC", - "EOcKjvbdFeiqmhsq", - "DoCkKvbdKCicQibx", - "EOcKjvbdZLrEUOLm", - "DoCjjvbdaNKbStmH", - "DoDKjvbdJbjDQjDY", - "EPCkKvbdemFwGmKL", - "EPDKjvbdZQleImEq", - "DncKjvbdZjShPfbG", - "DnbjjvbdqYnhHREY", - "DoCkKvbdaRfDIUGL", - "DoDKjvbdLrWlyuQz", - "DnbjjvbdZisHofaf", - "EObjjvbdhtydvrUb", - "DnbjjvbdRotHKGEX", - "EObjjvbdNeEThhkE", - "EPCjjvbdZtJJZESn", - "DoDKjvbdnPyxvLYb", - "EPDKjvbdeEoRbWbj", - "EOcLKvbdFxttaEXb", - "EObjjvbddwystRez", - "EPCjjvbdJpzEnenF", - "DnbkKvbdTppntuIN", - "EPCkKvbdTukpKUBR", - "DnbkKvbdhlFEOUcZ", - "EObkKvbdlhdUQuRa", - "DnbjjvbdkClKqHUg", - "EOcKjvbdqTtGqqkU", - "DncKjvbdtkwvaUBX", - "DoDKjvbdsQWOjCuf", - "DncLKvbdEKIJuwjA", - "DncKjvbdGLErcIMu", - "EOcLKvbdNPwpumfs", - "EObkKvbdnVUzLJrG", - "DoCkKvbdcTDKsdKB", - "DncKjvbdKRZdoFme", - "EOcLKvbdemFvgNKL", - "EPCkKvbdznopdblY", - "EPDLKvbdOYPVzdOU", - "DnbjjvbdsZlPsAhO", - "DoDLKvbdKCjDRKDY", - "DoCkKvbdhuZeXSVC", - "EPDKjvbdOStVgEtp", - "DncLKvbdvwMAvBWV", - "EPDKjvbdBcoaWJlf", - "EOcKjvbdZxdKODMS", - "DoCjjvbdbsCkTcjB", - "EOcLKvbdwWlAuaWV", - "DnbjjvbdFejRnJUR", - "DnbjjvbdmIdTqVSB", - "DnbkKvbdqBIeAWhE", - "DncKjvbdrMzJyMIJ", - "DoCkKvbdZGvdAOsJ", - "DncLKvbdjggLfFnL", - "DoCjjvbdYqNFJMdq", - "DoCkKvbdqZPHfqDx", - "DncLKvbdOEdThiLE", - "DoCkKvbdZirgpGaf", - "EPDLKvbdziuQPdSt", - "EObkKvbdKQyeOenF", - "DoDLKvbduaDySndh", - "DoCjjvbdVUNUGLvK", - "DncKjvbdAMhYrvzY", - "DnbkKvbdnQZxvKxb", - "EPCjjvbdBhjakJFj", - "DncLKvbdmfeYNNfy", - "DoDLKvbdjlbLydfo", - "DoDLKvbdpyPIGpcx", - "EOcLKvbdnVUzLJqf", - "DoCjjvbdmJETqVSB", - "DoDLKvbdJTZAsMxM", - "DoCkKvbdnQZxvLZC", - "DoDKjvbdACqwizJQ", - "DncKjvbdvBEZSoFI", - "DncKjvbdGckVjCJj", - "DncLKvbdiMFENtcZ", - "Dnbjjvbdjuvmcaww", - "DnbkKvbdZyEKNblS", - "DoCjjvbduMYXBUBX", - "DnbjjvbdFWYopNJe", - "DoDKjvbdelfXGljL", - "DnbjjvbdakLenmcA", - "EPDKjvbdfILWRmpg", - "EObjjvbdSLYeuHLT", - "DoCjjvbdMfbolotk", - "EPDLKvbdrRuKnKaN", - "EOcKjvbdyzdnRhIh", - "DoDLKvbdGAoRZJzm", - "DoCjjvbdhlFDnUcZ", - "EPDLKvbdmpZyVkYb", - "DncKjvbdTpqPUuIN", - "DncLKvbdHDjvJaij", - "EPDLKvbdYlRcsmkm", - "EPDLKvbdvlvAMdFN", - "DncKjvbdIsZArmYM", - "EOcLKvbdegjuqnQg", - "EOcLKvbdZQmFJNFR", - "DoCjjvbdZxdJmcMS", - "EPCkKvbdlZTSTYgU", - "DoDKjvbdqceJPnWB", - "DncLKvbdVgwuxGxz", - "DncKjvbdDnbkLXDE", - "EPDLKvbdatbHYKsh", - "DncKjvbdEzsqFLbi", - "EPDLKvbdnVVZkKRf", - "EOcKjvbdKeegbBQu", - "EPCkKvbdKfGHaaRV", - "EPDKjvbdmIctRVRa", - "EPCjjvbdRMxBxnUz", - "DnbjjvbdJYTbILpp", - "EPCkKvbdTAEiHbPE", - "EOcLKvbdfelZnGgA", - "DoCjjvbdOStWGeUp", - "EOcLKvbdemGXHNJk", - "DoDKjvbdYTMAmUOx", - "EPCkKvbdpyOhGpcx", - "EPCkKvbdAMgxsWzY", - "DnbjjvbdYkrETnMN", - "EPDLKvbdUQqPUtgm", - "DncKjvbdehKurNqH", - "DoCjjvbdZMSETnLm", - "DoDKjvbdIHGyyXwg", - "EObjjvbdXGYzUAPT", - "DoCjjvbdhbPCeWqR", - "DoCkKvbdKNADzGuB", - "DnbjjvbdFeirOJTq", - "DncLKvbdaRecHtFk", - "DnbkKvbdzoPpeClY", - "EObkKvbdZRMeJMeR", - "DnbjjvbdYfvdAPSi", - "DncLKvbdJcKCqJcY", - "EOcLKvbdqvokbhyR", - "DoDLKvbdrRuLNjaN", - "DoCjjvbdTlWPBWOi", - "DoCkKvbdjvWnEBxX", - "DoDLKvbdTkunaVoJ", - "DoCkKvbdQZNAHTSK", - "EObjjvbdqwPkbhyR", - "EOcLKvbdNHDPlpUk", - "DncLKvbdIHHZxxYH", - "DncLKvbdtkxXAtAw", - "DncLKvbdSCEFMJZL", - "DnbjjvbdZQmEhldq", - "DoCjjvbdNGbolotk", - "DnbjjvbdnCKWwnmu", - "DncLKvbdzHZMANEw", - "DoDKjvbdmttykJrG", - "DnbkKvbdlrZUzSci", - "EPDKjvbdSKyGVHKs", - "DoCjjvbdKVuGEFGi", - "EPCjjvbdCIkBkIej", - "DncLKvbdzHZMAMeX", - "DnbkKvbdaSFbgsek", - "DncLKvbdHDjujBij", - "DoDKjvbdGZVUaDwb", - "DnbjjvbdZnnJFEzK", - "DoCkKvbdtcDUwWOo", - "DoCkKvbdlBMoNALA", - "EOcKjvbdNsUWHFUp", - "DoDLKvbdVUNUFlVj", - "DnbkKvbdhkdcnUcZ", - "DncLKvbdLiBkqYAS", - "EOcKjvbdzoPpdcLx", - "EPDKjvbdijGIJmXr", - "EOcKjvbdZisHofaf", - "DoDLKvbdeOdrkUUS", - "DoDLKvbdnPyxvKxb", - "EPDKjvbdIxUBhMRQ", - "DncLKvbdlhctRUqa", - "DoDLKvbdmgFXlnGy", - "DncKjvbdCJKbKiGK", - "EOcLKvbddndrjtUS", - "DnbjjvbdkDLjqGuH", - "DncKjvbdmIcsptqa", - "DoCkKvbdvvlAvBWV", - "EObjjvbdjblLQftg", - "DnbjjvbdCEQBWKMf", - "DnbjjvbdBdPaVilf", - "DoCkKvbdZxcjODLr", - "DoCkKvbdEObjjwCd", - "EPDKjvbdyTNhlqbH", - "EPCkKvbdUMVoAvPJ", - "DncKjvbdUxhUZjoO", - "DncKjvbdqqtjmkAm", - "DncKjvbdKfGICBRV", - "EPCjjvbdVrOXaeLc", - "EPDLKvbdwXLaWBWV", - "EPCkKvbdjblKqHUg", - "DnbjjvbduDCuWuoP", - "EPDKjvbdNGbpMouL", - "EObjjvbdBcoaVjNG", - "DncLKvbdrWpMDIxq", - "DncLKvbdhaoCdwRR", - "DnbkKvbdFxtuBDwb", - "DncKjvbdIjEAKPgE", - "EOcLKvbduCbuXVoP", - "DoDKjvbdZtIiZDsO", - "DnbjjvbdEztRElCi", - "DncLKvbdxmsHwsJD", - "DnbjjvbdRbEElIxk", - "DoDKjvbdWHwvXgYz", - "EOcKjvbdQlwbYnUz", - "EOcLKvbdVTltFkuj", - "DncKjvbdliETptqa", - "DnbkKvbddoErjtTr", - "DoCkKvbdgPazvdXh", - "DncKjvbdySmhlqag", - "DoCjjvbdbPgHDkzd", - "DoCkKvbdFWZPomKF", - "EObjjvbdssSSxydc", - "EObjjvbdzQnliJwA", - "EObkKvbdKCjCpibx", - "EPCjjvbdpyOhHREY", - "DncLKvbddjJqutzn", - "EObkKvbdBdQAujMf", - "EPCkKvbdLAjflbXq", - "DncLKvbdLBLGlaxR", - "DoDLKvbdrpWPJbuf", - "DoCjjvbdEKHiuxKA", - "DoCjjvbdXsMAlsnx", - "EObkKvbdptTgSSLU", - "DoDKjvbdnHFXmNfy", - "DncKjvbdCJKbKhej", - "EPCjjvbdhlEdOUby", - "EOcKjvbdKWUfEFGi", - "DoDKjvbdZQmFJMdq", - "EPCjjvbdiGjDZWKV", - "EObkKvbdVAbQrprZ", - "DoDKjvbdfekzNgHA", - "DoDLKvbdnHEwlmgZ", - "DncKjvbdwzHeexEr", - "DoCjjvbdmpZxujyC", - "EPDKjvbdwMvAMcdm", - "DoCjjvbdfHkVrNqH", - "EPCkKvbdYzbfRiuy", - "EPCkKvbdZtIiZDrn", - "DnbjjvbdjvWnDbYX", - "DoCjjvbdOStVgEtp", - "EPDLKvbdZMSETmlN", - "EPDKjvbdBhjajhej", - "EPCjjvbddoFTLUUS", - "DnbkKvbdsQVoJcWG", - "EPCjjvbdrEFJQNvB", - "DoCjjvbdMpYRWOGs", - "EOcLKvbdZirgpHBf", - "EPDLKvbdyOTIXsJD", - "DoCkKvbdKRZdnfNe", - "DnbjjvbdbBWFFoow", - "EPCjjvbdgFlZnHHA", - "DnbkKvbdGGJrOIsq", - "DoDLKvbduDCtwWPP", - "EObjjvbdNddUIhjd", - "DnbjjvbdxsNiMqag", - "EObjjvbddeOrCWbj", - "EObjjvbdPxmAGsRj", - "EOcLKvbddeOrCXDK", - "DoDLKvbddeOrBwCj", - "DoCjjvbdVqnYCElD", - "DnbkKvbdUyIUZjoO", - "EObjjvbdeFOrCXDK", - "EObkKvbdVrNxCFLc", - "EObjjvbdTfzmkwWF", - "EOcKjvbdIHGzZYYH", - "EPDKjvbdtbbuXWPP", - "DoCjjvbdZisIQHBf", - "EObjjvbdbsCkUDjB", - "EPCkKvbdVwJXudFH", - "EPDKjvbdrouoKDVf", - "EPCkKvbdFyVVBEYC", - "DncLKvbdZnnIeEzK", - "EPDLKvbdxVNFQxkn", - "DoDKjvbdpxnggRDx", - "DoDLKvbdqZOgfpcx", - "DncKjvbdCIjakJGK", - "EPCkKvbdCJLBjhej", - "DoDLKvbdnPzYvKxb", - "EOcKjvbdqTsgSRkU", - "EOcLKvbdLBLGlaxR", - "DoDLKvbdcbTMrAUN", - "DncLKvbdzitoodSt", - "DoDKjvbdJvUfDdfi", - "EOcLKvbdHDjvKCJj", - "EPCkKvbdeOeTKssr", - "DnbkKvbdlYrqsYft", - "DncLKvbdiiehKMxS", - "DncKjvbdURQoVUhN", - "DnbkKvbduMYXBUAw", - "DoDLKvbdSPtHJfEX", - "EObkKvbdqBJFAWgd", - "EOcKjvbdFpATWgFy", - "DoDLKvbdBsBDTfXS", - "DncKjvbdjhHLfFmk", - "DoCjjvbdCJKakIfK", - "DnbkKvbddoFSjtTr", - "EObkKvbdANIYsWzY", - "EObjjvbdCTAbtFvr", - "EObjjvbdrRtkOLAm", - "DnbkKvbdkxsSTYgU", - "DoCjjvbdnBiwXnmu", - "EObjjvbdwtmEqYlO", - "EPDKjvbdrylQTAhO", - "DoDLKvbdtbbtvvOo", - "EPCjjvbdZLrETmlN", - "EPDLKvbdWXJYWDdg", - "DoCkKvbdKQzFOfOF", - "EPCjjvbdwzIFfXeS", - "DncKjvbdRjyFuHLT", - "EPDLKvbdULunaWPJ", - "DncKjvbdUxhTykOn", - "DnbkKvbdJcKCqKDY", - "EPDLKvbdcbSmSATm", - "DnbkKvbdegjurNqH", - "EPDKjvbdZjTIQGbG", - "EPCjjvbdiLddNuCy", - "DoCjjvbdZQldiNEq", - "EOcLKvbdakMGPODA", - "EObjjvbdnHEwlmgZ", - "EOcLKvbdBsAcUGXS", - "EPCkKvbdiVZdwSUb", - "EOcLKvbddCTNSAUN", - "DnbkKvbdEXxMUUUM", - "DncKjvbdYpldiMeR", - "DoDKjvbdNddTiIjd", - "DoDLKvbdZLqdUNlN", - "EPCkKvbdiBncFWpq", - "DncLKvbdiCPDEvqR", - "EOcKjvbdUyHszKoO", - "DncKjvbdhtydvqtb", - "EPCjjvbdpxoHgQcx", - "EObkKvbdkWWnDaxX", - "DnbjjvbdBhkBkJFj", - "DoCkKvbdRacdkhyL", - "EOcLKvbdZjTHpHCG", - "EPCkKvbdMowqWOGs", - "DncLKvbdegjurNpg", - "EObjjvbdfMfWfmKL", - "EPDLKvbdZirgpGaf", - "DoDLKvbdiZuFlQnG", - "DncLKvbdFxuVAcxC", - "EObkKvbdZisHofaf", - "EOcKjvbdJSyBSmYM", - "EPDLKvbdVYgtZkPO", - "EOcKjvbdRbEFMJYk", - "DncLKvbdrEFIonWB", - "DncKjvbdKDJbqJcY", - "EOcLKvbdhfjCxuiu", - "EObjjvbdLLAhWAKZ", - "DoCkKvbdRXNcblID", - "DoDLKvbdcbSmSATm", - "EOcLKvbdwWlAvAuu", - "EObkKvbdiBnbdvpq", - "DoCkKvbdNQXpumgT", - "DncLKvbdkVwOECYX", - "DnbkKvbdfoazwDxI", - "DoDLKvbdbBWFFpPw", - "DoDLKvbdvBDxsPEh", - "EPDKjvbdJqZdoFme", - "DoDLKvbdIryArmXl", - "EPCjjvbdANIZSwZx", - "EPCkKvbdVhYVxGxz", - "DncKjvbdLAjgNCYR", - "DncKjvbdxxIjCQZk", - "DncKjvbdbiNKKewY", - "EPCjjvbdlrZVZsEJ", - "EPDKjvbdIryAsMwl", - "DoCkKvbdtAHRIAAr", - "EPDKjvbdJmAEZfuB", - "EPCkKvbdZjSgogBf", - "DoDLKvbdOXnuzcnU", - "DnbkKvbdehKvRnQg", - "EObjjvbdZyDimbkr", - "DoDKjvbdmajWwoOV", - "EOcKjvbdkMalZeHP", - "EOcKjvbdIjEAJpHE", - "EPCkKvbdDihKVxKA", - "DncKjvbdNddUIiKd", - "EObjjvbdqdFIpOWB", - "DoCkKvbdxnShXsJD", - "DoDLKvbdjmBkzEfo", - "EOcLKvbdatagYLTh", - "DoCjjvbdVhYVxHYz", - "DnbjjvbdJbjDRKDY", - "EPCjjvbdLBLHNCYR", - "DnbjjvbdnGeYNOGy", - "EOcLKvbdUsmTekvK", - "EPCjjvbdtkxXBTaX", - "EPCjjvbdzoPqFCkx", - "DncKjvbdCIjbKhej", - "DncKjvbdZLqdTmkm", - "DoDKjvbdsPunicVf", - "EOcKjvbdmgFXmNgZ", - "EObkKvbdiMFENuCy", - "DoDKjvbdhanbeXRR", - "EObkKvbdACqwiyhp", - "DncKjvbdZisIQHBf", - "EPCjjvbdgQBzwDwh", - "DnbjjvbdyYJJaoyk", - "DoDKjvbdxUldqZMO", - "EObkKvbdkClLQgVH", - "EPCjjvbdZQldiMeR", - "EPDLKvbdZyEKOClS", - "EPDLKvbdcIlikFvx", - "DoDKjvbdrzMQTBHn", - "DnbjjvbdVYgtZkPO", - "DoDLKvbdHEKuiajK", - "EPCkKvbdczZQXxqC", - "DoDKjvbdrDdiQNua", - "DncLKvbdcImKLGWx", - "DoCjjvbdVYgtZkPO", - "EPDLKvbdZnnIeFZj", - "EPDKjvbdMIakqYAS", - "DoCkKvbdSLYfUgLT", - "EPDLKvbdiCObdvpq", - "DnbjjvbdRpUHKFcw", - "DoDLKvbdIHHZyYXg", - "EPCjjvbdypoMhiwA", - "DnbkKvbdCEPaVjMf", - "DnbkKvbderAvzlDP", - "DnbkKvbdZQleImFR", - "EOcKjvbdKRZdneme", - "DoDLKvbdiBnbeXQq", - "DncLKvbdEPDKjvcE", - "EOcLKvbdauCGwkTh", - "DncLKvbdEvZQPmJe", - "EPCkKvbdURQnuVIN", - "DncLKvbdegjvSOQg", - "EPCjjvbdKaKgMawq", - "DnbkKvbdRzKISbvA", - "DncLKvbdiLdcnUcZ", - "EPDLKvbdkDMKpfuH", - "DoDLKvbdRbDdkhyL", - "DnbjjvbdDwxMUUTl", - "DnbkKvbdrpWPKCuf", - "DnbkKvbdNVSqjmAX", - "DoDKjvbdRbDeMIxk", - "EOcLKvbdcyxpXyRC", - "DncLKvbdRMwbYnUz", - "EObjjvbdqlzJxlHi", - "DoCkKvbdJYUCIMQp", - "DncLKvbdLZQjSzuG", - "EOcKjvbdxVNEqYkn", - "DnbkKvbdZoOIeFZj", - "DoCjjvbdBraCtFwS", - "EOcLKvbdliDsqVSB", - "EPCkKvbdeATqNXif", - "DncLKvbdkMbLydgP", - "EObjjvbdZxdJmbkr", - "DoCjjvbdraellHLZ", - "EObkKvbduDCuWvPP", - "DoCkKvbdpstGrSLU", - "DoCjjvbdLGFgbBQu", - "DnbkKvbdhtzFWquC", - "EObjjvbdoAKztHdO", - "EPDLKvbdatafxKtI", - "EPDKjvbdkWXNcaww", - "DoCkKvbdwkXEHzzG", - "EObkKvbdmgEwmNgZ", - "DncKjvbdBiLCLJFj", - "DoCjjvbdeOdsKssr", - "EOcLKvbdfILWSORH", - "EObkKvbdCDpAujMf", - "EPDKjvbdKDKDQibx", - "DoDKjvbdVUMtGLuj", - "EObkKvbdrXQMCiYq", - "DncKjvbdePEsLTtS", - "DncLKvbdDxYLtUTl", - "EPCkKvbdGYuVBEYC", - "DncLKvbdNeEUIiKd", - "EPCkKvbdpxoIHRDx", - "EObjjvbdFkEsDHlu", - "EObjjvbdssSSxzFD", - "DoCkKvbdUtNTfMVj", - "DnbjjvbdJcKDRKDY", - "DncKjvbdqiAKEmOe", - "DoDKjvbdtlXwAtBX", - "DnbkKvbdxmsIYTIc", - "EObkKvbdLrXMzUpz", - "DoCjjvbdkxsSSxft", - "DncKjvbdQlwaxnUz", - "EObkKvbdjhGlFfNk", - "EPCkKvbdxsNhmRag", - "DoDLKvbdMfcPmQUk", - "DoDKjvbdQvnEDLhD", - "EObjjvbdVgxVxHYz", - "DoDLKvbdlrYtyrdJ", - "DoCjjvbdezvYeIsw", - "DncLKvbdNddTiIjd", - "EPDLKvbdGGJrNiUR", - "EPDLKvbdRzJhTDWA", - "EPCjjvbdvvkaWBVu", - "EOcKjvbdRXNdCkgc", - "EOcKjvbdQZNAHTSK", - "EPCkKvbdsCGNLfkZ", - "EOcLKvbdDwwktTsl", - "EOcLKvbdqlzJyLgi", - "EOcLKvbdxsNiMqag", - "EOcLKvbdhzVFlROG", - "EOcKjvbdEztRFMCi", - "DnbkKvbdqiAJdmPF", - "EPDLKvbdjcMKqGtg", - "EObkKvbdTlWOaWOi", - "EPDLKvbdURRPUuHm", - "DoDKjvbdelfWgNKL", - "EOcLKvbdGAnqZJzm", - "EObjjvbdGZUuAdXb", - "DoDLKvbduLwwAtAw", - "DoCjjvbdZjTIQGbG", - "EPCjjvbdRNXbYnUz", - "EPDLKvbdiLeENtby", - "EObjjvbdMowpunGs", - "EOcKjvbdbiNJjevx", - "DoDKjvbdEYYLstTl", - "DoDLKvbdqUTfrRjt", - "DoDKjvbdbsCkUEJa", - "DoDKjvbdXsMBNUPY", - "EPCjjvbdRNXaxnUz", - "DoDLKvbdNGcQNQUk", - "DnbjjvbdEARiMywX", - "EPDKjvbdSKxfUfkT", - "DncKjvbdhtyeXRtb", - "DncKjvbdZLqcsnLm", - "EObkKvbdZnmheEzK", - "EObjjvbdtbcUvuno", - "DnbjjvbdrzMQTBHn", - "DnbjjvbdDwwktTsl", - "EPDKjvbdkxsSTYgU", - "DoDKjvbdIryArlxM", - "DoDKjvbdnBivxOnV", - "DoDKjvbdeATplwif", - "EOcLKvbdKeegbApu", - "EPCjjvbdMgDQMotk", - "DoCjjvbduCbtwWOo", - "DnbkKvbdyNsHwrhc", - "DnbkKvbdtvNxJpsA", - "EOcLKvbdqAheAWgd", - "DoCkKvbdURQoUtgm", - "EOcKjvbdqceIpOWB", - "DoCkKvbdVwIwudFH", - "DnbkKvbdbLMFnmcA", - "EOcLKvbdZjTHpHBf", - "EOcKjvbdRXNdCkhD", - "EPDLKvbdiHJcZViu", - "DoCjjvbdxxIjCPzL", - "DnbkKvbdBcpBWJmG", - "EPCkKvbdZyEKOCkr", - "EPDKjvbdOTUWHFVQ", - "DoCjjvbdIGgZxwwg", - "EPDLKvbdFjeSbhMu", - "EPDLKvbdhgKCxvJu", - "EOcLKvbdNsUWGdtp", - "EPDKjvbduVnXipsA", - "DncLKvbdGYuVBEXb", - "EPDLKvbdZtIhyESn", - "DoDKjvbdZxdJmcLr", - "DoCjjvbdUsltGLuj", - "DoDKjvbdDoDLKvbd", - "DncLKvbdrDdhpNvB", - "EPDLKvbdKCjDRJbx", - "DoDLKvbdxLWdHzyf", - "EObkKvbdrzMQTAhO", - "EOcLKvbdOFDtJJKd", - "EPCkKvbdrSVKmjaN", - "EOcKjvbdWWiYVdEg", - "EOcKjvbdWWhwvDdg", - "DncKjvbdpstHRqjt", - "EPCkKvbdKWVFceGi", - "DoCkKvbdZjShPfbG", - "DoCkKvbdSxKlNzkY", - "EPDLKvbdIwtCHkqQ", - "EOcKjvbdsCGNLgLZ", - "DncKjvbdzaAOfgCM", - "DoDLKvbdxmrhYSiD", - "DncLKvbdfMfWgMjL", - "EPDKjvbdqFdEsuaI", - "EOcLKvbdiLeDnUcZ", - "DoCjjvbdKVuFceHJ", - "DoCjjvbdfekzNgHA", - "EOcKjvbdOFEThiLE", - "EPDLKvbdqceJPnWB", - "DoDLKvbduCbtwWOo", - "DncKjvbdTqROtuIN", - "DncKjvbdpedFUWBI", - "DoDLKvbdrEFJQNua", - "DoDLKvbdyXhjCPyk", - "EPCkKvbdJYUBhLqQ", - "EPCkKvbdtcCuXVno", - "DoDLKvbdZLrEUOLm", - "EPCkKvbdpstGrRjt", - "DncLKvbddePSCXCj", - "EObkKvbdauCHXjsh", - "DoDLKvbdkHfkefNk", - "EObjjvbdMRwMzUpz", - "EObjjvbdaMkCTVNH", - "DoCkKvbdGGJrNhtR", - "EPDLKvbdvBDxrneI", - "EPDLKvbdIHHZxwxH", - "EOcLKvbdrJAJdmPF", - "EOcKjvbdGZUuAdXb", - "EOcLKvbdbUbHYLUI", - "DnbjjvbdJzofYEAN", - "EPDKjvbdFxtuBDxC", - "DnbkKvbdQvnDbkgc", - "EPDKjvbdJmADzGta", - "DoDKjvbdZRMdhleR", - "DnbkKvbdsrqsZZeD", - "EObkKvbdrovPJbuf", - "EPCjjvbddeOqbXCj", - "EObjjvbdtcDVXVoP", - "DncKjvbdMfbpNQVL", - "DoCkKvbdhbPCeXQq", - "DoCkKvbdNHComQVL", - "EObjjvbdvBDxroFI", - "EPCjjvbdnBivwoNu", - "EObjjvbdbhljKewY", - "EPDKjvbdZyDimcMS", - "EObkKvbdWSOXbElD", - "EOcKjvbdTfznMXVe", - "EPCjjvbdZtJJYcsO", - "DoCjjvbdRjxfVHLT", - "DoCkKvbdVTltGMVj", - "DncKjvbdYfwEAOri", - "DncKjvbdYkrEUOMN", - "EObkKvbdqGEEsuaI", - "DncLKvbdjJfHimXr", - "EPDLKvbddndsLUTr", - "DnbkKvbdqBJFAWhE", - "EPDLKvbdEOcKjwDE", - "EPCkKvbdtvOYJqTA", - "DncLKvbdkyTRsZHU", - "DoCjjvbdTppnuVIN", - "DncLKvbdwyhFeweS", - "DncKjvbdsBelkgKy", - "DoCjjvbdKDKCqJcY", - "DoCjjvbdkClKqHVH", - "DoCjjvbdcTCjtDia", - "EPDLKvbdUVkpJtAq", - "EPDLKvbdRyjITCvA", - "DnbjjvbdJuuFcdgJ", - "DoDKjvbdrJAJdmOe", - "DncKjvbdJcJbqKCx", - "DoDLKvbdJcJbqJcY", - "DoDKjvbdeEoSCXDK", - "DoDLKvbdSwjlNzkY", - "EObjjvbdzitopDrt", - "DoCkKvbdKWVGEEgJ", - "DncKjvbdpssfqrKt", - "EOcLKvbdUMWPBVoJ", - "DncKjvbdyzdmrIIh", - "EPCjjvbdxUldqZLn", - "DoDLKvbdySnImRbH", - "DoCjjvbdGdKvJaij", - "DoCkKvbdxZgeewdr", - "EObkKvbdiLddNuDZ", - "DnbjjvbdSCDdkiZL", - "DncKjvbdznpREcMY", - "EOcLKvbdaRebhTfL", - "DnbjjvbdZQldiMdq", - "EPCjjvbdbrbjtEKB", - "EOcKjvbdEARiMzXX", - "DoDLKvbdXrkaNTnx", - "EPCkKvbdQZNAHTRj", - "DoDLKvbdEzspeLcJ", - "EPCjjvbduVnYKRTA", - "EObjjvbdJXtBhMQp", - "EPDKjvbdeOdrjssr", - "EPCjjvbdLqwMytpz", - "EPDKjvbdUMVoBVoJ", - "DncKjvbdRpUGifDw", - "EPDLKvbdZyDinDLr", - "DnbkKvbdNrsufeVQ", - "EPCkKvbdZMSDtNlN", - "EPCkKvbdySnJNSCH", - "EPCjjvbdfMevfljL", - "DncLKvbdXsMBNTnx", - "DnbkKvbdpxoHfqDx", - "DncLKvbdUQpntthN", - "DncKjvbdIsZArlwl", - "DoDLKvbdZGwEAOsJ", - "EOcKjvbdVvhwvDdg", - "EOcLKvbduWNxJqTA", - "EPCjjvbdHEKvJaij", - "DoDKjvbdrpWOjCuf", - "DncLKvbdrpWOjDVf", - "DoCjjvbdIHGzYwwg", - "DoDLKvbdpxoIGqEY", - "DoDLKvbdJcJbqKDY", - "DoCjjvbdRWmdClHc", - "EPCjjvbdFWYopNJe", - "DncKjvbdmfdwlmfy", - "DoCkKvbdxUleQxlO", - "EObjjvbdnGdxMnGy", - "EPCjjvbdvvlAvBVu", - "DncLKvbddndsKssr", - "EObjjvbdZMRcsnLm", - "EOcKjvbdFxttaEXb", - "DncKjvbdVUNTfMVj", - "EOcLKvbdNrtWHFUp", - "DoDKjvbdwuMdqYlO", - "EPDLKvbdrXPkbhxq", - "EObjjvbdrEFIpNua", - "EObjjvbdziuQQDrt", - "EOcLKvbdqYoIGpcx", - "DnbjjvbdsQVoJcVf", - "EObkKvbdkDMKpgUg", - "EObjjvbdvBDyTPFI", - "DncKjvbduCbuWvOo", - "EPCjjvbdkVvnECYX", - "DncLKvbdZGvdAOri", - "DoCkKvbdrXPlDJZR", - "EOcLKvbduCcVWvOo", - "DoDKjvbdCEPaWJlf", - "EPDKjvbddoErjssr", - "DncKjvbdACqxKZiQ", - "EPCjjvbdUVlPitAq", - "EPDKjvbdjJfHjMxS", - "EObkKvbdAMhYsWzY", - "DoDKjvbdnBivxOmu", - "EOcLKvbdbiNKKfXY", - "EPDKjvbdYqMeIleR", - "EObkKvbdJmADygUa", - "EObjjvbdEPDLLWcE", - "EPCjjvbdrXPkcIxq", - "EOcLKvbdliDtQtqa", - "DoCjjvbdmoyxujyC", - "EPDLKvbddoFTLTsr", - "EOcLKvbdCWzdJEpW", - "DnbjjvbdrEEhpOWB", - "DoDKjvbdZLrDtNkm", - "EOcLKvbdLFfHbAqV", - "EOcKjvbdmttzLKSG", - "EOcLKvbdmbJvwoOV", - "EOcKjvbdUaCQrqSZ", - "DnbjjvbdmgExMnGy", - "EPDKjvbddndrkUUS", - "EObkKvbdDwwkstTl", - "DoCkKvbdcJMjLFwY", - "DnbjjvbdaNLBruMg", - "DoDLKvbdQYmAHTRj", - "DnbkKvbdsQWOicWG", - "EObkKvbdMRwMzUpz", - "DoDLKvbdZshiZDrn", - "EPDLKvbdnPzYujxb", - "EOcKjvbdCEQAujMf", - "EPDLKvbdKefHbApu", - "DoDLKvbdYpldiNFR", - "DoCkKvbdFWZQQNJe", - "DncLKvbdznpQeCkx", - "EOcKjvbdnQZxvKxb", - "DoCkKvbdVBBprpqy", - "DnbkKvbdZirhPfaf", - "DnbkKvbdegjvSNqH", - "EOcLKvbdqdEiPnWB", - "EObjjvbdBhkCKiGK", - "EObjjvbdxZgfGYFS", - "DnbjjvbdNQYQumgT", - "EPCjjvbdxsNhlrBg", - "DoCkKvbdQdDApRDr", - "DoCkKvbdxxIiaoyk", - "EPDKjvbdFeirNhtR", - "DoCjjvbdegjvSOQg", - "EObkKvbdqcdiQNvB", - "DncLKvbdiMEdNtcZ", - "DncLKvbdTqRPUthN", - "EPCkKvbdwygeexFS", - "DoDKjvbdyTOJMrBg", - "DncLKvbdeEoRavbj", - "EPCjjvbdtbcUvvOo", - "EObjjvbdKCicRJcY", - "EObjjvbdZyEKODMS", - "DnbjjvbdmJDtQtrB", - "DncLKvbdEARhlyvw", - "DnbjjvbdIxTbILqQ", - "EOcLKvbdwygefYFS", - "DoCjjvbdznoqFCkx", - "DoCjjvbdRpUGjGDw", - "DncKjvbdhzVGMQnG", - "EPCjjvbdhkeDnVCy", - "EObkKvbdOEdUIiKd", - "DncKjvbdrDeIomua", - "DncLKvbdiHJbxuiu", - "EPDKjvbddxZstRez", - "EPDLKvbdmSYuZrdJ", - "EObkKvbdVUNUFkvK", - "EPDLKvbdNeEUJIjd", - "DoCkKvbdiMEdNuCy", - "DoDLKvbdRDcApQcr", - "EPCjjvbdTlVoBVoJ", - "EObjjvbdLBKgNBwq", - "EPCkKvbdsCFllHKy", - "EObjjvbdnVUzLJqf", - "DoDKjvbdqrVLNkBN", - "DoCkKvbdqFcdtWBI", - "DncLKvbdbVCGxLTh", - "EOcLKvbdeFPSCXCj", - "EOcLKvbdRpTgKFdX", - "EObjjvbdznpQeDLx", - "EOcKjvbdjvXNcaxX", - "DnbjjvbdHDkWJbJj", - "DncKjvbdhkeENuDZ", - "DnbkKvbdnUtyjjSG", - "DoDKjvbdSQUHJfDw", - "DncKjvbdbUbHYLUI", - "EOcLKvbdNsTvGduQ", - "EPDLKvbdSZigsCvA", - "DncKjvbdMfcPlpUk", - "DoDLKvbdxrnIlrBg", - "DncKjvbdiLdcnVCy", - "EPCjjvbdmfeYNOHZ", - "DoCkKvbdjvWmcaxX", - "DoDKjvbdbUbHXkUI", - "DncKjvbdBhkBjiFj", - "DoDLKvbdNHColpVL", - "EOcKjvbdrykosAhO", - "DncLKvbdqGDeUVaI", - "DnbkKvbdhgJcZViu", - "DnbjjvbduLxXAtBX", - "EPCjjvbdYpleJNFR", - "EPDLKvbdQvmdClHc", - "DnbjjvbdJYTbIMRQ", - "DncLKvbdznpRFDMY", - "EOcLKvbdZnmiFEyj", - "DnbkKvbdrRuLOLAm", - "EObkKvbdhkeEOUby", - "DncLKvbdYlSEUOLm", - "DoCjjvbdhkdcmtby", - "DncLKvbdddnrCXDK", - "DoDLKvbdKaLHNCYR", - "EOcKjvbdcyxpYZQb", - "EPDLKvbdACqwjZhp", - "DoCkKvbdBsBDTevr", - "EObkKvbdeKJqvUzn", - "EObkKvbdcImJkGWx", - "DncLKvbdYSlAltOx", - "DncLKvbdlrYtyrdJ", - "EObkKvbdKxqJrztf", - "EOcKjvbdsQWPJcVf", - "DoDKjvbdkySqrxgU", - "EObjjvbdeEoRbXCj", - "EOcKjvbdHDkVjBij", - "DoDLKvbdCTBCsfXS", - "DoCjjvbdKCjDQibx", - "DoCjjvbdlhdTqUrB", - "DoDKjvbdTulQKTaR", - "DoCkKvbdRjxetfkT", - "EPCjjvbdEuyQQNKF", - "EPCjjvbdDoDKkXDE", - "DoCjjvbdsQWPJbuf", - "DoDKjvbdhuZdvqtb", - "EPDLKvbdiHKCyWJu", - "EPDLKvbdLFegaaQu", - "DoCjjvbdqZPHgRDx", - "DncKjvbdUWMPjUAq", - "DoDLKvbdTYKkmzjx", - "DoDKjvbdegjvSOQg", - "DnbkKvbdUtNTekvK", - "EObkKvbdNsTvGeVQ", - "DoDLKvbdfNFvgMjL", - "EOcLKvbdZQmEiNEq", - "EPDKjvbdBraDTfWr", - "EPDKjvbdNGcQNQVL", - "EPDLKvbdZyEKODMS", - "EOcKjvbdBvzdIdpW", - "EPCjjvbdACqwiyiQ", - "DoCjjvbddePRawCj", - "EPDKjvbdWWiXucdg", - "DoDKjvbdWexzUAPT", - "DnbjjvbdwXMBWBWV", - "EOcLKvbdUyHszLOn", - "EPCkKvbdOYOuzcnU", - "EPCkKvbdhancEwQq", - "DnbkKvbdjggLefOL", - "EPCkKvbdFjdsDIMu", - "DoDKjvbdrSUjmkBN", - "DoDLKvbdZjTIQGaf", - "DoDKjvbdMgDPmPtk", - "EPDLKvbdWRmwbFMD", - "DoCkKvbdzROmJKXA", - "DnbkKvbdrDdiQNvB", - "DnbjjvbduDCtwVoP", - "EOcLKvbdCIjbLJFj", - "EPDKjvbdXrkaMsnx", - "EPDKjvbdVhXvXfxz", - "DncKjvbdhbPDEwRR", - "DoCkKvbdpxoHgQcx", - "DoCkKvbduMXwBUBX", - "EObjjvbdNeEThhjd", - "DoCjjvbdirzhrkJz", - "DoDLKvbdaMkCTUlg", - "DncLKvbdWRnYBeLc", - "DnbjjvbdGBPRZJzm", - "EOcLKvbdeOeSjstS", - "DoDLKvbdmIctRVSB", - "DoCjjvbdZxdJnDMS", - "DoCkKvbdRpTgKFcw", - "DncLKvbdTukojTaR", - "DnbjjvbdKRZdoFme", - "DnbkKvbdURQoVUhN", - "DoDLKvbdyYJKBozL", - "EObkKvbdfNFwHMjL", - "DoDLKvbdZisIQHBf", - "EObkKvbdqFcdsuaI", - "DncLKvbdzoPqFDLx", - "DoDKjvbdSKxeuHLT", - "EPDKjvbdsBemLfjy", - "DoCjjvbdJbjCqJcY", - "DoCjjvbdNPxRVnGs", - "DncLKvbdGcjvJbKK", - "EOcKjvbdrWpMDIxq", - "EOcLKvbdQdDApQcr", - "DoDKjvbdZMRdTnLm", - "EOcLKvbddxZssrFz", - "EObjjvbdUtNTfLuj", - "EPCjjvbdLLBIWAKZ", - "DoCkKvbdgFlZmfgA", - "EPCjjvbdUVkoitAq", - "DoDKjvbdDncKjvcE", - "DoDLKvbdRpUHJfEX", - "EPDKjvbdLqvlzVQz", - "EPDKjvbdZMRdUOLm", - "EOcLKvbdCJLBkIfK", - "DncKjvbdaSFbhUFk", - "EPDLKvbdZoNheEzK", - "DncKjvbdUVlPjUAq", - "DnbkKvbdKNADyfuB", - "EObkKvbdZdwfzghb", - "EPDLKvbdZtIhxcrn", - "EObkKvbdGckViajK", - "DncLKvbdFfJqmiUR", - "DncKjvbdKWUfDdgJ", - "DoDKjvbdMtrqjmAX", - "EOcLKvbdsQWPKDVf", - "DoCjjvbdwtleRZMO", - "EObjjvbduaDxsPEh", - "EPDLKvbdKxqJrzuG", - "EOcKjvbdVAaprprZ", - "EObjjvbdEuxopMjF", - "DnbjjvbdyOTHwriD", - "EPDLKvbdrpVnibvG", - "EPDKjvbdkWWnDaww", - "DncLKvbdrXPkbiYq", - "DoDLKvbddxZssqez", - "EOcLKvbdHDkWJbJj", - "DncLKvbdEPCkLWcE", - "DnbkKvbdEXwkstTl", - "EObjjvbdqiAKEmOe", - "DncLKvbdjAQGaQGj", - "EPCjjvbdNeDtJJKd", - "EPCjjvbdvwMBWBVu", - "EPDKjvbdFejSOItR", - "EOcLKvbdNPwqWOHT", - "EPDKjvbdbsCjscia", - "EObkKvbdyYIiaoyk", - "DoDKjvbdLZQirzuG", - "EObjjvbdSLZGVGjs", - "DoCjjvbdAMgxsWzY", - "DoDLKvbdEObjjwCd", - "DnbkKvbdsPvOicWG", - "EPCkKvbdrJAKElne", - "EPCkKvbdauCGwjsh", - "DncLKvbdegkWRnQg", - "EPCkKvbdYpmEiNFR", - "DoDKjvbduaDxsPFI", - "DoCjjvbdcyxoxYqC", - "DoCkKvbdkMakzFHP", - "DnbjjvbdJbibqJbx", - "DnbkKvbdWWhxWDeH", - "DoCjjvbdssRsYzFD", - "DoDKjvbdpyPIHRDx", - "DncLKvbdwNWANDeN", - "DoDKjvbdJYUBglRQ", - "EObkKvbdXnRAYVVt", - "DoCjjvbdUWLpKTaR", - "DoDKjvbdTqROttgm", - "EPCkKvbdVqnXaeMD", - "EObjjvbdADRwiyiQ", - "DoDKjvbdlrZUyrci", - "EPDKjvbdvAdZSndh", - "DoCkKvbdzoQQeDLx", - "DnbkKvbdSQUGjFdX", - "EOcLKvbdqBJFAXIE", - "EObkKvbdSCEFLiZL", - "DnbjjvbdzoQQdcMY", - "DnbkKvbdpxngfqEY", - "DncLKvbdbsDLUEKB", - "DoCjjvbdXrlBMtOx", - "EObjjvbdKCjDQicY", - "DncLKvbdLrWlzUpz", - "EObjjvbdaaWEfQQX", - "EObjjvbdtlYWaTaX", - "DnbkKvbdMowpunGs", - "EObkKvbdSLYeuHKs", - "EObkKvbdTAEhhCOd", - "EPCkKvbdmSYtyrci", - "DncLKvbdYkqcsnLm", - "DoDLKvbdrylQTAgn", - "DncLKvbdJXtCIMRQ", - "EObkKvbdSBdElIyL", - "DoDLKvbdwygefYFS", - "DncKjvbdyXhibPzL", - "EPCjjvbduaDxsPFI", - "EObjjvbdZoNiFEzK", - "EPCjjvbdkNBkyeHP", - "EPCkKvbdWRnXadlD", - "DncLKvbdRWmdDLhD", - "DnbkKvbdmSYtzTDi", - "EOcKjvbdkVwODbXw", - "DncLKvbdQlxCZOUz", - "EObjjvbdbhlijfXY", - "EOcLKvbdXmqAXtut", - "EOcLKvbdmbKXXnnV", - "DoDKjvbdkHgMFfOL", - "EPCkKvbdfekymgHA", - "DoCjjvbdeKKRvUzn", - "DoDKjvbdkHfkefNk", - "DoCjjvbdyqPMiKXA", - "DnbjjvbdUQqOtuIN", - "EOcKjvbdEPCkKwDE", - "DoDLKvbdZRNFIleR", - "DnbjjvbdRacdlJZL", - "EOcLKvbdTukoitAq", - "EOcLKvbdZLrDtOMN", - "EOcLKvbdgKfzcGAE", - "EObjjvbdzjVQQESt", - "EOcLKvbdcIlijevx", - "EOcKjvbdGKdsDHmV", - "DncLKvbdKkBHvAJy", - "EOcKjvbdZMRctOLm", - "EPCkKvbdADRxKZiQ", - "EObjjvbdDwxLsssl", - "EPDLKvbdUxgszLPO", - "EPCkKvbdSQTfiedX", - "EPCjjvbdNeEUJIkE", - "DoDLKvbdpyPHfqDx", - "DnbkKvbdyOShXsJD", - "DncLKvbdLiBkpxAS", - "DoDKjvbdaaWEepQX", - "DoCjjvbdWSOYBeLc", - "EOcKjvbdLFegbAqV", - "EPDKjvbdffLzOGgA", - "EObkKvbdFkErbglu", - "DncLKvbdiZuFlROG", - "DncKjvbdegkWRnQg", - "DoDLKvbdQdDApRDr", - "EOcLKvbdeYZtURez", - "EObjjvbdrXQLcIxq", - "DoDLKvbdxZhGGXeS", - "DoDLKvbdGGKSOItR", - "EObjjvbdjhHLfFnL", - "EOcLKvbdUQpoUuHm", - "DoCkKvbdXrlBNUPY", - "DoDKjvbdJXtCIMRQ", - "DnbkKvbdZMSDsnLm", - "DncKjvbdCTBDUGWr", - "DncKjvbdbhlikGXY", - "DoDKjvbdXmqAYVWU", - "DnbjjvbdliDsqVRa", - "DnbkKvbdmajXYOnV", - "EObjjvbdJpyePGNe", - "DnbkKvbdCTAcUGXS", - "DoDLKvbdCDpBVjNG", - "EOcLKvbdxwhiaoyk", - "DoDKjvbdxVNFQyMO", - "EPCkKvbdVvhwvEEg", - "DnbkKvbdFWYoomJe", - "EOcKjvbdlrZUysEJ", - "EPDKjvbdqquKnKaN", - "DoCkKvbdTkunaVoJ", - "EOcLKvbdfHkVrOQg", - "EPDLKvbdiUzFWrUb", - "DoDLKvbdtAGqIABS", - "DoCkKvbdZRMdhmEq", - "DnbkKvbdNsUVfeVQ", - "EPDLKvbdqwPkbiZR", - "DoCkKvbdNUsSLNAX", - "DncKjvbdmpZxvKyC", - "EPCkKvbdLYqKSztf", - "EPDKjvbdZyEKODMS", - "EPDKjvbdNGbomPuL", - "DncKjvbdZMSDtNlN", - "EPCjjvbdTXjkmzjx", - "EObkKvbdBdQAvKMf", - "EOcLKvbdkySrTYgU", - "DnbkKvbdZoOIddzK", - "DoCkKvbdZMSDsmkm", - "EPCkKvbdCWzdIdpW", - "DncLKvbdBvzdIdov", - "DoCjjvbdaRfDHtFk", - "DnbkKvbdWeyZtAOs", - "DoDLKvbdnCJwYPOV", - "DoCjjvbdEYYLstUM", - "EOcLKvbdwtldqZMO", - "EPCjjvbdFVxoomKF", - "EObkKvbdyqPMhiwA", - "DoDLKvbdkxrrSxgU", - "DoCjjvbdeATqNYKG", - "DncLKvbdJKEAJpHE", - "DoCkKvbddndsLUTr", - "DnbjjvbdqFceUWBI", - "DoDLKvbdhkddOUby", - "DncKjvbdGKdrcIMu", - "EPCkKvbdelevflik", - "DoDKjvbdhaoDFWqR", - "DoCjjvbdYlSDsmlN", - "EPCjjvbdiZuGLpmf", - "EObkKvbdnCJvxPNu", - "DnbkKvbdhzUelRNf", - "DnbkKvbdZeYGzgiC", - "DoCkKvbdDnbkLWbd", - "DnbkKvbdnHFYMmfy", - "DoCjjvbdePEsKtTr", - "DnbjjvbdZQmEhleR", - "DnbkKvbdTkunaVoJ", - "DnbkKvbdFWZPpMjF", - "DoDKjvbdSwkMNzkY", - "EOcLKvbdwtldpyMO", - "EOcKjvbdhkdcmtby", - "DoCjjvbdNQXqWNfs", - "EPDKjvbdzjUpPdTU", - "DnbjjvbdqceJPnWB", - "EPDKjvbdUyHsyjoO", - "EPCkKvbdZshhxcsO", - "DncKjvbdqAiFAWgd", - "EObkKvbdgFkzOGgA", - "DncKjvbdmgFYNNgZ", - "DoDLKvbdDjHjWYKA", - "DnbjjvbdJbicRKCx", - "DnbkKvbdfNFwHMjL", - "EPCkKvbdWSNxBdlD", - "EPDLKvbdCJKbLJFj", - "EPDKjvbdEOcKkXDE", - "EPCkKvbdVrOYCElD", - "DnbjjvbdCIkBjhej", - "DoDLKvbddoFTKstS", - "DnbjjvbduDDVXVoP", - "EObkKvbdxwiKCPzL", - "DnbkKvbdZGvdAPTJ", - "DoDLKvbdBdPaVjNG", - "EOcKjvbdIHGzYwxH", - "DoCjjvbdGFjSNhsq", - "DnbjjvbdlYsSSxgU", - "EPCjjvbdqrUjnKaN", - "EOcLKvbdtvOXipsA", - "DoDLKvbdrounjCuf", - "DoCkKvbdFVyPomKF", - "EOcKjvbdNHCpNPtk", - "EPDLKvbdWeyZtAPT", - "EPDKjvbdjcLkQfuH", - "EOcLKvbdzHZMAMeX", - "DoCjjvbdUMWPBVni", - "EOcKjvbdHELWKBjK", - "DoDKjvbdMgComQUk", - "DnbkKvbdiGjDZWJu", - "DncKjvbdyqOmJKXA", - "DoDKjvbdVZITyjoO", - "DoCjjvbdzQoNJJwA", - "EOcLKvbdGAoQxizm", - "DoDKjvbdatagYKsh", - "EPDKjvbdSBceMJYk", - "DoDLKvbdMpYQvOHT", - "DncKjvbdiCOcFWpq", - "DoCjjvbdUGznLvvF", - "EPDLKvbdANIYrvyx", - "EPCjjvbdIwtCHkpp", - "EObkKvbdJSyBSmYM", - "EObkKvbdwuMdqYlO", - "EObjjvbdmuVZkKSG", - "DncLKvbdSPsfjFdX", - "DoDLKvbdSQUHJedX", - "DoDKjvbdiVZdwSUb", - "EPDLKvbdRjxfVGkT", - "EObjjvbdmpZyVkZC", - "DncLKvbdhzUelROG", - "EPCkKvbdxVMeRZMO", - "EOcKjvbdxxIiapZk", - "EOcKjvbdJSyBTNYM", - "EPDKjvbdMSXMzUpz", - "EObkKvbdJmADzHVB" }; - - public static void main(java.lang.String[] unused) { - try { - BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("bad.out")); - for (int i = 0; i < strings.length; i++) { - out.write(strings[i].getBytes()); - out.write("\n".getBytes()); - } - out.close(); - } catch (Exception e) { - System.out.println("Some exception occurred"); - } - } -} diff --git a/hotspot/test/runtime/7158800/InternTest.java b/hotspot/test/runtime/7158800/InternTest.java deleted file mode 100644 index d0cd1c024f2..00000000000 --- a/hotspot/test/runtime/7158800/InternTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 7158800 - * @run shell/timeout=400 Test7158800.sh - * @summary This test performs poorly if alternate hashing isn't used for - * string table. - * The timeout is handled by the shell file (which kills the process) - */ -import java.util.*; -import java.io.*; - -public class InternTest { - public static void main (String args[]) throws Exception { - final String badStringsFilename = "badstrings.txt"; - - if (args.length == 0 || (!args[0].equals("bad") && !args[0].equals("normal"))) { - System.out.println("Usage: java InternTest [normal|bad]"); - System.exit(1); - } - - FileInputStream fstream = new FileInputStream(badStringsFilename); - DataInputStream in = new DataInputStream(fstream); - BufferedReader br = new BufferedReader(new InputStreamReader(in)); - String toIntern, toDiscard; - int count = 0; - long current = 0L; - long last = System.currentTimeMillis(); - - if (args[0].equals("bad")) { - while ((toIntern = br.readLine()) != null) { - toDiscard = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString()); - toIntern.intern(); - count++; - if (count % 10000 == 0 && count != 0) { - current = System.currentTimeMillis(); - System.out.println(new Date(current) + ": interned " + count + " 0-hash strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)"); - last = current; - } - } - } - if (args[0].equals("normal")) { - while ((toDiscard = br.readLine()) != null) { // do the same read from the file to try and make the test fair - toIntern = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString()); - toIntern.intern(); - count++; - if (count % 10000 == 0 && count != 0) { - current = System.currentTimeMillis(); - System.out.println(new Date(current) + ": interned " + count + " normal strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)"); - last = current; - } - } - } - in.close(); - } -} - - diff --git a/hotspot/test/runtime/7158800/Test7158800.sh b/hotspot/test/runtime/7158800/Test7158800.sh deleted file mode 100644 index 81fa7aca8a8..00000000000 --- a/hotspot/test/runtime/7158800/Test7158800.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# -# Run test for InternTest.java -# - -if [ "${TESTSRC}" = "" ] -then TESTSRC=. -fi - -if [ "${TESTJAVA}" = "" ] -then - PARENT=`dirname \`which java\`` - TESTJAVA=`dirname ${PARENT}` - echo "TESTJAVA not set, selecting " ${TESTJAVA} - echo "If this is incorrect, try setting the variable manually." -fi - -if [ "${TESTCLASSES}" = "" ] -then - echo "TESTCLASSES not set. Test cannot execute. Failed." - exit 1 -fi - -# set platform-dependent variables -OS=`uname -s` -case "$OS" in - SunOS | Linux | Darwin ) - NULL=/dev/null - PS=":" - FS="/" - ;; - Windows_* ) - NULL=NUL - PS=";" - FS="\\" - ;; - CYGWIN_* ) - NULL=/dev/null - PS=";" - FS="/" - ;; - * ) - echo "Unrecognized system!" - exit 1; - ;; -esac - -JEMMYPATH=${CPAPPEND} -CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH - -THIS_DIR=`pwd` - -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -fullversion - -${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}InternTest.java - -cp ${TESTSRC}${FS}badstrings.txt . - -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -XX:+PrintStringTableStatistics -XX:+TraceSafepointCleanupTime InternTest bad > test.out 2>&1 & -C_PID=$! - -sleep 60 - -ps | grep ${C_PID} | grep -v grep - -if [ $? = 0 ] -then - kill -9 ${C_PID} - echo "Test Failed" - exit 1 -else - echo "Test Passed" - exit 0 -fi diff --git a/hotspot/test/runtime/7158800/badstrings.txt b/hotspot/test/runtime/7158800/badstrings.txt deleted file mode 100644 index d7f76fb838e..00000000000 --- a/hotspot/test/runtime/7158800/badstrings.txt +++ /dev/null @@ -1,30001 +0,0 @@ -EOcLKvbddZyPxYpb -DncLKvbdPxmAGrqj -DoCjjvbdpxoIHQdY -EPCkKvbdqYoHfqEY -DnbkKvbdezvYdiUX -DnbjjvbdeEoRbXCj -EObkKvbdbsCkUEKB -EOcLKvbdnUtyjiqf -DncLKvbdRWnDcMHc -DoCkKvbdrSUkOLAm -DncLKvbdfNFwGmJk -EPDLKvbdvAdYroFI -DoDLKvbdiGibyViu -DncLKvbdYqNEhmFR -DoCkKvbdEARhlzXX -DncLKvbdSZjHsCvA -DncKjvbdqTsgRqkU -DnbjjvbdqAiFAXHd -EPDKjvbdGcjvJaij -DnbkKvbdwtldpxkn -DoDKjvbdYkrETnMN -EPCjjvbdbBWEfQQX -EPCjjvbduMXwAtBX -DncLKvbdbsCkTcia -DoCjjvbdczYpYZRC -EOcKjvbdFeiqmhsq -DoCkKvbdKCicQibx -EOcKjvbdZLrEUOLm -DoCjjvbdaNKbStmH -DoDKjvbdJbjDQjDY -EPCkKvbdemFwGmKL -EPDKjvbdZQleImEq -DncKjvbdZjShPfbG -DnbjjvbdqYnhHREY -DoCkKvbdaRfDIUGL -DoDKjvbdLrWlyuQz -DnbjjvbdZisHofaf -EObjjvbdhtydvrUb -DnbjjvbdRotHKGEX -EObjjvbdNeEThhkE -EPCjjvbdZtJJZESn -DoDKjvbdnPyxvLYb -EPDKjvbdeEoRbWbj -EOcLKvbdFxttaEXb -EObjjvbddwystRez -EPCjjvbdJpzEnenF -DnbkKvbdTppntuIN -EPCkKvbdTukpKUBR -DnbkKvbdhlFEOUcZ -EObkKvbdlhdUQuRa -DnbjjvbdkClKqHUg -EOcKjvbdqTtGqqkU -DncKjvbdtkwvaUBX -DoDKjvbdsQWOjCuf -DncLKvbdEKIJuwjA -DncKjvbdGLErcIMu -EOcLKvbdNPwpumfs -EObkKvbdnVUzLJrG -DoCkKvbdcTDKsdKB -DncKjvbdKRZdoFme -EOcLKvbdemFvgNKL -EPCkKvbdznopdblY -EPDLKvbdOYPVzdOU -DnbjjvbdsZlPsAhO -DoDLKvbdKCjDRKDY -DoCkKvbdhuZeXSVC -EPDKjvbdOStVgEtp -DncLKvbdvwMAvBWV -EPDKjvbdBcoaWJlf -EOcKjvbdZxdKODMS -DoCjjvbdbsCkTcjB -EOcLKvbdwWlAuaWV -DnbjjvbdFejRnJUR -DnbjjvbdmIdTqVSB -DnbkKvbdqBIeAWhE -DncKjvbdrMzJyMIJ -DoCkKvbdZGvdAOsJ -DncLKvbdjggLfFnL -DoCjjvbdYqNFJMdq -DoCkKvbdqZPHfqDx -DncLKvbdOEdThiLE -DoCkKvbdZirgpGaf -EPDLKvbdziuQPdSt -EObkKvbdKQyeOenF -DoDLKvbduaDySndh -DoCjjvbdVUNUGLvK -DncKjvbdAMhYrvzY -DnbkKvbdnQZxvKxb -EPCjjvbdBhjakJFj -DncLKvbdmfeYNNfy -DoDLKvbdjlbLydfo -DoDLKvbdpyPIGpcx -EOcLKvbdnVUzLJqf -DoCjjvbdmJETqVSB -DoDLKvbdJTZAsMxM -DoCkKvbdnQZxvLZC -DoDKjvbdACqwizJQ -DncKjvbdvBEZSoFI -DncKjvbdGckVjCJj -DncLKvbdiMFENtcZ -Dnbjjvbdjuvmcaww -DnbkKvbdZyEKNblS -DoCjjvbduMYXBUBX -DnbjjvbdFWYopNJe -DoDKjvbdelfXGljL -DnbjjvbdakLenmcA -EPDKjvbdfILWRmpg -EObjjvbdSLYeuHLT -DoCjjvbdMfbolotk -EPDLKvbdrRuKnKaN -EOcKjvbdyzdnRhIh -DoDLKvbdGAoRZJzm -DoCjjvbdhlFDnUcZ -EPDLKvbdmpZyVkYb -DncKjvbdTpqPUuIN -DncLKvbdHDjvJaij -EPDLKvbdYlRcsmkm -EPDLKvbdvlvAMdFN -DncKjvbdIsZArmYM -EOcLKvbdegjuqnQg -EOcLKvbdZQmFJNFR -DoCjjvbdZxdJmcMS -EPCkKvbdlZTSTYgU -DoDKjvbdqceJPnWB -DncLKvbdVgwuxGxz -DncKjvbdDnbkLXDE -EPDLKvbdatbHYKsh -DncKjvbdEzsqFLbi -EPDLKvbdnVVZkKRf -EOcKjvbdKeegbBQu -EPCkKvbdKfGHaaRV -EPDKjvbdmIctRVRa -EPCjjvbdRMxBxnUz -DnbjjvbdJYTbILpp -EPCkKvbdTAEiHbPE -EOcLKvbdfelZnGgA -DoCjjvbdOStWGeUp -EOcLKvbdemGXHNJk -DoDKjvbdYTMAmUOx -EPCkKvbdpyOhGpcx -EPCkKvbdAMgxsWzY -DnbjjvbdYkrETnMN -EPDLKvbdUQqPUtgm -DncKjvbdehKurNqH -DoCjjvbdZMSETnLm -DoDKjvbdIHGyyXwg -EObjjvbdXGYzUAPT -DoCjjvbdhbPCeWqR -DoCkKvbdKNADzGuB -DnbjjvbdFeirOJTq -DncLKvbdaRecHtFk -DnbkKvbdzoPpeClY -EObkKvbdZRMeJMeR -DnbjjvbdYfvdAPSi -DncLKvbdJcKCqJcY -EOcLKvbdqvokbhyR -DoDLKvbdrRuLNjaN -DoCjjvbdTlWPBWOi -DoCkKvbdjvWnEBxX -DoDLKvbdTkunaVoJ -DoCkKvbdQZNAHTSK -EObjjvbdqwPkbhyR -EOcLKvbdNHDPlpUk -DncLKvbdIHHZxxYH -DncLKvbdtkxXAtAw -DncLKvbdSCEFMJZL -DnbjjvbdZQmEhldq -DoCjjvbdNGbolotk -DnbjjvbdnCKWwnmu -DncLKvbdzHZMANEw -DoDKjvbdmttykJrG -DnbkKvbdlrZUzSci -EPDKjvbdSKyGVHKs -DoCjjvbdKVuGEFGi -EPCjjvbdCIkBkIej -DncLKvbdzHZMAMeX -DnbkKvbdaSFbgsek -DncLKvbdHDjujBij -DoDKjvbdGZVUaDwb -DnbjjvbdZnnJFEzK -DoCkKvbdtcDUwWOo -DoCkKvbdlBMoNALA -EOcKjvbdNsUWHFUp -DoDLKvbdVUNUFlVj -DnbkKvbdhkdcnUcZ -DncLKvbdLiBkqYAS -EOcKjvbdzoPpdcLx -EPDKjvbdijGIJmXr -EOcKjvbdZisHofaf -DoDLKvbdeOdrkUUS -DoDLKvbdnPyxvKxb -EPDKjvbdIxUBhMRQ -DncLKvbdlhctRUqa -DoDLKvbdmgFXlnGy -DncKjvbdCJKbKiGK -EOcLKvbddndrjtUS -DnbjjvbdkDLjqGuH -DncKjvbdmIcsptqa -DoCkKvbdvvlAvBWV -EObjjvbdjblLQftg -DnbjjvbdCEQBWKMf -DnbjjvbdBdPaVilf -DoCkKvbdZxcjODLr -DoCkKvbdEObjjwCd -EPDKjvbdyTNhlqbH -EPCkKvbdUMVoAvPJ -DncKjvbdUxhUZjoO -DncKjvbdqqtjmkAm -DncKjvbdKfGICBRV -EPCjjvbdVrOXaeLc -EPDLKvbdwXLaWBWV -EPCkKvbdjblKqHUg -DnbjjvbduDCuWuoP -EPDKjvbdNGbpMouL -EObjjvbdBcoaVjNG -DncLKvbdrWpMDIxq -DncLKvbdhaoCdwRR -DnbkKvbdFxtuBDwb -DncKjvbdIjEAKPgE -EOcLKvbduCbuXVoP -DoDKjvbdZtIiZDsO -DnbjjvbdEztRElCi -DncLKvbdxmsHwsJD -DnbjjvbdRbEElIxk -DoDKjvbdWHwvXgYz -EOcKjvbdQlwbYnUz -EOcLKvbdVTltFkuj -DncKjvbdliETptqa -DnbkKvbddoErjtTr -DoCkKvbdgPazvdXh -DncKjvbdySmhlqag -DoCjjvbdbPgHDkzd -DoCkKvbdFWZPomKF -EObjjvbdssSSxydc -EObjjvbdzQnliJwA -EObkKvbdKCjCpibx -EPCjjvbdpyOhHREY -DncLKvbddjJqutzn -EObkKvbdBdQAujMf -EPCkKvbdLAjflbXq -DncLKvbdLBLGlaxR -DoDLKvbdrpWPJbuf -DoCjjvbdEKHiuxKA -DoCjjvbdXsMAlsnx -EObkKvbdptTgSSLU -DoDKjvbdnHFXmNfy -DncKjvbdCJKbKhej -EPCjjvbdhlEdOUby -EOcKjvbdKWUfEFGi -DoDKjvbdZQmFJMdq -EPCjjvbdiGjDZWKV -EObkKvbdVAbQrprZ -DoDKjvbdfekzNgHA -DoDLKvbdnHEwlmgZ -DncKjvbdwzHeexEr -DoCjjvbdmpZxujyC -EPDKjvbdwMvAMcdm -DoCjjvbdfHkVrNqH -EPCkKvbdYzbfRiuy -EPCkKvbdZtIiZDrn -DnbjjvbdjvWnDbYX -DoCjjvbdOStVgEtp -EPDLKvbdZMSETmlN -EPDKjvbdBhjajhej -EPCjjvbddoFTLUUS -DnbkKvbdsQVoJcWG -EPCjjvbdrEFJQNvB -DoCjjvbdMpYRWOGs -EOcLKvbdZirgpHBf -EPDLKvbdyOTIXsJD -DoCkKvbdKRZdnfNe -DnbjjvbdbBWFFoow -EPCjjvbdgFlZnHHA -DnbkKvbdGGJrOIsq -DoDLKvbduDCtwWPP -EObjjvbdNddUIhjd -DnbjjvbdxsNiMqag -EObjjvbddeOrCWbj -EObjjvbdPxmAGsRj -EOcLKvbddeOrCXDK -DoDLKvbddeOrBwCj -DoCjjvbdVqnYCElD -DnbkKvbdUyIUZjoO -EObjjvbdeFOrCXDK -EObkKvbdVrNxCFLc -EObjjvbdTfzmkwWF -EOcKjvbdIHGzZYYH -EPDKjvbdtbbuXWPP -DoCjjvbdZisIQHBf -EObjjvbdbsCkUDjB -EPCkKvbdVwJXudFH -EPDKjvbdrouoKDVf -EPCkKvbdFyVVBEYC -DncLKvbdZnnIeEzK -EPDLKvbdxVNFQxkn -DoDKjvbdpxnggRDx -DoDLKvbdqZOgfpcx -DncKjvbdCIjakJGK -EPCkKvbdCJLBjhej -DoDLKvbdnPzYvKxb -EOcKjvbdqTsgSRkU -EOcLKvbdLBLGlaxR -DoDLKvbdcbTMrAUN -DncLKvbdzitoodSt -DoDKjvbdJvUfDdfi -EOcLKvbdHDjvKCJj -EPCkKvbdeOeTKssr -DnbkKvbdlYrqsYft -DncLKvbdiiehKMxS -DncKjvbdURQoVUhN -DnbkKvbduMYXBUAw -DoDLKvbdSPtHJfEX -EObkKvbdqBJFAWgd -EOcKjvbdFpATWgFy -DoDLKvbdBsBDTfXS -DncKjvbdjhHLfFmk -DoCjjvbdCJKakIfK -DnbkKvbddoFSjtTr -EObkKvbdANIYsWzY -EObjjvbdCTAbtFvr -EObjjvbdrRtkOLAm -DnbkKvbdkxsSTYgU -DoCjjvbdnBiwXnmu -EObjjvbdwtmEqYlO -EPDKjvbdrylQTAhO -DoDLKvbdtbbtvvOo -EPCjjvbdZLrETmlN -EPDLKvbdWXJYWDdg -DoCkKvbdKQzFOfOF -EPCjjvbdwzIFfXeS -DncKjvbdRjyFuHLT -EPDLKvbdULunaWPJ -DncKjvbdUxhTykOn -DnbkKvbdJcKCqKDY -EPDLKvbdcbSmSATm -DnbkKvbdegjurNqH -EPDKjvbdZjTIQGbG -EPCjjvbdiLddNuCy -DoCjjvbdZQldiNEq -EOcLKvbdakMGPODA -EObjjvbdnHEwlmgZ -EOcLKvbdBsAcUGXS -EPCkKvbdiVZdwSUb -EOcLKvbddCTNSAUN -DnbkKvbdEXxMUUUM -DncKjvbdYpldiMeR -DoDKjvbdNddTiIjd -DoDLKvbdZLqdUNlN -EPCkKvbdiBncFWpq -DncLKvbdiCPDEvqR -EOcKjvbdUyHszKoO -DncKjvbdhtydvqtb -EPCjjvbdpxoHgQcx -EObkKvbdkWWnDaxX -DnbjjvbdBhkBkJFj -DoCkKvbdRacdkhyL -EOcLKvbdZjTHpHCG -EPCkKvbdMowqWOGs -DncLKvbdegjurNpg -EObjjvbdfMfWfmKL -EPDLKvbdZirgpGaf -DoDLKvbdiZuFlQnG -DncLKvbdFxuVAcxC -EObkKvbdZisHofaf -EOcKjvbdJSyBSmYM -EPDLKvbdVYgtZkPO -EOcKjvbdRbEFMJYk -DncLKvbdrEFIonWB -DncKjvbdKDJbqJcY -EOcLKvbdhfjCxuiu -EObjjvbdLLAhWAKZ -DoCkKvbdRXNcblID -DoDLKvbdcbSmSATm -EOcLKvbdwWlAvAuu -EObkKvbdiBnbdvpq -DoCkKvbdNQXpumgT -DncLKvbdkVwOECYX -DnbkKvbdfoazwDxI -DoDLKvbdbBWFFpPw -DoDLKvbdvBDxsPEh -EPDKjvbdJqZdoFme -DoDLKvbdIryArmXl -EPCjjvbdANIZSwZx -EPCkKvbdVhYVxGxz -DncKjvbdLAjgNCYR -DncKjvbdxxIjCQZk -DncKjvbdbiNKKewY -EPCjjvbdlrZVZsEJ -EPDKjvbdIryAsMwl -DoCkKvbdtAHRIAAr -EPDKjvbdJmAEZfuB -EPCkKvbdZjSgogBf -DoDLKvbdOXnuzcnU -DnbkKvbdehKvRnQg -EObjjvbdZyDimbkr -DoDKjvbdmajWwoOV -EOcKjvbdkMalZeHP -EOcKjvbdIjEAJpHE -EPCkKvbdDihKVxKA -DncKjvbdNddUIiKd -EObjjvbdqdFIpOWB -DoCkKvbdxnShXsJD -DoDLKvbdjmBkzEfo -EOcLKvbdatagYLTh -DoCjjvbdVhYVxHYz -DnbjjvbdJbjDRKDY -EPCjjvbdLBLHNCYR -DnbjjvbdnGeYNOGy -EOcLKvbdUsmTekvK -EPCjjvbdtkxXBTaX -EPCjjvbdzoPqFCkx -DncKjvbdCIjbKhej -DncKjvbdZLqdTmkm -DoDKjvbdsPunicVf -EOcKjvbdmgFXmNgZ -EObkKvbdiMFENuCy -DoDKjvbdhanbeXRR -EObkKvbdACqwiyhp -DncKjvbdZisIQHBf -EPCjjvbdgQBzwDwh -DnbjjvbdyYJJaoyk -DoDKjvbdxUldqZMO -EObkKvbdkClLQgVH -EPCjjvbdZQldiMeR -EPDLKvbdZyEKOClS -EPDLKvbdcIlikFvx -DoDKjvbdrzMQTBHn -DnbjjvbdVYgtZkPO -DoDLKvbdHEKuiajK -EPCkKvbdczZQXxqC -DoDKjvbdrDdiQNua -DncLKvbdcImKLGWx -DoCjjvbdVYgtZkPO -EPDLKvbdZnnIeFZj -EPDKjvbdMIakqYAS -DoCkKvbdSLYfUgLT -EPDLKvbdiCObdvpq -DnbjjvbdRpUHKFcw -DoDLKvbdIHHZyYXg -EPCjjvbdypoMhiwA -DnbkKvbdCEPaVjMf -DnbkKvbderAvzlDP -DnbkKvbdZQleImFR -EOcKjvbdKRZdneme -DoDLKvbdiBnbeXQq -DncLKvbdEPDKjvcE -EOcLKvbdauCGwkTh -DncLKvbdEvZQPmJe -EPCkKvbdURQnuVIN -DncLKvbdegjvSOQg -EPCjjvbdKaKgMawq -DnbkKvbdRzKISbvA -DncLKvbdiLdcnUcZ -EPDLKvbdkDMKpfuH -DoDLKvbdRbDdkhyL -DnbjjvbdDwxMUUTl -DnbkKvbdrpWPKCuf -DnbkKvbdNVSqjmAX -DoDKjvbdRbDeMIxk -EOcLKvbdcyxpXyRC -DncLKvbdRMwbYnUz -EObjjvbdqlzJxlHi -DoCkKvbdJYUCIMQp -DncLKvbdLZQjSzuG -EOcKjvbdxVNEqYkn -DnbkKvbdZoOIeFZj -DoCjjvbdBraCtFwS -EOcLKvbdliDsqVSB -EPCkKvbdeATqNXif -DncLKvbdkMbLydgP -EObjjvbdZxdJmbkr -DoCjjvbdraellHLZ -EObkKvbduDCuWvPP -DoCkKvbdpstGrSLU -DoCjjvbdLGFgbBQu -DnbkKvbdhtzFWquC -EObjjvbdoAKztHdO -EPDLKvbdatafxKtI -EPDKjvbdkWXNcaww -DoCkKvbdwkXEHzzG -EObkKvbdmgEwmNgZ -DncKjvbdBiLCLJFj -DoCjjvbdeOdsKssr -EOcLKvbdfILWSORH -EObkKvbdCDpAujMf -EPDKjvbdKDKDQibx -DoDKjvbdVUMtGLuj -EObkKvbdrXQMCiYq -DncKjvbdePEsLTtS -DncLKvbdDxYLtUTl -EPCkKvbdGYuVBEYC -DncLKvbdNeEUIiKd -EPCkKvbdpxoIHRDx -EObjjvbdFkEsDHlu -EObjjvbdssSSxzFD -DoCkKvbdUtNTfMVj -DnbjjvbdJcKDRKDY -DncKjvbdqiAKEmOe -DoDKjvbdtlXwAtBX -DnbkKvbdxmsIYTIc -EObkKvbdLrXMzUpz -DoCjjvbdkxsSSxft -DncKjvbdQlwaxnUz -EObkKvbdjhGlFfNk -EPCkKvbdxsNhmRag -DoDLKvbdMfcPmQUk -DoDKjvbdQvnEDLhD -EObjjvbdVgxVxHYz -DoDLKvbdlrYtyrdJ -DoCjjvbdezvYeIsw -DncLKvbdNddTiIjd -EPDLKvbdGGJrNiUR -EPDLKvbdRzJhTDWA -EPCjjvbdvvkaWBVu -EOcKjvbdRXNdCkgc -EOcKjvbdQZNAHTSK -EPCkKvbdsCGNLfkZ -EOcLKvbdDwwktTsl -EOcLKvbdqlzJyLgi -EOcLKvbdxsNiMqag -EOcLKvbdhzVFlROG -EOcKjvbdEztRFMCi -DnbkKvbdqiAJdmPF -EPDLKvbdjcMKqGtg -EObkKvbdTlWOaWOi -EPDLKvbdURRPUuHm -DoDKjvbdelfWgNKL -EOcLKvbdGAnqZJzm -EObjjvbdGZUuAdXb -DoDLKvbduLwwAtAw -DoCjjvbdZjTIQGbG -EPCjjvbdRNXbYnUz -EPDLKvbdiLeENtby -EObjjvbdMowpunGs -EOcKjvbdbiNJjevx -DoDKjvbdEYYLstTl -DoDLKvbdqUTfrRjt -DoDKjvbdbsCkUEJa -DoDKjvbdXsMBNUPY -EPCjjvbdRNXaxnUz -DoDLKvbdNGcQNQUk -DnbjjvbdEARiMywX -EPDKjvbdSKxfUfkT -DncKjvbdhtyeXRtb -DncKjvbdZLqcsnLm -EObkKvbdZnmheEzK -EObjjvbdtbcUvuno -DnbjjvbdrzMQTBHn -DnbjjvbdDwwktTsl -EPDKjvbdkxsSTYgU -DoDKjvbdIryArlxM -DoDKjvbdnBivxOnV -DoDKjvbdeATplwif -EOcLKvbdKeegbApu -EPCjjvbdMgDQMotk -DoCjjvbduCbtwWOo -DnbkKvbdyNsHwrhc -DnbkKvbdtvNxJpsA -EOcLKvbdqAheAWgd -DoCkKvbdURQoUtgm -EOcKjvbdqceIpOWB -DoCkKvbdVwIwudFH -DnbkKvbdbLMFnmcA -EOcLKvbdZjTHpHBf -EOcKjvbdRXNdCkhD -EPDLKvbdiHJcZViu -DoCjjvbdxxIjCPzL -DnbkKvbdBcpBWJmG -EPCkKvbdZyEKOCkr -EPDKjvbdOTUWHFVQ -DoCjjvbdIGgZxwwg -EPDLKvbdFjeSbhMu -EPDLKvbdhgKCxvJu -EOcLKvbdNsUWGdtp -EPDKjvbduVnXipsA -DncLKvbdGYuVBEXb -EPDLKvbdZtIhyESn -DoDKjvbdZxdJmcLr -DoCjjvbdUsltGLuj -DoDKjvbdDoDLKvbd -DncLKvbdrDdhpNvB -EPDLKvbdKCjDRJbx -DoDLKvbdxLWdHzyf -EObkKvbdrzMQTAhO -EOcLKvbdOFDtJJKd -EPCkKvbdrSVKmjaN -EOcKjvbdWWiYVdEg -EOcKjvbdWWhwvDdg -DncKjvbdpstHRqjt -EPCkKvbdKWVFceGi -DoCkKvbdZjShPfbG -DoCkKvbdSxKlNzkY -EPDLKvbdIwtCHkqQ -EOcKjvbdsCGNLgLZ -DncKjvbdzaAOfgCM -DoDLKvbdxmrhYSiD -DncLKvbdfMfWgMjL -EPDKjvbdqFdEsuaI -EOcLKvbdiLeDnUcZ -DoCjjvbdKVuFceHJ -DoCjjvbdfekzNgHA -EOcKjvbdOFEThiLE -EPDLKvbdqceJPnWB -DoDLKvbduCbtwWOo -DncKjvbdTqROtuIN -DncKjvbdpedFUWBI -DoDLKvbdrEFJQNua -DoDLKvbdyXhjCPyk -EPCkKvbdJYUBhLqQ -EPCkKvbdtcCuXVno -DoDLKvbdZLrEUOLm -EPCkKvbdpstGrRjt -DncLKvbddePSCXCj -EObkKvbdauCHXjsh -DoDLKvbdkHfkefNk -EObjjvbdMRwMzUpz -EObjjvbdaMkCTVNH -DoCkKvbdGGJrNhtR -EPDLKvbdvBDxrneI -EPDLKvbdIHHZxwxH -EOcLKvbdrJAJdmPF -EOcKjvbdGZUuAdXb -EOcLKvbdbUbHYLUI -DnbjjvbdJzofYEAN -EPDKjvbdFxtuBDxC -DnbkKvbdQvnDbkgc -EPDKjvbdJmADzGta -DoDKjvbdZRMdhleR -DnbkKvbdsrqsZZeD -EObkKvbdrovPJbuf -EPCjjvbddeOqbXCj -EObjjvbdtcDVXVoP -DncKjvbdMfbpNQVL -DoCkKvbdhbPCeXQq -DoCkKvbdNHComQVL -EObjjvbdvBDxroFI -EPCjjvbdnBivwoNu -EObjjvbdbhljKewY -EPDKjvbdZyDimcMS -EObkKvbdWSOXbElD -EOcKjvbdTfznMXVe -EPCjjvbdZtJJYcsO -DoCjjvbdRjxfVHLT -DoCkKvbdVTltGMVj -DncKjvbdYfwEAOri -DncKjvbdYkrEUOMN -EObkKvbdqGEEsuaI -DncLKvbdjJfHimXr -EPDLKvbddndsLUTr -DnbkKvbdqBJFAWhE -EPDLKvbdEOcKjwDE -EPCkKvbdtvOYJqTA -DncLKvbdkyTRsZHU -DoCjjvbdTppnuVIN -DncLKvbdwyhFeweS -DncKjvbdsBelkgKy -DoCjjvbdKDKCqJcY -DoCjjvbdkClKqHVH -DoCjjvbdcTCjtDia -EPDLKvbdUVkpJtAq -EPDLKvbdRyjITCvA -DnbjjvbdJuuFcdgJ -DoDKjvbdrJAJdmOe -DncKjvbdJcJbqKCx -DoDLKvbdJcJbqJcY -DoDKjvbdeEoSCXDK -DoDLKvbdSwjlNzkY -EObjjvbdzitopDrt -DoCkKvbdKWVGEEgJ -DncKjvbdpssfqrKt -EOcLKvbdUMWPBVoJ -DncKjvbdyzdmrIIh -EPCjjvbdxUldqZLn -DoDLKvbdySnImRbH -DoCjjvbdGdKvJaij -DoCkKvbdxZgeewdr -EObkKvbdiLddNuDZ -DnbjjvbdSCDdkiZL -DncKjvbdznpREcMY -EOcLKvbdaRebhTfL -DnbjjvbdZQldiMdq -EPCjjvbdbrbjtEKB -EOcKjvbdEARiMzXX -DoDLKvbdXrkaNTnx -EPCkKvbdQZNAHTRj -DoDLKvbdEzspeLcJ -EPCjjvbduVnYKRTA -EObjjvbdJXtBhMQp -EPDKjvbdeOdrjssr -EPCjjvbdLqwMytpz -EPDKjvbdUMVoBVoJ -DncKjvbdRpUGifDw -EPDLKvbdZyDinDLr -DnbkKvbdNrsufeVQ -EPCkKvbdZMSDtNlN -EPCkKvbdySnJNSCH -EPCjjvbdfMevfljL -DncLKvbdXsMBNTnx -DnbkKvbdpxoHfqDx -DncLKvbdUQpntthN -DncKjvbdIsZArlwl -DoDLKvbdZGwEAOsJ -EOcKjvbdVvhwvDdg -EOcLKvbduWNxJqTA -EPCjjvbdHEKvJaij -DoDKjvbdrpWOjCuf -DncLKvbdrpWOjDVf -DoCjjvbdIHGzYwwg -DoDLKvbdpxoIGqEY -DoDLKvbdJcJbqKDY -DoCjjvbdRWmdClHc -EPCjjvbdFWYopNJe -DncKjvbdmfdwlmfy -DoCkKvbdxUleQxlO -EObjjvbdnGdxMnGy -EPCjjvbdvvlAvBVu -DncLKvbddndsKssr -EObjjvbdZMRcsnLm -EOcKjvbdFxttaEXb -DncKjvbdVUNTfMVj -EOcLKvbdNrtWHFUp -DoDKjvbdwuMdqYlO -EPDLKvbdrXPkbhxq -EObjjvbdrEFIpNua -EObjjvbdziuQQDrt -EOcLKvbdqYoIGpcx -DnbjjvbdsQVoJcVf -EObkKvbdkDMKpgUg -EObjjvbdvBDyTPFI -DncKjvbduCbuWvOo -EPCjjvbdkVvnECYX -DncLKvbdZGvdAOri -DoCkKvbdrXPlDJZR -EOcLKvbduCcVWvOo -DoDKjvbdCEPaWJlf -EPDKjvbddoErjssr -DncKjvbdACqxKZiQ -EPCjjvbdUVlPitAq -EPDKjvbdjJfHjMxS -EObkKvbdAMhYsWzY -DoDKjvbdnBivxOmu -EOcLKvbdbiNKKfXY -EPDKjvbdYqMeIleR -EObkKvbdJmADygUa -EObjjvbdEPDLLWcE -EPCjjvbdrXPkcIxq -EOcLKvbdliDtQtqa -DoCjjvbdmoyxujyC -EPDLKvbddoFTLTsr -EOcLKvbdCWzdJEpW -DnbjjvbdrEEhpOWB -DoDKjvbdZLrDtNkm -EOcLKvbdLFfHbAqV -EOcKjvbdmttzLKSG -EOcLKvbdmbJvwoOV -EOcKjvbdUaCQrqSZ -DnbjjvbdmgExMnGy -EPDKjvbddndrkUUS -EObkKvbdDwwkstTl -DoCkKvbdcJMjLFwY -DnbjjvbdaNLBruMg -DoDLKvbdQYmAHTRj -DnbkKvbdsQWOicWG -EObkKvbdMRwMzUpz -DoDLKvbdZshiZDrn -EPDLKvbdnPzYujxb -EOcKjvbdCEQAujMf -EPDLKvbdKefHbApu -DoDLKvbdYpldiNFR -DoCkKvbdFWZQQNJe -DncLKvbdznpQeCkx -EOcKjvbdnQZxvKxb -DoCkKvbdVBBprpqy -DnbkKvbdZirhPfaf -DnbkKvbdegjvSNqH -EOcLKvbdqdEiPnWB -EObjjvbdBhkCKiGK -EObjjvbdxZgfGYFS -DnbjjvbdNQYQumgT -EPCjjvbdxsNhlrBg -DoCkKvbdQdDApRDr -DoCkKvbdxxIiaoyk -EPDKjvbdFeirNhtR -DoCjjvbdegjvSOQg -EObkKvbdqcdiQNvB -DncLKvbdiMEdNtcZ -DncLKvbdTqRPUthN -EPCkKvbdwygeexFS -DoDKjvbdyTOJMrBg -DncLKvbdeEoRavbj -EPCjjvbdtbcUvvOo -EObjjvbdKCicRJcY -EObjjvbdZyEKODMS -DnbjjvbdmJDtQtrB -DncLKvbdEARhlyvw -DnbjjvbdIxTbILqQ -EOcLKvbdwygefYFS -DoCjjvbdznoqFCkx -DoCjjvbdRpUGjGDw -DncKjvbdhzVGMQnG -EPCjjvbdhkeDnVCy -EObkKvbdOEdUIiKd -DncKjvbdrDeIomua -DncLKvbdiHJbxuiu -EPDKjvbddxZstRez -EPDLKvbdmSYuZrdJ -EObkKvbdVUNUFkvK -EPDLKvbdNeEUJIjd -DoCkKvbdiMEdNuCy -DoDLKvbdRDcApQcr -EPCjjvbdTlVoBVoJ -EObjjvbdLBKgNBwq -EPCkKvbdsCFllHKy -EObjjvbdnVUzLJqf -DoDKjvbdqrVLNkBN -DoCkKvbdqFcdtWBI -DncLKvbdbVCGxLTh -EOcLKvbdeFPSCXCj -EOcLKvbdRpTgKFdX -EObjjvbdznpQeDLx -EOcKjvbdjvXNcaxX -DnbjjvbdHDkWJbJj -DncKjvbdhkeENuDZ -DnbkKvbdnUtyjjSG -DoDKjvbdSQUHJfDw -DncKjvbdbUbHYLUI -EOcLKvbdNsTvGduQ -EPDLKvbdSZigsCvA -DncKjvbdMfcPlpUk -DoDLKvbdxrnIlrBg -DncKjvbdiLdcnVCy -EPCjjvbdmfeYNOHZ -DoCkKvbdjvWmcaxX -DoDKjvbdbUbHXkUI -DncKjvbdBhkBjiFj -DoDLKvbdNHColpVL -EOcKjvbdrykosAhO -DncLKvbdqGDeUVaI -DnbkKvbdhgJcZViu -DnbjjvbduLxXAtBX -EPCjjvbdYpleJNFR -EPDLKvbdQvmdClHc -DnbjjvbdJYTbIMRQ -DncLKvbdznpRFDMY -EOcLKvbdZnmiFEyj -DnbkKvbdrRuLOLAm -EObkKvbdhkeEOUby -DncLKvbdYlSEUOLm -DoCjjvbdhkdcmtby -DncLKvbdddnrCXDK -DoDLKvbdKaLHNCYR -EOcKjvbdcyxpYZQb -EPDLKvbdACqwjZhp -DoCkKvbdBsBDTevr -EObkKvbdeKJqvUzn -EObkKvbdcImJkGWx -DncLKvbdYSlAltOx -DncLKvbdlrYtyrdJ -EObkKvbdKxqJrztf -EOcKjvbdsQWPJcVf -DoDKjvbdkySqrxgU -EObjjvbdeEoRbXCj -EOcKjvbdHDkVjBij -DoDLKvbdCTBCsfXS -DoCjjvbdKCjDQibx -DoCjjvbdlhdTqUrB -DoDKjvbdTulQKTaR -DoCkKvbdRjxetfkT -EPCjjvbdEuyQQNKF -EPCjjvbdDoDKkXDE -DoCjjvbdsQWPJbuf -DoDKjvbdhuZdvqtb -EPDLKvbdiHKCyWJu -EPDLKvbdLFegaaQu -DoCjjvbdqZPHgRDx -DncKjvbdUWMPjUAq -DoDLKvbdTYKkmzjx -DoDKjvbdegjvSOQg -DnbkKvbdUtNTekvK -EObkKvbdNsTvGeVQ -DoDLKvbdfNFvgMjL -EOcLKvbdZQmEiNEq -EPDKjvbdBraDTfWr -EPDKjvbdNGcQNQVL -EPDLKvbdZyEKODMS -EOcKjvbdBvzdIdpW -EPCjjvbdACqwiyiQ -DoCjjvbddePRawCj -EPDKjvbdWWiXucdg -DoDKjvbdWexzUAPT -DnbjjvbdwXMBWBWV -EOcLKvbdUyHszLOn -EPCkKvbdOYOuzcnU -EPCkKvbdhancEwQq -DnbkKvbdjggLefOL -EPCkKvbdFjdsDIMu -DoDKjvbdrSUjmkBN -DoDLKvbdZjTIQGaf -DoDKjvbdMgDPmPtk -EPDLKvbdWRmwbFMD -DoCkKvbdzROmJKXA -DnbkKvbdrDdiQNvB -DnbjjvbduDCtwVoP -EOcLKvbdCIjbLJFj -EPDKjvbdXrkaMsnx -EPDKjvbdVhXvXfxz -DncKjvbdhbPDEwRR -DoCkKvbdpxoHgQcx -DoCkKvbduMXwBUBX -EObjjvbdNeEThhjd -DoCjjvbdirzhrkJz -DoDLKvbdaMkCTUlg -DncLKvbdWRnYBeLc -DnbjjvbdGBPRZJzm -EOcLKvbdeOeSjstS -DoDLKvbdmIctRVSB -DoCjjvbdZxdJnDMS -DoCkKvbdRpTgKFcw -DncLKvbdTukojTaR -DnbjjvbdKRZdoFme -DnbkKvbdURQoVUhN -DoDLKvbdyYJKBozL -EObkKvbdfNFwHMjL -DoDLKvbdZisIQHBf -EObkKvbdqFcdsuaI -DncLKvbdzoPqFDLx -DoDKjvbdSKxeuHLT -EPDKjvbdsBemLfjy -DoCjjvbdJbjCqJcY -DoCjjvbdNPxRVnGs -DncLKvbdGcjvJbKK -EOcKjvbdrWpMDIxq -EOcLKvbdQdDApQcr -DoDKjvbdZMRdTnLm -EOcLKvbddxZssrFz -EObjjvbdUtNTfLuj -EPCjjvbdLLBIWAKZ -DoCkKvbdgFlZmfgA -EPCjjvbdUVkoitAq -DoDKjvbdDncKjvcE -DoDLKvbdRpUHJfEX -EPDKjvbdLqvlzVQz -EPDKjvbdZMRdUOLm -EOcLKvbdCJLBkIfK -DncKjvbdaSFbhUFk -EPDLKvbdZoNheEzK -DncKjvbdUVlPjUAq -DnbkKvbdKNADyfuB -EObkKvbdZdwfzghb -EPDLKvbdZtIhxcrn -EObkKvbdGckViajK -DncLKvbdFfJqmiUR -DncKjvbdKWUfDdgJ -DoDKjvbdMtrqjmAX -EOcLKvbdsQWPKDVf -DoCjjvbdwtleRZMO -EObjjvbduaDxsPEh -EPDLKvbdKxqJrzuG -EOcKjvbdVAaprprZ -EObjjvbdEuxopMjF -DnbjjvbdyOTHwriD -EPDLKvbdrpVnibvG -EPDKjvbdkWWnDaww -DncLKvbdrXPkbiYq -DoDLKvbddxZssqez -EOcLKvbdHDkWJbJj -DncLKvbdEPCkLWcE -DnbkKvbdEXwkstTl -EObjjvbdqiAKEmOe -DncLKvbdjAQGaQGj -EPCjjvbdNeDtJJKd -EPCjjvbdvwMBWBVu -EPDKjvbdFejSOItR -EOcLKvbdNPwqWOHT -EPDKjvbdbsCjscia -EObkKvbdyYIiaoyk -DoDKjvbdLZQirzuG -EObjjvbdSLZGVGjs -DoCjjvbdAMgxsWzY -DoDLKvbdEObjjwCd -DnbkKvbdsPvOicWG -EPCkKvbdrJAKElne -EPCkKvbdauCGwjsh -DncLKvbdegkWRnQg -EPCkKvbdYpmEiNFR -DoDKjvbduaDxsPFI -DoCjjvbdcyxoxYqC -DoCkKvbdkMakzFHP -DnbjjvbdJbibqJbx -DnbkKvbdWWhxWDeH -DoCjjvbdssRsYzFD -DoDKjvbdpyPIHRDx -DncLKvbdwNWANDeN -DoDKjvbdJYUBglRQ -EObkKvbdXnRAYVVt -DoCjjvbdUWLpKTaR -DoDKjvbdTqROttgm -EPCkKvbdVqnXaeMD -EObjjvbdADRwiyiQ -DoDKjvbdlrZUyrci -EPDKjvbdvAdZSndh -DoCkKvbdzoQQeDLx -DnbkKvbdSQUGjFdX -EOcLKvbdqBJFAXIE -EObkKvbdSCEFLiZL -DnbjjvbdzoQQdcMY -DnbkKvbdpxngfqEY -DncLKvbdbsDLUEKB -DoCjjvbdXrlBMtOx -EObjjvbdKCjDQicY -DncLKvbdLrWlzUpz -EObjjvbdaaWEfQQX -EObjjvbdtlYWaTaX -DnbkKvbdMowpunGs -EObkKvbdSLYeuHKs -EObkKvbdTAEhhCOd -EPCkKvbdmSYtyrci -DncLKvbdYkqcsnLm -DoDLKvbdrylQTAgn -DncLKvbdJXtCIMRQ -EObkKvbdSBdElIyL -DoDLKvbdwygefYFS -DncKjvbdyXhibPzL -EPCjjvbduaDxsPFI -EObjjvbdZoNiFEzK -EPCjjvbdkNBkyeHP -EPCkKvbdWRnXadlD -DncLKvbdRWmdDLhD -DnbkKvbdmSYtzTDi -EOcKjvbdkVwODbXw -DncLKvbdQlxCZOUz -EObjjvbdbhlijfXY -EOcLKvbdXmqAXtut -EOcLKvbdmbKXXnnV -DoDKjvbdkHgMFfOL -EPCkKvbdfekymgHA -DoCjjvbdeKKRvUzn -DoDKjvbdkHfkefNk -DoCjjvbdyqPMiKXA -DnbjjvbdUQqOtuIN -EOcKjvbdEPCkKwDE -DoDLKvbdZRNFIleR -DnbjjvbdRacdlJZL -EOcLKvbdTukoitAq -EOcLKvbdZLrDtOMN -EOcLKvbdgKfzcGAE -EObjjvbdzjVQQESt -EOcLKvbdcIlijevx -EOcKjvbdGKdsDHmV -DncLKvbdKkBHvAJy -EOcKjvbdZMRctOLm -EPCkKvbdADRxKZiQ -EObjjvbdDwxLsssl -EPDLKvbdUxgszLPO -EPCkKvbdSQTfiedX -EPCjjvbdNeEUJIkE -DoDLKvbdpyPHfqDx -DnbkKvbdyOShXsJD -DncLKvbdLiBkpxAS -DoDKjvbdaaWEepQX -DoCjjvbdWSOYBeLc -EOcKjvbdLFegbAqV -EPDKjvbdffLzOGgA -EObkKvbdFkErbglu -DncLKvbdiZuFlROG -DncKjvbdegkWRnQg -DoDLKvbdQdDApRDr -EOcLKvbdeYZtURez -EObjjvbdrXQLcIxq -DoDLKvbdxZhGGXeS -DoDLKvbdGGKSOItR -EObjjvbdjhHLfFnL -EOcLKvbdUQpoUuHm -DoCkKvbdXrlBNUPY -DoDKjvbdJXtCIMRQ -DnbkKvbdZMSDsnLm -DncKjvbdCTBDUGWr -DncKjvbdbhlikGXY -DoDKjvbdXmqAYVWU -DnbjjvbdliDsqVRa -DnbkKvbdmajXYOnV -EObjjvbdJpyePGNe -DnbkKvbdCTAcUGXS -DoDLKvbdCDpBVjNG -EOcLKvbdxwhiaoyk -DoDKjvbdxVNFQyMO -EPCkKvbdVvhwvEEg -DnbkKvbdFWYoomJe -EOcKjvbdlrZUysEJ -EPDKjvbdqquKnKaN -DoCkKvbdTkunaVoJ -EOcLKvbdfHkVrOQg -EPDLKvbdiUzFWrUb -DoDLKvbdtAGqIABS -DoCkKvbdZRMdhmEq -DnbkKvbdNsUVfeVQ -EPDLKvbdqwPkbiZR -DoCkKvbdNUsSLNAX -DncKjvbdmpZxvKyC -EPCkKvbdLYqKSztf -EPDKjvbdZyEKODMS -EPDKjvbdNGbomPuL -DncKjvbdZMSDtNlN -EPCjjvbdTXjkmzjx -EObkKvbdBdQAvKMf -EOcLKvbdkySrTYgU -DnbkKvbdZoOIddzK -DoCkKvbdZMSDsmkm -EPCkKvbdCWzdIdpW -DncLKvbdBvzdIdov -DoCjjvbdaRfDHtFk -DnbkKvbdWeyZtAOs -DoDLKvbdnCJwYPOV -DoCjjvbdEYYLstUM -EOcLKvbdwtldqZMO -EPCjjvbdFVxoomKF -EObkKvbdyqPMhiwA -DoDLKvbdkxrrSxgU -DoCjjvbdeATqNYKG -DncLKvbdJKEAJpHE -DoCkKvbddndsLUTr -DnbjjvbdqFceUWBI -DoDLKvbdhkddOUby -DncKjvbdGKdrcIMu -EPCkKvbdelevflik -DoDKjvbdhaoDFWqR -DoCjjvbdYlSDsmlN -EPCjjvbdiZuGLpmf -EObkKvbdnCJvxPNu -DnbkKvbdhzUelRNf -DnbkKvbdZeYGzgiC -DoCkKvbdDnbkLWbd -DnbkKvbdnHFYMmfy -DoCjjvbdePEsKtTr -DnbjjvbdZQmEhleR -DnbkKvbdTkunaVoJ -DnbkKvbdFWZPpMjF -DoDKjvbdSwkMNzkY -EOcLKvbdwtldpyMO -EOcKjvbdhkdcmtby -DoCjjvbdNQXqWNfs -EPDKjvbdzjUpPdTU -DnbjjvbdqceJPnWB -EPDKjvbdUyHsyjoO -EPCkKvbdZshhxcsO -DncKjvbdqAiFAWgd -EObkKvbdgFkzOGgA -DncKjvbdmgFYNNgZ -DoDLKvbdDjHjWYKA -DnbjjvbdJbicRKCx -DnbkKvbdfNFwHMjL -EPCkKvbdWSNxBdlD -EPDLKvbdCJKbLJFj -EPDKjvbdEOcKkXDE -EPCkKvbdVrOYCElD -DnbjjvbdCIkBjhej -DoDLKvbddoFTKstS -DnbjjvbduDDVXVoP -EObkKvbdxwiKCPzL -DnbkKvbdZGvdAPTJ -DoDLKvbdBdPaVjNG -EOcKjvbdIHGzYwxH -DoCjjvbdGFjSNhsq -DnbjjvbdlYsSSxgU -EPCjjvbdqrUjnKaN -EOcLKvbdtvOXipsA -DoDLKvbdrounjCuf -DoCkKvbdFVyPomKF -EOcKjvbdNHCpNPtk -EPDLKvbdWeyZtAPT -EPDKjvbdjcLkQfuH -EOcLKvbdzHZMAMeX -DoCjjvbdUMWPBVni -EOcKjvbdHELWKBjK -DoDKjvbdMgComQUk -DnbkKvbdiGjDZWJu -DncKjvbdyqOmJKXA -DoDKjvbdVZITyjoO -DoCjjvbdzQoNJJwA -EOcLKvbdGAoQxizm -DoDKjvbdatagYKsh -EPDKjvbdSBceMJYk -DoDLKvbdMpYQvOHT -DncKjvbdiCOcFWpq -DoCjjvbdUGznLvvF -EPDLKvbdANIYrvyx -EPCjjvbdIwtCHkpp -EObkKvbdJSyBSmYM -EObkKvbdwuMdqYlO -EObjjvbdmuVZkKSG -DncLKvbdSPsfjFdX -DoDLKvbdSQUHJedX -DoDKjvbdiVZdwSUb -EPDLKvbdRjxfVGkT -EObjjvbdmpZyVkZC -DncLKvbdhzUelROG -EPCkKvbdxVMeRZMO -EOcKjvbdxxIiapZk -EOcKjvbdJSyBTNYM -EPDKjvbdMSXMzUpz -EPCkKvbdNddThhjd -DoDKjvbdznpREcLx -DncLKvbdqYoHgREY -DnbjjvbdiCPCdvqR -DoCjjvbdsQVoKDVf -DoCjjvbdqFcdtWBI -EPCkKvbdFkFTDIMu -DnbkKvbdQvmdCkgc -DnbjjvbduCbtwWOo -DoCjjvbdaNKaruNH -EOcLKvbdrpWPKCvG -DoCjjvbdEKHiuwjA -DoDLKvbdsBfMlHKy -EObjjvbduCcVWuno -DoCkKvbdNddUIiLE -DoDLKvbdVrNwbElD -EPCkKvbdTqQoUuHm -DoCjjvbdcJMikFvx -EOcKjvbdijGIJmYS -DncKjvbdtvNwipsA -EPDKjvbdGQASwGey -DoCkKvbdmJEUQtqa -DncKjvbdpxnggQcx -EOcLKvbdDnbjjwDE -DnbjjvbdxVMdqZLn -EPCkKvbdTkvPAvOi -DnbkKvbddijRvUzn -DnbjjvbdJuuFceGi -DoDLKvbdeATplxJf -EObjjvbdiLeDmuDZ -EObkKvbdzHYlANFX -EObkKvbdSBdFLiYk -DncLKvbdMgCpNPuL -DncLKvbdNsTufeVQ -EPCjjvbdUQqOtuIN -EPCkKvbdKDJcQicY -DnbkKvbdsCFmLfjy -DnbjjvbdNdctJIjd -DoDLKvbdzjUpPdSt -EPDLKvbdMoxRVmgT -EOcKjvbdbsCjscia -DoCjjvbdrDeIpOWB -EPDKjvbdOTUVgFVQ -EOcLKvbduWNwipsA -DoDKjvbdJcJcRKCx -DncKjvbdGZUtaDwb -EPCjjvbdZtJJYdSn -DoDLKvbdtcDVWuoP -EObjjvbdKaLGmCXq -DoCjjvbddZxoxYpb -DnbkKvbdWRmxCEkc -EOcLKvbdNrsufduQ -DoDLKvbdqlzJxlIJ -DoCkKvbdFVyPoljF -DnbkKvbdjggMGGOL -DoDLKvbdLAkHMawq -DncLKvbdwuMdpxlO -DoDKjvbdtSqrxydc -DoCjjvbdSLZGVHKs -DnbjjvbdrMzKYlIJ -DnbjjvbdTAFIhBnd -EPDLKvbdIxTbIMRQ -DoDLKvbdbBVeGQPw -DnbkKvbdvlvANEEm -EPDLKvbdEOcKkXCd -DoCkKvbdYqMdhmFR -EObjjvbdnUtzKiqf -EPCkKvbdtunXjQsA -DnbkKvbdddoSBwDK -DnbjjvbdTqROttgm -EPCkKvbdzQnmJJwA -EObjjvbdfpBzwDwh -DncKjvbdRotHJecw -EPCjjvbdhtzFWrVC -DncLKvbdqdEhpNvB -DnbjjvbdkWWmcbYX -EOcLKvbdYSkaMsoY -EObjjvbdDjIKVxKA -DnbkKvbdrounjDVf -EObkKvbdJzpFwdAN -DoDLKvbdsBelkgLZ -DoDLKvbdwtmEqZMO -DncKjvbdxmrgwriD -EOcKjvbdDoDLLWbd -EPDKjvbdIwtBhLpp -EPDLKvbdUaBqTRRy -DoCjjvbdjKFhJlwr -DoCkKvbdGLFTDIMu -EPCjjvbdrbFmMHKy -DoDLKvbdehKurOQg -DncKjvbdijFhJlwr -DoCjjvbdjvXOEBww -EPCjjvbdTXjkmzkY -EOcKjvbdaSFcHtGL -EPDLKvbdpyPIHQcx -EOcKjvbdmaiwXoNu -DoDKjvbdSBdFMJZL -DoDKjvbdjKGIKMwr -DncLKvbdyXiKBozL -DoCkKvbdqlzJxkhJ -EObkKvbdrNZiyLhJ -DoCkKvbdrpWPKCvG -DncLKvbdVrOXbEkc -DnbkKvbdOAIrtJrA -DnbkKvbdrXQMChyR -EOcLKvbdDnbjjwCd -EPCjjvbdjvXOECXw -EPCkKvbdMgDPmPtk -DoDLKvbdYfwEAPSi -EPCjjvbdzGxlANEw -DoDKjvbdmbKWwoNu -EOcLKvbddZxpXxqC -DoDLKvbdLGGHbApu -DoCjjvbdVTltGLuj -EPCjjvbdOEdThiKd -DoCjjvbdUyHtZkPO -DncLKvbdHELWJajK -EOcKjvbdcarmSAUN -EObjjvbdqiAJdmOe -EObkKvbdZQleImFR -EObkKvbdQccBQRDr -DoCkKvbdLAjfmBwq -DncKjvbdSKxeuHKs -DncLKvbdmJDsqUrB -EOcLKvbdGFirNhtR -DncLKvbdEARiMywX -DnbjjvbdZxcjNblS -DncLKvbdWXIwudEg -DoDLKvbdhkeDmuCy -EObkKvbdUslselWK -DoCkKvbdLhakqYAS -DoCjjvbdIMBzmvpk -EPCjjvbdKaKgMbXq -EPCjjvbdiLeDmtcZ -DnbjjvbdsPvPKCvG -DncLKvbdnVUzLKRf -DoDLKvbdiUyeWrVC -EOcLKvbdjblLRGuH -DnbkKvbdhtydvqtb -EOcKjvbdTqQnuVIN -DoCjjvbdMtsRkNAX -EPCjjvbdGKdrbglu -DncKjvbdMoxQvOGs -DoDKjvbdiHKDZWKV -DoDKjvbdULvPAvPJ -DnbkKvbdEvZQPmKF -EObjjvbdkxrrTZGt -EObjjvbdKCicQibx -DoCjjvbdKkAgvAKZ -EOcKjvbdNxOuzcmt -EPDLKvbdbsCjsdJa -EObjjvbdHDkVjBjK -EPCjjvbdYqMdiMeR -EPCkKvbdczYoxZRC -DncKjvbdnPzYujxb -DnbjjvbdMpYRWOHT -DncLKvbdLFegbBRV -DncKjvbdxVMdqYlO -DoDKjvbdFkErbhNV -DncKjvbdLLBHvAJy -DoDKjvbdTfzmkwWF -EPCjjvbdyXiKCQZk -DoDKjvbdqUUGrSLU -EObjjvbdGcjuiaij -EOcLKvbdZRMdhmFR -DoCjjvbdZoNiEdzK -DoCjjvbdEARiNZwX -DoCkKvbdwXMBVaWV -EPCjjvbdVZHsyjoO -DoDKjvbdyXhjBpZk -EObkKvbdtkxWaUAw -DnbkKvbdLrWmZuQz -DncLKvbdySnJNRbH -EPCjjvbdezvYdhsw -DoDLKvbdhancFWqR -EObjjvbdyzeORgiI -EPCjjvbdyXiJbPyk -EObjjvbduVnXiqTA -DnbjjvbdZjTHofaf -EPDLKvbdLrXMyuQz -DnbjjvbdHffyxxXg -DoDLKvbdOStWGdtp -DnbjjvbddijRvUzn -DoCjjvbdYNqAXtut -EPCjjvbdUQpntuHm -DoDKjvbduWOXjQsA -DoDLKvbdtTRsYydc -DncKjvbdpfDeUVaI -DoDLKvbdULuoAvOi -DnbjjvbdqmZjYkhJ -EPDKjvbdZMSETmkm -DoDLKvbdZshhyETO -DncLKvbdQdCaQQcr -DncKjvbdQccBQRES -EOcKjvbdrNZjYlIJ -EPDKjvbdjAQHBPgK -DoCjjvbdnUuZkJqf -DoDKjvbdLAjfmBxR -EObjjvbdUsltFkuj -DoDLKvbdZQleJMeR -DnbjjvbdBraCtGXS -DoDLKvbdaSFbhUGL -EObjjvbdrbGMkgLZ -EPCkKvbdJYUCHlRQ -EOcKjvbdgFkzNfgA -DoCjjvbdaRecHtFk -EPDKjvbdnUuZkKSG -EPDLKvbdkWWmdBww -EObkKvbdypoNJKXA -EOcKjvbdZxdJmblS -DncLKvbdZirhPgCG -DoDLKvbddeOrCXCj -DoCjjvbdOXoVzcnU -DncLKvbdSBdFMJZL -DncKjvbdrzMPraHn -DncLKvbdqZPHfpcx -DncKjvbdVAbQsQqy -DoDKjvbdySnJNSCH -EPDLKvbdtSqsZZeD -DncLKvbdtvOYKRTA -DncLKvbdLGGICBQu -DoDLKvbdDncLKwDE -EObjjvbdNrtVgEtp -EOcKjvbdUQqOtthN -EObjjvbdZtIiYcrn -EOcKjvbdmuVZjjRf -DnbjjvbdcJNKKevx -DoCkKvbdDxXlTtUM -DncLKvbdqZOhHQcx -EPDKjvbdIsZBSlwl -EOcKjvbdNUsRkNAX -DoDLKvbdRbEFMJYk -DnbjjvbdiBncFWqR -EOcLKvbdRzKIScWA -EOcKjvbdRbEFMIyL -EPDKjvbdsPunjDVf -DoCjjvbdhzVFkpmf -EOcKjvbddxZtUSFz -DncKjvbdnVUykJrG -EOcLKvbdEPCkKvbd -EPCjjvbdnUuZkKSG -DnbjjvbdnCKWxOmu -DnbkKvbdYzcFrKVy -DoDKjvbdvmWAMcdm -EObkKvbdhkdcmuDZ -DncKjvbdNsUVgFVQ -EPDLKvbdYzbeqiuy -EOcLKvbdUxgszLOn -DnbjjvbdZQmEiMeR -DoCjjvbdkHflFemk -EPDLKvbdhbPCdwRR -DoDLKvbdWXIwucdg -DoCjjvbdOYOuzcnU -DoDLKvbdcSbkTdJa -EOcKjvbdEvYpQMjF -EPDLKvbdrykosAhO -EObkKvbdrovPJbvG -DoDLKvbdkHflGGNk -DoCjjvbdZtIiYcsO -DoDLKvbdZnmiEdzK -EObjjvbdZMSDsnLm -EPCjjvbdLAjfmBxR -DncLKvbdptUGrRjt -EOcLKvbdNQXqVmgT -DoDLKvbdCIkCLIfK -EPDLKvbduVmxKRTA -EPDKjvbdHbLzEzAD -EPCjjvbdbUbGxKsh -DoCkKvbdjlbLzEgP -EPCkKvbdXGYzUAPT -DnbkKvbduLxXAsaX -EObkKvbdJvUfEFHJ -EOcKjvbdmbKXXoNu -EPDKjvbdQvnDbkgc -DoDLKvbdiUzFWrVC -EObkKvbdZyEKNcLr -DoDKjvbdrEEhpNua -DnbkKvbdzitoocsU -EPCjjvbdmbJvxOnV -EOcLKvbdNddTiIjd -DncKjvbdfpBzvdYI -EObkKvbdBhjbLIfK -DoCjjvbdFjeTDHmV -EOcKjvbdRjyGVGkT -DoCkKvbdZQldhmFR -EPDKjvbdqlzKZLhJ -DnbkKvbdZoOIeEyj -DncKjvbdBdPaVjNG -EPCkKvbdTulPjUBR -EPDLKvbdGGJqmiTq -DoDLKvbdGGJqmhsq -EOcKjvbdIryBTNXl -EPDLKvbdIsYaSmXl -DoCjjvbdVwJXudEg -EPCkKvbduDCtvuoP -EOcLKvbddBsMrAUN -DncLKvbdrouoJcWG -DoDKjvbdCgLfHAzc -DncLKvbdhtzEvqtb -DoDKjvbdZtIiYcsO -DncKjvbdMfbomPtk -DncKjvbdYqNEiMdq -DnbkKvbdCTBCtFvr -DncLKvbdhtzEvquC -DoCjjvbdAMhZSvyx -DoDKjvbdjlbLzEfo -EOcKjvbdZLrETmkm -DncKjvbdULvPAuni -DoCjjvbdtcCtvuoP -EPCkKvbdOTTugEtp -EObjjvbdhtzEvquC -DoCjjvbdkHgLfFmk -DncKjvbdmoyyVkZC -DnbkKvbdsBemLgKy -DoDKjvbddCTMrAUN -DoCjjvbdmuUykJqf -DnbjjvbdbQHGckzd -DoDLKvbdyOShXriD -EPDLKvbdZRNFImFR -EOcLKvbdDoDKkWcE -EPCkKvbdwMvAMcdm -DnbjjvbdbKlFoNcA -DoCkKvbdMfbpMpVL -DncLKvbdhkeDnUby -DoDKjvbdMSWmZtpz -EPCjjvbdmfeYMmgZ -DnbjjvbdqiAKFMoF -DoCkKvbdSBdElIxk -EOcLKvbduoTzpkPU -DncLKvbdDoCjjwCd -EObjjvbdLGGHbBQu -DnbkKvbdQcbaQRDr -EPDLKvbdyNrgxTJD -EObjjvbdtSqryZdc -DoDLKvbdegkWSNpg -EOcKjvbdZLrDsnLm -EObjjvbdFkEsCgmV -DoDKjvbdatagXjtI -DncLKvbdGZUuBDwb -DoDLKvbduDDUvuno -EObjjvbdURROtuIN -DnbkKvbdyXhjBpZk -DoDLKvbdKaLGlaxR -DoCkKvbdlZTRrxgU -EPDLKvbdUsltFlWK -DncLKvbdGGKRnIsq -DnbkKvbdijFhKNXr -DoDKjvbdrWokbiYq -EObjjvbdUaCRSqRy -EObjjvbdRkYfVHKs -DnbkKvbdQvnDcMID -EObjjvbdvBEYrneI -DnbkKvbdySmiNRbH -EPDKjvbdjuvmcaxX -DoCjjvbdVTmUGLuj -EPDLKvbdxVMeRYlO -DnbjjvbdNPwpvNgT -DoDKjvbdJTZArlxM -EPDLKvbdjbkkRHUg -DnbkKvbdSBdFMIyL -EPDKjvbdMgColpUk -DncLKvbdVAbQsQrZ -DncLKvbdyTOJNRag -DnbjjvbdmgFYMmgZ -EPDKjvbdTAFIgbOd -EObkKvbdFWYoomJe -DoDKjvbdIxUBhMRQ -DoCjjvbdFWYopNKF -DoDKjvbdNdcshiLE -EOcLKvbdwWlBWAuu -EPCkKvbdYpldiNFR -EPDLKvbdQwODbkgc -EPCkKvbdqZOhHQcx -EObjjvbdHDjujCKK -DoDLKvbdnBjWwnmu -EPDLKvbdUQqPUuHm -DnbkKvbdIryBSlxM -DnbkKvbdjhGlFfNk -DnbkKvbdqlyiyMHi -EPDLKvbdxmsIYTIc -EPCjjvbdNrsufduQ -DncLKvbdaaWEepPw -DnbjjvbdkVvnDaxX -EOcKjvbdUQpntuIN -EOcKjvbdQdDAopcr -DoCkKvbduMXvaUAw -DnbkKvbdMRwNZuQz -DoCkKvbdNGcQMotk -EPDLKvbduWOYJpsA -DncKjvbdZtJIxcrn -DnbjjvbdwyhFfXeS -EOcLKvbdIryAsNYM -EObjjvbdyTNiNRag -EPCkKvbdiZuGLqOG -DncKjvbdHELWJbKK -DoDKjvbdIGfyxwxH -EPCkKvbdeOdrkTsr -DoDKjvbdpstGrRjt -EOcKjvbdZtJIxdSn -EObjjvbdZtIiZDrn -DnbjjvbdOEctIhkE -DncLKvbdKDJbqJbx -DncKjvbdEOcLKvcE -EOcLKvbdgLGzcGAE -DoCjjvbdGBPQxizm -EPCjjvbdeFOqbXDK -EObkKvbdehKuqnQg -DncKjvbdRosgKFcw -EOcLKvbdUsmUGLuj -EOcLKvbdrXQMCiZR -DoDKjvbdjcMLQftg -EPDLKvbdHEKvKBjK -EPDKjvbdbVCHYLUI -DncKjvbdFfKSOItR -DncKjvbdYSkaNToY -DncLKvbdQvmccLhD -EOcKjvbdnVUykKSG -DoCkKvbdbsDKsdJa -EObkKvbdGLFTChMu -DoCkKvbdqGEFTuaI -EPCkKvbdddoRbXCj -EPCjjvbdMfbpNQVL -DoDKjvbdFjdrbgmV -EPCkKvbdmRxuZsDi -DncKjvbdaRfChUGL -DncLKvbdMJBkqYAS -EObkKvbdxUmEqYlO -EPDLKvbdtbbtvuoP -DoDKjvbdxsOJNSBg -EPDKjvbdZtIhyDrn -DncLKvbdKCicRKDY -EPDLKvbdUtNUFlVj -EPCjjvbdeATqMxJf -EOcLKvbdaNLBsUmH -DoDKjvbdJcJcQjDY -EPCkKvbdiMEdNtby -DoCjjvbdiGibyWJu -DncKjvbdeEnrCXDK -EPCjjvbdUVlPisaR -DncLKvbdXGZZtAPT -DoDKjvbdddoRbXDK -DoDLKvbdSBdElIyL -DoCjjvbdRNXbZOUz -DnbjjvbdTAEhhCPE -EObjjvbdUMVoBWOi -DnbkKvbdFjdrcHmV -DoCjjvbdfIKurORH -DoDLKvbdVBCRTQrZ -EOcLKvbdZoNhddzK -DoCkKvbdULvOaVoJ -DnbjjvbdZirhPgCG -EOcKjvbdVBBprqSZ -DoDLKvbdaSFcIUGL -DoDLKvbdfIKuqnRH -DncKjvbdijGIKNXr -EPDLKvbdrzMPsAgn -EPDKjvbdNUsSKmAX -EPCkKvbdLLAhWAKZ -DncKjvbdkWWnDaww -DnbkKvbdJYUCHlQp -EPDLKvbdNwoVzdNt -DoCjjvbdSLYetfjs -DoDLKvbdptTgSSLU -DncKjvbdxVMdqZLn -DncKjvbdZyDinDMS -DnbkKvbdnPyxujxb -EPCkKvbdSiZjRABM -EPDKjvbdPyNAHSqj -DncLKvbdqwPlChyR -EPDKjvbdGckWJbKK -DoDLKvbdbBWFFoow -DoCkKvbdkCkkRGuH -DncLKvbdmJDtQuSB -EObkKvbdQdCaQQdS -DncKjvbdKfFhBaQu -DncKjvbdaNKaruMg -EOcKjvbdnPzZWLYb -EObjjvbdxUldqZMO -DnbkKvbdGckWJaij -DncKjvbdkVwODaww -EObjjvbdGKdsDHlu -EObkKvbdKQyeOfOF -EPCkKvbdGdKvKCJj -DnbkKvbdGdKuibKK -DoDKjvbdOFDtJJKd -DoCkKvbdwuMdpxkn -EObjjvbdZjShPgBf -DoDKjvbdcyxpYZQb -DnbjjvbdrbGMkgLZ -DnbjjvbdxsNiMqbH -DoDKjvbdWSOXbFLc -EPCjjvbdrDeIomvB -EOcKjvbdEuxopNJe -DoDKjvbdKDKCqKCx -DoCkKvbdkIHLfGNk -EOcKjvbdnUuZjirG -DncKjvbdIryArmXl -DoDKjvbdraemMGkZ -DncKjvbdEJgivYKA -DoDLKvbdbhmJkGWx -DnbjjvbdZyDimcMS -EOcKjvbdhuZeWrVC -DnbkKvbdRbEFMJZL -EPCkKvbdeOdrkUTr -DoCkKvbdlhdUQuRa -DnbjjvbdZtIiZDsO -EPCjjvbdZyEJmcMS -DnbjjvbdFpATWgGZ -EOcLKvbduaDxroEh -DnbkKvbdpeceUWBI -EOcKjvbdjcMLQftg -DncLKvbdnPzZWLZC -DnbjjvbdZyEKNcMS -DoDKjvbdZMSDsnLm -DnbjjvbdOAIsTjSA -DoCjjvbdWSNxCFLc -DoDKjvbdkClLRHVH -DncKjvbdZxdJmcLr -EPCjjvbdOYOuzdOU -DncKjvbdWHxVxHYz -DoDLKvbdwXMBWBVu -EObjjvbdZxdJmcMS -EOcKjvbdrEFJPmvB -EOcKjvbdQcbaQQcr -EPCkKvbdfHkWRnRH -EOcKjvbdrEEiQNvB -EObkKvbdcTCjtDia -DoCkKvbdnCJvwoOV -DoDLKvbdxnTIYSiD -EOcKjvbdGQASvfey -DoDKjvbdUtNTekvK -DoDLKvbdbUbHXkTh -DncKjvbdaNLBsVNH -EPCkKvbdmtuZjirG -EPDKjvbdvlvANEEm -DnbkKvbdcIljLGWx -EOcKjvbdJSyArmYM -EObjjvbdVTltFlVj -DncKjvbdTAFIgbOd -EOcLKvbdUsltGLuj -EObjjvbdZRNEhmFR -EOcKjvbdUGznMXVe -DnbjjvbdTqQoUthN -DncLKvbdZRNEhmEq -EObkKvbdKxpirzuG -EOcKjvbdiVZdvqtb -EOcLKvbdatbGxKtI -DnbkKvbdpfDdsvBI -DnbjjvbdpyPIGqDx -DoCkKvbdqUUGrRjt -DoCjjvbdfHjuqmqH -EPDKjvbdqlzJyLgi -DoCjjvbdznpREcMY -EObjjvbdjuvnEBww -DoCkKvbdQwNdCkgc -DoCjjvbdxsNhlqag -EOcKjvbdbsDKtEJa -EPDLKvbdfIKuqnQg -DncLKvbdJXsbILqQ -DoDLKvbdiUydwRuC -EOcLKvbdUtMsfMVj -DnbkKvbdfNGWflik -DoDLKvbdqwQLcJZR -DncLKvbdYqMeIleR -DoCjjvbdzaAPGgBl -EPCkKvbdauBgYLUI -EPDLKvbdiUydvqtb -DnbjjvbdRyjITCvA -DncLKvbdIwsahLqQ -EPCjjvbdRacdkiYk -EOcKjvbdRbEFMJZL -DoCjjvbdrzLoraHn -EObkKvbdxxIiaozL -EOcLKvbdJcJbqJbx -EPCjjvbdZisHogBf -EOcKjvbdVTmUGMWK -EPDKjvbdrylQSaIO -DncLKvbdSCEEkiYk -DoDLKvbdhtyeXRuC -EObjjvbdQvmcblID -DoDKjvbdauCGwjtI -DnbkKvbdGYtuBEYC -DoCkKvbdkyTSSxft -EPDLKvbdIGfyyYYH -EObjjvbdjlbLzEgP -EPCjjvbdIwsbHkpp -EPDKjvbdmuUyjjSG -DoCkKvbdUQpoUtgm -EObkKvbdUQqPVVIN -DncLKvbdXrkaMsnx -DncLKvbdaMjbTUlg -DncLKvbdhgJbyVjV -DnbkKvbdURQoUuIN -DnbjjvbdFWZQQMie -EPCjjvbdnCJwYPNu -EOcLKvbdBcpBVimG -DoCkKvbdyqPMiKXA -EObkKvbdnVUzKjRf -DnbkKvbdVgwvXgYz -EObkKvbdZsiJZDsO -EPDKjvbdiCPCdwRR -EObkKvbdGYuUaEYC -DnbkKvbdpyPIHREY -DnbjjvbdiZtfLpnG -EPCkKvbdVUNTelWK -DnbkKvbdTppoVUhN -DnbjjvbdxrnIlrBg -EPDKjvbdmIdUQtrB -EObjjvbdkNBkzFGo -DncKjvbdhbOcFXQq -DoDLKvbdNGcPmQVL -EPDKjvbdZoNheEyj -DnbkKvbdjlbLzEfo -DoCjjvbdZRMdiNEq -EObjjvbdczYoxYqC -EPDKjvbdLAkHMaxR -DoDLKvbdsPunibuf -DoDLKvbdNdcshhkE -EPDKjvbdhkdcnVCy -EPCkKvbdVZHtZkOn -DnbjjvbdsrrTYzFD -DoCjjvbdatbGxKtI -EOcLKvbdnGdxMnHZ -EPDLKvbdmaivwoOV -EObkKvbdjJegjMwr -EPDKjvbdYfwEAOri -EOcKjvbdpxngfpcx -DnbjjvbdEPCjkXCd -EPDKjvbdxsOImRag -EObjjvbdEPDKjwDE -DnbjjvbdYlSETnLm -DncLKvbdBiLBjhej -DoDKjvbdrpWPJcVf -DncKjvbdRpTfiedX -DoDKjvbdakMGOnDA -DnbjjvbduVmxKQsA -DncKjvbdKfFhCBRV -DnbkKvbdpfEFTvBI -DncLKvbdqwQLcIyR -EOcKjvbdlhdTpuSB -DncKjvbdqwQLbhxq -DnbkKvbdnHEwlmgZ -EPDKjvbdDoCjkWbd -EObkKvbdANIYsWyx -EObjjvbdpfEEsvBI -EPDKjvbdCJLCKiFj -DoDKjvbdqcdhonVa -EPCjjvbdzjUpQESt -DncLKvbdZQleImEq -EPCjjvbdEPCkLXCd -EPDKjvbdYlRdUNlN -EObkKvbdxwiKBozL -DnbjjvbdFjdsChNV -EObjjvbdwtleRYlO -DoDLKvbdeOdsLUUS -EPDKjvbdZLqctOLm -DoDLKvbdjlbLyeHP -DoCkKvbdaNLCTVMg -DnbkKvbdEKHjWXjA -DnbkKvbdZshhyDsO -DnbjjvbdsPunibuf -EPCkKvbdwWkaWBVu -EPDLKvbdFpATWfey -EObjjvbdzoQQdcMY -EPDLKvbdpxngfpcx -DnbjjvbdgPazwDwh -EPDKjvbdKVtfEEfi -EOcLKvbdhkeENuDZ -EObkKvbdIwtCILqQ -EPCjjvbdyNrhXsJD -DnbkKvbdMSWmZuQz -EOcLKvbdsPunicWG -DncLKvbdULvPBWPJ -DoCkKvbdKfFhCApu -EOcLKvbdTAEhhCOd -DnbkKvbdSKxetfjs -DoCjjvbdUtNTfLuj -EObjjvbdhzVGMROG -DoCkKvbdxsNhmRag -DnbjjvbddZyPwxpb -EObjjvbdEuxooljF -DncLKvbdVTlsfLuj -DoCkKvbdZjShQGaf -EPDKjvbdrSVKnKaN -DnbkKvbdFxuVBDwb -DoCkKvbdJXtBhLpp -EPCjjvbdHffzZXxH -DoCjjvbdqZOgfqDx -DncLKvbdqwQMChyR -EObjjvbdaSGDIUFk -EPDLKvbdZxdKNcMS -EObjjvbdhuZdwSUb -EPDLKvbdfMfWgMik -DncLKvbdZRNFJMdq -EOcKjvbdJKEAKPfd -EPCkKvbdcyxoxYqC -EOcKjvbdCSaCsevr -DoDLKvbdKQzEoGNe -DoDLKvbdjhHLefOL -DoCjjvbdRjxeuGjs -DncKjvbdyOTIXsIc -DnbkKvbdBdQBWKMf -EOcKjvbduLxXBUBX -EObkKvbdrSUkNkAm -DoDKjvbdKfFhBaRV -EPCjjvbdddoSBvcK -DncKjvbdyOTHxTJD -EOcLKvbdiLeENuDZ -DoCjjvbdJbjDRKCx -EPDKjvbddoErkUUS -DoCkKvbdBiKakJGK -DnbkKvbdCIjbKiFj -DoCjjvbdIsZBSmXl -EOcLKvbdBhjajiFj -DnbjjvbdrzMQTBIO -EObjjvbdrWolChyR -EPCkKvbdEARiMzXX -DoDLKvbdrWpMDJYq -EOcLKvbdKRZdoGOF -DoCjjvbdBsAcUFvr -DoCjjvbdBraDUGXS -DoCkKvbdIwtBhMQp -EObjjvbdeATqMxKG -EPDKjvbdYzbfRjWZ -EOcLKvbdsCGNLgKy -DoDKjvbdhficZWKV -EObjjvbdZQldhldq -EPDKjvbdsQVoJbvG -EPDKjvbdsQVnicWG -DoDLKvbdVZITyjoO -EPCjjvbdILazmvpk -EPCkKvbdZMSDsmlN -DoCjjvbdZGvdAOri -DoDKjvbdwuMeRYkn -DnbjjvbdZyEJmblS -EPDKjvbdhkeENuDZ -EPDLKvbdGdKvKCKK -EPCjjvbdjuwOECXw -EObkKvbdZeXfzghb -EObjjvbdJmAEZgUa -EOcLKvbdtcCuWvOo -EPCkKvbdiiehJlwr -DoDLKvbdwtldpyMO -DoCjjvbdjblLQfuH -DncKjvbdNPwpunGs -DnbjjvbdSLZFtgLT -EPDKjvbdyXhjCPyk -EObjjvbdliETpuSB -Dnbjjvbdqlyixkgi -DoDLKvbdmbJvxOnV -DoCjjvbdZjSgpGaf -DoCjjvbdqdEhpNua -DoDLKvbdelfXGmKL -EPDKjvbdIGgZyYYH -DncLKvbdfMfXHMik -DoCjjvbdZoNheEyj -EPCkKvbdsZlPsBIO -EOcKjvbdLAjgMbXq -DncKjvbdVZITykOn -DnbjjvbdpyOgfqEY -EPDKjvbdbUagYKtI -EObkKvbdrSUjnLBN -DncKjvbdQwNdDLhD -EOcLKvbdrykosBIO -EPDKjvbdsPunicWG -EPCjjvbdliDtQuRa -EOcKjvbdcSbkTdKB -EOcLKvbdKaKgNCXq -DnbjjvbdZshhxcrn -DnbkKvbdcbTMrAUN -EPCkKvbdsQWPKDVf -DncKjvbdijGHjMwr -EOcLKvbdULvPBVni -EPCjjvbdffLynHHA -DoCjjvbdTqQntuHm -DoDLKvbdjuwNdCXw -DoCkKvbdVZITzLOn -EPDLKvbdqrUkOLAm -EPDLKvbdZQmEhmFR -DoDKjvbdwjvdHzyf -EPDKjvbdePErjtTr -EObjjvbdmozYvLZC -DnbjjvbdACrXizIp -EOcLKvbdTvMQJtAq -DncLKvbdssSTZZeD -DnbjjvbdmozZVjxb -EOcLKvbdtSrSxzFD -EPDLKvbdZyDjOCkr -DnbkKvbdbBWEeopX -EOcLKvbdkWWmcbXw -DoCkKvbdkVwNdBww -DncKjvbdEzsqFMCi -DncLKvbdACqxJyhp -DoDKjvbdYpmFIleR -DncKjvbdGKdsCglu -DoCkKvbdZnnJFEzK -DoDKjvbdBsBCtGWr -EPDKjvbdBcpAuimG -DnbjjvbdIGfzYxXg -DnbkKvbdGLEsCgmV -EPCkKvbdySnJNSBg -DoCkKvbdPyNAGrqj -EPDKjvbdmaivxPNu -DnbjjvbddoFSkUUS -DoCkKvbdySmiNRag -DoDLKvbdEYXlUUUM -EObkKvbdCTBCtFwS -DoDLKvbdoznDkXoA -EOcLKvbdBvzciEov -DoCjjvbdSPtHJfEX -EPDLKvbdtvOYJqTA -EPDKjvbdZisHpHBf -EPDKjvbdILazmvqL -EOcKjvbdRpUHKGDw -DncKjvbdWXJYWDdg -EPDLKvbdIwtCHlQp -EPDKjvbdUtNTfLvK -DncLKvbddZxpXxqC -EOcLKvbdkNBlZdgP -EObkKvbdqYnhGqEY -EPDLKvbdfpBzwDwh -DncLKvbdTkuoBVoJ -DnbkKvbdvvlBWAvV -DoCjjvbdrXQMCiYq -EPCjjvbdFeiqmiUR -DncLKvbdzjUopDsU -DncKjvbdhkeDmuCy -EPCjjvbdVqnYBdlD -EOcLKvbdSCDeLiYk -DoCjjvbdJvUeceHJ -EPCjjvbdjgfkfFnL -DnbjjvbdkVwNdBww -EObkKvbdczYowyRC -EPCjjvbdZoNhddyj -EPCjjvbdOSsugEuQ -EObkKvbdZMRcsnLm -EObjjvbdrMzJyLgi -EPDKjvbdrSUjnKaN -EPDKjvbdSLYfUfkT -EPDKjvbdUVlQKUAq -DoDLKvbdJcKCqJbx -DnbjjvbdeFPRbWcK -DoCkKvbdVAbQsQqy -DncLKvbdpeceTvBI -DoDLKvbdcIlikFwY -DoDLKvbdbsDLTdJa -EPCkKvbdRXOEClHc -DnbjjvbdbKkennDA -DncLKvbdEzsqEkcJ -EPCjjvbdJvUedEgJ -EOcLKvbdzitpQDsU -DncLKvbdQvnDblHc -EOcKjvbdbQGgDkzd -DnbkKvbddZyPxYpb -EPDLKvbdLrXNZuQz -DoDKjvbdDjIJvYKA -EPCjjvbdbVCHXjsh -EOcLKvbdsPunicVf -EOcLKvbdEzspdlCi -DoDLKvbdmRxtzSdJ -DnbjjvbdsBfNLfjy -DoCjjvbdcTDLUDia -EPDLKvbdidjgVPAO -DoCkKvbduVmxKQsA -EObjjvbdxLXDgzzG -EPCkKvbduaEZSoFI -EOcLKvbddneSjssr -DoCkKvbdWXJYVdFH -DncLKvbdHkaznWqL -DncKjvbdbVCGxKsh -DnbjjvbdiMEcmtcZ -DoDKjvbdqAheAXHd -EPCkKvbdMIalQxAS -DnbjjvbdVviXucdg -DnbjjvbdMpXpumgT -EObkKvbdMJCLqYAS -EObjjvbdczZQYYqC -DncLKvbdUxgtZjoO -EOcLKvbdjuwNdCYX -DncKjvbdSwjlNzkY -EPDLKvbdrWpLbhxq -DoDKjvbdnBjWwoOV -EPCjjvbdmSYtyrdJ -DoDLKvbdzeZnzdzQ -DncLKvbdMowqWOGs -EPCkKvbdqTsfqrLU -EObkKvbdraemMHKy -EOcLKvbdJcJbpjCx -DnbjjvbdmuUzKjRf -DncKjvbdNeEThhkE -DoDKjvbdHakydzAD -EOcKjvbdXsLaNUPY -EObjjvbdLFfHbBQu -DncLKvbdbKlFoODA -DoCjjvbdRpTfiecw -DnbkKvbdRkYetgLT -DoCjjvbdegkVrOQg -DoDLKvbdhlFEOUby -DoCkKvbdFyUtaEXb -DnbjjvbdAMgxsXZx -EOcLKvbdUQqOtuHm -EPDKjvbdxrmiMrCH -EOcLKvbdREDApQdS -DoDLKvbdWRmxBdlD -DnbjjvbdiHKCyVjV -EPCkKvbdxwhjCPyk -EObjjvbdLKaHvAJy -EPDLKvbdZtJJYcsO -DoCjjvbdbPfgDkzd -EObkKvbdUaBqTRRy -EPDKjvbdGYtuAcwb -DnbjjvbdQcbaQRDr -EPCjjvbdsBfNMHKy -EPDKjvbdZyDimblS -DoDKjvbdJXtBglRQ -EObkKvbdpssfrSLU -EOcLKvbdMRwMytpz -DoCjjvbdEYYMUTtM -DoCkKvbdeAUQmXif -DncLKvbdUaBqSpqy -EObkKvbdVAbQrqRy -EObkKvbdwXMAuaWV -DncLKvbdCIjakIfK -DncLKvbdjmBkzEfo -EOcLKvbdKVtfDeGi -EObkKvbdnQZyVjxb -DncLKvbdzRPMhiwA -DncKjvbdJpydnfOF -EPDKjvbdqTsfrRkU -EPDLKvbdEuyQPlie -DnbjjvbdfSBWzlCo -DnbkKvbdqiAKFMne -EPCjjvbdatbHYLUI -EOcKjvbdNsTugEtp -EPCkKvbdmgFXmNgZ -EPDLKvbdMSXNZtpz -DoDKjvbdUaBprqRy -DnbjjvbdXmqAXtvU -EOcKjvbdHlBznWpk -EOcKjvbdVqmwbElD -DoCkKvbdqrVLOLAm -DnbkKvbdZshiYcrn -DoCkKvbdZoNhddyj -EOcLKvbdEuxooljF -DnbkKvbduCcVXVoP -EPCkKvbdmuVZjirG -DncKjvbdRzKHrbvA -EObkKvbdeKJqutzn -EObkKvbdyOShXsIc -EPCjjvbdRbDdlJZL -DoDKjvbdSBdFMIxk -DncLKvbdKaKgMawq -EObkKvbdCDpAuilf -DnbkKvbdRWnDcLgc -DncLKvbdqlzJxkhJ -EPCjjvbdNHDQMpUk -EOcLKvbdRMwbZNtz -EPDKjvbdOEdThiLE -DoDLKvbdUyHszKoO -DnbkKvbdZisIPgCG -DncKjvbdwzHeeweS -DncKjvbdQwODcLhD -DoDLKvbdqdFJPmua -EOcLKvbdvwMAvBVu -EPDLKvbdbVBfwjsh -DoCkKvbdRyjHrcWA -DoDLKvbdWIYVxGxz -DnbkKvbdbiMjLGXY -EOcLKvbdBhjbKiFj -EObjjvbdCDpAvJmG -EPDKjvbdLBKfmCYR -DoCkKvbdbiMijevx -DnbkKvbdyOSgwriD -EPDLKvbdlYrqsZHU -EOcLKvbdwyhGFxFS -EPDLKvbdRyjHsCvA -EPCkKvbdHgGzYxYH -DoDLKvbdGFjRmhtR -EPDKjvbdFyUtaEYC -DncLKvbdeFOrCWbj -DoDLKvbdJSyArlwl -EOcKjvbdZyEKODLr -EOcLKvbdemGXGmJk -DnbjjvbdSCDeLhyL -DoDLKvbdYTLaMsnx -DoCjjvbdxKwEHzyf -EOcLKvbdiVZdvquC -DnbkKvbdUaBqTQqy -EPCjjvbdGZVVBEXb -DoDLKvbdCEQAvKMf -DoDLKvbdRWmdCkhD -EPDKjvbdRotHJecw -DoCjjvbdZxcimblS -EOcLKvbdtbcUvvOo -DnbjjvbdZsiJZDsO -EOcKjvbdRyjHsCvA -EOcKjvbdxLWdHzzG -DoCjjvbdFjdrbhMu -EPCkKvbdxVNFRYlO -DoCkKvbdmIcsqUqa -EPDLKvbdfMfWgMjL -EPDKjvbdTqQoUthN -EOcKjvbdtkwvaUAw -DoDKjvbdBdPaVilf -DoDLKvbdZMRdTmkm -EPDLKvbdelewGlik -DoCkKvbdwzHfFxEr -EPCkKvbdvAcyTPFI -EObjjvbdQdDBPqES -DoDKjvbdZtIiYcrn -EOcKjvbdypnlhiwA -DoCkKvbdNrtWGduQ -DncKjvbdxsOIlqbH -EPCjjvbdANIYrvyx -DnbjjvbdNwnuzdOU -EPCkKvbdFyUuBEXb -EOcLKvbdaaWFGQQX -DncLKvbdraelkfkZ -EPCjjvbdTpqPVUhN -DncKjvbdySmiNSBg -EPDKjvbdrpWPJbvG -EObjjvbdwNWANEFN -EObjjvbdZeYGzhJC -DoCjjvbddndsKstS -EPDLKvbdegkWSORH -EPCjjvbdvwMAvBVu -EPCjjvbdkySqrxgU -EPCkKvbdHkaznWqL -EPCjjvbdqlzKYkhJ -DncLKvbdZxdJmcMS -EPCjjvbdqGEFTvAh -EObjjvbdTYKkmzkY -EPCkKvbdZisHofbG -EOcLKvbdzoPpdcLx -EPDKjvbdZjTHpHCG -EOcKjvbdKWVGEFHJ -EPCjjvbdhyuFlROG -EPCkKvbdFjeTDIMu -DncLKvbdOYPVzcnU -DoCjjvbdSZjISbvA -DoCkKvbdZoNiEdyj -EPCjjvbdrWpMDJZR -EObkKvbdkVvnDaxX -EObjjvbdcSbjtDia -DnbjjvbdLGGICBRV -EPDLKvbdkWWmcbXw -EObjjvbdnHExNOHZ -DncKjvbdUtNUFlVj -EObkKvbdEvZPomKF -DoCkKvbduoTzpjnt -EOcLKvbdURQoVVHm -DnbkKvbdTAEiIBnd -DncKjvbdQwOECkgc -DnbjjvbdRbDdkiZL -DoCjjvbdEPCkLWcE -EPDKjvbdzjUpPdSt -EPDKjvbdZMSDsmkm -DoDLKvbdBdPaWJmG -EPCkKvbdwjwEHzyf -DnbjjvbdhuZeXSUb -DoCkKvbdlYrqsYft -DoCjjvbdEXxMTssl -DoDKjvbdzoPpdbkx -DncKjvbdWRnXbFMD -DoDLKvbddijRutzn -DncKjvbdnCKWwnmu -EOcLKvbdZMSDsmkm -EOcLKvbdUaCRTRSZ -EObkKvbdkCkjpgVH -DnbkKvbdirziTKiz -DoDLKvbdJpyeOenF -EObkKvbdGKdsDHmV -EObjjvbdoAKzshDn -EPDLKvbdlrZVZrci -DncLKvbdRzKHsDWA -EObkKvbdKkAhWAKZ -EPDLKvbdVAaqSqRy -DoCkKvbdjAPgApHK -EPCkKvbdBcpBWJmG -DncKjvbduCbuXWOo -EOcLKvbdqiAKEmOe -EPDKjvbdYpldhleR -DnbjjvbdEPCjjwCd -DnbjjvbdbsDKtEJa -EObjjvbdKfGICBRV -DoDLKvbdRadFMIxk -DoDKjvbdGGJqmhsq -EPCjjvbdJbicQjDY -DncKjvbdbiNKKfWx -EOcLKvbduLxXAsaX -EPCjjvbdEKIJuwjA -EPCjjvbdWRmwadlD -DnbjjvbdfMewGmJk -EOcLKvbdNxOuzdOU -DnbkKvbdfIKvSOQg -DncLKvbdQZNAHSqj -DnbjjvbdZLqdUNlN -EPCjjvbdSLYetgLT -DncKjvbdeEoSCWbj -EPDLKvbdsCFmMGjy -EPDLKvbdLGGHaaRV -DncLKvbdEuxpQMjF -EObjjvbdVYhTzLPO -EPCkKvbdaSFbhTek -DnbkKvbdDihJuwjA -EObjjvbdFjeTDIMu -EObjjvbdhkeDnUby -DoDKjvbdxUmEpyLn -DncLKvbdiVZdvqtb -DoCkKvbdunszqLPU -DnbkKvbdSBcdkiYk -EObjjvbdbhmKKevx -DnbjjvbdVZHtZkOn -DoDLKvbdZirgogCG -DoDLKvbdqBIeAWhE -EPCjjvbdwtmEqYkn -DncKjvbdKCjDRJbx -EOcKjvbdTvLpJsaR -DoDKjvbdyXhjBozL -DnbjjvbduDDUwVoP -DoDKjvbdzaAOfgBl -DoCjjvbdWSOYCElD -EOcLKvbdqwQMDJYq -DoCkKvbdNHColpUk -EPCkKvbdCEPaVimG -EOcKjvbdjKFhJlxS -EOcLKvbdxUleRYkn -DnbkKvbdrNZjZMHi -DoDKjvbdmuUzLKSG -EObjjvbdfIKurOQg -EPDKjvbdQlwbZNtz -DncKjvbdhkeDnUby -EObjjvbdwuMdqZMO -DncKjvbdliDtQtrB -EPCjjvbdNPwqWNgT -DncKjvbdjAPgApGj -EObkKvbdMpYRVmfs -DnbkKvbdGKeTChNV -DoDLKvbdHbMZdzAD -EObjjvbdQlwayOUz -EPDKjvbdVqnYCFLc -DoCkKvbdmpZyVjyC -EObkKvbdUslsfLuj -DoDLKvbdlhdURVSB -EOcLKvbdmSZVZrci -DoCjjvbdYzberJuy -EPDLKvbdhzVGLpnG -EPCjjvbdsPvOicVf -EObkKvbdeOeTLUUS -DncLKvbdmfdxMnHZ -EPDKjvbdHffzYwxH -EPDLKvbdrylPsAgn -EOcKjvbdwWlBWAvV -EPDKjvbdVAbQsQqy -DnbkKvbdsZlPsBIO -DncLKvbdEzspdkbi -DncLKvbdhyuGMROG -DoCkKvbdFaOpxizm -DoCkKvbdZsiIxcrn -DoCkKvbdijGHjMwr -DnbkKvbdcyxpYZQb -DnbjjvbdEzspdkbi -DncLKvbdNQYRVnGs -EObkKvbdkClKpgVH -EOcLKvbdkClKqHVH -EOcKjvbdhanbdvqR -EPCkKvbdmfdwmNfy -EObkKvbdYTMAmUPY -DoCkKvbdIGgZxxXg -EOcKjvbdnHEwlnHZ -DncLKvbdCDpAuilf -EPCjjvbdmbKXXoOV -EObkKvbdapGfdLzd -EPCkKvbdRjyGVHLT -DoCkKvbddoFTLTtS -EPCjjvbdGLFTCglu -DoCjjvbdiLeENtcZ -DoCkKvbdKCicQjCx -EPCkKvbduoTzqLPU -EPCjjvbduVmwiqTA -EPCjjvbdWIXuxGxz -EPCjjvbdpxngfqDx -EOcKjvbdeOdrkTsr -DoDLKvbdNrsufduQ -EOcKjvbdIHHZyXwg -DoCjjvbdpfEEsvBI -EOcKjvbdhgKDYvKV -DnbjjvbdmbJvxOmu -EPDKjvbdGdKujCKK -DoDLKvbdfkGzcGAE -EPCkKvbdZoNiEeZj -EPDLKvbdaMjbTUlg -EPCkKvbdSPsgJfEX -EPDKjvbdDxYLstUM -EPCjjvbdKVtfDeGi -EOcLKvbdpeceTvAh -EObjjvbdHffzYwxH -DnbjjvbdffMZnHHA -EOcLKvbdsQVnibvG -EOcKjvbdZirgpGbG -EObjjvbdJSxaTMxM -EOcLKvbdbrcLUEKB -EPCjjvbdGZUuAcwb -DnbkKvbdpssgRrLU -DnbkKvbdKVteceHJ -EPDKjvbdmajXYOmu -EPDKjvbdNwoVzdOU -DnbjjvbdrpVnicWG -DoDKjvbdjhGlFfNk -EObjjvbdEXwlTtTl -DoDLKvbdkCkkQftg -DncKjvbdDxYLtUTl -DncKjvbdNQYQunGs -DoDLKvbdZQleImFR -DoDKjvbduVmxKRTA -DoDLKvbdsrqsZZdc -DoDLKvbdZLqctNlN -EPDLKvbdNsUVfeVQ -DncLKvbdhuZeXRuC -EPCkKvbdiCObdwRR -DoDKjvbdIwsbIMQp -EObjjvbdtcCtvvPP -EOcLKvbdpyOhHRDx -EObjjvbdmgEwmOHZ -DoCkKvbdelevgNJk -DoCjjvbduLwwBTaX -DoCkKvbdXrlBNTnx -EPDLKvbduCcUvuoP -EPDKjvbdURRPVUgm -EObkKvbdBsBCsfXS -DoDLKvbdZjSgogCG -EObkKvbdhgKDZViu -EPCkKvbdEYXkstUM -DncLKvbdrMzJyLgi -DnbjjvbdaSFcIUFk -EPDLKvbdnBjWxOnV -EPDLKvbdssRryZeD -EOcKjvbderAvzkbo -DoCjjvbdZirhQHCG -DnbkKvbdBraCtFvr -EOcLKvbdxZgfFxFS -DoDKjvbdJuuFdFGi -EPDKjvbdUQqPUtgm -EPDLKvbdNHCpMpUk -EPDKjvbdnCKXYOnV -DoCkKvbddZyQXyQb -DnbjjvbdpxoHgREY -EPCkKvbdfNFwHNJk -DncLKvbdVBCQsQqy -EPCkKvbdUxhTzLOn -EObjjvbdSQTgJfEX -DoCkKvbdrWpLbiZR -DoDLKvbdtcDUwWOo -DoCkKvbdwzHfGXeS -EPDLKvbdrzMPraHn -EPCkKvbdDoCjjvcE -DoDLKvbdbhlijewY -EObkKvbdUxgsyjoO -DoDLKvbdbUafxKsh -DoCjjvbdULuoBWOi -EPCkKvbdVBBqSqRy -DoCjjvbdhkeENtcZ -EPCjjvbdqYnggRDx -DncLKvbdjhHMFfOL -EOcKjvbdZxcinDMS -DoDLKvbdvBDySndh -DncKjvbdirziTKiz -DncKjvbdJXsaglRQ -DncKjvbdhfjDYvJu -DncLKvbdjuvnDbYX -EOcKjvbdKaLHMaxR -DoCjjvbdiGjDZWKV -DnbjjvbdEObjkWbd -DnbkKvbdJmADygVB -EPDKjvbdJvVFdEfi -EPDLKvbdnGeXmOGy -DoCjjvbdpssgSSKt -EPDKjvbdwtldqYlO -EPDKjvbdmfeXmNgZ -DoCjjvbdqvokbiZR -DoDLKvbdqUUHSRjt -EObkKvbdmbKXYOnV -EOcKjvbdaSGChTfL -EPCkKvbdWWiYWDdg -DoCjjvbduoTzqKnt -DnbjjvbdHDkVjBjK -EOcKjvbdbVBfwjtI -EOcKjvbdjvXOEBxX -DncKjvbdZLrETnMN -EObkKvbdfNGXHMjL -EPCkKvbdkDLkRHUg -EObjjvbdZjTIQGbG -DoDKjvbdZsiIyDsO -DnbkKvbdbrbjscjB -EPCjjvbdmbJwYPOV -DoCkKvbdKDJcQicY -DoDLKvbdZxcinCkr -DoDKjvbduoTzqLPU -EOcKjvbddndsKstS -DnbjjvbdNQXqWNfs -EOcKjvbdIidAKQGd -DoDLKvbdTkvOaVni -DoCjjvbdsPvPJcVf -DoDKjvbdVqnXbElD -EOcKjvbdIHGyyXxH -DnbkKvbdUxgszLOn -EPDLKvbdwuMdpxkn -DnbkKvbdqrVLNkBN -DncKjvbdijFgjMwr -EPCkKvbdSQUGjFcw -EObjjvbdRWmdCkgc -DnbkKvbdVTltFkvK -EOcLKvbdJbjCqKDY -EObkKvbdfMfXGmKL -EObjjvbdzRPNJKXA -EPCjjvbdBsAbtGWr -DoDKjvbdJXsahLqQ -DnbkKvbdlBNOmALA -DoDLKvbdlrYtzTDi -EPDLKvbdZtJIxdTO -DncKjvbdmbJvxPOV -EPDLKvbdaMkBsUmH -EPCkKvbdNsUVgFUp -DoCjjvbdWfYytAPT -EObjjvbdNHCpMpVL -EPCjjvbdMgComPtk -EOcLKvbdeqaWzlDP -DoCkKvbdFVxopNKF -EOcKjvbdYkrDsmlN -DncKjvbdWWiYWEFH -DoDKjvbdSLYfUfkT -DnbjjvbdhkeEOVCy -DoDKjvbdJXsagkpp -DoDLKvbdZoOIdeZj -DncLKvbdLiCMRYAS -DncKjvbdyOTHwsJD -DncKjvbdvmWANDeN -DoDLKvbdtTSTYydc -DoCkKvbddneSjtTr -EObkKvbdkDMKpftg -DnbjjvbdbhljKewY -EPCkKvbdIsZBSlwl -EPCjjvbdlqxuZsDi -DnbjjvbdNrtWGeVQ -EOcLKvbdvBEZSndh -EOcKjvbdrJAJdmOe -DoCjjvbdyOTHxTIc -DoCjjvbdmfdwlnGy -EOcLKvbdkDMKpgVH -DoCkKvbdRECaQQdS -DncKjvbdaMjartlg -EPCjjvbdVviXuceH -DnbkKvbdNsUVgFVQ -DoDKjvbdFkEsDIMu -EOcKjvbddZyPwyQb -DoDKjvbdqmZixlIJ -DoDKjvbdrEEhomvB -EOcLKvbdlZSqsZHU -EPCkKvbdehKuqmqH -DoDLKvbdFxtuBDwb -EPCjjvbdKjaHvAJy -DncLKvbdBcpAujMf -DoCjjvbdNQYRWOHT -DoCjjvbdHakzEzAD -EPCkKvbdJTYaSlwl -DoCjjvbdzitpQETU -DoDKjvbdvBEZSoFI -DncLKvbdnBjXXoOV -DoDLKvbdiZuGMROG -DoDKjvbdKVtecdfi -DnbjjvbddjJqvUzn -EPCkKvbdaMjbStlg -EOcKjvbdSZjHsDWA -DnbkKvbdUaCRSqSZ -DoDLKvbdxZgefXeS -DncKjvbdjhGkfFnL -DncKjvbdIjEAJogE -EPCkKvbdNGcPlpVL -DncKjvbdUMWPAvOi -DnbkKvbdatafxKsh -EObkKvbdjcMLQgUg -DoDKjvbddeOqavcK -EOcLKvbdoznELXoA -EPDLKvbdeOdrjtUS -DnbkKvbdjKFhJmXr -EPCkKvbdpxoHfpdY -DoCjjvbdZLrDsnMN -EPCkKvbdwyhFexFS -EOcKjvbdkClKpftg -DoDKjvbdxnTIYSiD -DncKjvbdxnShYSiD -DoCkKvbdFxtuBDwb -EObjjvbdYkrEUNkm -DnbjjvbdNQYQvNfs -EPCkKvbdhlFDnUby -EOcLKvbdiCObdwRR -DoCjjvbdVwJXvEFH -DnbkKvbdBvzchePv -EObkKvbdZHWdAPSi -DncKjvbdHgGzYxXg -DoCkKvbdMJCMQxAS -EPCkKvbdZLqdTmkm -DoDLKvbdnCJwYPNu -EPCjjvbdOSsvGdtp -DncKjvbdlYrqsZGt -EOcLKvbdJYUBhLqQ -DoCjjvbdZisHpGaf -DnbjjvbdVgxWXfxz -EPDKjvbdkWXNdBxX -DoCkKvbdlZTSSyHU -DncKjvbdjggLeenL -DnbjjvbdKNAEZfuB -DoCjjvbdLAkHMaxR -EOcLKvbdZRNFJNFR -DoDLKvbdjAQGaPfj -EObjjvbdjggMGFmk -DoDLKvbdyfyMAMeX -DncLKvbdjbkkRHVH -EOcLKvbdOTTugFVQ -EOcKjvbdWHxWXfxz -EPCkKvbdvwMBWBVu -EPCjjvbdnHEwlnHZ -DoDKjvbdHEKuiaij -DoCjjvbdVwIwvEEg -EPDLKvbdehKvRnRH -DncLKvbdnVUyjirG -EObjjvbdfMevgNJk -EPDKjvbdjbkjqHVH -DncLKvbdrJAKEloF -DoCkKvbdGckWJaij -DnbjjvbdTvMQJtAq -EPCkKvbdhkddNtcZ -DnbkKvbdrzMQTBIO -DncKjvbdsZlQTAgn -EPDLKvbdOFDtJIjd -EOcLKvbdnBivwoOV -DncKjvbdJXtBhLpp -EPCkKvbdJTYaSmXl -EOcLKvbdLGFgbBQu -DncKjvbdnHEwlmgZ -DoCjjvbdACrYJzJQ -EPCkKvbdiZuGLqNf -DnbjjvbdnGdxMmfy -DnbkKvbdRkZGUgKs -DoDLKvbdZisHofaf -EPDLKvbdJKEAJpGd -DnbkKvbdBsBDUFwS -EObjjvbdtcDVWuno -EOcKjvbdBsAbsfWr -EPDKjvbdrWpMChyR -DoDLKvbdVTltFkuj -EPDKjvbdGFjSOJUR -EOcKjvbdBsAcUGXS -EPCkKvbdcJNKKfWx -EPDLKvbdnQZyWKxb -EPCkKvbdqTtGrSKt -EObkKvbdjJfIKNXr -EOcLKvbdVqmxBdkc -EOcKjvbdFWYopMjF -DnbjjvbdqdFJPnWB -DoCjjvbdehKvRnRH -EPDKjvbdkyTRsZGt -EObjjvbdozmckYPA -DnbjjvbdbrcLUDjB -DoDLKvbdrMyixkhJ -DoDLKvbdrpWOjCvG -DoDKjvbdLFehCAqV -DncKjvbdrWpMCiYq -EOcKjvbdVTmUFkvK -EObkKvbdhficZVjV -EPCkKvbdIsZAsNXl -DoCjjvbdmfdxNOHZ -EPDKjvbdznopdblY -DnbjjvbdLiCMRYAS -DncLKvbdePEsKstS -DoDLKvbdUMVoBVni -DncKjvbdWRnXaeLc -EObjjvbdrDdiPmvB -DoDKjvbdDoDKkXDE -DncKjvbdOAIrtJrA -EPCkKvbdwzIGGXdr -EOcLKvbdUQqPUtgm -EPDLKvbdhlFEOUby -DncKjvbdZirhPfbG -EOcLKvbdKVuGEEgJ -DoDKjvbddePSBvbj -EPDLKvbdfHjuqmqH -EPDKjvbdZjSgpHBf -DncLKvbdunszpjoU -EPCkKvbdqTtHRrKt -EObjjvbdfNGXGljL -EObjjvbdUGznMWue -DnbkKvbdsPuoJbvG -EObjjvbdnQZxujxb -EPDLKvbdczZPwyQb -DoCkKvbdWXIwvDdg -EOcKjvbdQvmdDLhD -DncLKvbdCIkBjiFj -EObjjvbdjJegjNXr -DncLKvbdcIlikFvx -EPDLKvbdRkZFtfjs -DoCjjvbdczYoxZRC -EOcLKvbdatagXjsh -DncLKvbdjcLjqGuH -DoCjjvbdMSWlyuQz -DoCkKvbdjuvnDbYX -DnbjjvbdiMEdOUcZ -EPCjjvbdcTDKtEKB -DnbjjvbdwzHeexEr -EPDLKvbdemGWgNJk -EObjjvbdakLfOnDA -EPDLKvbdTfznLvvF -DoDKjvbdaNLBsUmH -EOcLKvbdhzVFkqNf -DoDKjvbdZRNFIldq -DoDKjvbdlrZVZsEJ -EObkKvbdbUagXjtI -DoDLKvbdUyHsykPO -EObjjvbdkVwNdCYX -EPDLKvbdUVkpJtBR -EPDKjvbdrMzJxkgi -EOcKjvbdSLYfUgLT -DoCjjvbdMRwNZtpz -EPDLKvbdIxTaglRQ -EPDLKvbdJqZdnenF -DoDLKvbdZMRdTmkm -DnbkKvbdANHxrvyx -EPCjjvbdFkErbhNV -EOcLKvbdWSNxCEkc -EPCjjvbdiCPCdwQq -DnbkKvbdbAvEeoow -EOcKjvbdeFOrBvcK -DnbkKvbdaRecHtGL -DnbkKvbdZshhxcrn -EOcKjvbdqTtHRrKt -EObjjvbdauBgXjtI -EOcKjvbdQdCaQRDr -DoCjjvbdFVxopMjF -EPDLKvbdIGgZyXwg -DoDLKvbdRpTfjFdX -DnbkKvbdSQUGifEX -DnbjjvbdpxoIHREY -DoDLKvbdqiAJeMne -EOcLKvbdCIkBkJFj -DncLKvbdFfKSNhsq -DoDKjvbdwWkaVaVu -EPDLKvbdNeETiJKd -DnbjjvbdhbOcEvpq -DoCkKvbdrbGMlHLZ -DnbjjvbdLAjgMawq -DncLKvbdlqyUzSdJ -DncLKvbdYkqdTnLm -EOcKjvbdYkrDsnMN -EOcLKvbdnCKXXnnV -DoCjjvbdDncLLWbd -DoDKjvbdYpmFJMdq -EPDLKvbdFpATXHFy -DoDKjvbdJvUfEEfi -EPDLKvbdmJEURVSB -DncLKvbdtbcVWuno -EOcLKvbdbUagYKtI -EObkKvbdcJMjKevx -DnbjjvbdKVuGEFGi -DoCkKvbdZMRctNkm -EOcLKvbdYpmEiMdq -DoDKjvbdYpmEhmEq -DncKjvbdzjVQQDrt -EPCjjvbdzHYlAMdw -EPDLKvbdYkqcsnMN -EObkKvbdiiehJmYS -DnbjjvbdDwwktUUM -EObkKvbdrounjCuf -DnbjjvbdGGKRmiUR -EOcLKvbdwzIGFxEr -EPDKjvbdOEdUJJLE -DoCkKvbdfNFvgMjL -DoDLKvbdOEdThhjd -DnbkKvbdyTOImSCH -EOcLKvbdzitpQESt -DoDKjvbduDCuWvPP -DoCjjvbdTppnuUhN -DoCkKvbdIBlZdzAD -DoCjjvbdZQmFJMeR -DnbkKvbdJXsaglQp -DoCkKvbdSZigrcWA -EObjjvbdZsiIyETO -EPDKjvbdZLqctOLm -DncKjvbdwyhGFxFS -DncLKvbdqwPkcIyR -EPDKjvbdRkYfUgLT -DoCkKvbdxxIjBpZk -DncLKvbdqlyjYlIJ -EPCjjvbdRaceLiYk -EPDKjvbdjlbLyeHP -EPDKjvbdrbFmLfkZ -EPCkKvbdvBEYsPFI -DncKjvbdSBdElJYk -EPDKjvbdpxoIHREY -EPCkKvbdjhHMFfNk -EPCkKvbdANIYsXZx -EObjjvbdnGdxNOHZ -EObjjvbdKQzFPGOF -DoCjjvbdtunYKRTA -DnbjjvbdLFfHbBRV -EOcKjvbdpedEsuaI -DnbjjvbdYkqcsmkm -EPCkKvbdbrcLUEKB -DnbkKvbdNQYQunGs -DoDLKvbdJcJbqKCx -EPDLKvbdIxTbHlRQ -DnbkKvbdvwMAvBWV -EOcKjvbdfHkVqnQg -EOcLKvbdbKkfPNcA -EPDLKvbdVAbQrpqy -DncLKvbdWRnXaeLc -EPCkKvbdFpATXGey -DoDLKvbdyfxlANFX -DoCkKvbdFVyQQMjF -EOcLKvbdxnShXrhc -DoCjjvbdmaivwoOV -DnbkKvbdbsDLTdJa -DoCkKvbdUtMtGMVj -DnbjjvbdNVSqkNAX -EPDLKvbdWfYytAOs -EPCkKvbdZyEJnDLr -EObkKvbdyXhjCQZk -EObkKvbddoFSkUTr -EOcKjvbdeATqMxKG -DnbkKvbdnPyyWKyC -DncKjvbdkySrTZHU -DnbjjvbdmfdxNNfy -EPCkKvbdHlBznXQk -EPDKjvbdZisIPgCG -DncLKvbdrEEhonVa -DoDLKvbdrykosBHn -EObkKvbdqvpLbiZR -DoCjjvbdhkeDnUcZ -DoCkKvbdVwIwudEg -DncLKvbdyXiJaozL -DoCkKvbdyzeOSIIh -EPCjjvbdkVwNcbYX -DncLKvbdTkuoAuoJ -EPCjjvbdijFgimYS -DncLKvbdliEURUrB -DoDKjvbdURQoUuIN -DoDKjvbdrMzJxkhJ -EPCkKvbdqYngfqEY -EPDLKvbddwzUTrFz -DoCkKvbdyYIjBpZk -EPCjjvbdssSSxzEc -EObkKvbdFejSNiUR -EPCkKvbdrEFJPmua -DnbkKvbdiifIJmXr -EPDLKvbdZLrEUOLm -EObjjvbdGFiqnItR -DoCkKvbdjuwNcaww -DncKjvbdmpZxukYb -DoDLKvbdqdFJQNua -EPDKjvbdNQYRWOGs -DoCjjvbdZeYGzhIb -EObjjvbdZjSgpHCG -EObjjvbdhfjDYvKV -EPCkKvbdJpzFOeme -DnbkKvbdlhcsptrB -DncLKvbdFeiqnJTq -EObjjvbdZxcinCkr -EPDLKvbdFVyQPmKF -EObkKvbdelfWfljL -EOcKjvbdJpydnenF -DnbkKvbdbVCGwkUI -EObkKvbdemFwGmJk -DoCkKvbdBsAbsfWr -EPDLKvbdJYTbHkqQ -DncKjvbdyNrgxTIc -DoDKjvbdGQASvfey -EOcLKvbdRNYCZOUz -EOcKjvbdyzeORgiI -EOcLKvbdZQmEhleR -EPCjjvbdmttyjjRf -DnbjjvbdLBLGmBwq -EOcLKvbdKVuFdFGi -EPCkKvbdxmsHwsJD -DoDLKvbdyOTIXriD -EPDLKvbdZsiJYcsO -EPCjjvbdjvXOEBxX -DoCkKvbdlZSqsZGt -DoDKjvbdADRxKZiQ -EOcKjvbdzoQREcMY -EObkKvbdGGKRmhsq -EObjjvbdJutfDdgJ -DoDLKvbdUsltFkvK -EObkKvbdHDkWKBjK -DncKjvbdLqwMzVQz -EObjjvbdaRecITfL -DoDKjvbdakMGPNcA -DnbjjvbdwXMBWAvV -EOcKjvbdQwOEDLhD -EOcKjvbdAMgxrwZx -DnbjjvbdqqtkNkAm -DoDLKvbdbhmKKewY -DoCjjvbdQmYBxnUz -DnbkKvbdvPTzqKnt -EPCkKvbdJqZePGOF -DoDLKvbdTfznMXVe -DoCkKvbdFyVUaDwb -DncLKvbdFxuUaDwb -EObkKvbdhlEcnUby -DnbjjvbdCJLCKhfK -DoCkKvbdPyNAGrrK -EOcKjvbdVgxVxGxz -EObkKvbdSxKkmzjx -EOcLKvbdemFwHMjL -EObjjvbdrEEiPnVa -DoCkKvbdDjIJvXjA -EPCjjvbdYTMAmToY -DoCjjvbdbLMFnmcA -DoCkKvbdrounjCuf -EPDKjvbdrJAJeNOe -DncLKvbdJbicQjDY -EPCjjvbdmpZxvLZC -DncLKvbdVrNxCElD -DnbkKvbdDoDLKwCd -DoDKjvbdsZkpSaIO -EPCjjvbdNQYRVnGs -DoCkKvbdVrOXbFMD -DoCjjvbdlYrqryHU -DoDLKvbdVTltGMVj -DncLKvbdwzHfGXeS -EPCkKvbdmajXYOnV -EOcLKvbdZLqdTmlN -DoDLKvbdqdFJQOWB -EObkKvbdVgwvXgYz -EPDKjvbdkMakzFHP -DoDKjvbdakLfPNcA -EObjjvbdyYJJbQZk -DoDLKvbdDigivXjA -DoDLKvbdHELWJajK -EObjjvbdZGvdAPTJ -EOcKjvbdUGzmkvue -DncLKvbdSZigsCvA -DoDLKvbddBsMrATm -EObkKvbdmSZUzSdJ -DncKjvbdjAPfaQGj -DoDKjvbdlBMoNALA -DnbkKvbdJTZArlxM -EObjjvbdHgHZyXwg -EPDLKvbdhzUekpnG -EPDKjvbdEOcKjvbd -DoCkKvbdjcLkRHUg -EObjjvbdBiLBkIej -DnbjjvbdZMSEUNkm -DoCkKvbdzRPNJJwA -EPCjjvbdGdKuiajK -EPDLKvbdrEFIpOVa -EPCkKvbdKfGHbApu -EPDKjvbdUtMsfMVj -DoDLKvbdbVCHYKsh -EPDLKvbdEztRFMCi -EOcLKvbdJmADzGta -DnbjjvbdtSrSxydc -DoCjjvbdACrYKZiQ -EPDKjvbdsrqsYzEc -DoCjjvbduLxXAtAw -DoCjjvbdEztQdkbi -DoDLKvbdkClKpgVH -DoDLKvbdSCDeMJYk -DoDLKvbdpxoIGqDx -DoCkKvbdDigjVxKA -EPDKjvbdGGKSOJUR -EOcLKvbdiLeDnVDZ -DnbjjvbdyOSgxShc -EPDLKvbdNsUWHEuQ -EOcLKvbdYpmFImEq -DoDKjvbdZLrDtOLm -DncKjvbdJvVGEFHJ -EOcKjvbdZirgogCG -EPCkKvbdKCjCqJbx -EObjjvbdgKfzcGAE -DncKjvbdZjTIQHBf -DoDKjvbdRDcBQQcr -DnbkKvbdZQmEiNFR -EObkKvbdSiZjRABM -EObkKvbdURROttgm -EObjjvbdlZSrSxft -DoCjjvbdNxPVzdOU -EPCjjvbdqAheAWhE -EPCkKvbdwXLaWBWV -DoCkKvbdKDKDQjCx -EOcKjvbdehLVqnQg -DoCkKvbdZxdJmcMS -DncLKvbdDjHjVxKA -EObkKvbdXrlAmToY -EOcLKvbdwtleRYlO -EPCjjvbdtlYWaUBX -EPCkKvbdiUzFXSVC -DoCjjvbdcJNJkFwY -EObkKvbdaRebhUGL -EOcKjvbdNHDQMotk -DoDLKvbdyTNhlqbH -EOcLKvbdKfGIBaRV -EObkKvbdKaLHMawq -DoCkKvbdnCKWwoNu -EPDLKvbdHffzYwxH -DncKjvbdnGdxMmgZ -EPCjjvbdNPwpvNgT -DoDLKvbdYkrEUOMN -DoDKjvbdTqROuUgm -DoDKjvbdvBDyTPEh -DnbkKvbdJKEAKQHE -EObjjvbdiBoCeWqR -DnbkKvbdmRyUyrci -DnbkKvbdJuuGEFGi -EOcLKvbdFyVVBEXb -EObkKvbdwyhGFwdr -EObkKvbdCTBDTevr -DoDKjvbdjbkkQftg -EOcKjvbdVAbQrqRy -EObjjvbdLAkHMawq -EObjjvbdEztQeLcJ -EPCjjvbdcIlikFvx -DncKjvbdZyEJmcLr -EObjjvbdqceJPmua -DncKjvbdZnmiEdyj -EOcLKvbdiGicYujV -DoCkKvbdFeirNhtR -DoCkKvbdDjHjVxKA -DnbkKvbdqFdEsvBI -EOcKjvbdcImKKevx -EPDLKvbdQmXbZOUz -DncKjvbdqcdhpNvB -EObkKvbdsPvOjCvG -DoDKjvbdFVyQPmKF -EOcKjvbdqYnhGpcx -EPDKjvbdKfGIBaRV -EPCkKvbdnGeXmNgZ -DncKjvbdKVtedEgJ -EObjjvbdCTAbsewS -DnbjjvbdeEoRavcK -EPCkKvbdNsUVfeVQ -EPDLKvbdGdLWKCKK -DnbjjvbdKfFhCBRV -DoCjjvbdZLrDtOLm -EPDLKvbdhtydvrVC -DoDLKvbdZjTIPfaf -DoCjjvbdbrcLTdKB -DncKjvbdzoQRFClY -DnbjjvbdSKyFuHKs -EOcKjvbdZQldiMeR -DncLKvbdkySrTYft -DnbkKvbdSLZGUgKs -EPCkKvbduCbuWvOo -DoDKjvbdsCFlkgLZ -DoCjjvbdrDdiPmvB -EPDLKvbdySnJNRbH -EPDLKvbdDoDKkXDE -EPCjjvbdijGHjMwr -EOcLKvbdeJjSWUzn -EPCkKvbdKWVFdEgJ -DoDLKvbdVYhTykPO -EObkKvbdeJiqutzn -DoCjjvbdRjyFuGkT -DoDKjvbdHDkWJajK -EPCkKvbdbKlFnnDA -EPDKjvbdQwOEDMHc -DoDLKvbdZshiZESn -EObjjvbdkyTSSyGt -DoCkKvbdxUmEpyLn -EObjjvbdMuSqkNAX -DncLKvbdbiNJkGWx -DoCjjvbdWIYVwfxz -DncLKvbdkVwNcaww -DoDLKvbdOFEThhjd -DoDLKvbddndrkUTr -DnbkKvbdyzeNrHiI -EPCjjvbdZRNEhldq -DncKjvbdhlEdNuDZ -DoCjjvbdqquKmkAm -DoDKjvbdFyVVBDxC -EPCkKvbdJuteceHJ -DnbkKvbdiBoDEvqR -DoDLKvbdLqvlzUpz -EPCjjvbdrRuKnLBN -DnbkKvbdZjShQHCG -DnbkKvbdcScLTcjB -EOcKjvbdyNrgxSiD -EOcKjvbdZirhPfbG -DoDLKvbdkIGkefOL -EPDLKvbdkCkkRGtg -EPDKjvbdbUafxLTh -EObkKvbdhfjDYvKV -DoCjjvbdpecdsvAh -EOcKjvbdpfDeUWAh -DnbkKvbdPxmAGsRj -DnbjjvbdZMSEUNlN -EOcLKvbdqFdFTvAh -DoCjjvbdWXJXvDeH -DoCjjvbdqUTfqrLU -EPCjjvbdvOszqLPU -EObkKvbdmtuZkJqf -EOcLKvbdjgfkefNk -DoCjjvbdhaoCeWqR -EObjjvbdKaLHMbXq -DoCjjvbdSLZFtfjs -DoCjjvbdFfKSOItR -DnbkKvbdqUUHSSKt -EPCkKvbdHEKujBjK -EObkKvbdIsZBSmXl -EOcKjvbdRDcApQcr -DoDKjvbduDDVWvPP -EOcKjvbdLBLGlaxR -DoDLKvbdIxTbHlQp -EPDLKvbdrRtkOKaN -DoCjjvbdRjyFtfkT -EPDKjvbdGQASwHGZ -EPDKjvbdMgDPlouL -EObkKvbdJXtCILqQ -EObkKvbdrEFJQNvB -DoCkKvbdeOeTKtUS -EObkKvbdSQTgJfDw -EPCjjvbdSQUGiedX -DoCjjvbdqUUGrRjt -EPDKjvbdTqRPVUgm -EPCkKvbdIMBznWqL -EObkKvbdhancEwRR -EOcKjvbdrMzJxkgi -EPCjjvbdhbPDEvqR -EPDKjvbdZHXEAOsJ -EPDLKvbdxnShXriD -DoCkKvbdLLAgvAKZ -DoCkKvbdhficYvJu -EObjjvbdZRMeIleR -DncLKvbdYfwEAOri -DoDLKvbdDwxMTtUM -DoCkKvbdWRmwbFLc -DnbkKvbdNQYRVnHT -DnbjjvbdjmCMZeHP -EPDKjvbdaNKbTUlg -EPCkKvbdidkHVPAO -DoCjjvbdHfgZxwxH -EObjjvbdxwhibPyk -EPDKjvbdFjeTDHmV -DoDKjvbdiCOcFWqR -DoCkKvbdJmADyfuB -EOcLKvbdhficYujV -DncLKvbdYzbfSJuy -DoCjjvbdbUagXjtI -DoDKjvbdjKFhKNYS -EOcLKvbdCIkCLJGK -DoDKjvbdZshiZESn -EPCkKvbdSQTfjFcw -EObkKvbdiMEcnUcZ -EPDLKvbdyOTHxSiD -EPCjjvbdFjeTDHmV -DnbjjvbdJuuGEFGi -EPDKjvbdhkeDnVCy -EPCkKvbdVAaqSprZ -DncLKvbdVUNTelVj -DoCkKvbdfILVrNpg -DncKjvbdNHDQNPuL -EOcLKvbdLZQirztf -EObjjvbdGckWKCJj -EObkKvbdIHGyyXwg -DncLKvbdiUydwSVC -DoDLKvbdpecdtWBI -EOcLKvbdLGFgaaRV -EOcLKvbdezuxeJUX -EObkKvbdgGLymgHA -DnbjjvbdEvZQQNJe -DncKjvbdJcJbpjDY -DoDKjvbdIxTahLqQ -DncKjvbdBcpAvJlf -EObjjvbdnPyyVkYb -EObjjvbdfNGWfljL -DnbjjvbdieLHVPAO -EOcKjvbdRNYCYmtz -EPDKjvbdiHJcYuiu -EObkKvbdMowqVnHT -DoCjjvbdiUydvrUb -EObjjvbdZMRcsnLm -DnbkKvbdaSFcIUFk -DnbjjvbdZyEKNcLr -DnbkKvbdZnnJFEzK -DncLKvbdJSyBSlxM -DoCkKvbdXsMAmUOx -EPCjjvbddneSkTtS -EOcLKvbdVwIxWEEg -EPCjjvbdxsOJMrBg -DncKjvbdkIHMGGOL -DncLKvbdGFjRmhsq -DnbkKvbdySmiNRag -EPDKjvbdpyPHgREY -DnbjjvbdGZUuAcxC -DnbjjvbdiHKDYvJu -DoCjjvbdtlXwBUBX -EObkKvbdTkvPAvPJ -EOcKjvbdSxLLmzkY -DncKjvbdhgJcZVjV -EOcLKvbdZirgogBf -EOcKjvbdTukpKUBR -EPDLKvbdQlwaxmtz -DoCkKvbdNxOuzdNt -EPDLKvbduCbuXWPP -EPCkKvbdmbJvwoNu -EObkKvbdKDKCqJbx -EPCjjvbdyNsIXrhc -EPCkKvbdSCEEkiYk -EObkKvbdOFDshiLE -DoDKjvbdZnmiFEzK -EObkKvbdJbjDRKDY -EObkKvbdYfvdAOri -DncKjvbdkDLjpfuH -DoCkKvbdsrqsZZdc -DoDKjvbdLBLHNBwq -DncLKvbdDjHjWYKA -DoDKjvbdZQleIldq -DoDKjvbdatbGxKtI -EObjjvbdUWMQKUAq -EOcLKvbdlhdUQtrB -EPCjjvbdAMhZTWyx -DoCjjvbdjhGlGFmk -DoDLKvbdHgGzZXxH -EOcKjvbdrykoraIO -DoDKjvbdjJehJlwr -EObkKvbdrEEhonWB -EPCjjvbdiUyeWrUb -DnbkKvbdNQYRVmgT -EPCjjvbdVUNUFkuj -DnbjjvbdEYYMTtUM -DoDKjvbdYpldhldq -EPCjjvbdtlYWaTaX -DoCjjvbdozmdLXoA -DnbjjvbdZnnJFFZj -EObjjvbdZshiZDrn -EPDLKvbdZjShPfaf -DoCkKvbdrpVnibvG -DoCkKvbdQwNcblHc -EObkKvbdxZgefXdr -DoDKjvbdNddUIhkE -DncKjvbdcImJkFwY -DoDKjvbdZirhQGaf -DoDKjvbdqwPkcJZR -EPDLKvbdkHgLfFnL -DncKjvbdlqxuZrci -DncKjvbdRadFLiYk -EPDKjvbdIHGyxxXg -EObkKvbdmpZyVjyC -EPCkKvbdUaBqSpqy -EOcKjvbdqZOgfqDx -EObkKvbdkNBlZeGo -EObjjvbdOAIrsjSA -EPDLKvbdEvZPpNKF -DnbjjvbdczYoxZRC -DoDKjvbdvAdZTPEh -DncKjvbdqUTfqrKt -EPCkKvbdZGwEAPTJ -EPDLKvbdZMSEUNkm -EPCjjvbdYkqctNlN -DnbkKvbdeEnqawDK -DoCjjvbdKVuGEFHJ -EOcKjvbdzitopDsU -DnbjjvbdsBfNLgLZ -DnbjjvbdcImJkFvx -EPCkKvbdMgCpNQUk -EOcLKvbdZQmEhleR -EPDLKvbdtTRrxzEc -DncLKvbdKVuFceHJ -EPCkKvbdyfxlAMdw -DnbkKvbdsZkosBHn -EPDLKvbdwWlAvBVu -DoDLKvbdlqxuZrdJ -EPDLKvbdMRwMzUpz -EObjjvbdFkFTCgmV -EObkKvbdHEKvJbKK -DncLKvbdkNCMZdfo -DoCjjvbddoFSkTtS -EPCkKvbdRpTfjFdX -DoDKjvbdIGgZyYXg -EPCkKvbdBiLCLIfK -DoCjjvbdKQydnfNe -EPCjjvbdHgGzZYYH -DnbjjvbdYNqAYUvU -DncKjvbdGckVjBjK -DoCjjvbdjhHMFemk -DnbkKvbdkIGkeenL -DncLKvbdmaivwnmu -EPDLKvbdmuVZkJqf -EPDKjvbdNddUIhjd -DoCkKvbdRDbaQRES -DncLKvbdTvLojUBR -DncLKvbdtSrSxyeD -DncKjvbdjgflGFmk -DoCkKvbdQwNdDLgc -DoCkKvbdEXwksssl -DoDKjvbdtAHRIAAr -DoDLKvbdSPsgJecw -EObkKvbdjggLfGOL -DoCjjvbdSBdFLhxk -DoCkKvbdiMEdNuDZ -DoCjjvbdhtzFWrUb -EPCjjvbdSKxetgKs -DoDLKvbddndsLTtS -DncKjvbdtcCtwVno -DoDLKvbdACrYJzJQ -EOcLKvbdyOShXrhc -EObjjvbdqquKnKaN -DoCkKvbdnCJvxOnV -EPDLKvbdFWYpQMjF -DnbjjvbdnCJvwoNu -EObkKvbdhfjCyWKV -DoDKjvbdrNZjZLhJ -DnbkKvbdyNrgwsIc -EPCkKvbdSZjITDWA -DncLKvbdqiAJeNOe -DoCkKvbdhaoDEvpq -EOcLKvbdtkwwAtAw -DncKjvbdsPvOicWG -DoCjjvbdWXJYVcdg -DoDLKvbdmIdUQuSB -DnbkKvbdauBgYKtI -EOcLKvbdJbicRKCx -DoDLKvbdsPuoJcVf -EPCkKvbdfILWRnRH -EPCkKvbdAMhYrvzY -DoCjjvbdKWUedEfi -EPCkKvbdhaoDEvqR -EObjjvbdxVMeRZMO -DncKjvbdFaOqZJzm -DncKjvbdIryArlwl -EObkKvbdRWmccLgc -EPCkKvbdsPunibvG -EOcKjvbdQccBPpcr -EPDKjvbdssRsYzFD -DncLKvbdySmiMqbH -EObkKvbdZLqdTmlN -EPDLKvbdVAaqTQqy -DncLKvbdFWZPomJe -DoDKjvbdUVkojTaR -DncKjvbdULvPBWPJ -EObjjvbdUslsfLuj -DoDKjvbdsBfMlHKy -DoCjjvbdkySrTYgU -EPDKjvbdYgXEAPTJ -EOcLKvbdrzMPsAhO -DoCkKvbdcyxpXyRC -DncLKvbdkIGkeemk -EObkKvbdVqnXbElD -EObkKvbdMuSqkNAX -DncLKvbdkNCLydfo -EOcLKvbdUVlQJsaR -EOcKjvbdczZPxYqC -EObkKvbdWIXvXfxz -DoCkKvbddndsLTtS -DnbkKvbdFfJqmiUR -DncKjvbdURROuVIN -EObkKvbdddnrCXDK -DncLKvbdZyEJmcLr -EPCkKvbdVgxVxHYz -DoDKjvbdFfKRmiTq -EPDKjvbddCTNSAUN -DoDLKvbdUxgsykOn -DoDLKvbdBhjbLIfK -DoCkKvbdFejRmiTq -EPDLKvbdmuUykJqf -DoCkKvbdVTmTfLuj -DoCjjvbdkNCLydgP -DnbjjvbdHffzYxYH -EObkKvbdpxngfpcx -EPCjjvbdKQzFOfOF -DncLKvbdOEdThiKd -EOcKjvbdJSyBTNXl -DncLKvbdyNsIXriD -EOcLKvbdJYTagkpp -DoCjjvbdkMakzEfo -DoDLKvbdZjSgpGbG -DnbjjvbdSQUHJfDw -DncKjvbdRpTgJedX -DncKjvbdrykosBIO -EObkKvbdGYttaEYC -DoCkKvbdZxcjNcMS -DoCjjvbdRadElIyL -DoDKjvbdkySqryGt -EPDKjvbdiHJbyWJu -EPCjjvbdwzHeewdr -EPDKjvbdQwNccLhD -DoCjjvbdbBVeGPow -EOcKjvbdddnrCWcK -EPCjjvbdJXtCHkqQ -EObkKvbdrbFllHLZ -DncKjvbdACqxKZhp -DoCkKvbdJXtCILpp -DncKjvbdEYYMTssl -EOcKjvbdwjvdHzzG -EPDLKvbdemGWgMik -EPCjjvbdqvokcIyR -DnbkKvbdUaCQrprZ -DoCjjvbdKCjCqKDY -EPDKjvbdYSlBMtOx -EPDLKvbdyXiKBozL -EObkKvbdZxdKNcMS -EObkKvbdCDpBVjNG -DncKjvbdmgExMmgZ -EObjjvbdHkaznWqL -EObjjvbdkNCLzEfo -EPDLKvbdyNrgwsIc -DncKjvbdnHFYNNfy -DoCkKvbdDwwktTsl -EPDLKvbdTlWOaWPJ -DoDKjvbdmIctRVRa -EPCkKvbdeEnqbWbj -EPDKjvbdTYLMNzkY -DncKjvbdkHgLfGNk -DncLKvbdnPyxvLZC -EOcLKvbdjKGHjMxS -DoCjjvbdiZtfMROG -EPDKjvbdFeiqmhsq -EPDKjvbdDoDKjvbd -EOcLKvbdKRZeOfOF -DoDKjvbdzoQQeCkx -EObjjvbdEOcLKwDE -DoCkKvbdrafNLgLZ -EObjjvbdMfbomPuL -DncKjvbdUQqPUthN -EOcLKvbddjJrWUzn -DoDLKvbdvBDySoEh -DnbjjvbdVUMselVj -DoCkKvbddndrkUUS -EObkKvbdmpZxvKxb -EPCkKvbdmbJvxPNu -EPCkKvbdmfdwlnHZ -DnbkKvbdZRMdhmFR -DnbjjvbdYSlBNToY -DncLKvbdzoQRFClY -EPCkKvbdVZITzLOn -DncKjvbdZtIiZDrn -DncKjvbdFVxopNKF -EOcKjvbdtTSSxydc -EObjjvbdUVlQKTaR -EPDLKvbdkMbLzEgP -DoDLKvbdKDJcQicY -DoDLKvbdJmAEZgVB -EOcKjvbdCWzdJFPv -DncLKvbddneTLUUS -EObjjvbdBcoaWJlf -EPDKjvbdGcjvJbJj -DoCjjvbdddoRavcK -EOcLKvbdAMhZSvyx -DnbjjvbdajlGOmcA -DoCkKvbdCIkCLJFj -DnbjjvbdMSWmZtpz -EOcKjvbdNGcQMpUk -EOcKjvbdTqROuUhN -DoCkKvbdFVxoolie -DoDKjvbdUQpnuUgm -EPDKjvbdnBiwXnmu -DnbjjvbdJuuGDdgJ -EPCjjvbdZLqcsnLm -EObkKvbdZnmheEzK -DoDKjvbdXsMAltOx -EObkKvbdiMEdOUcZ -DoDKjvbdZRNEhleR -DoDLKvbdMIbLpxAS -DoDLKvbdVwIwucdg -DoCjjvbdRbDeLiZL -DncLKvbdZMRctNlN -DoCkKvbdGcjvJbJj -DnbjjvbdSZihScWA -EPDLKvbdkDLjqHUg -DnbjjvbdZisIPfaf -EObjjvbdmpZyWLZC -EOcLKvbdrbGNLgLZ -DnbkKvbdkVvmdBww -EObjjvbddoFSjstS -EObjjvbdxwiJbPyk -EPDKjvbdTvLoitAq -DoCkKvbdZLrDsnMN -DoDKjvbdOAJTUJrA -EObkKvbdURQntuHm -EObkKvbdkIGkefOL -DncLKvbdsCFllHKy -EPCkKvbdatafxKtI -DoCjjvbdiifHjMxS -DnbkKvbdZsiIyDsO -DncKjvbdieKgUoAO -EPCjjvbdBhkCLIej -DnbjjvbdDxXktTsl -EObkKvbdKCjCqKCx -EOcLKvbdIwsahLqQ -EPDLKvbdhzUfLpnG -EObjjvbdbAvEepPw -EOcLKvbdSLZFuHKs -DnbkKvbdIidAJogE -DnbjjvbdJbjDQicY -EPDLKvbdQwODblID -EObkKvbdqZOgfqEY -EObjjvbdkWWnDbXw -DncLKvbdEvZPpMjF -EPDLKvbdKQydnfNe -EObjjvbdUWMQJtAq -EOcLKvbdqrUjmkBN -DoDLKvbdJmAEZfuB -DoCkKvbdhtydvqtb -DoCkKvbdtAHQhABS -EPDLKvbdxZhGGXdr -EPDKjvbdmSZVZrci -DnbkKvbdZjTHogCG -EObkKvbdYqMdiMeR -DoDKjvbddwzUURez -DoDLKvbdbKlFnnDA -EPCkKvbdGGKSOJTq -EObkKvbdLGFgbBRV -DoCkKvbdKyQjSzuG -DncKjvbdJcJcRJcY -EOcLKvbdnBiwYPOV -EOcLKvbdLGGHaaRV -EObjjvbddneSkTtS -DoDKjvbdiLddOUcZ -EObkKvbdsPvOjCuf -DnbkKvbdZyEKOClS -DoCjjvbdyzeORhIh -DnbkKvbdhkeDmuCy -EObkKvbdvvkaWAvV -EOcKjvbdzeZnzdzQ -DoCjjvbdVAaprqSZ -EObjjvbdjhGkefNk -DncLKvbdSKxfVHLT -EPCjjvbdZRMeImFR -DncLKvbdFeirOJTq -DncLKvbdFfJrOItR -DoDLKvbdmoyyVkYb -DncLKvbdddoRavcK -DoDLKvbdauBfxKtI -EObjjvbdSPtHJfDw -EPCjjvbdCEQBWJmG -DoCjjvbdDnbkLWcE -EPDLKvbdVUNUGMVj -DnbkKvbdnQZyVjyC -DnbkKvbdgFkymfgA -DoDKjvbdRDcBQQdS -EOcKjvbdtcCuWvOo -EObkKvbdlrYuZrdJ -DoCjjvbdZirgogBf -DoDLKvbdMfcPmPuL -EOcKjvbdDwwlTtTl -DncLKvbdwXLaWAuu -EPDKjvbdUaBqSpqy -EObkKvbdHlBznXRL -EPCkKvbdkMakzFHP -DnbkKvbdqZOgfpcx -DnbkKvbdUMWOaWPJ -DncLKvbdMfbolpVL -EObjjvbdfekynGgA -EPCkKvbdWWiXvEFH -DoCjjvbdpxnhGqDx -DoDKjvbdsQVnjDWG -EObkKvbdYNqAXtut -DncLKvbdDnbkLXCd -EObkKvbdKaLGmBwq -DoCkKvbdBvzciFPv -DoDLKvbdjKFgilwr -EPCkKvbdUaBqTQqy -DoDLKvbdVgwvYHYz -EPDKjvbdIHGyyXwg -EPDKjvbdEXxMTstM -DnbkKvbdQccBPpcr -DnbkKvbdMgCpNPuL -EPDKjvbdSPtHKFcw -DoDKjvbdkIHMGFnL -DncLKvbdnGeXmNgZ -DoDLKvbdhtyeWquC -EObjjvbdqGEFUVaI -EOcLKvbdNPwpumgT -DnbkKvbdZshiYdTO -DoDKjvbdZMSETmkm -DncLKvbdRbDdkhyL -EPCjjvbdTvMQJtBR -EObkKvbdjvXOEBww -DncLKvbdrXPkbiZR -EOcLKvbdFejSOJTq -EOcKjvbdegjvRnRH -EPDLKvbdJvVGDeHJ -EObjjvbdXrlBMtOx -DncKjvbdFejSNhsq -EPDKjvbdBiLBjiGK -EOcKjvbddiirVtzn -EPDLKvbdVBBqTRRy -DoCkKvbdeqaWzkcP -EObjjvbdqYnggREY -EPDKjvbdEARiNZwX -EObjjvbdSQTfifEX -EObjjvbdLBLHNBxR -EPCkKvbdNHCpMpUk -EPCkKvbdKVuGDdfi -EPCkKvbdxrnImRbH -EOcLKvbdZRNEiNFR -EOcLKvbdtbcUvuno -EPCjjvbdJTZAsNXl -EPDLKvbdFVyQPljF -DoCkKvbdieKftoAO -EObkKvbdZMSETnMN -DoCjjvbddePSBvcK -DncLKvbdqUUHSSLU -DoDLKvbdZQldhmEq -DoDKjvbdOTTugFUp -DncLKvbdZsiJZESn -DnbjjvbdtbcUwWPP -EPDLKvbddwzTtRez -DnbjjvbdZoNheFZj -EPCkKvbdKfFgbApu -DoDLKvbdhytfMQmf -DnbkKvbdnGeXlnGy -EPCjjvbdSBcdlIyL -DncKjvbdbAvFFpPw -EObjjvbdzoPpeClY -EOcLKvbdqwQMDIyR -EPCjjvbdmaivxOmu -EPCjjvbdIwsahLqQ -DncLKvbdddoSBwCj -EOcLKvbdrEEhpNvB -DoCjjvbdEPCkKvcE -DncKjvbdePEsLTsr -DncKjvbdmRyVZsEJ -DnbjjvbdZLqdTnMN -EPDKjvbdRbEFMIxk -EObjjvbdJXsbHlRQ -DncKjvbdkDMLQftg -EOcKjvbdOEctJIjd -DnbkKvbdqTsfrRkU -EPDKjvbdkIGkeenL -DoDLKvbdUxhUZjnn -DncLKvbdwyhFexFS -EPDKjvbdbLLfOmcA -DnbkKvbdtbbuXWPP -EOcLKvbdYpmEhmFR -DnbkKvbdxmsHxTIc -DoDKjvbdznoqFDLx -EObjjvbdmfdxMnHZ -EObjjvbdYTMBNUOx -EObjjvbdADRwizJQ -EOcLKvbdMoxQvOGs -EOcLKvbdrWolDJYq -EPCjjvbdeFPRbXDK -DoDKjvbdrDdhpNvB -EPDKjvbdZxdKODLr -EOcLKvbdWSNwadlD -EOcKjvbdxrmhlqbH -DoDLKvbdzoPqEblY -DncKjvbdTkuoBWPJ -DnbjjvbdrykpSaHn -EOcKjvbdKWUfDdgJ -DnbkKvbdZMSEUOMN -EObkKvbdSBcdkhxk -DnbjjvbdIGfyyYXg -EPCkKvbdnBjWwoOV -EOcKjvbdzaAPGgBl -DnbjjvbdkVvmdCXw -DoDLKvbdkDLkQfuH -DoCkKvbdVqnXbFMD -DncKjvbdWWiXuceH -DoCjjvbdBvzdIePv -DncKjvbdLFfICBQu -DncLKvbdeFPRawDK -DncKjvbdjmBkydgP -EObjjvbdVUMtFkuj -EPDLKvbdrSUjmkBN -DoDLKvbdSPsgKFdX -DoDKjvbduDDVXVno -DoCjjvbdMuSqjmAX -EPCkKvbdZyEJmcLr -DnbkKvbdMfcQMouL -DoDLKvbdUMWPAuni -DnbjjvbddZxpYZRC -EPDKjvbdbAvEeopX -DnbkKvbddoErkUUS -DoCjjvbdePErjstS -EOcKjvbdGKeTDHlu -EObjjvbdfIKvSORH -EPCjjvbdUsmTelWK -EObkKvbdaMkBsVMg -DoCkKvbdRjxfVHKs -DnbkKvbdMpYQumgT -DncLKvbdVwIxWEFH -DncKjvbdaMkCTUmH -DoDLKvbdhlFENuDZ -EPCjjvbdZisIPgCG -EPCjjvbdZnnJEdzK -EPDKjvbdGLEsDINV -EObjjvbdYzcFrKVy -EPDKjvbdZirhPgBf -EPDLKvbdKaLGmCXq -EObkKvbddoErkTsr -DoCkKvbdRXNdCkgc -DoDLKvbdEvZQQNKF -DoCkKvbdZoNhdeZj -EPCkKvbdhkddNtby -EPDLKvbdZLrDtNlN -DncKjvbdRbDdlIxk -EPCkKvbdEOcKjwCd -DncKjvbdlqyUyrdJ -DoDLKvbdNddThhkE -EOcKjvbdwyhFewdr -EPDLKvbdiUydwSVC -DnbkKvbdYzcFqjWZ -DnbkKvbdiBoCdwRR -EOcLKvbdpecdsuaI -EPCkKvbdQlxCYnUz -EPDLKvbdVvhxWEEg -EOcLKvbdlZSqryGt -EPCkKvbdUaCQsQqy -DoCkKvbdvAdZSndh -DnbjjvbdmttykKRf -EPCkKvbdYgWdAPTJ -DoCkKvbdlYrqsZGt -DnbkKvbdZsiIxcrn -DoCjjvbddeOqavbj -EObkKvbdbVBfwjsh -EObjjvbdMoxQvOHT -EPCkKvbdRbEFLiYk -DoCkKvbdlhdTqUqa -EOcLKvbdMIbMRYAS -EObkKvbdDncKkWbd -DncLKvbdfSAvzkcP -DnbkKvbdxsOIlqbH -DoCkKvbdADSYKZhp -EPCjjvbdZshiZESn -DoCjjvbdieLGuPAO -EPCjjvbdkHgMFenL -EPDKjvbddBrlrAUN -DncKjvbdddoSCXCj -EPCjjvbdsQWOibvG -EObkKvbdKkBHvAKZ -EObjjvbdkWWmdBww -EObjjvbdnGeXmNgZ -EOcLKvbdyNrgwrhc -DnbkKvbdNddThiLE -DncKjvbdDjHivYKA -EObjjvbdWXIxWDdg -EObjjvbdrMyixlIJ -EOcKjvbdcyyPxYpb -DncKjvbdcyxowxpb -EOcLKvbdhbOcFXQq -EOcKjvbdHDjuibKK -DoDKjvbdiVZeXRuC -EOcKjvbdnBjXYOnV -DnbkKvbdOTTufdtp -DoDKjvbdVAbRTRSZ -DnbjjvbdRXOEDLgc -EOcLKvbdznopdcLx -DncLKvbdRNXayOUz -DncLKvbdSPtHKFdX -EPDKjvbdxUldqYkn -DoCkKvbdZRNEiNEq -EPDKjvbdrbFllGjy -EPCjjvbdUyHszLPO -DncLKvbdxwhibQZk -EOcKjvbdFWYopMie -EOcKjvbdaNKbTVMg -DnbjjvbdliETqUrB -EObjjvbdRXODbkgc -DnbkKvbdTlWPBWPJ -EOcKjvbdOFEThiKd -EObjjvbdMSXMzVQz -EObjjvbdHDkVjCKK -EPDLKvbdqFceTuaI -EOcKjvbdFyUtaDxC -EOcLKvbdmgExMnGy -DncKjvbdtlYWaUBX -DoDKjvbdCDoaWJlf -EPDKjvbdkyTSTYgU -DoCjjvbdqqtjnLAm -DnbjjvbdGYtuAdXb -DoCkKvbdBhjbLIfK -EPDKjvbdNPwqVmfs -DoCjjvbdsrqsYzFD -EPDKjvbdSPsfjFdX -EPCjjvbdZyDjNbkr -EPDKjvbdqZOgfpcx -EPCkKvbdqGDeUVaI -DoDKjvbdUVkpKUAq -DoCjjvbdRpUGjGEX -DoDLKvbdmgFYMmfy -EPDLKvbdRpUHKFcw -DoDLKvbdEvZQPmKF -DoDKjvbdZshhxdTO -DoCjjvbdiZuGMROG -DoDKjvbdfpBzvdYI -EPCjjvbdmgFYNOGy -EOcKjvbdNrtWGdtp -DnbjjvbdWHxVwgYz -EPCkKvbdJbjDRKDY -EPCjjvbduWOYJpsA -DncKjvbdehLVrORH -DoCjjvbdGFjSOItR -DoCkKvbdjuwODbYX -EObjjvbdJTZBSmXl -DnbkKvbdzQoNIiwA -EObjjvbdjJfHilwr -EOcKjvbdJpyeOfOF -DnbjjvbdqFdEsuaI -EPDLKvbdUxhTzKoO -EPDKjvbdBraCsfXS -DoCjjvbdLAjgNBxR -EObkKvbdlhdTqUrB -EPCjjvbdZoOIeFZj -DnbjjvbdrDdhpNua -EPCjjvbdIHHZxxYH -EPCkKvbdiMEdOVCy -DoDKjvbdhgJbxvKV -DoDLKvbdUyHsyjoO -DoDKjvbdGQATXGfZ -DnbjjvbdvAdYroEh -EPCkKvbdhtydvrUb -DoCjjvbdsQWOicWG -DncLKvbdcJMjLGWx -DoCkKvbdIwsaglQp -DoCkKvbdYkrEUOLm -EObkKvbdVvhxWDeH -EPDLKvbdZMRdTnLm -DoCjjvbdADRwizJQ -DoDKjvbdSwjkmzjx -DnbkKvbdBiKbLIfK -EPCjjvbdRyigsDWA -EPDKjvbdRXOECkhD -EObjjvbddxZtTqez -EObjjvbdbBVdfPow -DncLKvbdMfcQNQVL -EPDKjvbdVBBqTQrZ -DncKjvbdZMRctOLm -DncKjvbdGGJrOIsq -EPCjjvbdZMSETmlN -DoDLKvbdhlEdOVDZ -EOcLKvbdOhAXyAZB -DoCkKvbdyOTIYSiD -DoCjjvbdUtNUGMVj -EObkKvbdWXJYWDdg -EOcLKvbdBhjbKhej -EObkKvbdVwIwvDdg -EPDLKvbdzjUpQDsU -EOcKjvbdqAiFAXHd -DoDLKvbdqrUkNjaN -EOcKjvbdYORAYUvU -EOcLKvbdcIljLFwY -DnbkKvbdVwJXvDdg -DoDKjvbdVBCQsRSZ -DoDLKvbdmuUzKiqf -EObkKvbdJYUCILpp -EPDKjvbdsQVoKCvG -EPDLKvbdmoyyVkZC -EPDLKvbdsCGNLfjy -EOcKjvbdbiNKLGWx -DoCjjvbdrpVnjDWG -EObkKvbdfVzxPizs -DnbkKvbdRXODcLgc -EPCjjvbdjJfIJlxS -DoCjjvbdZLqcsnLm -DncKjvbdjuvnECXw -DoDLKvbdEPDKkXCd -DnbjjvbdOSsvGduQ -DoDKjvbdIMBzmvpk -EPCjjvbdqrUkOLAm -EPCjjvbdTkvOaVoJ -EObjjvbdozmdKwoA -DncLKvbdDxXkstTl -EOcKjvbdfMewHMik -DoDLKvbdGKeTCgmV -EObjjvbdxnSgwsIc -EPCkKvbdaaVdepPw -EObkKvbdqGEFUVaI -DncLKvbdjblKpgUg -DoDLKvbdRWnEDLhD -DnbjjvbdFxuVAcxC -DncKjvbdqZOhGpcx -DoCkKvbdfHjvRnQg -DnbkKvbdwMvANDeN -EObkKvbdFfKSOIsq -DoCjjvbdmajXYPNu -EObkKvbdANHyTXZx -EPCjjvbdLFfHbAqV -DoCjjvbdVgwuxHYz -EPCjjvbdQvmcblHc -DoDKjvbdaSFbhUGL -DncLKvbdzHZMANFX -DncKjvbdySnJNRbH -DoCjjvbdMpYRVnHT -EObkKvbddePSBwDK -EPCkKvbdMfcPmQUk -EObjjvbdMgCpNQVL -DoDKjvbdrEFIonWB -DoDLKvbdFjdsCgmV -EObjjvbdwtmFRYlO -DnbjjvbdIwtBgkqQ -EPCjjvbduaDxrndh -EPDLKvbdShzKRABM -DnbjjvbdfHjvRnRH -EOcKjvbdBiLBjiGK -EPCjjvbdCEPaWKNG -DoDKjvbdtbbuWuoP -DoDKjvbdegkWRmqH -DnbjjvbdNeETiJLE -EPCkKvbdjcLkRHUg -DnbjjvbdjvXOEBww -EOcLKvbdTlWPAvOi -DoCjjvbdrMyixkhJ -EObkKvbdqGEEtWAh -DncKjvbdbBVeGQPw -DoDLKvbdpssfqqjt -DnbkKvbdFWZPomJe -DoDKjvbdSBcdkiYk -DoCkKvbdvBEZSoFI -EOcKjvbdRaceLhxk -EOcKjvbdJKEAKQHE -DoDLKvbddZyQYYpb -EObjjvbdeXzTsqez -DncLKvbdCSaCtGXS -EPCkKvbdlZSrSyHU -EOcLKvbdTJZiqABM -DncLKvbdvAdYsOdh -DnbkKvbdcyxoxZQb -DnbkKvbdhanbdwRR -EPCjjvbdbBVeFopX -DncKjvbdGLFTDHmV -DoCjjvbdiZuGLpmf -EOcLKvbdJbjCqJbx -EObkKvbdGdLWJbKK -DoCjjvbdRkZGVHKs -DoCjjvbdGckWJajK -DncKjvbdAMgxrvyx -EPCjjvbdEPDKjvbd -EOcLKvbdkDLjqGtg -DoDLKvbdNPxRVnGs -DoDKjvbdySmhmRag -EPCjjvbdVqnXadkc -EPDKjvbdTulPitAq -EObjjvbdGLErcHlu -DoDLKvbdHELWKCJj -EObjjvbdbVCHYLUI -DncKjvbdqvpLbiZR -EPCjjvbdvAdZSoFI -EOcLKvbdfjfzcGAE -DnbjjvbdaNKartmH -EOcLKvbdcTDKsdJa -DncLKvbdOSsufduQ -DnbkKvbdyYIiapZk -DoCjjvbdunszqKoU -DoCkKvbddndsLTsr -DoDKjvbdxxJKBoyk -DoDLKvbdrovOibvG -EPCkKvbdiLddOVDZ -EPCkKvbdiBncFWqR -EOcLKvbdZQldiNFR -DoCkKvbdOEctJJKd -DoCkKvbdrMzKZMIJ -DnbkKvbdVhYVwgYz -EOcLKvbdQvnDblHc -DoDLKvbdmJEURVRa -DoDLKvbdCTBDUFwS -EPCkKvbdNrsvHEuQ -DnbkKvbdegkVqnRH -DoCjjvbddBrlrATm -DoCkKvbdCJLCLJFj -EOcKjvbdxZgefXeS -EPDKjvbdZtJJZDsO -DoCkKvbdQvmdDMID -DoDLKvbdRaceLhxk -DnbkKvbdSBdFLhxk -DoDKjvbdOTTufdtp -DoDLKvbdnQZxujyC -DnbjjvbdZshhyETO -DoCjjvbdtvOYJqTA -DncLKvbdRMxBxmtz -DnbjjvbdEzsqElCi -EObjjvbdKefHbAqV -DnbkKvbdmpZyWKyC -DncLKvbdNQXqWOGs -EPDLKvbdVTlsekuj -EPCkKvbdGcjvJajK -EPDLKvbdIryArlxM -DoDLKvbdwyhGFwdr -EPCkKvbdzaAOgGal -DncLKvbdiHKCxvJu -EOcKjvbdLBKgMbXq -DoCjjvbdTppoVVIN -EPDKjvbdNPxQvOHT -DnbjjvbdTvLpJsaR -DncKjvbdnVUyjiqf -EPCjjvbdVUNTfLvK -EOcLKvbdDxYLtTtM -DnbkKvbddePSCXCj -EPDLKvbdgGLzOHHA -DoCkKvbdTukpKTaR -DncLKvbdVUMtGMWK -EObkKvbdXnRAYVWU -DncLKvbdyqOmJJwA -DoDKjvbdFVyQQNKF -DncKjvbdvOszqLOt -EPCkKvbdZRMdhmFR -EPDLKvbdhlFDmuCy -EOcKjvbdkIHLeenL -DnbjjvbdqceJQOWB -DoCkKvbdzitpPdSt -EPCjjvbdFeiqmhtR -DoDLKvbdsQVoJcVf -EPDLKvbdUQpnuVIN -DoDLKvbdWSNxBdlD -EPCjjvbdpyPHgQcx -EOcKjvbdUyHsyjoO -DoCjjvbdxrnJNSCH -DoCjjvbdKDKCpjCx -EPDLKvbdxsOIlrBg -DoCkKvbdnGdxMnHZ -EPDLKvbdfHkWSNpg -DnbjjvbdkHgMGFnL -EOcLKvbdxmsIYSiD -DoDLKvbdEXxLsssl -DoDKjvbdjFLGuPAO -EOcLKvbdeEoRawCj -DoDKjvbdyOTIYSiD -DnbjjvbdIHGyyXxH -DncKjvbdTqQoUuHm -EOcKjvbdMfcQNPuL -DnbkKvbdatbGxKsh -DoDKjvbdOTUWHEtp -EPCkKvbdGLFTCgmV -DoDKjvbdkHfkfGNk -EObjjvbdJXtBhMRQ -EObkKvbdRpUHKGEX -DnbjjvbdiUzFWrVC -EPCkKvbdliETqUrB -DnbkKvbdZjTIQHBf -DoCjjvbdZMSETnLm -EPDLKvbdFWYoomKF -EPDLKvbdRaceLhxk -DoDLKvbdEASJNZwX -EPDLKvbdGZUtaEXb -DncLKvbdyNrgxSiD -EOcKjvbdbVBgXkTh -EPCkKvbdvOszpkOt -EObkKvbdKfGHbBRV -DncLKvbdjvXOEBxX -EPDLKvbdvAcyTPFI -EObjjvbdNsUWGeUp -EPCjjvbdZtIiZDrn -DoDLKvbdrRtkOLBN -DncKjvbdptUHSSLU -DncLKvbdWSOXaeLc -EPCkKvbdiLeDmuCy -DoCjjvbdhyuFkqNf -DnbkKvbdzoPqFDMY -DoCkKvbdGFirOItR -DoCjjvbdEObjkXCd -DnbkKvbdjKFgilwr -EPDLKvbdVwIwvEFH -DoDKjvbdfIKvRmpg -EPDLKvbdOFDsiIkE -EPDLKvbdGKdrcIMu -EPDKjvbdZnmiEeZj -DoDKjvbdKWVFceHJ -DncKjvbdvBDySneI -DncKjvbddeOqawCj -DoCkKvbdEztRFLbi -EPDKjvbdMpXpumgT -EPDKjvbdtunYJqTA -EPCjjvbdegkVqmpg -EObjjvbdlYsRsZHU -EOcKjvbdbUagXkUI -EPDLKvbdANHySvyx -DnbkKvbdmJEUQtqa -EPDKjvbdVUNUFlVj -EPCkKvbdvvlBVaVu -DoCjjvbdmozZWLYb -DoDKjvbdwzIFfXeS -DoDLKvbdNQXpvOGs -DncLKvbdEYXlTstM -EPCkKvbdbUbGwkUI -EOcLKvbdLBLHNBxR -DnbkKvbdePErkUUS -EObjjvbdyXiJaoyk -DncLKvbdVrNxBeLc -DoCjjvbdaRebhUGL -EOcKjvbdxsNhmSBg -EOcKjvbdXrkaMsoY -EObjjvbdhuZdwSVC -DoCkKvbdqGEFUWAh -DoDKjvbdegkVrNpg -DoCkKvbdtcCtvuoP -EOcKjvbdmJEUQtrB -EOcKjvbdWXIwucdg -DoDLKvbdhgKCyWJu -EPCjjvbdcSbkUDjB -EPDKjvbdLrWmZuQz -EPDLKvbdXrlAlsnx -DnbkKvbdKNADygUa -EPDKjvbdyNrhXsJD -EOcLKvbdIsZBSlxM -EPCkKvbddndrkTsr -DnbjjvbdFyUuBEYC -EPCkKvbdJcKCpjCx -EObkKvbdbBWFGQPw -EOcLKvbdFjdrbhNV -EPDLKvbdrDdiQNvB -EObkKvbdkHgMGGOL -EPCkKvbdkySrSyHU -DncLKvbdaaWEfQQX -EObkKvbdehKvRmpg -DnbkKvbdmIdURVRa -DoDLKvbdvBEZSneI -DoCkKvbdNdcshhjd -DncLKvbdZyEKOCkr -DoCkKvbdVrNwbFMD -DnbkKvbdnCKXXoNu -EPDKjvbdSQTgKGDw -EObkKvbdaRfCgtFk -EObjjvbdkWXNcaww -EObkKvbdDihJuxKA -DncLKvbdnVVZkKSG -EPCkKvbdVBBqSpqy -DncLKvbdqGEFUWAh -DoCkKvbdsPvOjDWG -DncKjvbdySmiNRbH -DoDKjvbdraemLfjy -DoDLKvbdnPzZWKxb -DnbjjvbdRjxfVGkT -DoDKjvbdGLEsDHlu -DnbjjvbdRotHKFdX -DoCkKvbdRpUGiecw -DnbjjvbdZjTHogBf -EPDKjvbdcTCjtDia -EOcKjvbdrounibuf -EOcKjvbdVBCRSqRy -EPDKjvbdEvZPolie -DnbkKvbdzRPNJKXA -DncLKvbdBhjbKiGK -DnbkKvbdqrVKmkBN -DnbjjvbdBraDTewS -DnbkKvbdJcKDRJbx -DoCjjvbdbUbHYLUI -DoDKjvbdUyITykOn -DoCkKvbdYlSEUOMN -EPCkKvbdRpUHKGEX -EObkKvbdTAFJICPE -EPDKjvbdrpWPJcVf -DoCkKvbdZnnJFFZj -EPCkKvbdkVvmcaxX -EOcKjvbdyzdnRgiI -EObjjvbdqAiFAXIE -DncLKvbdWWiYWDeH -EPCjjvbdqlzKZLgi -EObjjvbdauCGwkUI -DoDLKvbdtTSSxydc -EObkKvbdbVCGxLTh -EObkKvbdkWWmdBxX -EObjjvbdRNXaxnUz -EOcKjvbdwXLaVaVu -DncKjvbdqTtGqrKt -DncKjvbdIjEAJpGd -EPDKjvbdHffyyXwg -EObkKvbdSCEFLiYk -DncKjvbdiVZeXRuC -DoDLKvbdWWhwudFH -EPDLKvbdrRuKmkAm -EObjjvbdxsNhlqag -EPDKjvbdcJMikFwY -DoDKjvbdpyPHfpdY -DncKjvbdwyhGGXdr -DoCkKvbdkVwODbXw -DncLKvbdJcJbpibx -EPCkKvbdsQWPJcVf -EOcKjvbdZRNEiMdq -EObkKvbdjvXOECXw -EObjjvbdZxcjODLr -DncKjvbdRWmdDMID -DncKjvbdjvWmcbYX -DoCjjvbdnBjXXoOV -DncKjvbdiBnbdwQq -EPDKjvbdDoDKjwCd -EPCkKvbdFxuVBEYC -DncKjvbdFVxopMie -EOcLKvbdKWUfEEfi -EPCkKvbdNrtVgEtp -DoDLKvbdfoazwDxI -DoDKjvbdqquKmkAm -EPDKjvbdhbPCeXRR -DncKjvbdZtIhyETO -EPCkKvbdQwNdCkhD -EPDKjvbdhzUfMROG -DnbjjvbdrpVoKCuf -EPDLKvbdtlYWaUAw -EOcLKvbddoErjstS -DnbkKvbdyzeORghh -EPDLKvbdZnmhdeZj -DoCjjvbdcIlikGXY -EOcLKvbdLAkHNBxR -DoCjjvbdtkwwBUAw -DoCjjvbdgGMZnHHA -DnbkKvbdUsmTfLuj -EOcLKvbdqZPHgQcx -EPDLKvbdLqvlytpz -DoDLKvbdqdFIomvB -EObjjvbdBhjbKhfK -EOcLKvbdrMyjYlIJ -DncKjvbdDncKkXCd -DnbkKvbdNQXpunHT -EPDKjvbdZjSgofbG -DnbjjvbdBiKbLIej -DoCjjvbdGAoQxizm -EOcLKvbdwtldqZLn -DoDLKvbdIrxaSmXl -DoCjjvbdNHDQMpUk -EOcLKvbdTkunaWOi -DncLKvbdNHCpMpVL -DoDKjvbdelfXHNKL -EObjjvbdcyxpYYqC -DoDLKvbdZGwEAOri -DoDLKvbdIxUCHkqQ -DoCjjvbdoznEKxPA -EOcKjvbdbLMGPNcA -EObjjvbdiiegilxS -DoDKjvbdZRNFImFR -DncLKvbdRbDeLhxk -EPCkKvbdqlzJxlHi -EOcLKvbdhkeDnUby -EPCjjvbdhaoDEwQq -EPCkKvbdFkFScHlu -EPCjjvbdJKEAKQGd -DoCkKvbdpxngfqDx -EObjjvbdUGznLwWF -EObjjvbdVZHsykPO -DncLKvbdYlRdUNlN -EPCkKvbdHDkWKBjK -DncLKvbdjKFhKMxS -DnbjjvbdnBjWxPOV -EObkKvbdtcCtvvOo -DnbjjvbdTpqPUthN -DncLKvbdMoxQvOGs -DnbjjvbdfNGXHMjL -EPDKjvbdhgJcZVjV -DoDLKvbdNGbolpVL -EPDKjvbdatbHYLUI -DncLKvbdczZPwxqC -DnbjjvbdZxcimblS -EPDLKvbdKaKgMbXq -EOcLKvbdtbcUwWOo -DnbkKvbdJutfEEfi -DoCjjvbdmIdURUqa -EPCjjvbddBrmSATm -EPCkKvbdXsLaNUPY -DnbkKvbdNPwpvOGs -EOcKjvbdIwsaglQp -DoCkKvbdlhdUQtrB -DoDLKvbdGdLWJaij -DoCjjvbdwXMAvAvV -DnbkKvbdbrbkTdJa -EPDKjvbdFVxpQNJe -DoCjjvbdHDkWJbKK -DnbkKvbdjvXODbYX -DoCjjvbdemFwGmJk -DoCjjvbdQdCaPpcr -EOcKjvbdqcdiQNvB -DncLKvbdbBWFFoow -EOcKjvbdKaKgMawq -EObkKvbdLBKgMawq -DncKjvbdcbSmSAUN -DoCjjvbdyOTHwsJD -EOcLKvbdOStVfeUp -EObkKvbdHffyyYXg -EPCjjvbdmuUykJrG -DoDLKvbdJYTbILpp -DncKjvbdnGdwlmgZ -EPDKjvbdZQldhldq -EObjjvbdUaBpsRSZ -EOcKjvbdrzLpSaIO -DnbjjvbdLGFgbAqV -EPDKjvbdXrlAmUOx -EPDLKvbdtSqryZeD -DoDKjvbdtlXwAtAw -DoDKjvbdaRebgsfL -EObjjvbdUWLpKUAq -EObjjvbdQvmccLgc -EOcLKvbdznopeDMY -EOcLKvbdIwsbHkpp -EPDLKvbdziuQPcsU -EPDLKvbdelevgMik -DoDKjvbdTAFIgbOd -DoDLKvbdbBWFGPow -DoDKjvbdYqNEiMeR -EOcLKvbdhficYuiu -EOcKjvbdyTOImRbH -DncKjvbdiLeDmtby -EPDLKvbdUsmTekvK -DoCkKvbdkCkkQftg -DoCkKvbdVTmUFlVj -DoCkKvbdTIyjRAAl -EOcKjvbdbUafxKtI -EOcKjvbdZsiIxdSn -DoDKjvbdSCEElIyL -DnbjjvbdBsAbsfXS -DoCkKvbdBcpAuimG -DoCkKvbdVwIwvEEg -DnbjjvbdajlFoNcA -EPCkKvbdtSrTYzFD -DnbkKvbdGFirNhsq -EOcKjvbdapHHELzd -DoDLKvbdiUyeXSUb -DnbjjvbdtAGqIABS -DnbkKvbdXsLaMsnx -DoCkKvbdeEnqawDK -EOcKjvbdDxXkstUM -DnbjjvbdcyxoxZQb -DoDLKvbdlrZVZrci -DoCkKvbdTAEiICPE -EOcLKvbdpyPHfpcx -EPDLKvbdVBCRTQqy -DnbjjvbdmJEUQtqa -DnbjjvbdkClKqHVH -EObkKvbdCJKajiGK -EObkKvbdeAURMxJf -EPDLKvbdcSbkUDjB -DncLKvbdsCFmLfjy -EPCkKvbdIwsahLqQ -DoCkKvbdrJAJeMne -DoDLKvbdIHGzYwxH -DoCjjvbdGckVjBjK -EObjjvbdegkVqmqH -DoDLKvbdLKaIWAKZ -EPDLKvbdaRfChUGL -DoDLKvbdyYJJaozL -DoCkKvbdrWpLbhyR -DoCkKvbdLGGIBaRV -DoDKjvbdKyRJrztf -DoCkKvbdjuvnEBxX -EObkKvbdNeEThhkE -EPCjjvbdQwNcbkhD -DoCkKvbdJqZePGOF -EObjjvbdNGbomQUk -EObkKvbdkxrqsZHU -EOcLKvbdrounjDVf -DoDLKvbdkClLRGtg -EOcLKvbdbKkfOnDA -EPCkKvbdRDbaPpcr -EPDLKvbdkHgLefNk -EOcLKvbdFVxpPmKF -EObkKvbdsrrSxzEc -DnbkKvbdFeirOIsq -DncLKvbdzitopDrt -DoCjjvbduWOXjQsA -EPCkKvbdyXhjCPyk -DoDKjvbdaaWEfPow -DncLKvbdvAcySneI -EObjjvbdADRwjZhp -EObkKvbdnPyxvLYb -DncKjvbdijGIJlwr -EPCjjvbdJcJbqJcY -DnbkKvbdkMbLydgP -DoCkKvbdRDbaQQcr -DoCjjvbdxsOIlrCH -DnbjjvbdKQydnfOF -EPDKjvbdcImKKfWx -DnbjjvbdcImKKewY -EObkKvbdqdFJPmua -EObjjvbdajkennDA -DnbjjvbdZyEKNcLr -DoCjjvbdKWVFdEgJ -EPDKjvbdWXIwuceH -DnbjjvbdqiAJdlne -EOcLKvbdkyTRryGt -EPCjjvbdpaJFAWgd -EPCjjvbdmJDsqVSB -EPCjjvbdREDAopdS -DoCjjvbdRpUHKFdX -DncKjvbdptUHSSKt -EPCjjvbdiCObdvpq -DncLKvbdNwnuzcmt -DncKjvbdqdFIpOWB -DoDKjvbdjggLefNk -EObkKvbdrNZiyLgi -EPCkKvbdaSFcITfL -DnbjjvbdGLFTDINV -EPCkKvbdiLeENuDZ -DncLKvbdZyEJmcLr -EObjjvbduDCuWvOo -DoDKjvbdNQXqWNgT -DncKjvbdVBCRTRRy -EPCjjvbdSQUGifEX -EOcLKvbdANIZSvyx -DoDKjvbdvBDyTPFI -DnbkKvbdEPCkLWbd -DoCkKvbdyYIjCPyk -DnbkKvbdelewGmKL -EPDLKvbdatbGxLUI -EPDLKvbdTvLojTaR -DoCjjvbdhtyeWrVC -DoDKjvbdzeZnzdzQ -DnbjjvbdyzdnRhJI -EPCjjvbduLxWaUBX -EOcLKvbdkyTRsYgU -DnbjjvbdCTBCsewS -EObjjvbdjAPgApHK -EPDLKvbdwkWdHzyf -EObjjvbdsPvOicWG -DoCkKvbdTulPisaR -DnbkKvbduCcUvuoP -EObkKvbdZRMdiMeR -DoCkKvbdSPtHJfDw -DncLKvbdKaLGlaxR -DnbkKvbdRpTgKGDw -DoCjjvbdWXJYWEEg -EObjjvbdWXJYWDdg -EOcKjvbdKCjCqKCx -DnbkKvbdakMGPNcA -DoDKjvbdwkXDgzzG -EObkKvbdNHDPlotk -DncLKvbdyzdmrIJI -EObkKvbdFkErbhMu -EPCkKvbdNeDsiIjd -DoDKjvbdIGfyyXxH -DoCjjvbdZyDinDLr -EPCjjvbdemFvfmJk -EObjjvbdJYTbILqQ -DnbjjvbdWXIwucdg -DoCjjvbdiHKCxvJu -EPDKjvbdfpBzwDxI -DoCjjvbdaNLCStlg -EPCkKvbdnVUykJqf -DoCjjvbdyYIjBozL -EPCjjvbdzjUpQDsU -DoDLKvbdZxcjOCkr -EPCkKvbdeFOrBvcK -EPDKjvbdKaKflaxR -EOcLKvbdfMevgMjL -EPDKjvbdGckWKCKK -DoCjjvbdKVuFdEgJ -EObjjvbdfMfWfmJk -DoDLKvbdMfbomQVL -EPDLKvbdRkYeuGjs -EOcLKvbdKfGHaaQu -EObkKvbdoznDjwoA -EOcKjvbdUMWPBVoJ -DoCkKvbdFjeSbgmV -EPCjjvbdrEFJQOWB -EOcLKvbdvAcyTOdh -DnbjjvbdWfYzUAOs -EObkKvbdTkuoBWPJ -DnbkKvbdFpASvgFy -DoCjjvbdczZQXyRC -DoCjjvbdRDcBQQdS -DoDKjvbdqYngfqDx -EObkKvbdWRmwbElD -EPCjjvbdFyVVBDwb -EObjjvbdBhjbKhej -DncLKvbdzaAPGgBl -EObkKvbdTppoVUgm -DoCjjvbdbrcLTcjB -EPCkKvbdGLFTCglu -DoDLKvbdDwxMUUUM -EPCjjvbdNQYQumgT -DncKjvbdmfeXmOGy -EPCjjvbdwtmFRYkn -DoCkKvbdsBfMlGjy -DncLKvbdRpUHKGDw -EObjjvbdjblLQfuH -EObjjvbdJYTbHlRQ -DoCkKvbdmttyjiqf -DoCkKvbdZQldiMdq -EPDKjvbdFejSNiUR -EOcLKvbdjgfkfFnL -DnbjjvbdMpYQvNgT -DnbkKvbdUyIUZjnn -DnbkKvbdJbjDRKDY -EPCjjvbdeEnrBvcK -EOcKjvbdyzdnSIIh -DoDKjvbdDoDKjwCd -DoDLKvbdCSaDUFwS -DoDLKvbdIrxaTMwl -DnbkKvbdRNXayNtz -DoCkKvbdxxJKBoyk -DncLKvbdnGdxNOGy -DnbjjvbdySmhlqbH -DoCkKvbdxwhjBoyk -EPCjjvbdZQleIleR -EPCjjvbdaRfChTek -EOcKjvbdYTMBNUPY -DoCjjvbdegkWSNpg -EObkKvbdziuQPdTU -EOcKjvbdnCKXYOmu -DoCkKvbdZnmhddzK -EObjjvbdzaAPGgBl -DoDLKvbdePFSjtTr -EPCkKvbdNrtWGeVQ -EPCjjvbdelfWfmKL -DoDKjvbdKxpjSztf -EPDKjvbdxmsIXsIc -EPCjjvbddZyPxYqC -DoDKjvbdvOszqLOt -DncKjvbdatbGxLTh -EObjjvbdzoQQdbkx -DoCjjvbdZRMeImEq -EOcKjvbdqTtGqqjt -EOcKjvbdqAheAWgd -DnbjjvbdySmhmRag -DncKjvbdjKFhJlwr -EPDKjvbdqFceUWBI -DoDKjvbdsBemLgLZ -EPDLKvbdKQzEoFnF -EOcKjvbdFjdsCgmV -EObjjvbdpfEEtWBI -EPDKjvbdZxcjOClS -EPDKjvbdnBivwoOV -EPCjjvbdrylQTAhO -EPDKjvbdKaLGmBxR -EPDKjvbdHgGzYwxH -EObjjvbdkHflGFmk -DnbjjvbdqGDeUVaI -EPDKjvbdMgDQNQUk -DncLKvbdSKyGVHKs -EOcKjvbdqFdEsvAh -EOcKjvbdYkrETnLm -DnbkKvbdqBIeAXHd -DncLKvbdZQldhmFR -DncLKvbdFjeSbhMu -EPCkKvbddePRavcK -EPCkKvbdssRsYzEc -EPCkKvbdRadFLhxk -DnbkKvbdVvhxWEEg -EOcLKvbdIryArmYM -EPCkKvbdKfGHbAqV -DncKjvbdEKIJuxKA -EPDKjvbdIwsbIMRQ -EObkKvbdzaAOfgBl -DncLKvbdeUAUASlv -DnbjjvbdlqxuZsDi -DnbjjvbdUWMQKTaR -EOcLKvbdNGbpNPtk -EPDKjvbdWSOYCEkc -DoCkKvbdjggMGGOL -DoCjjvbdSQUHJecw -DncLKvbdZyDjODMS -EObjjvbdfpBzvcxI -EOcLKvbdTlVoAvPJ -DnbjjvbdVviYWEFH -EPCkKvbdZnmiFFZj -EObjjvbdNGbpNQUk -DoDLKvbdrbGMkfjy -DoDLKvbdxnShYSiD -EObkKvbdJYTahMRQ -DoDLKvbdoAKzshEO -DoCkKvbdZxcjOCkr -EPDLKvbdRWmdCkgc -EPCkKvbdGFiqnJUR -DoDKjvbdRzJgsDWA -DncLKvbdptTfqqjt -EPDKjvbdmIctRUqa -EObkKvbdnBiwXoOV -DnbjjvbdfMevfljL -EObkKvbdBraDUGWr -DncKjvbdUxhTzKnn -DoCjjvbdmfdxMmfy -DnbjjvbdhuZeWrVC -DnbkKvbdLiCLpxAS -DnbjjvbdKfFgbApu -DnbjjvbdziuPpETU -DoCjjvbdwuNEqZLn -EPCkKvbdEXwksssl -EPCjjvbdhgKCxujV -DoDKjvbdhlEdOVDZ -DncKjvbdLAjgMbXq -DncKjvbdOFEThhkE -DoCkKvbdANHxrvzY -EPCjjvbdZtIiZDrn -DoCjjvbdYpldhmEq -DncLKvbdqwPlDIyR -DncLKvbdUtNUFlWK -EObkKvbdkWXODbYX -DnbjjvbdRzJhSbvA -DoCkKvbdEJgjVxKA -DncKjvbdxnSgxShc -EObjjvbdbUbHYKsh -DncLKvbdZoNiFEzK -EPDKjvbdbiMjKevx -DnbkKvbdIwsbHlRQ -EObjjvbdhWyAzzAJ -EObkKvbdqvpLcIyR -EObjjvbdGGKSOIsq -EObkKvbdTpqPUthN -DncKjvbduaEZTOdh -EObkKvbdJJdAJofd -DoCkKvbdEKIJuwjA -DncLKvbdDnbjkXDE -DnbjjvbdhbObdwQq -EObjjvbdunszpkPU -EPCjjvbdwNWANDdm -EPDLKvbdozmcjxPA -EObjjvbdZnmiFFZj -DnbjjvbduDDUwVno -EOcKjvbdZjShPfbG -DncLKvbdADSXiyhp -DoCjjvbduCcVXWPP -DnbkKvbdffLzOHHA -DncLKvbdBdPaWJlf -EPDLKvbdJvVGEFGi -EPCkKvbdvwMBWBWV -EObjjvbdijGHjMxS -EPCkKvbdaNLCTVNH -EPCjjvbdbAudeopX -DoDKjvbdozmcjwoA -EPCjjvbdYlRctOMN -DoCjjvbdDoDLKvcE -EObkKvbdVqmwaeMD -DnbjjvbdqvolChyR -EPCkKvbdRkZGVGjs -DoDKjvbdjvXOEBxX -DoCjjvbdIHHZyXwg -DnbkKvbdLBKgNCYR -EPDKjvbdyNsHxShc -EOcKjvbdyzdmqhJI -DnbjjvbdqFcdtVaI -EObjjvbdrJAKElne -DncKjvbdTvLpJtAq -EObkKvbdDoDKjvbd -EPCjjvbdYlRcsnLm -DoDKjvbdegkVqmqH -EPDLKvbdZHXEAPSi -DoDKjvbdakLennDA -DncLKvbdrDdiPmua -DoCjjvbdhbPDEwRR -EPDLKvbdtcDUvuno -DnbjjvbdEKHjVxKA -EOcLKvbdYqMdhmFR -EPDLKvbdmttzKiqf -EPDLKvbdTkvPAuoJ -DncLKvbdVAbRTQqy -DncLKvbdLBKflbYR -DoCjjvbdZyDimcMS -EOcKjvbdFpATXHFy -EObkKvbdnCJwYOmu -EPCkKvbdVZHszLPO -EPCkKvbdCSaDTfXS -DncKjvbdNVSqjmAX -EPCkKvbdFjdrbhMu -EPCkKvbdbsCkUDjB -EObjjvbdMowpumfs -DoDLKvbdRotHJecw -DnbjjvbdTfzmkwWF -EObjjvbdBcpAvKNG -DoDLKvbdWHxWXfxz -EPCjjvbdqUUGrSKt -DncLKvbdliDsqVSB -DnbkKvbdBdQAujMf -DnbkKvbdWXIxVcdg -DoCkKvbddePSCXCj -DnbjjvbdZirhPfbG -DnbjjvbdyXiKBozL -DnbjjvbdznpREcMY -DncKjvbdJcKCqKCx -EPCkKvbdJbibpjDY -EPDLKvbdkClLRHVH -EPDKjvbdTvLoisaR -EOcKjvbdZGwEAPSi -EPCkKvbdKRZdnenF -DncKjvbdfMfXGmJk -EPCkKvbdhfibyWJu -EOcKjvbdMIbLqYAS -EPDLKvbdbUbHXjtI -EObkKvbdCSaDUFwS -EPDLKvbdGGJqnJUR -EOcLKvbdDoDKjvbd -DnbjjvbdFkFTDIMu -DnbjjvbdgFlZnGgA -DoCkKvbdakLfPODA -EPDLKvbdDwwlTstM -DoCjjvbdMJBkqYAS -DnbjjvbdiGjCxujV -EPDLKvbdVwIwuceH -EPDLKvbdZyEKOCkr -EPDKjvbddoFTLTtS -DoCkKvbdXrlAlsnx -EOcLKvbdZoOIeEzK -DnbjjvbdaMjbTVMg -EPDKjvbdeOeTKssr -DncKjvbdSKxetfjs -DoCjjvbdpxnhGpcx -EPDLKvbdmtuZkJrG -DoCjjvbdYkqdTmlN -EOcLKvbdJuuGEEfi -DoCjjvbdhzUfMROG -DncLKvbdddnrBvbj -EOcLKvbdWSNwbFMD -DoDLKvbdtSrTYydc -EPCjjvbdRjxetgKs -DncKjvbdFxttaEYC -EPDLKvbdiBncFWpq -DnbjjvbdyTOImSCH -DoDKjvbdcyyQXyRC -EOcLKvbdZLrEUOLm -DoCjjvbdXmqAYVWU -EPCjjvbdUsltFkvK -DncKjvbdLqvmZuQz -DnbjjvbdZjTIQGaf -DoDKjvbdzoPpeCkx -EPDKjvbdGGKSNhsq -DncKjvbdtSrSxzFD -EPCkKvbdyOTHxShc -DnbkKvbdehKvSORH -DoDLKvbdWIXvYHYz -EObkKvbdDoCkLXCd -DoDLKvbdLBKflaxR -EPDLKvbdKQzFOenF -EObjjvbdjFLHVPAO -EObkKvbdFeiqmhsq -DoDKjvbdRotHKFdX -DnbkKvbddZxpYZQb -DncKjvbdqqtkNkBN -EPDKjvbdZjShPgBf -DoCkKvbdNHCpMouL -EObjjvbdxZgefYFS -DoCjjvbdNrsvHEuQ -DoCjjvbdwzHeewdr -EObjjvbdvPTzpkPU -EPDKjvbdrounibvG -DnbkKvbdpstGqqjt -EPDLKvbdeFOrCXDK -EOcLKvbdGBPRYizm -DoDLKvbdNwnuzdOU -DnbkKvbdRMwaxnUz -EOcLKvbdDihKWXjA -EObkKvbdFeirOJTq -DoDLKvbdSKxeuGjs -EOcLKvbddndsKssr -DnbjjvbdiCPDEvpq -EOcKjvbdMoxQumfs -DnbkKvbdfNGWfljL -DnbkKvbdIHGzZXwg -EObjjvbdTlWPAvOi -DoDLKvbdnPyyVkZC -EOcKjvbdkWWmdBxX -EObkKvbdEJgjWXjA -DnbjjvbdkMalZdgP -DnbkKvbdsCGNLfjy -DnbjjvbdYqMeIleR -DncLKvbdMgComPtk -DoCkKvbdMfbolouL -DncKjvbderAvzlDP -DnbjjvbdqwQLcIyR -EObjjvbdcImJkFwY -EPCjjvbdYzberKVy -DoCjjvbdEzsqElCi -EObkKvbdRotGiecw -EPCkKvbdGLErcINV -DoCkKvbdYpmEiMdq -DoDKjvbdJXsaglRQ -DnbkKvbdFVxpPmJe -DnbkKvbdxUmEpyLn -EPCjjvbdLrXMytpz -DnbkKvbdhtzEvqtb -EPDKjvbdDxYLstTl -EPCkKvbdiBoDFXQq -EPCkKvbdZoOJEeZj -DoCjjvbduDCuWuoP -EObkKvbdjcLkQfuH -DoCkKvbdcImKLGWx -EPDLKvbdEYXlUUTl -EOcLKvbdZLqdTnMN -EOcKjvbdmozYujyC -DncLKvbdJpzEnfOF -EOcLKvbdiCPCdvpq -DncKjvbdADRxKZhp -DoDLKvbdmJDsqVSB -EObkKvbdnBiwYPOV -EObkKvbdqwQMDIxq -DncKjvbdeFOqbWbj -EPDKjvbdmfeYMmfy -DnbkKvbdGLFSbhNV -DoDLKvbdwkXDgzzG -EObkKvbdbAvFFpQX -EPDLKvbdyXhjBoyk -DoCjjvbdMfbpMouL -DoCjjvbdREDApRES -DncLKvbdmajWwnmu -DoDLKvbdIidAJofd -DoCjjvbdSZihTCvA -DoCkKvbduLwvaUBX -EPCkKvbdiHJbyVjV -EObkKvbdGYtuAdXb -DoDLKvbdCTBCtFwS -EOcLKvbdhlFENtby -DoCkKvbdySnIlrBg -EPDLKvbdwuNFQyMO -DncKjvbdlqxtzTDi -DoDKjvbdWWhxWEFH -DoCkKvbdiHJcZVjV -EPDKjvbdCflGHAzc -DncLKvbdzROmJKXA -EPDLKvbdCJLBjhej -EOcKjvbdVrNwbEkc -DnbkKvbdUtNUFlWK -DoDKjvbdLBKflbYR -EPCjjvbdauBfwkTh -EPCkKvbdrXQMDJZR -DnbjjvbdnVUyjjSG -DncKjvbdiMEdOUby -DoDKjvbdqiAKFNPF -EOcLKvbdQdDBQQcr -DoDKjvbdpxnggQdY -DncKjvbdtSrTYydc -DnbjjvbdwzHefXeS -DoCjjvbdRosfjGEX -EPCkKvbdnPyxujyC -EObjjvbdZyEJnCkr -DnbkKvbdhytelRNf -EPDLKvbdeYZstSFz -EObjjvbdTfzmlXVe -EOcKjvbdbKkenmcA -DncLKvbdvwMAuaVu -EObkKvbdwMvAMdEm -EOcLKvbdkHflFfNk -EPCjjvbdzoPpeDMY -DoCjjvbdiLeDmuCy -EOcKjvbdRpUGjGDw -DnbkKvbdUslsekuj -EPCjjvbdmJEURVRa -DncLKvbdZjSgofaf -EOcLKvbdaMjasUlg -DoCjjvbdREDBPpdS -DnbjjvbdIwsaglQp -DoCkKvbdkNCLzFHP -DoDLKvbdaRfChUFk -EPCjjvbdrRtjnKaN -EPCkKvbduoTzpkOt -EOcKjvbdnHFYMmfy -EOcKjvbdHDkVjBjK -EObjjvbdEXxMTssl -DnbjjvbdNPxRWOHT -EObjjvbdiZtfLpmf -EObjjvbdTvLojTaR -DoDKjvbdKkBIWAKZ -DoDLKvbduCbtwVno -DncLKvbdmttzKjSG -DncLKvbdbBVdfQQX -EObkKvbdyXiKBpZk -DncLKvbdzGxlAMdw -DoCkKvbdMpXpvNfs -DoCkKvbdKQydoGOF -EPDLKvbdTfzmlXVe -EPDKjvbdQccBPqES -EPCjjvbdZtJIyESn -DoCjjvbdVrOXbElD -DnbjjvbdbLMGOmcA -DnbkKvbdnPzZWKyC -EPDLKvbdmajWwoOV -EObjjvbdQwOEDMHc -EPCkKvbdTvMQKUBR -DoCjjvbdOTUVgEtp -DoCkKvbdIHHZyXxH -EPDLKvbdDoDLKwDE -EObjjvbdiZtfMQmf -EObjjvbdijGHimXr -DoDKjvbdVrNxCElD -EPDLKvbdJutedFGi -DnbjjvbdmSZVZsEJ -DncKjvbdqlzKYlIJ -EOcKjvbdfelZnGgA -EOcKjvbdYlRctOLm -DoDKjvbdPxmAHSrK -EPCjjvbdWWiYWEEg -DoCjjvbdbAvFFoow -EOcKjvbdFjeSbglu -EPDLKvbdlqyVZsEJ -EOcKjvbdddoRbXDK -EPCkKvbdaRecHtFk -DncLKvbdSKyGUgKs -DoDLKvbdcyyPwyQb -DoDLKvbdnVUzKjRf -EObjjvbdYkqdUOLm -EObkKvbdRbEEkhyL -DncKjvbdtAHQhAAr -DnbkKvbdVqmwbFMD -EOcLKvbdznoqFDLx -EOcLKvbdEXxLtTsl -DnbkKvbdtumwipsA -EObjjvbdmJEUQtqa -DncKjvbdxwhjCPyk -DnbkKvbdyfyMANFX -DncLKvbdiVZeXRtb -EObkKvbddtAUATMv -EOcKjvbdxnSgwriD -EObjjvbdlrZVZrdJ -EPCkKvbdsBelkfkZ -DoDKjvbdFVyPomJe -EPCkKvbdQmYBxnUz -EOcKjvbdSBdFLhyL -DncLKvbdmJETpuSB -DoDLKvbdRECaPpcr -DncLKvbdIxUBglRQ -DoCjjvbdpssfrSLU -DnbkKvbdSQUHJedX -EObjjvbdkySrTZHU -EObkKvbdZtIiZETO -DoCjjvbdtumwipsA -DoCjjvbddBrlrAUN -EPCjjvbdKCjDQibx -DoCjjvbdQccAopdS -DoDLKvbdSBceLiYk -EPDKjvbdREDAoqDr -EOcKjvbdZQleJMeR -DoCkKvbdEARiMywX -EPDKjvbdkDLkQgUg -DncLKvbdFjdsDIMu -EPCjjvbdlrYtysDi -EPCkKvbdezuxeIsw -EObkKvbdyNsHxTJD -DnbkKvbdemGWgMik -DoDLKvbdBhkCKhej -EOcLKvbdjvWmcaww -EPDLKvbdqTsgRrLU -EObkKvbdZyDimcLr -EPCjjvbdlrYtzTEJ -DoCkKvbdHgGyyYXg -DoCkKvbdZoNhddyj -EPDKjvbdhtzFWquC -EPCkKvbdDoCkKwDE -DoDLKvbdsrqsZZeD -EPCkKvbdiHJbxuiu -DoCjjvbdhlFEOUcZ -EPDKjvbdDigiuwjA -EPDKjvbdQdDBPqES -DoCjjvbdcTCjsdKB -DncLKvbdUsmUFkuj -EPDLKvbdnHEwlnGy -EOcLKvbdxVNEqYkn -DoDKjvbdEuxopNJe -EObkKvbdkClLQfuH -EPCjjvbdcTDLUEKB -EOcKjvbdEPDKkXDE -EPCjjvbdXsLaNUOx -DoDKjvbdFWZQQNKF -EPDLKvbdUtMtFlVj -EOcKjvbdzaAPGfal -DnbkKvbdHlBznXRL -DoDLKvbdTlVoBWPJ -EPCkKvbdDoCjkXDE -EOcKjvbdrzMQTAhO -EOcLKvbdozmdLXoA -DoDLKvbdzQnmIjXA -DoCkKvbdmgExMmgZ -EPCkKvbdzjUoocrt -EOcLKvbdwyhGFweS -EOcLKvbdWWhxVceH -DncLKvbdqqtkOKaN -DoCkKvbdOTTvHEuQ -DoDLKvbdjJehKMwr -DoCjjvbduDCtvuoP -DnbjjvbdqdEiPmvB -DnbjjvbdhtzEwRuC -DnbkKvbdRkYetfkT -DoDKjvbdCDpBVjNG -DoCkKvbdcSbjscjB -EPDLKvbdYpldiMdq -DoCjjvbdaaWEfPow -EOcKjvbdqZPHgQdY -DoCkKvbdeOdrjtUS -DoDLKvbdFaPRZJzm -DnbjjvbdRECaPqES -DncKjvbdaMjaruMg -EObjjvbduVnYJpsA -DnbkKvbdqTsfrSLU -DncKjvbdYqMeJMdq -EOcKjvbdvvlBWAuu -DnbjjvbdUxgtZkOn -EOcKjvbdOSsufduQ -EOcLKvbdtumxJqTA -DncKjvbdIryAsNXl -DoDKjvbdMuTRkNAX -DoDLKvbdxnSgwrhc -EOcKjvbdiHKCxujV -EObkKvbdeKJrVtzn -EPDLKvbdjhHMGGNk -EOcLKvbdkVwNdBww -EOcLKvbdygZMANEw -EPDLKvbdRXODcLhD -EPCjjvbdSPsfjFcw -DoDKjvbdYpleIldq -DoDLKvbdOEcsiIjd -DnbjjvbdddoRavbj -DncLKvbdHDkWKBjK -DoCjjvbdxxJKBoyk -EPDKjvbdYkqdUNkm -DoDLKvbdDnbjjvcE -DoCkKvbdVvhxVceH -EPDLKvbdWRnXbFMD -EObkKvbdliEUQtqa -EPCkKvbdNQXqVmfs -EOcLKvbdIGfyyYYH -DncKjvbdxUldpxlO -DoDKjvbdznopdcLx -DncKjvbdHDkVibKK -EPDLKvbdjlbLydgP -DoDKjvbdYTMAltOx -DoDKjvbdcSbkUEKB -EPCjjvbdzoQREblY -EOcKjvbdZxcinDMS -DoDKjvbdZyDjODMS -DoCjjvbdxZgfFwdr -EPDLKvbdaMkBsVMg -EPCkKvbduDDUvuno -DncKjvbdsCFmLgKy -DoDLKvbddeOrCWcK -DncLKvbdNddThhjd -EOcKjvbdBvzcheQW -EPDLKvbdeEnqbXCj -DoCjjvbdNrtVfduQ -EOcKjvbdZQmEiNFR -EPCkKvbdGFjSNiTq -EPDKjvbdZxcinCkr -DoCjjvbdkNBlZdgP -DoCkKvbdEYXkstTl -DncLKvbdYpmEhmEq -EOcLKvbdePFSkTsr -DoCjjvbdemFvfmKL -DnbkKvbdemFwGljL -EPDLKvbdmbJvxOnV -EPCjjvbdtbcVXVoP -EOcKjvbdFkErcHmV -DoDKjvbdVUMtFlWK -EOcLKvbdkMakydfo -DnbjjvbdIMBznWqL -EObkKvbdptUHRrLU -DnbkKvbdjJfHilwr -EPCjjvbdGYuUaDxC -EObjjvbdmtuZjjRf -DncLKvbdkCkkQfuH -DoDLKvbdtlXwBUBX -DncLKvbdCWzchePv -EObkKvbdrEEiPmua -EOcLKvbdYqNFIldq -DoDLKvbdfILWRnQg -DoDLKvbdqUUGrRkU -DoCjjvbdfMfWflik -EOcLKvbdOTTugEuQ -DncLKvbdjvWnDaww -EOcLKvbdsPuoKDVf -EPDLKvbdZirhPfaf -DoCjjvbdDwxLsstM -DnbjjvbdfHkWRmpg -DncLKvbdrpWOibuf -EPDLKvbdZtIhyESn -DncLKvbdwygfGYEr -EPCjjvbdeEoSCWcK -EPCjjvbdjuvmdBww -EObjjvbdqUTfqqjt -EOcLKvbdZjSgogBf -DoDKjvbdYqMdiMeR -DoCjjvbdKefICApu -DoDLKvbdMfcQNQVL -EPCkKvbdjggMGGNk -EObkKvbdCDoaVjMf -EObkKvbdWWiXuceH -EOcLKvbdURROuVHm -DnbjjvbdpssfrSLU -DncKjvbdgFkzNgHA -DnbjjvbdaSFbgtFk -DncLKvbdIxTahMQp -EPDLKvbdKWVFceGi -DncKjvbdFVyPomKF -DoDKjvbdZirgpHBf -EObjjvbdVqmwadkc -EPCkKvbdieLHVPAO -DncKjvbdZLqdUOMN -DoDKjvbdWWiYWDeH -EObkKvbdQwNdClID -DnbjjvbdMoxRVnGs -DncLKvbdrDdiPmvB -DnbjjvbdZQleJNFR -EOcLKvbdrDdhpOVa -EPDLKvbdYqNFImFR -DoDKjvbdEYXlTtUM -DoCjjvbdhuZeWqtb -EPDKjvbdMfcPlpVL -EOcKjvbdNQYQvNfs -DoDKjvbdiUzFXSVC -DoCkKvbdmRxtzSci -DnbjjvbdbiMikGXY -DoCjjvbdQdDBQQdS -EObjjvbdqZPIGqDx -DoCkKvbdkWWmdBxX -DoDKjvbdKxpirzuG -DoCjjvbdlBNPNALA -DoCjjvbdhzVGMROG -DoCjjvbdzoQREcMY -EPDKjvbdlAlnmALA -EPDLKvbdwuMeRZLn -EOcLKvbdYqMdiNFR -EObkKvbdOTTugEuQ -EOcKjvbdYTMAmUOx -DnbjjvbdRDcBQRES -DoDLKvbdidkHVPAO -EPCkKvbdSKyFtfjs -DoCjjvbdhytelQmf -DncLKvbdEztRElCi -EPDLKvbdRWnEDLgc -DoDKjvbdwuNFQyLn -EObkKvbdGLFTDHmV -DnbkKvbdShyiqABM -EObkKvbdUaCQsRSZ -EOcKjvbdjuwNcbXw -DnbkKvbdmfeXlnHZ -DncKjvbdsPuoKDVf -EOcKjvbdNGbomPtk -DoDKjvbdvPTzpkOt -EPDKjvbdJqZdneme -DncKjvbdqTtGqqkU -DnbkKvbdjggLeemk -DoCjjvbdVZIUZkOn -EPCkKvbdzjVPodTU -DncKjvbdnBjXYOnV -DoDKjvbdHgGzYxYH -EPCkKvbdSZigsCvA -EPCjjvbdtbbtvuno -DoDKjvbdPIAXyAZB -EObjjvbdRNXaxmtz -DoCkKvbdUyITykPO -EPCkKvbdssRryZeD -EObkKvbdJuuGEFGi -DoDLKvbdxZgfGXeS -EObjjvbduoTzqLOt -DoDKjvbdbrbkTcjB -DncLKvbdxxIiaoyk -DoCjjvbdFxtuBDxC -EPDLKvbdzaAPGgBl -EPDLKvbdpxnhGqDx -EOcKjvbdtSqsZZeD -EOcLKvbdMowpvOGs -EObkKvbdVBCRSpqy -DoCkKvbdZRNEiMeR -EPCjjvbdczYowyQb -DncKjvbdjgfkfGNk -DnbkKvbdssSTYzFD -EOcLKvbdVhYWYGxz -DncKjvbdKDJcQibx -DncKjvbdZHWdAPTJ -EPCkKvbdFjdsChNV -DoDLKvbdJcJcRJcY -EPCjjvbdRjyGVHLT -DnbkKvbdBcpBWKMf -DoCjjvbdxUmEpyMO -EPDKjvbdZoNiFEzK -DoCjjvbdPIAYZAZB -EOcLKvbdFejSOIsq -DoDKjvbdjggMGFmk -EObkKvbdWRnXadlD -EObkKvbdnGdxMmfy -DoDLKvbdLBKgNBxR -DoCjjvbdaSGChTek -EPCkKvbdSCEElIxk -EObjjvbdIxTbHlQp -EPCkKvbdOEcshhkE -EOcLKvbdbsCjsdKB -DncLKvbdCSaDUGXS -EPCjjvbdRzJgsDWA -EPDLKvbduCbuXVno -EOcLKvbdGdLViajK -DncKjvbdCWzdJEpW -DncKjvbdjuwODbXw -DncLKvbdqUTfqqjt -EOcKjvbdxUmFRYkn -DoCjjvbdVAaqSqRy -EPDLKvbdaMkBsUlg -EOcKjvbdGLFTCgmV -EPCkKvbdZeYGzgiC -DoCjjvbdwXLaWBVu -DoCjjvbdelevgMik -EPDKjvbdkHgMGGOL -DoCjjvbdcJMjKewY -EOcLKvbdwzHfGYEr -DncLKvbdlZTRryGt -EOcLKvbdfVzwoizs -EPDKjvbdhzUelRNf -EPCkKvbdiHKCxvKV -EOcKjvbdGFjRmhtR -EPDLKvbdGLEsChNV -DoDKjvbdYORAXuWU -DnbjjvbdpstHSSKt -EObkKvbdegkVqmpg -EPDLKvbdhyuGMQmf -EObkKvbdliDtQtqa -DoCkKvbdfNGXGlik -DoCkKvbdHfgZyXwg -DoCjjvbddndsKssr -EPCjjvbdZMSDsnLm -EObkKvbdEXxMTstM -EPDKjvbdJvUecdfi -DnbkKvbdVUMsekuj -EPCjjvbdPyNAGsSK -DoCjjvbdMSWmZuQz -EObkKvbdBcpBVjNG -DnbjjvbdezuxdiUX -EPCjjvbdBdQAvJlf -DncKjvbdOTUWHFVQ -DoDKjvbdaSGDIUFk -EOcKjvbdUGzmlWvF -EOcLKvbdjlakydfo -DoCkKvbdWSOXaeLc -DoDKjvbdznpRFDLx -DoCkKvbdwtldpxlO -DoDLKvbdGdLVjBjK -EObjjvbdmttykKSG -DoDKjvbdZjShQGaf -DoDKjvbdrDdhomvB -EPDLKvbdiUyeXSVC -DncKjvbdIsYaSmXl -DnbjjvbdVhXvYHYz -EPDKjvbdwzHfGXdr -EOcKjvbdxsOJMqbH -DoCjjvbdehKuqmqH -EPCjjvbdZdxGzhJC -EOcKjvbdsCGMlHLZ -DoCjjvbdOEcshhkE -DoCjjvbdEzsqElDJ -DncLKvbdURRPVVIN -EPCkKvbdZoOJFEzK -DnbjjvbdBiKajhfK -EOcLKvbdbUafwkTh -EOcLKvbdVZHszKoO -DnbkKvbdGKdsDIMu -DnbkKvbddoFSkUUS -DnbjjvbdPxmAGrqj -EPCjjvbdKNADzHVB -EPCjjvbdcyxpXxqC -DnbkKvbdLBLGmBxR -EPDKjvbdFWYopNJe -EPCkKvbdcJNKKewY -DoCjjvbdGLErcHmV -EPCjjvbdWXIxWDdg -DnbkKvbdQvmcbkhD -EOcLKvbdbVCGwjtI -DoCjjvbdmgFYMmfy -EPDLKvbdQdDApRES -DnbkKvbdWWhwvEFH -DnbjjvbdxZhFexFS -EPCkKvbdCIjakJGK -EPCkKvbdKQyeOfOF -DncKjvbdEObjkXDE -DnbjjvbdNGcPlotk -DoCjjvbdVUMtGMVj -EPDLKvbdelfWgNKL -DnbkKvbdqwPlDJZR -DncLKvbdbiMikFwY -EObkKvbdkNBkzEgP -DoCkKvbdmuUyjiqf -DncKjvbddneSjtTr -EPCkKvbdRkZFtgLT -EObkKvbdRjyGUgLT -EPCkKvbdKaKgMaxR -DnbkKvbdZMRdTnMN -EPCkKvbdqZOhGpcx -EPCkKvbdxwhjBozL -DncKjvbdGckViajK -EPCkKvbdiifHilxS -EOcLKvbdqUUGrRjt -EPCjjvbdbhljLGWx -DnbkKvbdhgKCxujV -DoDLKvbdJSyAsNXl -DoDLKvbdjgflFenL -EPCkKvbdMJBlQxAS -DncLKvbdUMVoAvPJ -DoCkKvbdkCkjpgVH -EPDKjvbdqGEEsvAh -EObkKvbdmRxuZrci -EObjjvbdNdctIhjd -EPCkKvbdCSaDTevr -EPCjjvbdRDcAopcr -EObkKvbdwtmEpyMO -EOcKjvbdqZPHfqDx -EOcLKvbdaNKbStmH -EOcLKvbdaSFcHsfL -DnbkKvbdRosgJecw -EObkKvbdkySrSyGt -EOcLKvbdwuMdqYkn -EPCjjvbdrDdhonWB -EPCkKvbdiBoDEwRR -EPCkKvbdEztQdlCi -EObkKvbdFyUuBEXb -EPDKjvbdOAIsUJrA -EPDKjvbdKCicRKCx -EObjjvbdSZihSbvA -DncLKvbdvAdYsPEh -DncKjvbdySnImSCH -EObkKvbdiVZeXRtb -EOcKjvbdsCFllHLZ -EPDKjvbdZeXfzgiC -DnbjjvbdMpXpvNgT -DoDLKvbdsCFllHKy -DoCkKvbdqYoHfpdY -DnbjjvbdRzKHrbvA -EOcKjvbdNHComPtk -EOcLKvbdCJLBjiGK -EPDLKvbdsZlPsAhO -DnbkKvbdemFvgMik -DoCjjvbdFyUuBDwb -DnbjjvbdrafMlGkZ -DncKjvbddZyPxYpb -EObjjvbdxZhGFwdr -EPCkKvbdEXwlTssl -DnbkKvbdANIYrvyx -EObjjvbddePRawCj -EPDKjvbdyNsIXrhc -EPCkKvbdhkeEOVDZ -DoDLKvbdAMgxrwZx -EPDLKvbdsQWPJbvG -DoCkKvbdkVvmcbXw -EPDKjvbdJYTbIMQp -DncLKvbdBsAcTewS -DncLKvbdxrnJNRag -EOcLKvbdmSYtzSdJ -EObkKvbdqdFJQNua -DoCjjvbdZyEKOCkr -DoCkKvbdZLrEUOLm -EPCkKvbdRNXaxnUz -EPDLKvbdnUuZjjRf -EObkKvbdmbKXYOmu -DnbkKvbdlZTSTYgU -EPDKjvbdGYuUaDxC -DncLKvbdFyVVAcxC -DoDKjvbdEvZPpMjF -EPDLKvbdSwjlNzjx -EPCjjvbdbKkeoNcA -DoCkKvbdMfcQMotk -DnbkKvbdyTNiNRbH -DncLKvbdFWYpQMjF -EPCkKvbdEvYopMjF -DncKjvbdeKJrWUzn -EOcKjvbdpssfrSLU -EObjjvbdKCjDRJbx -DnbkKvbdeUAUATMv -EPDLKvbdjKGIJlxS -DnbkKvbdpssfqrLU -EPDKjvbdqZPHgQdY -EPDLKvbdeAURNXif -DoCjjvbdypoMhiwA -EPDLKvbdGYtuAdXb -EObkKvbdRaceLiYk -DoCjjvbdXsMBNTnx -EOcLKvbdKCjCqKCx -DoCjjvbdYSlAmUPY -EPDLKvbdpstGrSKt -EPDKjvbdhtyeXRuC -EObjjvbdtlYXBUBX -EObjjvbdRMxByNtz -EObjjvbdhanbeWqR -EOcKjvbdpyPIHQcx -EPDLKvbdrRtjnLBN -DoDKjvbdNQYQvNgT -DnbjjvbdbsDKsdJa -DnbjjvbdDxYMTssl -EPDLKvbdnCKWxOmu -DncKjvbdILazmwQk -DoDKjvbdhgJcYuiu -DoCjjvbdlYrrSyHU -EOcKjvbdVUNUFkvK -EObjjvbdRyjHrbvA -DoDLKvbdDnbkKvbd -EOcKjvbdaNKbStmH -DnbkKvbdjblLRGtg -DncKjvbdxUleQyLn -EPDKjvbdLGFhBaQu -EObkKvbdqmZiyLgi -DoCjjvbdJuuGEFGi -EPDKjvbdqmZixlIJ -DoCjjvbdXnRAYVVt -EOcLKvbdWIYVxGxz -EPCkKvbdxZgfGYEr -EPDKjvbdfNGWfmKL -EPDKjvbdbrbjscjB -DoDKjvbdsPunjCvG -DoDKjvbdziuQQDsU -DoDLKvbdbhlijfWx -EPCkKvbdhgKCyWKV -EPDLKvbdGLEsCgmV -EOcKjvbdmIcspuSB -EPDKjvbdIwsbILqQ -DoDLKvbdpedEsvBI -DncLKvbdsPunjDVf -DncLKvbdIxTbHkqQ -DncLKvbdcSbkTdJa -DncKjvbdUWLpJsaR -DnbkKvbdsQVnjCvG -EPDKjvbdyXiJapZk -EPCkKvbdrzLosAgn -DncLKvbdNsTugEuQ -DoDLKvbdrykoraHn -EObjjvbduaDySoFI -DncKjvbdZHWdAOri -EPCjjvbdlqxtysEJ -DnbkKvbdOSsvHEtp -DoDKjvbdRotGjGDw -DoDKjvbdYfvdAOsJ -DoCkKvbdBhjajiGK -EObjjvbdCgLegAzc -DoDLKvbdhtyeWrVC -EOcKjvbdzitoocrt -EOcKjvbdNVTSKmAX -EPCjjvbdVYgsyjnn -EObkKvbdliEUQuRa -DoCkKvbdqFceUWAh -EPDKjvbdIsZAsMxM -DnbkKvbdUVlPjUBR -DoDKjvbdbUafwjsh -EObjjvbdQlxCZOUz -DoCkKvbdQvnEDLhD -EOcKjvbdUVlQKUBR -EPDKjvbdehKvRnQg -DoDLKvbdxmsIYTIc -EObjjvbdsCGNLfkZ -EObjjvbdmSYtzSdJ -DoCjjvbdiMEcnVDZ -EPCjjvbdypnlhiwA -DoCjjvbdRyihTDWA -DoCjjvbdZoOJEdzK -DoCjjvbdJpzEoGOF -DoCkKvbdYpmEiMeR -EPCkKvbdbhljKfWx -EPDLKvbdqYnggQcx -EOcLKvbdwjwEHzyf -EPCjjvbdLFegbAqV -DoCjjvbdMoxQvNgT -EPCjjvbdZsiIyETO -DoDLKvbdZQmFImEq -DnbjjvbdYkrDtOMN -EPCjjvbdjggMGGOL -DncLKvbdDwwlTstM -EOcKjvbdCWzciFQW -DoCkKvbdyYIiaozL -DnbkKvbdNsTufeVQ -DoDKjvbdjlakydfo -EObjjvbdUGznLvue -DoCjjvbdeFOqawDK -DoCjjvbdZnmiFEyj -EOcKjvbdVBCQrprZ -EOcLKvbdrovOjCvG -DncKjvbdrovPKCuf -EOcLKvbdlYrqryHU -EObkKvbdcyyPxZQb -EObjjvbdnBivwnnV -EObjjvbdjJehJlwr -DnbkKvbdOFDtJIjd -DnbjjvbdVAaqSqSZ -EObkKvbdrXPkbiZR -DoCjjvbdzaAPGfal -DncKjvbdZQldhmEq -EObjjvbdmoyxvLZC -DnbkKvbdmpZxujyC -DoCjjvbdvwLaWBWV -DncLKvbdiVZdvquC -DnbjjvbderBWzlDP -EPCjjvbdjbkjpfuH -DncLKvbdrafNLfkZ -DncKjvbdrWokbhxq -EPCkKvbdsZkosBHn -EOcKjvbdidjfuPAO -DnbjjvbdNGcPmQUk -EPCjjvbdrJAKFNOe -DnbjjvbdTukoitBR -DnbkKvbdySmhlrCH -EObkKvbdrXPkcIxq -EOcLKvbdFejSOItR -EObkKvbdmgExMnGy -EPDKjvbdqrVLOLBN -DoDKjvbdLAkHNCYR -EObkKvbdVrOXbEkc -DnbjjvbdEXwlUTsl -EPCkKvbdyXhjBpZk -EObkKvbdiifHjMxS -EOcKjvbdEKHiuxKA -EObkKvbdZLqdTmlN -EObkKvbdWRnXaeLc -DnbjjvbdWSNwaeMD -DnbjjvbdfNGWgNKL -DoDKjvbdoAKztIDn -DncLKvbdmaivxOmu -DnbjjvbdZLqcsnMN -EObjjvbdcTDKscia -EPCjjvbdOTTufeUp -DoDKjvbdGdLVjBjK -DncKjvbdcJNKLFvx -EOcLKvbdTYKkmzjx -EOcKjvbdZRMeImEq -DoDLKvbdKQyePFnF -DnbkKvbdNrtWGduQ -EPCjjvbdatbHXjtI -EPCjjvbdvwMAuaVu -EPDLKvbdnQZxvLZC -EObjjvbdtlYXAsaX -DnbkKvbduDDVWvPP -EPDLKvbdqTtGrSKt -EObjjvbdxnSgwsJD -EObjjvbdbKkenmcA -EPCkKvbdFaOqYizm -EOcKjvbdLGGHbBRV -DoDLKvbdRzJhTCvA -EPCjjvbdiMFDmtcZ -DnbjjvbdWWhwvEEg -EPCjjvbdJmAEZgVB -DoCjjvbdmuVZjirG -DoCjjvbdliEURUqa -DoDLKvbdnCKWwnnV -EPDLKvbdhgJbyViu -DnbkKvbdjggMFfNk -EObkKvbdEuxopMie -EPDKjvbdssRsYydc -DncLKvbdliDsqVRa -EOcLKvbdLBKflbYR -DncKjvbdzoPpeClY -DncKjvbdqFdEsvBI -DoCjjvbdZMRctOMN -DncKjvbdDnbkLWcE -EObkKvbdMfcQNPuL -DoDKjvbdUWMPjTaR -DnbjjvbdxmsHwsIc -EObkKvbdrDdhonWB -EPCkKvbdhgJcYvJu -DoCkKvbdlYsSSyHU -EPCjjvbdNdcsiJLE -DoDKjvbdhlEcmuCy -EObjjvbdJTZAsNXl -EPCjjvbdznpQeClY -DncLKvbdDxYMTssl -DoCjjvbdkVwNcbXw -EOcLKvbdMgDPlpUk -EObkKvbdXsMAlsnx -DnbkKvbdiBncEvqR -EPCjjvbdeFPSCWcK -DoDKjvbdmuUzKjSG -EPDKjvbdqrUkNjaN -DoDKjvbdhyuFlQnG -EOcKjvbdDigivYKA -DoDLKvbdJYUCHkqQ -DncKjvbdACqwiyiQ -EPDKjvbdEYXkstUM -DoDLKvbdKDKCpicY -DncLKvbdCDoaVjNG -EObkKvbdxZhFexFS -EPCkKvbdKDJcQjCx -DoDLKvbdEPCkKwCd -EPCkKvbdTfzmkwVe -DnbjjvbduWOYJqTA -DoCjjvbdcJMijfXY -EPCkKvbdmaiwYPOV -EOcKjvbddjJrVtzn -EObkKvbdpstHSRjt -EOcKjvbdyXiKCQZk -DnbkKvbdIsYaSmYM -DnbjjvbdwtmFQxlO -DnbkKvbdYpleJMdq -DoCjjvbdkNBkzFGo -EOcKjvbdbsCkUEKB -DoDKjvbdYlRctOMN -DnbkKvbdjuwOECXw -EPDKjvbdWRnXaeMD -DncLKvbdkDLkQgVH -DoDLKvbdFeiqnJTq -EOcKjvbdzHYlAMeX -EPCjjvbdJbjCpjDY -EPDLKvbdzitopDsU -DnbkKvbdziuPpDrt -DncLKvbdySnImSCH -DnbjjvbdySnImRbH -DoCjjvbdKjaIWAJy -DnbjjvbdTqRPUthN -DoCjjvbdURQntuIN -EObjjvbdQlxCYmtz -EPDKjvbdMtsSLNAX -EObjjvbdJbjDQicY -DoDKjvbdEPCkKwDE -EObkKvbdKQydoGNe -DoDLKvbdVwJXuceH -EObjjvbdnUtykJrG -DncLKvbdwMvANEEm -EPDKjvbdpyPHgQdY -DnbjjvbdUVkpKUBR -EOcLKvbdhfjCyVjV -EPDKjvbddoFTKstS -EPCkKvbdANHyTXZx -EPCkKvbdUxhTyjoO -EObjjvbdkVwNdBxX -EPDKjvbdDoCjjvbd -DnbkKvbdWWhwudEg -DnbkKvbdyTNiMrCH -DoDLKvbdelewGljL -DncLKvbdUGznMWue -DncKjvbdwygfFwdr -EPCkKvbdJqZePFnF -DnbjjvbdNsTugEuQ -DoDKjvbdQcbaPqDr -DncLKvbdfMevgNJk -DncLKvbdlrZVZrdJ -DoCjjvbdFjeTCglu -DnbjjvbdYqNFImEq -DoCjjvbdsCGMkfkZ -DncLKvbdhuZdwSUb -DoCkKvbdrXPkbiZR -DoCjjvbdZRMdiMdq -DoDKjvbdemFvgMjL -DoCjjvbdygZMANEw -EOcKjvbdZRMeIldq -EObkKvbdiHJcZWKV -DncKjvbdCJKbKiFj -EObjjvbdzROlhjXA -DnbjjvbdDoDLKvbd -EPDLKvbdVYgtZjnn -EObkKvbdDoCjjwDE -DnbkKvbdrouoJbuf -DoCkKvbdyTOImRag -EPDKjvbdBcpBVilf -DoCjjvbdCWzdJFQW -EPCkKvbdbrbjscjB -EOcLKvbdwkWdHzzG -EPDKjvbdnGeXlnGy -EPCkKvbdznpREcLx -EPCkKvbdZMRcsnLm -EOcKjvbdJSyArmXl -DnbkKvbdZMSDtNkm -EPDKjvbdAMgySvzY -DoDLKvbdyYJJbPzL -DoCkKvbdLAjgMaxR -DoDLKvbdWIXuxGxz -DoCjjvbdqwQLbiYq -DnbkKvbdpyPIHQcx -EOcKjvbdfNGXHNJk -DncKjvbdqYnhHQdY -DncKjvbdeEnrBvcK -EPDKjvbdZjTHpGaf -DoDLKvbduoTzqLPU -DnbkKvbdIjEAJofd -DnbkKvbdxnSgxTJD -DoDLKvbdXsLaMsnx -DnbjjvbdaRfDHsek -DoCkKvbduLwwAtBX -DnbkKvbdrpWPJcVf -DoDKjvbdrbFlkgLZ -DoCkKvbdlqxtyrdJ -EObkKvbdRyihSbvA -EObkKvbdWRnYCFLc -DoCkKvbdOEcshhjd -DnbkKvbdZjTHpHBf -DnbjjvbdcyyPwxpb -DncLKvbdkVvmdCXw -DncLKvbdcScKtEJa -DnbjjvbdrSVLOLBN -EObkKvbdiGjDYvKV -EPCkKvbdEJgjVwjA -DnbkKvbdRosgKFdX -EPDLKvbdcScKtDia -DoCjjvbdtbcVXVno -DncKjvbdhgJbyViu -EPCjjvbdjJehKNYS -EObkKvbdyOTIYTJD -DnbkKvbdRaceMJYk -DoCkKvbdqiAKEmOe -DoDLKvbdEKHiuwjA -EObkKvbdxUldpxkn -EObkKvbdFejRmhtR -DncLKvbdSBcdlIyL -EPCkKvbdxZhFexFS -EObjjvbdwjwEHzzG -EPCjjvbdmRxtzSdJ -EPDLKvbdEvYooljF -DoCkKvbdmgFXlmfy -DoCjjvbdtkxXBTaX -EObkKvbdmgExMnHZ -DncLKvbdjvXODaww -DoCkKvbdSCEFMIyL -EPDKjvbdVYhTykOn -DoDLKvbdNsUVgFUp -DncKjvbdRXOEClID -DoDKjvbdnVVZkKSG -DoDKjvbdWWhxVcdg -EPCkKvbdwuNFQxlO -DncLKvbdKeegbBRV -DncLKvbdUWLpJsaR -EOcLKvbdNxOuzcmt -EObjjvbddwzUUSFz -DoCjjvbdJXtBhMQp -DoCkKvbdLGFgbBRV -EOcLKvbdcJMjKewY -DnbjjvbdxUmEqYkn -DnbkKvbdjbkjqGtg -EPCkKvbdIHGzYwwg -DnbjjvbdrpWOjCvG -DoDKjvbdZMRctNkm -DnbkKvbddZyPwxqC -DoCjjvbdtcDVWuno -DoCkKvbdJcKDRJcY -EOcLKvbdmbKWwnnV -EPDKjvbdcasNSAUN -EPCkKvbdUaBpsQqy -EObkKvbdJutedFHJ -DoDLKvbdBhjakJFj -DnbkKvbdnUuZjiqf -EPDKjvbdpxoHgQcx -DnbjjvbdZjTHofbG -EObkKvbdkxsSSxgU -DnbjjvbdWRmwbElD -DoCkKvbdRkZFuGjs -EPCkKvbdwNWANDdm -EObjjvbdTkvPBVni -DoDKjvbddndrkTtS -DncLKvbdZtJIxdSn -EOcLKvbduaDyTOeI -EOcKjvbdxZgfGXdr -EOcLKvbdkySrTZGt -EPDKjvbdVwJXucdg -EPDLKvbdatagYLUI -DoCjjvbddZxpYZQb -EPDKjvbdtunXjRTA -DoDLKvbdWSOYBeMD -DoCjjvbdHlBznXRL -EPDLKvbdcyxpXxpb -DnbjjvbdAMhYsWzY -EObjjvbdraemLgKy -EPDKjvbdJpzFOenF -DoCjjvbdZnnIeEyj -DoCjjvbdrWpLbiZR -EOcKjvbdLqwMytpz -DncKjvbdKQzEoFme -EPDKjvbdZRMeJMeR -DncKjvbdEuxpPlie -EOcLKvbdFWYpPlie -EOcLKvbdjblKpgUg -EOcLKvbdiBnbdwQq -DoDLKvbdOTTufeVQ -EPDKjvbdpyOggQdY -DnbkKvbdGBOqYizm -EObjjvbdRjxfUfkT -EPCjjvbdUMVoAuoJ -DoDLKvbdVwJXvEEg -EObkKvbdnCKXXoOV -DoDKjvbdNPxRVmgT -DncLKvbdZsiIxdSn -EPDKjvbdjlalZeHP -DoDLKvbdeFPSBvbj -DoDKjvbdVqnXbFMD -DncKjvbdHffyyYYH -EOcLKvbdBhjbLJFj -EPDKjvbdJvVGEFHJ -EOcKjvbdgQBzvdYI -EPDLKvbdpyOggRDx -EObjjvbdKQyeOfNe -EPCjjvbdtcCtwVno -EPCjjvbdQvmdClHc -DnbkKvbdyXiKBoyk -DncKjvbdqTsgSSLU -EObjjvbdyNrgxShc -DnbjjvbdRkZFuGjs -EObjjvbdYfvdAOri -DoDKjvbdkMbMZeGo -EPDLKvbdCIjbLIej -DoDKjvbdHffyxwwg -EPCkKvbdGdLVibJj -DoCkKvbdaaVdepQX -DnbkKvbdSQUGifDw -EPCkKvbdqYngfpdY -DnbkKvbdxUleQyLn -DoCjjvbdqlyixkgi -EPCkKvbdjgfkfGNk -EObjjvbdeFOqavbj -DoDLKvbdYkrDtNlN -DoCkKvbdjhGlFenL -EPCjjvbdijFhJmXr -EObjjvbdnGeYMmfy -EOcLKvbdbhmJjfXY -EOcLKvbdLBKfmCYR -DncLKvbdJSxaSmXl -EPCjjvbdsQVnicWG -DoDKjvbdjhHLfFnL -EObkKvbdjuwOEBww -DoCjjvbdiBncEvpq -EOcLKvbduLxWaUAw -DncLKvbdhuZdwRtb -EOcKjvbdjvWnECXw -EObkKvbdZeYGzghb -DoDLKvbdNQYQumgT -DoDKjvbdJpydoFnF -EPCkKvbdRjyFuGkT -DnbjjvbdraelkgKy -EObjjvbdfNGXHMjL -DoDLKvbduWNwiqTA -DncKjvbdnVUzLJrG -DoDLKvbdehKvSOQg -EPDLKvbdwtmFRYkn -DoDKjvbdKfFgaaQu -DncKjvbdCTBDTfXS -EObjjvbdDoCjjwCd -EPCjjvbdYTMAmUOx -EOcKjvbdiMFDnVCy -EObkKvbdjlalZeHP -DnbjjvbdCJLCLIfK -DoDLKvbdZMRdUNkm -DnbjjvbdURRPVUgm -EObjjvbdJcJbpibx -EObkKvbdrWpMDJZR -EObjjvbdjuwNdBxX -EPCjjvbdbBVdfQQX -EPCjjvbdKRZeOfOF -DoCkKvbdKDKCqKCx -DoCjjvbdkVvmdBxX -EPDKjvbdvAdYroEh -EOcLKvbdtcCuXWPP -EPCjjvbdczZQXxpb -DncKjvbdUxhUZkPO -EObjjvbdlrYtysEJ -DncLKvbdcScLUDia -EPDKjvbdBsAbsevr -DoDLKvbdqTtGqrLU -DoDKjvbdSCEFLiYk -EPCjjvbdRWmccLgc -DncLKvbdNQYQunGs -EObkKvbdmbKXYPNu -EPCjjvbdfMewGmKL -EObjjvbdzROmIiwA -DnbkKvbdliETptqa -EPDKjvbdHlBznWpk -DoCkKvbdUaBpsQqy -DoCkKvbdWSOYCFMD -DoDLKvbdxmrhYTIc -DncLKvbdLAkGlbYR -DncKjvbdlhctRUqa -DoCjjvbduDCtwVno -DnbkKvbdIjEAKQHE -DnbjjvbdiLddNuCy -EPDKjvbdEXwktUTl -EPCjjvbdyNrgwsJD -EObkKvbdnPzYujxb -EPDKjvbdznoqEcMY -EPDKjvbdZRNEhleR -DoCjjvbdGQATXHFy -EPCjjvbdyqPNIiwA -EOcKjvbdkxrrTYgU -EOcKjvbdcImKLFvx -DoCkKvbduoTzpkPU -EPCjjvbdJXtCIMQp -EOcKjvbdrpVoJbvG -DncLKvbdqZPIHRDx -DnbjjvbdTAFJHand -EOcKjvbdtcCuWuno -DncLKvbdfIKurNqH -DncKjvbdLrWmZtpz -DoDLKvbdMtsRjmAX -EObjjvbdLGGHbBRV -EObkKvbdCWzchePv -EOcKjvbdZxcjODMS -EObkKvbdzaAPGgBl -DoDLKvbdKVtecdgJ -DnbjjvbdHDjvJbJj -EPCjjvbdLiCLqYAS -EPDLKvbdFVxpPmKF -DoDLKvbdZisIPgBf -DncLKvbdTppoUtgm -DnbjjvbdpyPIGpdY -DoDLKvbdEztRElCi -DncLKvbdHgGzZYYH -DnbjjvbdZLqctOMN -DnbkKvbdqTtGqqkU -DnbjjvbdiMEcnVCy -EPDKjvbdvBDxrneI -DoDKjvbdemGXHNJk -DoDKjvbdhficYvKV -EObjjvbdegkWSOQg -DoDLKvbdOFDtIiKd -EPCjjvbdBdQAuimG -DoCjjvbdpyPHgREY -DncKjvbdJXsbHkpp -DoDKjvbdRbEElIxk -DoDKjvbdsQWPJcWG -EObkKvbdsCGNLfkZ -EOcLKvbdzaAPGgCM -EObkKvbdzjUoodSt -DnbkKvbdemFvgMjL -DnbkKvbdWWhxVcdg -DncLKvbdxrmiMqag -EPCkKvbdMSWlytpz -EObjjvbdwNWAMdFN -EPDLKvbdlrYtzTEJ -DnbjjvbdVqnYBeLc -DncKjvbdnHEwmOGy -DnbjjvbdtbbuWvPP -DncKjvbdmIcspuSB -EObkKvbdEOcKkXCd -EOcKjvbdDncKkXCd -EPDLKvbduaDxrndh -DoCjjvbdOFDshhkE -DnbkKvbdRaceLhyL -EPCkKvbdZshhyDrn -DoCjjvbdCSaDTfWr -EOcKjvbdqUTfrSLU -EPDLKvbdtTRryZdc -DoDLKvbdkyTRsZGt -EPDKjvbdyqPNIjXA -DoCkKvbdNUrrKmAX -DoCjjvbdSCDeMIxk -EObkKvbdkMbLzEgP -DncKjvbdEvZPpMie -DoCkKvbdyYIibQZk -EObkKvbdNPxQumfs -EOcLKvbdDncKjvbd -EPCkKvbdozmcjxPA -EPDKjvbdCIkCLIfK -DncKjvbdcyxoxZRC -DoCkKvbdeOdrkUUS -DoCjjvbdhzVFlQnG -EObjjvbdOFETiJLE -DncKjvbdhyuGLqNf -EObkKvbdRWmdClID -DoCjjvbdFpATWgFy -DnbkKvbdlqxtysDi -EObjjvbdqmZjYkhJ -DoDKjvbdZyDjODMS -DoCjjvbdEJhJvYKA -EOcKjvbdqTsgRrLU -EOcKjvbdZsiIxcrn -EObkKvbdIHGzZYYH -EPDKjvbdHgGyxxXg -EObkKvbdxmrgwriD -EPCkKvbdxrnJNSBg -DnbkKvbdjhGkefOL -EPCjjvbdKQydoGNe -EOcKjvbdqvpMDJZR -EObjjvbdQdDBQQdS -DoDKjvbdSKxfVHKs -DoDKjvbdbLLeoODA -DoDLKvbdBsAcUGWr -DoCjjvbdRzKHrbvA -EObjjvbdfMfXGljL -EObkKvbddeOrCWbj -DoDKjvbddjJrVtzn -DoDLKvbdhtydvqtb -DnbjjvbdRNXayOUz -EPDLKvbdRjyFtgKs -EObkKvbdsPuoKCvG -EPCkKvbdYqNEiNFR -DncKjvbdUxgsyjnn -EPCjjvbdZRMdhldq -DoDLKvbdEJhKWXjA -DoCkKvbdQwODblID -EPCkKvbdssRrxzFD -DnbjjvbdZxdKOCkr -EObjjvbduCcUwVno -EOcKjvbdmuUzLKRf -EPCjjvbdfpBzvcwh -DnbjjvbdMowpvNfs -EPDKjvbdGLErcHmV -EPDLKvbdZoOIeEyj -DncLKvbdSLZGUgKs -DncLKvbdlqyUzTEJ -EPCjjvbddePRawDK -DncKjvbdHEKvKCJj -DoDKjvbdeEnqavcK -DoDLKvbdtSrTYzFD -EPDLKvbdxUmFQxlO -DnbjjvbdLLBIWAJy -EOcLKvbdMowqWNfs -EPDKjvbdptUGrSKt -DoDLKvbdHEKvKCKK -EPCjjvbdJcJbpjDY -DnbjjvbdMuTRkNAX -DnbkKvbdEzspdlDJ -DncLKvbdVUMsekvK -EPDKjvbdOTUVgEtp -DncKjvbdAMgySwZx -DoCkKvbdwtmFRYkn -EObjjvbdIjEAKPgE -EPDKjvbdRpTfjGEX -DncKjvbdFjeSbglu -EObkKvbdjFLGtoAO -DoCkKvbduWOYJqTA -EPCkKvbdVAapsQrZ -DnbjjvbdVwJXudEg -DoDLKvbdUtMsfLvK -EPCjjvbdHELVjBij -DncKjvbdRWnECkhD -EPDLKvbdZsiJZDsO -DncLKvbdnPzZWLYb -EPCjjvbdznoqEcMY -EOcKjvbdzoQQeDMY -DnbjjvbdznpQdbkx -EPDKjvbdeYZtTrFz -DoCkKvbdkySrTZHU -DncKjvbdCSaDUGXS -DoCkKvbdcJNJjfXY -EOcLKvbdCEQAvJlf -EPDKjvbdyzdmqhJI -DncLKvbdNPwpvNgT -DoDKjvbdqmZixkgi -EOcKjvbdVYhUZkPO -EObkKvbdhgJbxvJu -DoDKjvbdUQqPUuHm -DncLKvbdqvolChyR -EPCkKvbdEXxMTssl -DnbkKvbdHgGzYwxH -DoDLKvbdIidAJpGd -DnbkKvbdZLqdUOMN -DnbkKvbdGckViaij -DoCkKvbdFVxopNJe -EOcLKvbdRbEFMIyL -EObkKvbdLAjflawq -EObjjvbdziuPodTU -EPDLKvbdQwNdCkhD -EPCjjvbdZxdJmcLr -EPDLKvbdxrmhlqag -DoCkKvbdSPsgJfDw -EPCjjvbdkDLjpgUg -DnbjjvbdtbcUwWOo -DnbkKvbdWIXuxHYz -EObjjvbdEvYpQMie -DoDLKvbdIHGzZXxH -EPDLKvbdVYgszKoO -DncKjvbdhancEvpq -EPCjjvbdcJNKKewY -EPDKjvbdWWhwvEEg -EOcLKvbdvAdYsOdh -EObkKvbdcyyPwxqC -EObjjvbdSPtGifDw -EOcLKvbdkMalZeHP -EPDKjvbdYlRctNlN -DoDLKvbdKWVGEFGi -DncLKvbdMgColouL -DncLKvbdhbPCeXRR -DncLKvbdDwxMTstM -DoDKjvbdvAcySndh -EObkKvbdXGYytAPT -DoCjjvbdmuVZjjRf -EOcLKvbdDGlFgAzc -DoDKjvbdiBncFXRR -DoDKjvbdkaMnmALA -DncKjvbdVBCQrqSZ -DoCkKvbdVviYWEFH -EObkKvbdAMhZSwZx -DoDLKvbdeAUQlwjG -DoDLKvbdZxcjODMS -EOcLKvbdrpWPKDVf -EPCkKvbdWRnYCFLc -DnbkKvbdKeehBaRV -DoDKjvbdMSXMzUpz -EOcKjvbdRkZGVGjs -DoDLKvbdFkFScIMu -DoCjjvbdZjTHogBf -DnbkKvbdnBivwnmu -EOcKjvbdCTAcTevr -EOcKjvbdVviXvDeH -DoDLKvbdliDsptqa -EPDLKvbdZirgpGaf -EPCjjvbdaRfChUFk -EPCjjvbdkClKqGtg -DoCjjvbdKQyeOfOF -EPCkKvbdqvpLbiYq -DnbjjvbdCTBDTfXS -DoCjjvbdOEctIhkE -EObjjvbdbVCHXkUI -DncKjvbdxnTIXrhc -DnbjjvbdezvYdhsw -EPCjjvbdDwwkstUM -EPCkKvbdaaVdepQX -DoDLKvbdjlbMZeHP -DoDLKvbdqAiFAXHd -EPDLKvbdGLEsCglu -EPCjjvbdZyDinClS -EPCkKvbdSLYeuGkT -EPDKjvbdwyhGFweS -EOcLKvbdjJfIKNYS -DoCjjvbddeOrCXCj -DoDKjvbdkxrqsZHU -EOcKjvbdGYuVBEYC -DncKjvbdHkazmvqL -DnbkKvbdZsiIxdSn -EObkKvbdhanbeXQq -EOcLKvbdMpXqWNfs -DnbkKvbdEztQdkcJ -EPCjjvbdDjHjWXjA -EOcKjvbdNQYQvNgT -EPCkKvbdNHCpNPtk -DoCjjvbdbsCkUDjB -EObkKvbdOStWGeUp -EOcKjvbdVqnYBdlD -DoCkKvbdvlvANDeN -DoDKjvbdnQZyWKyC -EOcLKvbdkyTRsYft -EOcKjvbdnVUyjiqf -EPCjjvbdXnRAXtut -EPDKjvbddZxpXxpb -EPDLKvbdfHjvSOQg -DncKjvbdXsMBNTnx -DncKjvbdEARiMzXX -EPCjjvbdOStVgEuQ -DnbjjvbdHELWKCKK -EOcLKvbdehLWSOQg -DncLKvbdYkqctOLm -DoDLKvbdxsOJMqbH -DoCjjvbdzGyMANFX -DoCjjvbdSCEElJZL -DoDKjvbdRkYeuHLT -EOcKjvbdXsLaMsnx -DnbjjvbdePFSkUUS -DncKjvbdGZUuAdXb -EOcLKvbdlZSqsZGt -DncKjvbdiCPCdwRR -EObjjvbdjvXOEBxX -EPDLKvbdRXOEDMHc -EPCkKvbdZisIQHCG -EPDKjvbdjKGIKNYS -DncLKvbdWWiYVdEg -DnbjjvbdaMkBruNH -EOcLKvbdOFEThiKd -DoCkKvbdVZHszLPO -DoDKjvbdiHJcYvJu -EPCkKvbdwuNFRZLn -EObkKvbdJqZdoGNe -EOcKjvbddndsLUUS -EOcLKvbdBraCtGWr -DncLKvbdxrnJNRbH -DoDLKvbdCWzciFPv -EPCkKvbdtlXvaUAw -DoCjjvbdMfbomQUk -DoCjjvbdfoazwDxI -DoCkKvbdauCHXkUI -DnbjjvbdaogHELzd -EPCjjvbdTulPisaR -EPCkKvbdOSsvHEtp -DoDLKvbdTkuoBVni -EPDKjvbdVBBqTRSZ -DnbjjvbdEJgivYKA -DncKjvbdJXtBgkqQ -DnbkKvbdbsCjsdJa -EPCjjvbdhlEcnUby -EObjjvbdssSSyZdc -EObkKvbdhgKCyWJu -EObkKvbddeOqbWcK -DoCkKvbdqvpLcJYq -EPDKjvbdxZgefXeS -EOcLKvbdkVwOEBww -EPDKjvbdemFvfljL -EPCjjvbdFkErcIMu -EOcKjvbdZyEKNcMS -EPDKjvbdqlzJxlHi -EPCjjvbdmbJwXnmu -EOcLKvbdcTDLTcia -DoCkKvbdyzdmqhJI -DnbjjvbdGdLWKBij -DoDKjvbduaDxsPEh -DoDKjvbdZshhxdTO -DncKjvbdptUGqrKt -EPCjjvbdJvVFceGi -EOcKjvbdddoRawDK -DoCkKvbdfMfXHMik -EObjjvbdVAbRSpqy -EObkKvbddZyPxYpb -DnbkKvbdVYgszKnn -DoCkKvbdZMRdUNkm -EObjjvbdTvMPitBR -EObkKvbdIxTaglQp -EObkKvbdGGKSNiUR -DoCkKvbdGBOpyJzm -EPCjjvbdqrUjmjaN -DncKjvbdIMBzmvpk -EPCjjvbdcyxoxYpb -EOcKjvbdmIcsqUrB -DoCkKvbdqvolChyR -EPCjjvbdkHgMGGOL -EPDLKvbdpaIeAWgd -DncLKvbdqvokcIxq -EOcKjvbdZsiJYcrn -EObkKvbdyYJKBpZk -DoCkKvbdKDKDQicY -EObkKvbdlhdTptqa -EObkKvbdyXhjBpZk -EObkKvbdKNAEZfta -EOcLKvbdRyihTCvA -DncLKvbdtcCtwVno -DnbjjvbdVZITykOn -DoCjjvbdJSyArlwl -EPDKjvbdDxYLtUUM -EPDKjvbdvlvANEFN -DoDKjvbdrykpTAgn -DnbjjvbdeYZtUSFz -DoDKjvbdzjVQQETU -EObjjvbdiHJbyVjV -DoCjjvbdcScLTcjB -DncLKvbdhaoDEwQq -DnbkKvbdQlwbZNtz -EPCjjvbdEARiMzXX -EPCjjvbdGFjSOIsq -DoDKjvbdrXPlChxq -DoDLKvbdYqMeImEq -DoDKjvbdOFETiJKd -EPCjjvbdCTBDUFvr -DoCkKvbdZoOIdeZj -DncLKvbdHgHZyYXg -EOcLKvbdCSaCsevr -DoCjjvbdsQWOjCuf -DoDKjvbdKWUfDeGi -EOcKjvbdzitpPcrt -EPDKjvbdZyDimcMS -EPCjjvbdBcpAuilf -EOcKjvbdqwQMCiYq -EOcLKvbdsrrTZZdc -EObjjvbdSQUHKGEX -DoDLKvbdcyxoxZRC -EObkKvbdWXJYWEFH -DnbkKvbdhgKDYuiu -DoDKjvbdrSVLOKaN -EPCjjvbdMoxQumgT -EPDKjvbdcbTMrATm -EPDKjvbdznopdcMY -DnbjjvbdzdzOzdyp -EObjjvbdGYuVBEXb -EPDKjvbdiZtekpnG -DoDLKvbdvvlAuaVu -DoDKjvbdEYXkstTl -EPCjjvbdauCHYKsh -DoCjjvbdDjIJuwjA -EObjjvbdkNCLzFGo -EPDLKvbdiGicZWKV -EPCkKvbdtlXvaTaX -DoCkKvbdpyOggQcx -EObjjvbdtTSSyZdc -DoDLKvbdiZtelROG -EOcLKvbdWRnYCFMD -EPDLKvbdNddUIhjd -DncLKvbdEObjjvbd -EPDLKvbdVUNTelVj -EPCjjvbdVhXvYGxz -DoCkKvbdfRaWzkbo -DoCjjvbdRjyGVHKs -DoCjjvbdSKxfUfkT -EOcKjvbdaRecITek -DoCkKvbdEJhKVwjA -DoDLKvbdwXLaWBVu -EPDLKvbdLYqJrztf -DncKjvbdUMVoAuoJ -DnbjjvbdvmWAMcdm -EObjjvbdpssfqrKt -DnbjjvbdhlEcnVDZ -EOcKjvbdNsUWGeVQ -EObjjvbdVUNTekuj -DnbkKvbdVYgsykOn -EObkKvbdpssgSRjt -DncKjvbdVZITzLOn -DoDKjvbdGGJrNiTq -DoDLKvbdACqwizJQ -DoDKjvbdIryArmXl -DoCkKvbdZMRdTmlN -DnbkKvbdrovPKDVf -EObkKvbdrounjDWG -DnbjjvbdCSaDTevr -DnbjjvbdUyITyjnn -DnbkKvbdKRZeOfOF -DoCkKvbdDigiuxKA -EOcKjvbdxsNhlrCH -EOcLKvbdDjHiuxKA -DncKjvbdXmqAXtvU -DnbjjvbdqFdFTvAh -EObkKvbdxrmhmSBg -DoCjjvbdIidAKPfd -EOcKjvbdKQydoGOF -DnbjjvbdlqyUzSdJ -EPDKjvbdtvOYKQsA -EPCkKvbdcIljLFvx -DoCjjvbdYqNEhldq -EPDKjvbdczYpYZRC -DoDLKvbdiBoCeXQq -EOcLKvbdiCPDFXRR -EPDLKvbdZisHofaf -EPDKjvbdmIdURVSB -EPDKjvbdZRNFIldq -DoDKjvbdJpydoFme -DoDLKvbdWWhwudEg -DncLKvbdDnbjjwDE -DncKjvbdqTsfqqkU -DncKjvbdKDKDRKDY -DoDKjvbdTulQJsaR -DoCjjvbdSBdFMIyL -DncLKvbdqTtHSSKt -EOcKjvbdBcoaVjMf -EObjjvbdiiehKNXr -EObjjvbdCWzciFQW -EPDLKvbdWSNwadlD -EPDKjvbdKVuGEFHJ -DoCkKvbdZMRdUNlN -EPDKjvbdZRMdiMdq -EPCkKvbdxUmEpyMO -DoDLKvbdRkYfVHKs -EObjjvbdIwtCIMQp -EPDKjvbdmJDsqUqa -EPDKjvbdrDeJPmvB -EOcKjvbdTvMPisaR -DncKjvbdMtsRjmAX -DnbjjvbdlqyUysDi -EPDKjvbdQwNdClID -DncLKvbdRjxfVGjs -EObkKvbdauBfxKtI -DoDLKvbdiZtfLpnG -DoDKjvbdhancFXRR -DoDKjvbdREDBQQdS -EObjjvbdrzMQTBIO -EOcKjvbdcImKKfXY -DoDLKvbdijGIKNXr -DncLKvbdgGMZmfgA -EPCjjvbdZnmheFZj -EPDKjvbdmuVZjiqf -EObjjvbdeFPRawDK -EPDLKvbdrNZiyLhJ -EOcKjvbdlhdURUrB -EPDLKvbdGGJrNhtR -EOcKjvbdiGibyWKV -EOcKjvbdQlwbZNtz -DncLKvbdnVUzKiqf -EOcKjvbdbsDKscjB -EPDLKvbdDnbjjvcE -DoCkKvbdySmhmRag -DncKjvbdkyTSTYft -DoDLKvbdEYXkstUM -EOcKjvbdiHJbyVjV -EOcKjvbdsQVnicWG -DoCkKvbdoznDkYPA -EObkKvbdURQoVVHm -EPDLKvbdFfKSNiTq -DnbjjvbdVgxVwgYz -DnbkKvbdmfeYNOHZ -DoDKjvbdyqPNIiwA -EObjjvbdFVyQPlie -EOcLKvbdGdKvKBij -EPCjjvbdDwxMUTtM -DoCkKvbdKVtfEEfi -DoCkKvbddjKRvUzn -EObkKvbdliEURVSB -EPDLKvbdWSNwaeMD -EOcLKvbdJqZdoFnF -DnbjjvbdKxqJrzuG -DnbjjvbdmuUyjjSG -EPDLKvbdADRxKZhp -EPCkKvbdiCPDEwRR -EObjjvbdTXkMNzkY -DnbjjvbdMgDPlouL -EPCjjvbdyzeNqghh -EOcKjvbdmuUyjjSG -EPDKjvbdDoDLKvcE -EPDLKvbdNxPVzdNt -DoDKjvbdBhjbKhfK -DnbjjvbdZLrETmlN -DoCkKvbdHffyxwwg -EOcKjvbdYSlAmUPY -EPCjjvbdtTSTYzFD -DoCjjvbdFjeTCgmV -EObjjvbdNwnuzcnU -DoDLKvbdSPsfiecw -DoDKjvbdKVtedFGi -EObjjvbdUaCQsRRy -EObkKvbdbsDLUDjB -EObkKvbdEOcKjvcE -EPCjjvbdyNsIYShc -EOcLKvbdbVCGxKsh -DoDKjvbdlZSqsYft -DoCjjvbdUslselWK -DncLKvbdbUbHXkUI -DnbkKvbdYkqcsmkm -DncKjvbdXsMAmUOx -DoDKjvbdJuuFcdgJ -EOcLKvbdGLFTChNV -DoCkKvbdaaWEfQQX -DncKjvbdVqnXbFMD -EOcKjvbdZyEJnClS -DoCkKvbdNdctJIjd -DoDLKvbdmaiwYOmu -EPCkKvbdmbJvxPOV -DncLKvbdTqRPUuIN -EPDLKvbdGGKSNiUR -EPCjjvbdIwtCIMQp -EOcKjvbdHDjvJajK -EOcLKvbdZyEJnDMS -DnbkKvbdrWpMDJZR -EOcLKvbdbUagXjtI -EOcLKvbdLGFgbBRV -EOcKjvbdqvpMDIxq -EPDKjvbdOAJSsjSA -DncKjvbdsrqsYyeD -DnbjjvbdtkwvaUBX -DnbjjvbdGQASwGfZ -EObkKvbdURROtuIN -EObkKvbdiUydwRtb -EOcLKvbdqlyixkhJ -EPCkKvbduaEYroFI -DoCkKvbdnUtyjiqf -DoCkKvbdssSTYzFD -DncLKvbdeATqMwjG -DnbkKvbdqlyjYlHi -DncLKvbdTAEhhCOd -EOcLKvbdpxoIHQdY -EPDKjvbdEXxLsstM -DncLKvbdbLLfPNcA -DoDLKvbdCWzdIeQW -DnbjjvbdWSNwbElD -DoDKjvbdGFjSOJUR -DoCjjvbdmttzKjRf -EPCjjvbdqmZjZMHi -DncLKvbddwzUTqez -EObkKvbdrEFIpOVa -DnbjjvbduMYWaTaX -EPDKjvbdTAEiIBoE -EOcKjvbdVrNwaeMD -DoCjjvbdSwkMNzjx -DoDKjvbdZoNheEyj -EObjjvbdFpASvgGZ -DnbkKvbdvBDxsPEh -DoDKjvbdIHGzYxYH -EOcLKvbdhanbeXQq -EObkKvbdACqxJyhp -DoDLKvbdgQBzwDxI -EObjjvbdOYOuzdNt -DnbjjvbdRWmdDMHc -EPCkKvbdePFTLUUS -DnbkKvbdHlBznWpk -EPCkKvbdqlyixlIJ -DnbjjvbdIHHZyYXg -EObjjvbdBcoaVimG -EOcLKvbdZnnIddzK -DnbjjvbdBiLBjhfK -EPDLKvbdeOeTKtTr -EObkKvbdYlRcsnLm -DoDKjvbdnHExNOGy -DoCkKvbdnCJwXoNu -EOcKjvbdwWlBWBWV -DnbjjvbdGYuVAdXb -EObkKvbdLGGHbBQu -EPCkKvbdEJgjVxKA -EObkKvbdlqyVZrdJ -EObkKvbdaNLBsUmH -EPCkKvbdGQASwHGZ -DncLKvbdnBjWwnnV -DnbjjvbdUslsekuj -DncLKvbdeATqNYJf -EOcLKvbdIwtCHlQp -EOcLKvbdGLErcIMu -DnbkKvbdjvXOECXw -EPCkKvbdfSAvzkbo -DnbjjvbdsCGNMHKy -DoDLKvbdURQnuVHm -EObjjvbdQvmdCkgc -EPCjjvbdSPsgKFcw -EPDLKvbdYpmEhleR -EPCjjvbdFjdsDHlu -EPDLKvbdqdFIpOWB -EObjjvbdnQZyVkZC -EPCjjvbdQdCaQRES -DnbjjvbdADRwiyiQ -DnbjjvbdiiehKNYS -DoCkKvbdHkaznWqL -EObjjvbdmoyxujxb -EOcLKvbdxxIibQZk -EObjjvbdsPuoKCvG -EObjjvbdjcMKpftg -EOcKjvbdZisHofbG -DncLKvbdUGznLwWF -DoDLKvbdFfJqnJUR -DnbjjvbdsBelkgLZ -DoCkKvbdrbGNLfkZ -DncKjvbdeYZssqez -EPCkKvbdyNsHwsIc -DnbkKvbdrafMkfjy -EPCjjvbdZyEJnDMS -DnbjjvbdFpASwGey -DnbkKvbdLGGIBaQu -DncLKvbddiiqutzn -DncKjvbdWIXuwfxz -DoCjjvbdNPxRVnHT -DncKjvbdwygefXeS -EPDLKvbdmJEUQtrB -EPCjjvbdQwOECkhD -DoDLKvbdNGbpMotk -DncLKvbdRyjIScWA -DncLKvbdVrOXaeMD -DncLKvbdQmYBxnUz -DnbjjvbdVBCRSqSZ -EPCkKvbdRosfifEX -EPDLKvbdlYrqrxgU -EPDLKvbdKVuGDeHJ -DncLKvbdDncLLWcE -EOcLKvbdfNGXGmKL -EOcLKvbdQvmdDMHc -EOcLKvbdEARiMyvw -DoCjjvbdnHFXlnGy -EOcKjvbdhtyeXRtb -DncKjvbdMgDQNQVL -EObjjvbdpedFUWBI -EPDKjvbdkHfkfFnL -DoDKjvbdrXQMChyR -EObkKvbdREDAoqES -DoDKjvbdBdQAvKMf -DoCkKvbdjvWnDaxX -DnbkKvbdePEsKstS -EPDKjvbdyOTHwsJD -DnbkKvbdrSVKnKaN -EPCkKvbdZirgpHBf -DoCkKvbdsQVnjDVf -DnbjjvbdGLEsCgmV -EPDLKvbdelewHMjL -EObjjvbdjlbMZeGo -DoDLKvbdxrmhlrCH -DoCkKvbdczZQXyQb -EObjjvbdRDcBQRDr -DoCjjvbdxLXEHzyf -DoCkKvbdkySrTZGt -DoCjjvbdDoDKjwCd -EObkKvbdKWVGEEfi -DoDKjvbdTqQoUuIN -EObjjvbdZRNEiMeR -DoDKjvbdxUmEpyMO -EPDLKvbdxxJJaozL -EObkKvbdraemLfkZ -EPCjjvbdbiNKLFvx -DnbjjvbdZjSgpHCG -EObjjvbdqBIeAXHd -EObjjvbdVUNUGMWK -EPDKjvbdliDsqUqa -EOcLKvbdxZgfGYFS -DnbjjvbdYpmFJMdq -EPCkKvbdcTCjtEKB -DncLKvbdVUMtFlVj -EPDKjvbdcIlijevx -DoCjjvbdpstHSSKt -EOcKjvbdLAjgMaxR -DoDKjvbdHkaznXQk -EPDLKvbdrovPJcVf -EObjjvbdjblLRHVH -EPCkKvbdfSAvzlCo -EPDLKvbdkHfkefOL -DoCjjvbdbiNKKfXY -EPDLKvbdjJfHilwr -EOcKjvbdxVMeQxkn -DncKjvbdqlzJyMIJ -DoDLKvbdffMZnGgA -EPDLKvbdrpWPJcVf -DnbkKvbdNsTvGeVQ -DncKjvbdZshiZETO -DoCjjvbdWRnXaeLc -EPDLKvbdUaCRTQqy -EOcKjvbdKDKDQjCx -EPCkKvbdLKaIWAJy -DoDKjvbdjblKpftg -EPDKjvbdfHkWSNqH -EObjjvbdSCEEkiZL -EPDKjvbdcyxpYZQb -EPDLKvbdVUMtFkuj -DnbjjvbdVBCQrprZ -EObjjvbddoEsLUUS -DnbkKvbdiHKDZVjV -EOcKjvbdpyPHgRDx -EObjjvbdYpleJNFR -DncLKvbdrDdhpOWB -DncLKvbdcbSmSAUN -DncLKvbdQwODcLgc -EPCjjvbdKVuFcdgJ -EPDLKvbdJvUecdfi -EObkKvbddjJqvUzn -EPCkKvbdLrXNZuQz -DnbkKvbdDihJuxKA -DoCjjvbdegkWSORH -DncKjvbdFyVUaEYC -DoDLKvbdNHDPlpVL -DoDLKvbddneTKtUS -DoCjjvbdEARhlywX -DncKjvbdmbJwYPOV -DnbjjvbddeOrBvbj -EPDKjvbdAMhZTXZx -DnbjjvbdULuoBVoJ -DoCkKvbdMfbomQVL -EObjjvbdyTNhlqbH -EPDLKvbdcyxowxpb -DoCkKvbdEPDLLXCd -DncLKvbdSCEFLiZL -DnbjjvbdBiLCKiFj -EPCjjvbdmgExNNgZ -EOcLKvbdsPvPKDVf -DoCkKvbdbKkfOmcA -DncLKvbdIxTaglRQ -DnbkKvbdFVyQQNJe -EPDLKvbdbsCjtEKB -EPDKjvbdakMFnnDA -EObjjvbdWWiYVcdg -DnbkKvbdfSAvzkcP -EOcLKvbdbKkennDA -EPCjjvbdTppoVUhN -EPDLKvbdemGWgMjL -DnbjjvbdJvUedFHJ -DoDLKvbdqvokbiZR -EPCjjvbdZMRctOMN -DoCjjvbdNPwpunGs -DoCkKvbdZtJIyDrn -EPCjjvbdFejRnIsq -EPDLKvbdZshhxdTO -DncLKvbdxZhGGXeS -DoDLKvbdKyRKSztf -EPDKjvbdCflFgAzc -EPDKjvbdOEdThiKd -DoDLKvbdTAFIgaoE -EObjjvbdEARiNZvw -EOcLKvbdjhHLefOL -DncKjvbdbVCHXjtI -EPDKjvbdeFPRawCj -DoDLKvbdtcCuWuoP -DoDLKvbdUVkpJtAq -EPCjjvbdaSFcHsfL -EPDKjvbdPxmAGrrK -EPCkKvbdDjHjWXjA -DnbkKvbdpssfqrKt -DoDKjvbdePEsKtTr -EObkKvbdDwxMUTtM -DnbkKvbdZRMdiNEq -EPCjjvbdhuZdvquC -DoCjjvbdGLEsChMu -EPDKjvbdRDbaQQdS -EOcKjvbdEJhJvYKA -DncKjvbdkxsSSxft -EObjjvbdKRZdnfOF -EOcLKvbdZQmFIleR -DnbkKvbdjcLjpfuH -DnbkKvbdYzbfSKWZ -EPDLKvbdbUafxLTh -EPCjjvbdJuuFcdgJ -DoCkKvbdJcKCqJcY -DoCjjvbdSKyGVGkT -DoCjjvbdemFvflik -DoCjjvbdvBEYsPEh -EOcKjvbdCWzdJEov -DncLKvbdqTsgSSKt -DnbkKvbdUMVoBWOi -EPCkKvbdOEcsiIjd -DncLKvbdaSFbhUFk -DoCkKvbdhtzEwRuC -DoCkKvbdiCOcEvqR -DoCkKvbdfILVqnRH -DnbkKvbdCJLCKhej -EPCkKvbdakLeoODA -DnbkKvbdUaCRTQrZ -DoDKjvbdRacdkhyL -EPCjjvbdYNqAXtut -DncKjvbdwzHfFwdr -DncLKvbdNrsvGeUp -EPDKjvbdDoCkKvbd -EPCjjvbdrafNLfkZ -EObjjvbdmajXXoOV -DncLKvbdVAbRTQrZ -EObkKvbdkySrTZHU -DoDKjvbdZeXfzghb -EPDLKvbdiCOcFWpq -EOcKjvbdUQpnuUhN -DncLKvbdijGIKMwr -DncKjvbdHgHZxwwg -DncLKvbdVTmUFlWK -DoDKjvbdeYZtUSFz -EPDKjvbdHffyyYXg -DncKjvbdXsLaMtOx -DncKjvbdzitoocrt -DoDKjvbdhtyeWquC -EPDKjvbdEuyPpNKF -DnbkKvbdtvOYKRTA -DncKjvbdZnnJFEzK -EPCkKvbdqZPIGpcx -DnbkKvbdVgxWYGxz -EPCjjvbdOStWHEuQ -EObkKvbdNddTiIjd -DoDKjvbdwXMBWAuu -EPDLKvbdsPvPKDVf -DncLKvbdQvnDbkhD -DncKjvbdEKHjWYKA -EPCkKvbdCgMFgAzc -EOcLKvbdQvnDbkgc -EPCjjvbdDoCkLWbd -DnbkKvbdKCibpicY -EOcLKvbdhfibyViu -EOcLKvbdzQnliJwA -DncKjvbdEASImZwX -EPDLKvbdFkFTChNV -DnbjjvbdEuxoomKF -EOcKjvbdYqMeJMeR -DnbjjvbdgQBzvdYI -DoCjjvbdkxrrSxft -DnbjjvbdjuwNdCYX -EOcLKvbdfpBzwEXh -DoCkKvbdnHFYMmgZ -EOcKjvbdjlbMZeHP -DoCkKvbdmttzKjSG -EPDLKvbdzjUopDsU -EPDLKvbdsZlPraIO -EOcLKvbdLBLHMbYR -EPDLKvbdtbcVXVno -DoDLKvbdaaVeGQQX -EPCjjvbdWSOYCEkc -EObjjvbdxUmFQyMO -DoDLKvbdRbDdkiZL -DoCjjvbdhlFDnVCy -EPDKjvbdcTDKscia -EPCkKvbdjlbMZeGo -DncLKvbdCIkCKiGK -DoCjjvbdrbFmMGkZ -EObkKvbdQccAoqDr -DnbjjvbdTqRPVUgm -EPCkKvbdNrsufeUp -EOcLKvbdrMyjZLhJ -EPDLKvbdiifHimXr -DnbkKvbdpstHSRjt -EOcKjvbdZtIhxdSn -DnbkKvbdbhmKLGXY -DnbkKvbdkxsSSxft -DoCjjvbdTAFIhBnd -EObkKvbdUtMtGLvK -EPCjjvbdpstGrSLU -DncKjvbdxLXDgzyf -EOcKjvbdSCDdlIxk -EObkKvbdOFEUIiLE -DnbkKvbdjggLefNk -DncKjvbdliEUQtqa -EOcLKvbdFjdsDHlu -DncLKvbdeEnqavcK -EOcLKvbdnPyyVjyC -DoDKjvbdliDsptrB -DoCkKvbdrXQLbiZR -DncLKvbdFkErbhNV -DoDKjvbdTqROtthN -DoCkKvbdYSlAmUOx -DnbkKvbdKVuGDdgJ -EOcKjvbdvwLaWAvV -DoDLKvbdEObjjvbd -DnbkKvbdwXLaWBVu -DnbkKvbdmtuZjiqf -DoDKjvbdegkWRnRH -DoCkKvbdeXzUUSFz -DncLKvbdfNGXGmJk -DoCjjvbdEztQdlCi -EPCkKvbdEuyQPljF -EPCjjvbdrEEiQNvB -DnbkKvbdLqwNZtpz -EObkKvbdKeegbBQu -EObkKvbdvBEZSoFI -DoDLKvbdrXQLbhyR -DnbkKvbdbKlGPODA -DncLKvbdnCKXYOnV -EOcKjvbdjcMKpfuH -DoCkKvbdQdCaQRES -EPCkKvbdDncKjwCd -DoDLKvbdYlSDtNkm -EObkKvbdmbKXXnmu -EPCkKvbdjgfkfGOL -DnbkKvbdZyDjNcMS -EOcLKvbdkNCLyeHP -DncLKvbdVUMtGLuj -EOcKjvbdKVtedFGi -EPCjjvbdKRZeOenF -DoCjjvbdUQqPUthN -EPDKjvbdkMbLydgP -EObjjvbdVqmxBdlD -EPDKjvbdjAQGaPgK -DoCkKvbdTlVnaWPJ -EPCjjvbdwjvdHzzG -EObjjvbdBsBCtGWr -EPCjjvbdwuNEqZMO -DncLKvbdbrcKtEKB -EPCkKvbdFyVVAcxC -EPCkKvbdaSGCgsfL -EPDKjvbdrylQTBIO -DncKjvbdfSBWzlCo -EObjjvbdfRaWzlCo -DnbkKvbdsPvOjDWG -EPCjjvbdcbSlrAUN -EObkKvbdrWpLbhxq -EPCjjvbdhgKDZVjV -EOcKjvbdhlFDnUby -DoCkKvbdddoSBvcK -DoCkKvbdpssfrRkU -DoDLKvbdJutfEFGi -EObkKvbdEPDKkWcE -EOcKjvbdcJNJjevx -EPCjjvbdcTDKscia -DncKjvbdYlRcsmlN -EPDLKvbdkHgMFfNk -DoCkKvbdjbkjqGuH -EPDKjvbdTvMPjUAq -DnbkKvbdQYmAGsRj -EPCkKvbdKeegbApu -EPDKjvbdiLdcmtcZ -DoCkKvbdNeDshhjd -EOcLKvbdxnShXsIc -EPDLKvbdyOShXrhc -EObkKvbdbPgHELzd -DoCjjvbdDoCkKwDE -EOcLKvbdmbJvxPOV -DnbjjvbdkNBlZeHP -DnbkKvbdRXNdDMID -DncLKvbdXnRAYUvU -EObkKvbdBcpAuilf -EPDKjvbdSLYeuGkT -DoCjjvbdRaceLiYk -DncLKvbdZoNiFEzK -EOcLKvbdGLEsDIMu -DnbjjvbdnUuZkJqf -DoCkKvbdlqyUyrci -DoCkKvbdLGGHaaRV -DnbkKvbdmoyyWLYb -DncKjvbdMpYRWOGs -DnbjjvbdkyTRsYft -EObkKvbdjKFhJmXr -DnbjjvbdxLWcgzzG -DoCkKvbdxnShXrhc -DnbjjvbdRbEEkiZL -EOcLKvbdWWiXudEg -DoDLKvbdDjIKVxKA -DoDKjvbdgFkzNgHA -EPDLKvbdvvlAuaVu -EPDLKvbdauBfwkTh -DncLKvbdmIctQtrB -EPDKjvbdCDpBWJmG -DoDKjvbdvAcxsPEh -EOcKjvbdrJAKFNOe -EOcLKvbdbsDKscia -DncLKvbdAMhYsWzY -DncKjvbdddnrCXDK -EOcLKvbdkHflGGOL -DoDKjvbdbUafxKsh -DnbkKvbdNdctIiLE -EOcLKvbdvBDyTPEh -DoCjjvbdFejSOJUR -DnbkKvbdUQpntuHm -EObjjvbdTpqOttgm -DoDLKvbdddoSCXCj -DncLKvbdbVCHXkUI -EPCjjvbdKNAEZgVB -EPDKjvbdFjdsDIMu -DnbjjvbdpaIeAXHd -EOcLKvbdrDdhpOWB -EPDKjvbdIxUBhLpp -EPDKjvbdhkddOVCy -EPCkKvbdTkuoAuni -EPDLKvbdnPyxujxb -EObjjvbdfSBWzlCo -EPDKjvbdMuSrKmAX -EPDLKvbdmozYvKyC -DnbkKvbdZirhPfaf -EPCjjvbdNQXqWOHT -DncKjvbdZsiIyESn -DnbkKvbdURQnuUgm -DoCjjvbdkIHMFfOL -EPDKjvbdKfGHaaRV -DncLKvbdtcDUwVoP -EOcLKvbdxrnImRbH -EPDLKvbdozmdLYPA -DoDKjvbdUVkojUBR -DnbjjvbdqUUHRrLU -DoDLKvbdEARhmZvw -EOcLKvbdZHWdAOri -DoCjjvbdVUMtGLuj -EOcLKvbdmfeYNNfy -EPDKjvbdZirgogCG -DnbjjvbdEJhKVwjA -DnbkKvbdkVvmdBxX -DnbjjvbdvBEYsOeI -EPCkKvbdDoCjjwDE -DoCjjvbdRXNdClID -EPDKjvbdkxrrTZGt -EOcLKvbdZdxGzhJC -DoDLKvbdxnSgxSiD -DoDKjvbdIryAsMxM -DnbkKvbdTYKlNzjx -DncLKvbdIGfzZYXg -DncLKvbdQvnEClHc -DnbkKvbdqUTfrRkU -DoDKjvbdRDcAopdS -DoDKjvbdTfznMXWF -EOcLKvbdauCHYKtI -EObkKvbdNrsvHEtp -DoDLKvbdDihJvXjA -DnbjjvbdliDtRVRa -DncKjvbdgFlZmfgA -DncLKvbdmJDsptqa -DncKjvbdfoazvdXh -EOcKjvbdJXtBgkpp -EPCkKvbdqUUGrSKt -EPDKjvbdrMzJyLgi -EPCjjvbdiGjDYuiu -EOcLKvbdkWXNcaww -EOcLKvbdxxIjBoyk -DnbkKvbdePErjssr -DnbjjvbdIryArmYM -EOcLKvbdRMwayNtz -EOcLKvbdRkZGUgKs -DoDKjvbdZLrEUOMN -DnbkKvbdDHMFgAzc -DnbkKvbdwXMBVaVu -DnbjjvbddeOrCXDK -EPDLKvbdwuMeQyLn -EPCjjvbdBhjbLIej -EPDKjvbdaNLCSuMg -EPCjjvbdBhkCKhej -EPCkKvbdptUGrSKt -EObkKvbdVTmTfLvK -DoCkKvbdDoDKkXDE -DnbjjvbdfoazvdYI -DnbkKvbdatbHYKtI -DnbkKvbdVUMtGLuj -EPDKjvbdeEoRavbj -DoCkKvbdJpzFPGNe -DnbjjvbdNHDQNQUk -DncKjvbdYNqAXuWU -EPCkKvbdZnnIddzK -EObkKvbdYlRdTnMN -EPDKjvbdEzspdkcJ -DoDLKvbdCIkBjhfK -EObjjvbdTkuoAvOi -DoCkKvbdhkdcnUby -EPCjjvbdHfgZyYXg -DncLKvbdbsCkTdKB -DoCjjvbdLqwMzVQz -DoDLKvbdRkYfUgLT -EOcLKvbdbQHHELzd -EPCkKvbdbVCGxLTh -EObjjvbdmSYuZsEJ -DoDKjvbdssRsYyeD -EPDKjvbdLrWlytpz -DncKjvbdJTZBSlxM -DnbkKvbdxrnJMrBg -EPCjjvbdxZgfFxFS -EObkKvbdUQpnuVIN -EObkKvbdzjUpQESt -EObjjvbduaDxsPFI -DoDLKvbdkyTRsYft -DoDKjvbdyTOImRbH -EObkKvbdegkWRnQg -DoCjjvbdaSFbgsek -DoDKjvbdrylPsAhO -DoCjjvbdgGMZnGgA -EPCkKvbdlqyUzSdJ -DncKjvbdwNWAMdFN -EPDKjvbdTlWPAuoJ -EOcLKvbdUMWPAuoJ -DnbjjvbddZxowxqC -EPCkKvbdEuyQPlie -DoDKjvbdVAaqSqSZ -EPDLKvbdwtldpxlO -EOcLKvbdrRtkNkBN -DncKjvbdJqZeOenF -DncKjvbdfHkWSNqH -DoCkKvbdnUuZjirG -EOcKjvbdsCFmMGkZ -DoDLKvbdwzIFfYEr -EOcLKvbdqqtjmjaN -DoCjjvbdrbGNLgKy -EPDKjvbdNHComQUk -DnbkKvbdIMBznWqL -EPCjjvbdEKHivXjA -EPDLKvbdVhYWYGxz -EPDLKvbdZxcjNblS -DnbjjvbdJpzEoFme -EPDKjvbderBWzkcP -DoDLKvbdpssgRrKt -EObkKvbdtbbtvuoP -EOcLKvbdqGDeUWAh -DoDKjvbdlZSrTYft -EOcKjvbdFfKRmhtR -DnbkKvbdNPxRVnGs -EPDLKvbdZshhxcsO -EPCjjvbdMoxQvNgT -EPCjjvbdKaKfmBxR -EPDLKvbdSwjkmzjx -DoCkKvbdjbkkRGtg -DoDKjvbdfoazwDxI -DoDKjvbdqwQLbhxq -EPCkKvbdZtIhyETO -DncLKvbdmpZxukYb -EOcKjvbdMoxQumgT -DoCjjvbdLYqJrzuG -EObjjvbdnGeXlmfy -EPDLKvbdyzeOSHhh -EOcLKvbdiZuGMQmf -EPCkKvbdWSNwadkc -DncKjvbdhfibyVjV -EOcKjvbdQmXbZOUz -DoCjjvbdSKxeuGkT -DnbjjvbdbrbkUDjB -EPDLKvbdJcKCqJbx -DnbjjvbdjSziTLJz -EOcKjvbdZxdKNcMS -DoCkKvbdelfWfmJk -DoCjjvbdFjeScHlu -EPDLKvbdnCJvwnnV -EPDKjvbdNrsufduQ -DnbkKvbdjcLjqGuH -EObjjvbdmbKXYOnV -DoCjjvbdRacdkiYk -EObkKvbdaaVdfQQX -DoCkKvbdJpydnfOF -DoCkKvbduCbtwVoP -DoDKjvbdpxnhHRDx -EOcKjvbdmJEUQtqa -EPDLKvbdRkZGVGjs -EPDKjvbdEObjkXCd -EObjjvbdCTAbtGWr -DoCkKvbdqTsfrSKt -DncLKvbdaMkBsUmH -DncLKvbdqlyixlIJ -EPCkKvbdvwMAuaVu -DncKjvbdiUzEwRuC -DoDKjvbdiUzFWrVC -DnbkKvbdkDMKpfuH -EObkKvbdZnnJFEzK -EObkKvbdWWhwudEg -DoCjjvbdypoNIiwA -DoCjjvbdShyiqABM -DnbjjvbdOFEThhkE -DnbjjvbdRXNcbkgc -DoCkKvbdqUTfrSKt -EPDLKvbdfNGWgMjL -EPDLKvbdGFirOJUR -EOcKjvbdSCEFMJYk -EOcKjvbdmpZxukYb -EPDLKvbdrafNLgKy -DnbkKvbdmJDsqUrB -DnbjjvbdjKFgimXr -EOcLKvbdVYgtZjoO -EObkKvbdTvMPjUBR -EOcLKvbdSxKkmzjx -DoDKjvbdnPzYvKxb -EPCjjvbdaRfDITek -EObkKvbdjKGIJmXr -DoCjjvbdliEURVSB -EObkKvbdFaOqYizm -EOcLKvbdqGEEsuaI -DoCjjvbdZQleJNEq -DoCjjvbdbKlFnnDA -DnbjjvbdWIXuwfxz -EPDLKvbdNGcPmPuL -DoCjjvbdBsBDTevr -DnbkKvbdczYoxYpb -EObjjvbdJutedEfi -DncLKvbdGFirNhsq -EPDKjvbdUaCQrqRy -EPCjjvbdQwNdDMID -EPDLKvbdtSrSyZeD -DnbkKvbdNHDQMpUk -DoDKjvbdZirgofaf -EObkKvbdrpWOibuf -DoCkKvbdwygfFxEr -EPCjjvbdSwjlNzjx -DnbkKvbdjKGHjMxS -DncLKvbdijFhKNXr -EOcKjvbdddoRavbj -EPDLKvbdmIdTpuSB -DncLKvbdiiehJmYS -EObkKvbdjcLkQgUg -DoDKjvbdsQVoJbuf -EObjjvbdhzUfMQmf -DnbkKvbdcImKKfWx -EObkKvbdbQHHELzd -DnbjjvbdWWiXuceH -EPDKjvbdjJegjNXr -EPCjjvbdZyEKNblS -DoDKjvbdLqvlzVQz -EPDLKvbdZRNEhmFR -DnbkKvbdGcjuibJj -EOcLKvbdGAnpxizm -EPCjjvbdkVvnDaww -EOcKjvbdHffzZXwg -DoCkKvbdKeehCAqV -EPCjjvbdHEKuiajK -EOcKjvbdUtMselWK -EPDKjvbdEXwlTstM -EPDKjvbdsrrSxzFD -EOcKjvbdEztQeMDJ -EPCkKvbddoFSjstS -DoCkKvbdSCEElIyL -DncKjvbdFVxpQNJe -DnbjjvbdXmqAYUut -DoCjjvbdiZtfLpmf -DoDKjvbdwygeexEr -EOcLKvbdiUyeXSUb -DncKjvbdsZkoraIO -EOcLKvbdACrYJyhp -EOcLKvbdTlVoBVoJ -EPCkKvbdqZPHfqDx -DnbkKvbdmJDsptqa -DncKjvbdhkeDnUcZ -EPDKjvbdURQoUtgm -EPDKjvbdjAQHAogK -EObjjvbdCIkCKhfK -EOcKjvbdYzbfRjWZ -DnbkKvbdWRnYCEkc -DncKjvbdyzeORgiI -EObjjvbdEPCkLWbd -DoDLKvbdNHComPuL -DnbkKvbdaRebhUFk -DnbkKvbdhlEcmtby -EOcLKvbdliETqUrB -EPDKjvbdIxTbHkqQ -DncLKvbdCEPaVjNG -EOcLKvbdIjEAJogE -DoCkKvbdsZkpSaHn -EPDLKvbdEXxLtTtM -DncKjvbdwXMAvAuu -EPDKjvbdakMGPODA -EPCkKvbdauBfxKsh -EOcKjvbdCJKakJFj -EPCkKvbdyXhjBozL -DoDLKvbdkWWnDbYX -DncKjvbdEPCjkXDE -DoDKjvbdlqxtzTDi -EPCjjvbdyTOJNSBg -DoCkKvbdnGeYMmgZ -EPCkKvbdaSFbhUFk -EObjjvbdnCKWxPNu -DoCjjvbdrWpLbhyR -EPDLKvbdmRxtyrci -DnbjjvbdSBdElJZL -DnbkKvbdrXQLbiYq -DoDLKvbdWHwuwfxz -DoCjjvbdZRNFJNEq -DncKjvbdUVkpJsaR -DoCjjvbdbiMijfXY -EPDKjvbdVTmTekvK -DoCjjvbdeXytTrFz -DoDLKvbdyYJKCQZk -DoDLKvbdczZQYZQb -EObjjvbdRadFMJZL -DncLKvbdkVvnECYX -DncKjvbduaDySneI -DnbjjvbdwuNFQyMO -DncLKvbdsrqrxzEc -DoDLKvbdcSbjtEKB -EPCjjvbdZtJIyETO -DoDLKvbdJvUfDdgJ -DnbjjvbdhbPDFWqR -DncKjvbdcyyQYYpb -DoDKjvbdWSNwbFMD -DoCjjvbdmajXXoNu -EPCkKvbdxZgeexEr -EOcKjvbdxsOIlrBg -DoDKjvbdZyEJmbkr -DncLKvbdTkunaVni -EOcLKvbdUQpoUthN -DoDLKvbdyNsHxTJD -DncKjvbdEztRElCi -DnbkKvbdXnRAYVVt -DnbjjvbdqAheAWgd -DnbkKvbdCJLBkIfK -EPDKjvbdUGzmkwWF -EPCkKvbdSiZiqABM -EPDLKvbdidkGtoAO -EOcLKvbdYlSDsnLm -EPDKjvbdMSWmZtpz -DoDKjvbdlhdURVRa -EOcLKvbdOYOuzdOU -DncLKvbdrafMlGkZ -EObjjvbdrylPraHn -DnbjjvbdDncLKwCd -DoCkKvbdoznELXoA -DoCkKvbdmttykJrG -DoDLKvbdBvzciEov -EPCjjvbdeXzUUSFz -DoDKjvbdtunYKQsA -EObjjvbdqceJQNvB -EOcLKvbdqTtGqqkU -DoCkKvbdiGjDYujV -EPCkKvbdRWnEDLhD -EOcLKvbdcSbjtDia -DncLKvbdTqROuVHm -EOcKjvbdiifIKMxS -EObkKvbdlYrqsZGt -DoDKjvbdSBdFLhxk -DnbkKvbdVUNUFkuj -DoCjjvbdrzLpSaIO -DoDKjvbdzGxlANFX -DoDLKvbdfHjuqmpg -EPDKjvbdZRMeIldq -DncKjvbdMfcPlpVL -DncKjvbdxKwDgzzG -EOcLKvbdYzbfRjVy -EObkKvbdWSNwbElD -DoCkKvbdeFOrCXCj -EObjjvbdbKlGOmcA -EOcKjvbdDxXktUTl -EPCjjvbdvBDySneI -EPDKjvbdLFehCBRV -DoDLKvbdiZuFlROG -EPDKjvbdDoDLKvbd -DoCjjvbdQwNdCkhD -DoCjjvbdCJLBkIfK -DnbjjvbdlqyUzSci -DncLKvbdNHCpMpUk -EOcKjvbdiMFEOVCy -DoCkKvbdnGeYNOGy -DnbkKvbdZoOIddzK -EOcKjvbdFpATWffZ -DoDKjvbdeOeTKtTr -DnbjjvbdGGKSNhsq -EOcKjvbdyXiKCPyk -DoCjjvbdeAURNYKG -DoDKjvbdpssfrRjt -EPDKjvbdnVVZjjRf -EOcKjvbdiZuGMQmf -EOcLKvbdNHDPlotk -DnbjjvbduCbtwVoP -EOcKjvbdxUleQxlO -DoDKjvbdnHFYMnGy -DnbjjvbdUVlPitAq -EPCkKvbdjAPgAofj -DoCkKvbdTlVoAuoJ -EPCkKvbdmSYtyrdJ -EPDKjvbdBsAcTevr -EPCkKvbdUyITzKnn -DnbjjvbdbQHGdLzd -EOcLKvbdezuyFIsw -DoDLKvbdEXwlTtUM -EOcKjvbdKyRJrztf -DnbjjvbdtTSSxzEc -DnbjjvbdHDjujBij -DoCjjvbdsQVnicWG -EObkKvbdZsiJYcrn -EPDLKvbdUtNUFkuj -DoDKjvbdNPwpumfs -EOcKjvbdSBcdlJZL -EPDLKvbdmfeXlmfy -DncKjvbdIsZAsNXl -DncLKvbdmJDsptrB -DncKjvbdGYuUaEXb -DncLKvbdyYJJbPzL -DnbkKvbdrpVnicWG -EPCjjvbdTqQoVUgm -DoDLKvbdFVyPpMjF -EObkKvbdZnnIeEyj -EObkKvbdbUagYKtI -DoCkKvbdqGDdtWBI -EPDLKvbdFVxpQNKF -DncLKvbdkWXNdCYX -EPDKjvbddwystRez -EOcKjvbdaNKasUlg -DnbkKvbdNdctIhjd -EPCkKvbdatagYKsh -DoCkKvbdfNFvgMik -EObjjvbdJYTbIMQp -DoCjjvbdEYYMTtTl -DncKjvbdWRmxCElD -EPCkKvbdbsCjsdKB -EOcLKvbdFVxpQMie -EObkKvbdpaJFAWgd -EPDLKvbdijGHimXr -EPCjjvbdlhctQtqa -EObjjvbdFVxoolie -DncKjvbdrJAKEmOe -DnbkKvbdzQnmIiwA -EPCkKvbdkHfkeemk -DnbjjvbdLGGHaaQu -DnbkKvbdOSsugEtp -DnbkKvbdZtIiYcrn -DoCjjvbdQZNAGsSK -EObjjvbdNPxRWOGs -DoCkKvbdVUMsfLuj -DnbjjvbdmJETqUqa -EPDLKvbdBsAcUFvr -EOcLKvbdIsZArlwl -EPCjjvbdNddTiJKd -DoDKjvbdyXhiaozL -DncLKvbdjmCLzEfo -EOcLKvbdRadElJYk -DncLKvbdjbkkQfuH -EObkKvbdXFxzUAOs -DncLKvbdxZhGFwdr -DoCjjvbdNsTugEuQ -EObjjvbdRbDdlIyL -DoCkKvbdePEsLUUS -DoCjjvbdOStVgFVQ -EPDLKvbdUtMtGLuj -EObjjvbdFjdrbhMu -EOcKjvbddeOrBwCj -DnbjjvbdxUmFRYkn -DnbjjvbdCEQBVimG -EOcLKvbdvAdZTPEh -EPCkKvbdGcjvJaij -EPCjjvbdOFETiIjd -EOcLKvbdemGWgNKL -DoCkKvbdqTsfrRkU -DncLKvbdbrcKsdKB -EPDLKvbdTAFIhBoE -DoCjjvbdKCjCqJbx -DnbjjvbdNsUWHFUp -EPDKjvbdkWWmcaxX -EPDLKvbdbKlFoNcA -DoCjjvbdkIGkefNk -EPCkKvbdXFyZtAPT -EPDKjvbdpxnhGpcx -DoDLKvbdhanbeWqR -EOcKjvbdliEUQtqa -EObjjvbdbBVeFpPw -EObkKvbdQdDApQdS -EPDLKvbdnQZyVkZC -EObjjvbdhbOcEwQq -DnbjjvbdBdPaWKMf -DoCjjvbdCTAbtGWr -EPCjjvbdEvYpQMie -EObjjvbdDxYLtUTl -EObkKvbdCTBDTfXS -EPCjjvbdmpZxvKyC -EPCkKvbdRzKITDWA -EObkKvbdemGXGmJk -EOcLKvbdIryAsNXl -DoDKjvbdkWXNcaww -EObkKvbddCTNSAUN -DncKjvbdvBDxroEh -DncLKvbdiCPDEwRR -EObjjvbdRkZGVHLT -DoCjjvbdFkFSbhNV -EPDLKvbdwjvdHzzG -DoDLKvbdqquKmkBN -EOcKjvbdsQVoJcVf -EPCjjvbdYlSEUOMN -EObkKvbdjKGIKMxS -DncLKvbdRpUGifDw -EObkKvbdEuxooljF -EPDLKvbdzitpQETU -EOcKjvbdTvLpKUAq -DoCjjvbdrSVKmkAm -EOcLKvbdEvZQPmJe -EPCkKvbdfelZnHHA -EOcLKvbdjhGlGGNk -DncKjvbdCEPaWJmG -DncLKvbdrpVnjDWG -DoDLKvbdeOeTKtUS -DoCkKvbdtbbuXVno -EObkKvbdYpleJMeR -DnbjjvbdiCPDEvqR -DoDLKvbdUslsekuj -DnbkKvbdGBPQyJzm -EPCkKvbdtbcUwVoP -DoDKjvbddxZssrFz -DncLKvbdkIGlGFmk -EPCkKvbdhuZdwRtb -EObkKvbdehLWSOQg -DoCkKvbdatafwjsh -DoDKjvbdhfjCyViu -DoCjjvbdFyUuAcxC -EObkKvbdUMWPAvPJ -EPDLKvbdxxIjBoyk -DnbjjvbdMRvlytpz -EPCkKvbdDxYLtUTl -DnbjjvbdiVZeXSUb -DoCjjvbdffMZmgHA -EPDLKvbdnPyyVkYb -EPCkKvbdZtIhyETO -DncKjvbdRECaPqDr -EPDKjvbdVrNxBeMD -DnbkKvbdKVuFdFGi -EOcLKvbdrzLosAgn -EPDKjvbdLLAgvAKZ -EOcLKvbdLYpirztf -DncKjvbdnGeXlnHZ -EOcLKvbdQdDAopdS -DnbkKvbdptTfrRkU -DoCjjvbdqGEFUVaI -DncLKvbdrDeIomvB -DoDLKvbdyOTHxSiD -EOcLKvbdRpTfjGDw -DoDLKvbdzitpPdTU -DnbjjvbdUxhTykOn -EOcKjvbdGFjSNhtR -EObkKvbdidkGuPAO -EObjjvbdVAapsQrZ -EPDLKvbdQccAopdS -EObjjvbdmozYukZC -EOcKjvbdGFjSOIsq -EPCkKvbdyzeNrHiI -DncLKvbdEOcKjvcE -DncLKvbdLFfIBaQu -DoDKjvbdtlXwBUBX -DoCjjvbdeOeTLTsr -DncKjvbdiZuGLpnG -DoCkKvbdWRnYBdkc -DncLKvbduCbtvvOo -DnbkKvbdGGKRnIsq -EOcLKvbdVTmUFkuj -EOcKjvbdFkEsDHlu -DoDKjvbdQwNcbkgc -DncLKvbdWRmwbFLc -DnbjjvbdHlBzmwRL -EPDKjvbdDncKjwCd -EObkKvbdGBPRYizm -EOcKjvbdqrVLNjaN -EObjjvbdqFceUVaI -DoCkKvbdZQmFImFR -EPDLKvbdmIctRVSB -EObkKvbdjAQHBPfj -EObjjvbdrEFIonWB -DnbjjvbdsPuoKCuf -DoDKjvbdtbbuXWPP -EPDLKvbdOStWGduQ -DoCkKvbdUQqPUuIN -EPDLKvbdwyhFewdr -EObkKvbdShyiqAAl -EPDLKvbdGZUuBEXb -EPCkKvbdHffyyXwg -EObjjvbdGBOpyJzm -EObkKvbdZirgpGaf -EObkKvbdRjxfUfkT -EPDKjvbdZHWdAPSi -DnbjjvbdVrOYBdkc -DoCjjvbdGGKSNhsq -EOcKjvbdJqZeOenF -EOcLKvbddBsNSAUN -DncKjvbdZtJJYcsO -EPDKjvbdBraDTevr -DoCkKvbdRDcApQdS -EObjjvbdGGJrNiTq -DoCjjvbdGLFTCgmV -DoCjjvbdtlXwBUAw -DncLKvbdQwNdClHc -DoDLKvbdygYlAMeX -EPDLKvbdTvMQKTaR -EPCjjvbdiMFDnVDZ -DoCjjvbdiBoDFXRR -EObkKvbdUQqOuUgm -EOcKjvbdaMkBsVNH -EObkKvbdwuNEqZMO -EObjjvbdLAkGlbXq -EObkKvbdkCkkQgUg -DncLKvbdVqnYCFLc -EPCkKvbdxVMeRZLn -DncLKvbdRXOEClHc -EObjjvbdvwMAvBWV -EObjjvbdIwsahLpp -EObjjvbdKDKCpicY -DoDKjvbdlrZUzTEJ -EOcLKvbdyYIjBpZk -DncLKvbdxsNhlqag -EPDKjvbdgPazvdXh -EPDLKvbdbKlGPNcA -DoCjjvbdqUUHSRjt -DnbkKvbdNeDsiJKd -DnbjjvbdqGEFTvAh -DoDKjvbdnUtykKRf -EPDKjvbdZtJJZDrn -DoCjjvbdmRxtysEJ -EOcKjvbdQmXbYnUz -EPDKjvbdjmCLzFGo -DncKjvbdsBfMkfkZ -EPCkKvbdFVxpPlie -DnbkKvbdZLrEUOMN -DoCkKvbdEOcKkXDE -EObkKvbdvBEYsPEh -EPDKjvbdcJMjLGXY -EOcLKvbdOYPVzcnU -DnbkKvbdsQWOjDWG -EOcLKvbdfHjvRnRH -DoDLKvbdmbKXYPOV -DncKjvbdrpWPJcVf -EOcKjvbdURROuUgm -DnbkKvbdrovOicWG -EObjjvbdLYpirzuG -DnbjjvbdGQASvgGZ -DnbkKvbdYzcFqjVy -DncKjvbdBsBCtFvr -DoDLKvbdYgXEAOri -EOcLKvbdqTsfqqjt -DncKjvbdPIAYZAYa -EOcLKvbdypnliJwA -DnbkKvbdhyuGLqNf -EOcLKvbdjhGkfGOL -DncKjvbdjblLRGuH -EPCjjvbdxwhibPyk -EOcKjvbdBhkCLIfK -DnbjjvbdJTZArlxM -DoCkKvbdRjxetgKs -EObkKvbdiUyeWrVC -EOcKjvbdwXLaWAuu -EPDLKvbdssSTZZdc -EObkKvbdcSbjtDia -DncKjvbdgGMZnHHA -DoCkKvbdatafwkUI -DncLKvbdnCKWxPNu -EObjjvbdyOShXrhc -EPCjjvbdpyPHfqEY -DoDKjvbdbUbGxKsh -EOcKjvbdypoNJKXA -EObkKvbdyTOJMrBg -DoDLKvbdiZtfLpmf -EPCkKvbdLGFgbBQu -EOcLKvbdCJLBkJFj -DnbkKvbdUxgszLPO -DoDKjvbdUQqPVVHm -EPCjjvbdijGIKNYS -EPDKjvbdCJKajhej -EPDLKvbduoTzqLPU -DnbjjvbdJTZBTMwl -EOcLKvbdLAjfmBwq -DoDLKvbdQwOECkhD -DoCjjvbdQYmAHTSK -DoDKjvbdEuyQQMjF -DoDKjvbdZdwfzhIb -EOcKjvbdyTOJNRag -DoDLKvbdbBVdfQPw -DoCkKvbdbVBfxLUI -DncKjvbdcIljKevx -EOcLKvbdhgKDZViu -EObjjvbdOTUWHEtp -DncKjvbdZRMeIldq -DnbjjvbdkHgMGGNk -EOcLKvbdZMSETmlN -EPCkKvbdjcMKpfuH -EPDLKvbdiBncFXQq -EObjjvbdJcKCqKDY -DoDKjvbdQwOEClID -EPCkKvbdRpUHJecw -DoDKjvbdZjSgogBf -DoCkKvbdEObkKvbd -DoDLKvbdDwwktUTl -DoCkKvbdSKyGVHKs -DnbkKvbdZMSETnMN -DncLKvbdiZuGLpmf -EObjjvbdjcLjpgVH -EOcLKvbdYzcFqjVy -EPCjjvbdQvnDcLhD -DoCkKvbdDihJvYKA -EPDLKvbdJqZeOenF -EOcKjvbdWXJXvDdg -DoCjjvbdznpQeCkx -EPCjjvbdjJehJmXr -DoDKjvbdmSYuZsDi -DoDKjvbdFVyPolie -DnbjjvbdULvPAvOi -DncKjvbdwzIGFwdr -DnbkKvbdOEcsiJKd -EPCkKvbdEJhJuwjA -EObkKvbdYSkaNUOx -EObkKvbddoFSkTtS -DoDLKvbdFkFTDHlu -DoCjjvbddwzTtRez -EOcLKvbdDwwlUTtM -DoDKjvbdHDjvJaij -EObkKvbdyTOIlrBg -EOcLKvbdtSqsYzFD -EObkKvbduVmwjQsA -EPDKjvbdbiMjKfXY -DncLKvbdsQWPKDWG -DncLKvbdRbEElIyL -DnbjjvbdGKeTDHlu -EPCkKvbdrpWOjDWG -EObjjvbdVwJYWEFH -EPCjjvbdvBDySoFI -EPCkKvbdZMSDsmkm -EObkKvbdqYnhHREY -EObjjvbdyqPMiJwA -DncLKvbdCTBCtGXS -EPCkKvbdfekynGgA -EPCkKvbdvvkaWBVu -DoCjjvbdGZUuAdYC -DoDKjvbdpyOgfqDx -EPCjjvbdePFTKstS -EOcLKvbdVviXudFH -EPCkKvbddZyQYZQb -DnbkKvbdUaCQrqRy -EPDLKvbdQwNdDMID -DncKjvbdUaCRTQrZ -DnbjjvbdHDkWJbKK -EOcKjvbdOTTvGduQ -DnbjjvbdssRrxzEc -EObjjvbdezuxdiTw -EOcLKvbdGLFTCgmV -EPDLKvbdUxgtZkOn -EOcLKvbdbrbjscia -DnbjjvbdjJfHimXr -EOcKjvbdjcMLQgUg -DoDKjvbdlYrqrxft -EPDKjvbdGYttaEXb -EOcLKvbdhbPDEwQq -EOcKjvbdvAcxroEh -DoDKjvbdVgxVxHYz -DoCkKvbdTqQnuVIN -DoCjjvbdrXQMCiZR -EOcKjvbdMSWlytpz -DoCjjvbdBiLCLJFj -EObkKvbdUyHtZkPO -DoDLKvbdGcjujCJj -EPCjjvbdfkGzbfAE -DoCjjvbdDoCjjwDE -DnbkKvbdqGDdsvAh -DoDLKvbdjvXNdBww -EOcKjvbdANHySvyx -DoCjjvbdeJjRvUzn -DncKjvbdqUTgRqkU -DncLKvbdEvZQPljF -DnbjjvbdSPsgKFdX -EOcKjvbdGLFScHmV -EPCjjvbdqUTgRqkU -EPCkKvbdNxOuzdOU -DoCkKvbdpfEEtWBI -EOcLKvbdDwwlTtTl -EPCjjvbdSZjITDWA -DncKjvbdQwNcblID -DnbjjvbdijGIKMwr -DnbjjvbdYpldiMdq -DncLKvbdemGXHNKL -EPCkKvbdEKHjWYKA -DoDLKvbdwXMBWAvV -DnbjjvbdQwOEClHc -DnbkKvbdbUbHYKtI -DncLKvbdCSaCtFvr -DncLKvbdEuyPpNJe -EPDKjvbdFVyPolie -DncKjvbddneSkTtS -EOcKjvbdZtJIxcsO -EOcKjvbdiGicZWJu -DncLKvbdOFDtIiLE -DoDLKvbdOSsufduQ -DnbkKvbdMfcPmQVL -EObjjvbdiUzEwSVC -DoCkKvbdCIkBkJFj -DncLKvbdYkrETmlN -EObjjvbdqZOggREY -EPCkKvbdHDkViajK -DnbkKvbdbsDLTdKB -EPDLKvbdlqxtzTDi -DncKjvbdLGFgbAqV -EObjjvbdoAKztHcn -EPDLKvbdRXODblID -DoCjjvbdIHGzYwxH -EObkKvbdNPwqVnHT -EOcKjvbdxrnImRag -EOcLKvbdiLddNuCy -DoCkKvbdkMakzEfo -EObkKvbdnPyxukYb -EPCjjvbdZdwfzgiC -EPCkKvbdnHEwmNfy -EObjjvbdySmiNRag -EOcKjvbdzeZnzdyp -EPCjjvbdJvVFdEgJ -EOcKjvbdZQldiMeR -EOcKjvbdFyVVAdYC -DncKjvbdJXsahMRQ -DnbjjvbdfNGXGljL -EOcLKvbdwWlAvAvV -DncLKvbdkIHLefNk -DncLKvbdliDtQtrB -DoCkKvbdxZgefXdr -DncKjvbdCWzchdpW -EPCkKvbdpyPHfpdY -EOcKjvbdhbOcFWqR -DnbjjvbdzjUpPdSt -DoDLKvbdZMRdUOLm -DncLKvbdVwJXucdg -EPCjjvbdWXIxVcdg -DnbkKvbdMpXpvOHT -DncLKvbdRkZGVHKs -DoDKjvbdmpZyWKxb -DoCjjvbdegkWRmpg -DncLKvbdyzeOSHhh -EPDLKvbdRECaPpdS -EPDKjvbdqvpLcJZR -DoCjjvbdRDbaPqDr -EObjjvbdRECaPqDr -EOcLKvbdsBfNLgLZ -DncKjvbdZyEKOCkr -DnbkKvbdSPsgJfEX -EPDKjvbdZRMdiMeR -EPDLKvbdDwwktTsl -EPDLKvbdLhbLpxAS -EPDKjvbdZirgpHBf -DoCkKvbdmtuZkJqf -DnbjjvbdwWkaWAuu -DnbjjvbdRDcBPqES -DnbkKvbdyzeNqgiI -EObjjvbdYkrEUOLm -DoCkKvbdmtuZkKRf -DoCkKvbdNdctIhkE -DnbjjvbdhytfLqOG -EOcLKvbddZyPwxpb -EPCjjvbdYzbeqivZ -EOcKjvbdwygfGXeS -EOcLKvbdRosfifEX -EPCkKvbdznopdbkx -EObkKvbdVBBqSqSZ -EObjjvbdQlxCZNtz -EPCkKvbdhlFDmtby -DoDLKvbdCDpAvJmG -EPDKjvbddeOrCXDK -EOcLKvbdrovOjDWG -DnbkKvbdIGfyyYYH -EObkKvbdmbKWwnmu -EOcLKvbdkDLjqGuH -EPDLKvbdqrUkNjaN -EPDKjvbduDDVXWPP -EObjjvbdZnnJFEzK -DnbjjvbdaRfCgtGL -DoCkKvbdGKdsDHlu -DncKjvbdqlyiyMHi -DoDLKvbdSLYetgLT -DnbkKvbdZQleJNEq -EOcLKvbdZLrETnMN -DnbjjvbdiUydwRuC -EObjjvbdnPzYvLYb -EPCjjvbdGYuUaEYC -EObjjvbdACqwiyiQ -DncKjvbdIHGzZYXg -DncKjvbdxrnIlqag -DnbjjvbdySmhlqag -DoCjjvbdSCEFMJZL -EObjjvbdSKxfUfjs -DnbjjvbdnUtyjjRf -DncLKvbdkyTRsZGt -DoDLKvbdWRnXbElD -EOcKjvbdjvXNcbYX -EOcKjvbddjKSWUzn -DoDKjvbdvBDxrneI -EOcLKvbddndsKtTr -DoDLKvbdZjTHpGbG -DnbkKvbdpfDdsuaI -EPCkKvbdfMfWgNJk -DoCkKvbdjJegjNXr -DoDKjvbdcTDLTdKB -EPDLKvbdwzHfFxEr -DncKjvbdfMfWgMik -DnbkKvbdrbFllGkZ -EPCkKvbdCIkCLJGK -EObjjvbduDDUvvOo -EOcKjvbdDxYMUTsl -EOcLKvbdsPvOibuf -DncKjvbdUsltGLvK -EPCjjvbdyOShYTIc -DoDKjvbduaEZSoEh -DncKjvbdLrXMzUpz -DoCkKvbdNsTufeUp -EObkKvbdLGGIBaQu -EPCjjvbdmSZVZsEJ -DncLKvbdQdDAoqDr -DoCkKvbdKCicRJbx -EPCkKvbdxwhibQZk -DoDKjvbdTvMQJsaR -DoCkKvbdYzcGSJuy -DnbkKvbdwyhGFwdr -DoCjjvbdEOcLKwDE -DoCkKvbdGGKRmhtR -EOcLKvbdrzMQTAgn -DoDLKvbdJvVFceHJ -DnbkKvbdfMfWfmJk -EPCkKvbdmajWwnmu -EPCjjvbdxrmiMqag -EOcKjvbdqUTfqqkU -EObkKvbdoAKztHcn -EObkKvbdkyTSTZHU -EPCjjvbdiCOcEwRR -DnbkKvbdGZUtaDwb -EPCjjvbdYORAXuWU -DoCkKvbdULvPAuoJ -DnbjjvbdcSbjscjB -DoDKjvbdLrXMytpz -DncKjvbdIryBTNYM -DoCjjvbdZyDinCkr -EPDLKvbdZoOJFEyj -DncLKvbdajkfOmcA -EPDLKvbdRNYCYmtz -DoCkKvbddePRawDK -EOcKjvbdbUbHYKtI -EPCjjvbdbrbjscjB -EPDKjvbdKDJcRKCx -EObjjvbdqcdiQOVa -EPDKjvbdZjTIPgBf -DnbjjvbdrSUjmjaN -DnbjjvbdEXxLsstM -EPCkKvbdFjeSbglu -DnbkKvbdLqwMytpz -DoDKjvbdUGznMXVe -EObkKvbdpstHRrLU -DoDKjvbdYTLaNUPY -DnbkKvbdGKdrbhNV -EObjjvbdRMxCZNtz -DncLKvbdDihJuwjA -EPCjjvbdOFDtJIkE -DnbkKvbdliEUQuSB -DoDKjvbdkCkkQftg -EPCkKvbdGZVVAcwb -EObjjvbdkyTSSxgU -EPDKjvbdIryBSlxM -EOcKjvbdWIXvXfxz -DoDLKvbdhfjCyWKV -DoDKjvbdNQXpumfs -DncKjvbdiMEcnVCy -EPDLKvbdxVMeRZLn -EPCkKvbdDoDKjwDE -DnbkKvbdSCEFLiZL -DoCjjvbdqYoHgQcx -EObjjvbdxZhFexFS -EOcLKvbdkDMLRGuH -EPCkKvbdVwJXvDdg -DoCjjvbdjhHLefOL -EOcLKvbdiCOcFWpq -DnbjjvbdrovOjCvG -DncLKvbdRzKHsCvA -EPCkKvbdDoDLKwDE -EOcKjvbdrNZjZLhJ -EObjjvbdTAFIhBoE -DncKjvbdlqyVZsDi -DncLKvbdjggMFenL -EPDLKvbdUsltGMWK -DoCjjvbdkyTRsZGt -EOcLKvbdrzMPsBHn -EPCkKvbddZxpYYpb -DncLKvbdGKdsCgmV -DnbkKvbdvAdYsPEh -DoDLKvbdqUUGrSKt -EPCjjvbdxnTHxTIc -EOcKjvbdZisIQGaf -DncLKvbdBhjbLJFj -DoCkKvbdJSyBTNYM -DnbjjvbdmfdwlmgZ -EOcLKvbdJcJcRJbx -DncLKvbdmoyyWLYb -EObjjvbdSKxfUfkT -EObjjvbdlAlnmALA -DoDLKvbdTlVnaVoJ -EOcKjvbdnCKWwnnV -EPCjjvbdjbkkRGtg -EPCjjvbdULuoBVoJ -EPDKjvbdwMvAMceN -DnbkKvbdznopdcLx -EPCkKvbdeuzwoizs -EPCjjvbdpssfrRjt -EOcKjvbdiGibyWJu -DnbkKvbdYSlBNToY -EPDKjvbdkVwNcbYX -DoCjjvbdsPuoJcVf -DnbkKvbdrbGNLgLZ -DnbkKvbdRbEFMJYk -EObjjvbdqceIonVa -DnbkKvbdTpqPUuHm -EOcLKvbdVviXvEEg -EOcLKvbdvAcxrndh -DnbjjvbdTYKkmzkY -EOcLKvbduDCuXVno -EPCkKvbdEvYpPlie -DncLKvbdaSGCgtFk -DoCjjvbdpfDdtWBI -DncLKvbdHDkWJbJj -DncLKvbdqZOgfpdY -EPCkKvbdFxuVBEXb -DoDKjvbdnBivwnnV -EPCkKvbdRWmcbkhD -EObjjvbdfIKvSOQg -DnbkKvbdcIlikGWx -EOcKjvbdQdDBQQdS -EPCjjvbdnPzZWKyC -DnbkKvbdZxcimbkr -DncLKvbdLFfHaaRV -DoCjjvbdYSlBNToY -DnbjjvbdKCicRKDY -EPCkKvbddneSjtUS -EObjjvbdmIctRUqa -DncKjvbdYqMdiNFR -DnbjjvbduaDyTPFI -EPCkKvbdePEsLTtS -EPCkKvbdbUagYKsh -DoDLKvbdssSSxzFD -EObkKvbdMuSrLNAX -EPDLKvbdddnqbWbj -DnbkKvbdvAcySneI -EPDKjvbdatbGxLUI -EOcLKvbddePRbWbj -DoDLKvbdijGIKNYS -EPCjjvbdNrsugEtp -EOcLKvbdxZhGGYEr -DnbkKvbdTkvPAvPJ -DoCjjvbdFyUuAcwb -DnbjjvbdJTZBTMxM -EPDLKvbdaMkCStmH -EPDLKvbdjKGHimYS -DnbkKvbdelewGlik -EObjjvbdkHgMGGOL -EObkKvbdURRPUuHm -EOcLKvbdjKFhKNYS -EPDLKvbdhyuFkpnG -EOcLKvbdRosgJecw -DoCjjvbdczYoxYqC -DncLKvbdzaAPGgCM -EPDKjvbdiUzEwSUb -DoCjjvbdKQzEneme -EObjjvbdatagXkTh -DoCjjvbdwtldqYkn -EOcKjvbdUxgszLOn -EPCkKvbdUaBprprZ -EOcLKvbdYNqAYVVt -EObjjvbdbUafwkTh -EPDLKvbdcIljLGWx -DnbjjvbdNHDPlotk -EOcLKvbdkIHMFfOL -EPDKjvbddePSCXDK -EOcLKvbdbUafxLTh -DoDKjvbdQlwaxmtz -DoCkKvbdbQHHELzd -EPDLKvbdhficZWKV -DoDKjvbdqrVLOLAm -DoCjjvbduDDUvvPP -EPCjjvbdCEQAuilf -EOcLKvbdEASIlywX -DncLKvbdRNXayNtz -EOcKjvbdVrOXaeMD -EPCjjvbdFWYopNKF -DnbkKvbdSQTfjFcw -DoDLKvbdJTZAsMwl -DoCjjvbdiCPDEvpq -DncKjvbdVwIwuceH -EPDLKvbdJvVFcdfi -EPCjjvbdcbSlrATm -DnbjjvbdqBJFAXIE -EPCkKvbdTAFJHbOd -EPCjjvbdcTCkUEKB -EPCkKvbdxwhibPzL -EPCkKvbdRpTfifEX -EPDLKvbdvAdYsOeI -DncKjvbdpxngfpdY -EPCjjvbdEXwksstM -DnbkKvbdNrsufeUp -DnbkKvbdJKEAJogE -DoCkKvbdNsUWGduQ -DoCkKvbdbrcLTcjB -EOcKjvbdiHJcZViu -EObkKvbdEztQdkcJ -DoCjjvbdliETptqa -EOcLKvbdOEdUIhjd -DoCkKvbdSKxfVGkT -EPCjjvbdIsZAsMxM -EOcKjvbdZsiIyDsO -DncLKvbduDCtwWOo -DnbkKvbdEztQdlCi -DnbjjvbdLZQjSztf -DoDLKvbdXmqAXuVt -EPCjjvbdxsOJNSCH -DoDLKvbdRadElJZL -EOcLKvbdWRnXbEkc -DncKjvbdSCEFLiYk -EPDLKvbdidkHVPAO -DoCjjvbdkClKqGtg -EPDKjvbduLxXBUAw -DncLKvbdqUTfqqkU -EObjjvbdcImKKevx -DoDLKvbdMgCpMpVL -DnbjjvbdtTRsYydc -DnbkKvbdKefHbBQu -EOcKjvbduoTzpjnt -DoCjjvbdjuwNcaww -DncKjvbdTkvPBVni -EPDLKvbdapGfdLzd -EPDKjvbdvAdZTPEh -EPCkKvbdwXLaVaWV -EOcKjvbdZoNhddyj -DncKjvbdqceIonVa -DnbjjvbdIwsbHkqQ -DoDKjvbdjFKfuPAO -EOcLKvbdbhmJkFvx -DncKjvbdDxYMUUTl -DnbjjvbdMfbpNQVL -DoDLKvbdZeXfzhIb -EOcLKvbdVAbRSpqy -DncLKvbdZxcjOCkr -EOcKjvbdyTNiNSCH -EObkKvbdiLddOUcZ -DoCjjvbddwystRez -DoDKjvbdUsmTelWK -EPDLKvbdEPCjkWcE -DoDKjvbdIwsaglQp -EObkKvbdGcjvJbKK -DoCkKvbdRzJgrbvA -EObkKvbdkxsSSxft -DncLKvbdfHjvSNpg -DnbkKvbdxsNiMqag -DoDLKvbdcImKKevx -EOcLKvbdJutfDdgJ -DoDLKvbdhancEwRR -EObkKvbdnPzYvKyC -DoDKjvbdNHDPlouL -EPCkKvbdKaKgMbXq -EOcLKvbdqUTgSRkU -EPCkKvbdZjSgpHBf -DncLKvbdHffzYxXg -DoCkKvbdFkErbhMu -EObjjvbdhancEwQq -EPDKjvbdJYUCHkpp -EPDKjvbdtkwwBUAw -EOcLKvbdiZuGMRNf -EObkKvbdrJAKElne -DnbjjvbdIHHZxwwg -EPDKjvbdkHgMGGNk -DoCjjvbdeOeSjtUS -DoDLKvbdJbicQjCx -DncKjvbdnGeXlnGy -EPDKjvbdKVtecdfi -EOcKjvbdULuoBVni -DnbkKvbdmJDtRVRa -DncLKvbdJTZAsMxM -EPDKjvbdVgxVxHYz -EPCjjvbdVBCRSqSZ -EPCjjvbdJqZdnfOF -DncKjvbdqdEiQOVa -DnbkKvbdZLqdTnLm -EOcKjvbdzHZMANFX -DncKjvbdVrNxBdkc -DnbjjvbdKkAgvAKZ -DnbjjvbdmbKWxOnV -DoDKjvbdYqMeImEq -EObjjvbdbUagYKtI -DncKjvbdQZNAHSqj -DoDLKvbdfoazvcwh -DnbkKvbdVvhwvDdg -DoDKjvbdURQoUthN -EPDLKvbdvBDyTOeI -DnbjjvbdrRuKmkBN -DnbkKvbdRbDdlIxk -EObjjvbdSCDdkhyL -DoDKjvbdSBceMJYk -DoDLKvbdwyhGGYFS -EPDKjvbdQvmcblID -DoDLKvbdaaWFGQQX -DoDKjvbdEASImZvw -EPDLKvbdnQZyWLYb -EPDKjvbdbrcLUEJa -EOcLKvbdKCicQjDY -EPCjjvbdVBCQsQqy -EPCkKvbdkaNPNALA -DncLKvbdaNKartmH -DoDLKvbdCTAbtFvr -EObjjvbddZxowxpb -EObkKvbdTpqOuUgm -DncLKvbdZQleJNFR -DnbjjvbdUVlPisaR -EObjjvbdBsBCtFvr -EPCjjvbdJutecdgJ -EOcKjvbdfNFvgNKL -DncKjvbddneSjtUS -DoDKjvbdjcMKqGtg -EOcLKvbdGdLWKCKK -EOcKjvbdRDcBPpdS -DoCkKvbdauCGwkTh -EPCjjvbdaNLCStmH -EOcKjvbdelfWgMjL -DoDLKvbdtSrSxyeD -EPCjjvbdemGXGmKL -EOcLKvbduDCuXWOo -DncKjvbdauBfxLUI -DnbjjvbdIHGyyXwg -EPCjjvbdEvYooljF -EObjjvbddneTLUTr -DoCjjvbdySmiNRag -DoDKjvbdqUUHSRjt -EObjjvbdczYpXxpb -EObkKvbdaMkBrtlg -EPDLKvbdnUuZkKRf -DoDKjvbdcScKsdJa -EPCjjvbdsrrTYydc -EObjjvbdZoNiFEyj -EPDLKvbdmttyjirG -EOcLKvbdYqMeIleR -DoDKjvbdKWUfEFGi -EOcLKvbdcyxoxYqC -EObkKvbdNeETiJLE -EPCkKvbdUMWOaVoJ -EPCjjvbdWSOXbElD -EPCkKvbdNHCpNPuL -EObkKvbdEuyQQNJe -DoCkKvbdmgExNOGy -EOcKjvbdZtJJYcsO -EOcLKvbdMpXqVnGs -EObjjvbdbsDLTcjB -EPCjjvbddoFTLUTr -EOcLKvbdaNKbTVNH -DoCjjvbdJcKCpicY -DoDLKvbdsBfMlGjy -EPDKjvbdqiAJdlne -EObkKvbdKefHaaRV -DoDLKvbdbiNJjewY -EPCkKvbdVTltFlWK -DoDLKvbdbBWFGPpX -DncLKvbdVZITzKoO -EPCjjvbdnUtzLKSG -EPCkKvbdBraDTevr -EPDLKvbdTkunaWPJ -EObjjvbdZRNFJNEq -DnbkKvbdxUldqYkn -EPDLKvbdtvOYJpsA -EOcLKvbdJvUfEEgJ -DoDKjvbdlYrqsZGt -DncKjvbdePFSjstS -EPDLKvbdqquLOLAm -DoCkKvbdSPtHKFdX -DoCjjvbdZyDjNcMS -EPDKjvbdTlVnaWPJ -EPCjjvbdZirgpHCG -EObkKvbdNQYQvNfs -DncKjvbdqqtjnLBN -DoDKjvbdjJehJmYS -DncLKvbdrNZixlHi -EPDLKvbdMfcPlpVL -EPCjjvbdUWMQJtBR -DoCkKvbdfMfWfljL -DnbjjvbdaRfDHtFk -DncLKvbdiMFDnVDZ -DoCkKvbdXrkaNToY -DoCjjvbdZLqdUNlN -EObkKvbdRjxetfkT -EOcLKvbdmgFXmOGy -EPDKjvbdUQpntuHm -DoDKjvbdpstHRrKt -DncLKvbdHkazmwRL -EObjjvbdpfEFUWAh -DoDKjvbdZyEJnDMS -EObkKvbdiBoCeXQq -DoCkKvbdeATplxKG -DncLKvbdWRmwadkc -EPDKjvbdUQqPUthN -DoCjjvbdnBjXXnmu -EPDLKvbdZjTIPfbG -EPCkKvbdWHwuxGxz -DncKjvbdYpmFJMdq -DoDKjvbdhbPDFXRR -DnbkKvbdBdQBVimG -DoCjjvbdmIctRUqa -EPDKjvbdZyDjNbkr -EOcLKvbdQYmAHSrK -DnbjjvbdqYoHgQcx -DncKjvbdqiAKFMoF -DncKjvbdOTUWHEuQ -DoCjjvbdVTmTfLuj -DoCkKvbdddoRbWcK -EPDKjvbdIsYaTNYM -EObkKvbdRosfiedX -EOcKjvbdcTDLUEKB -EOcLKvbdmozYujxb -DnbjjvbdZirgogBf -EPCjjvbdKWUeceHJ -DnbjjvbdZoOJEdzK -EPDKjvbdEJhKVwjA -DoCkKvbdfpBzvcxI -DoDKjvbdlrYtysDi -DoDLKvbdZjSgofbG -DoCjjvbdUtMtGMVj -EPCjjvbdGGKRmiTq -EPCkKvbdQvnDcMID -DnbkKvbdKCjCqJbx -EPCkKvbdYpleImEq -DoDLKvbdjKFgjNXr -DoDLKvbdZshhxcrn -EPDLKvbdnVVZjjRf -EOcKjvbdqdFIpNua -DnbjjvbdVwIxVdEg -DoCkKvbduaEZSneI -DnbkKvbdznoqFClY -DoCjjvbdoAKzsgcn -EOcKjvbdSLZGVGkT -DncKjvbdiCObeWqR -EPCjjvbdWRnXbEkc -EObjjvbdRotGiecw -EObkKvbdKDKDQibx -DnbjjvbdlYsRsYft -EOcKjvbdUaBqSprZ -DoCjjvbdhkdcmuDZ -EOcKjvbdjgflFfNk -DoCjjvbdGKdrcINV -EOcLKvbdEJgjVxKA -EObkKvbdSxKkmzkY -DnbjjvbdsZkosBIO -DoCjjvbdBvzchePv -EObkKvbdGYtuBEXb -EPDKjvbdiLeENtby -EPCkKvbdRNXbYnUz -EObjjvbdfHkWRnQg -EObkKvbduDDVXWOo -DoCkKvbdJbjCqJbx -EPDLKvbdpedFTvBI -DncLKvbdjJegjMwr -EPCjjvbdUxgszLPO -EObkKvbdxmrhXsJD -EOcKjvbdJSxaSmXl -EPDLKvbdfNFwGmJk -EPDKjvbdsrrTYydc -DncKjvbdhgKDZVjV -EPCkKvbdZMRctNkm -DoDKjvbdezuyEhtX -EPCkKvbdEXwlUTsl -EPDLKvbdeAUQlxKG -DoDKjvbdZnmiEdyj -EObkKvbdrzMPraIO -EPCjjvbdxxIibPyk -EPCkKvbdKfFgbBRV -DoDKjvbdyzeORhIh -DnbkKvbdbAvFGPpX -DncKjvbdZoOJEdyj -DnbkKvbdrJAJdmOe -DoDKjvbdKVuFdEfi -EOcKjvbdqdFJQNvB -EPDLKvbdOEctIhkE -EPDLKvbdvBEYsOeI -DncKjvbdHELVjBjK -DncLKvbdZshhyDsO -EPDKjvbdGdKuibJj -DoCkKvbdEYXkstUM -DnbjjvbdJpyeOfNe -EPDKjvbdzoPpdbkx -DoCkKvbdMSXMytpz -DncLKvbdqZOggQcx -DoDKjvbdmuUyjirG -DnbkKvbdNVSqkNAX -DncLKvbdRotHJfEX -EOcKjvbdZyEJnCkr -EPDLKvbdyYJKBpZk -DnbkKvbdxmrgxTJD -DnbkKvbdhaoDFWqR -DncKjvbdbhmJjevx -EObjjvbdSKyGVGjs -DnbjjvbdSKxfVHKs -DnbjjvbdqdFIomua -DnbkKvbdkHflGGOL -DoDLKvbdqGDeUVaI -EObjjvbdjmBlZeHP -EPCkKvbdmttykJrG -DncLKvbdRXOEDLgc -DoDLKvbdhaoDFWqR -DoDKjvbdvvkaWAuu -DoCkKvbdbhmKKfWx -EObjjvbdSBdFMJZL -DnbjjvbdnUuZjjSG -EPDLKvbdliDtQuSB -EOcLKvbdsCFmMGjy -DnbjjvbdtunXjQsA -EObkKvbdkCkjqHUg -EObjjvbdDoCkKvbd -DnbkKvbdiZuFlROG -EOcKjvbdRNYCZNtz -EOcLKvbdxUmEpxlO -EPCkKvbddePSBwDK -EOcLKvbdauBfxKsh -DoCjjvbdtkwwBTaX -EObjjvbdmgEwmNfy -DnbjjvbdOStWHEuQ -EPCkKvbdGLFTChNV -EPCkKvbdKDJbpjDY -DoDLKvbdnPzZVjxb -DoCjjvbdFVyPomJe -DncLKvbdACqwizIp -EPCkKvbdZirhQGaf -DncKjvbdtTRsZZeD -EObkKvbdLBLHMbYR -EOcLKvbdrNZjZLgi -EObjjvbdTXkLmzkY -EPCkKvbdBsAbsfXS -EOcKjvbdeATpmXif -DoCkKvbdMSWmZuQz -DncLKvbdVTmTfMVj -DoDLKvbdZxdKODMS -EPDKjvbdZjShPgCG -EPDLKvbdxVMdpxkn -EPDLKvbdcSbjsdKB -EPDLKvbdiifIJlwr -DoDKjvbdKQydoFnF -EObkKvbdegkWRmpg -EObkKvbdiBncFXQq -DoDLKvbdNdctJJLE -EOcKjvbdUyHszKnn -EOcLKvbdSQUHKFcw -EObkKvbdUaBqSprZ -DoCkKvbdSCDeLiZL -EPCkKvbdKDKCpjCx -EPDLKvbdwygfFweS -DoDKjvbdiVZeWqtb -DoCjjvbdMRwMyuQz -DoCjjvbdsCGNLfkZ -DoCkKvbdmRxuZsEJ -EPCkKvbdkDMLRGtg -EObkKvbdGdKuibJj -EPCkKvbdePFTLUTr -EOcKjvbdXrlAlsoY -DoDLKvbdZjTHogBf -DnbjjvbdZirhQGaf -EPCkKvbdFVxooljF -DoCkKvbdbKkeoNcA -DoDKjvbdqYngfqEY -EPDLKvbdrWokcJYq -DoCkKvbdMowqVnHT -EPCkKvbdqqtjnKaN -DoDLKvbdiCPDFWqR -DoDLKvbdeJiqutzn -EObkKvbdqcdiPmvB -EPCjjvbdMgComQUk -DoDLKvbduVnYKQsA -DnbjjvbdjhHLfFmk -EOcKjvbdVvhwvEEg -DnbkKvbdZtIhyESn -DncLKvbdznopeClY -EPCkKvbdwtldqZLn -EOcKjvbdeEnrBwDK -DoCkKvbdkxrqsZHU -DoDKjvbdijGHimYS -DncLKvbdfNGWgMjL -EOcKjvbdmbKWxOnV -EPCkKvbdhtzEvrVC -DoDLKvbdhfibyWJu -DoCkKvbdXrkaMsoY -DoCkKvbdzoPpdbkx -EPDLKvbdSLYeuGjs -EOcLKvbdqlyixlIJ -EObjjvbdnVVZjiqf -EOcLKvbdyNrhXriD -DoCjjvbdRjyFtgLT -EOcLKvbdkyTRryHU -EPCjjvbdrykpTBIO -EObjjvbdlqxtzSdJ -EObjjvbdcarmSATm -EOcKjvbdXsLaNToY -EOcKjvbdlqxtysDi -EOcLKvbdaMkCStmH -DncKjvbdbAvFGPow -EPDLKvbdTulQKTaR -DncKjvbdXGYzUAOs -DncKjvbdezuxeItX -DnbkKvbdrykpTBIO -DoCkKvbdxnShXsIc -DoDLKvbdEPCjkXCd -DnbkKvbdIxUBgkpp -DnbkKvbdBiKbKhfK -DoDKjvbdKNADygVB -EObjjvbdADRxKZiQ -EPCjjvbdMfcQMotk -EObjjvbdSBcdkhxk -EPDKjvbdNrtVgFVQ -EPDKjvbdZMRdTnLm -EObkKvbdehKvRnQg -DoCkKvbdliETptqa -DoDLKvbdEXwktUUM -EObjjvbdBiLBjiFj -EOcLKvbdRkYeuGjs -EOcKjvbdmttzKjRf -EObkKvbdxrmhmRbH -DnbkKvbdyXiJaoyk -EObkKvbdxmrgwsIc -DoDLKvbdiZtfMQmf -DnbkKvbdpxoHfpcx -EObjjvbduaEZTOdh -EObkKvbdqqtkNkAm -DoDKjvbdxmrgxTIc -DncLKvbdMgColpVL -EPCkKvbdZnnJEeZj -EPCjjvbdVYgszKoO -EPCkKvbdBcpAuilf -EObkKvbdlhdUQuSB -EObkKvbdMIbLpxAS -EPCjjvbdnVUyjirG -DoDKjvbdKRZeOenF -DnbjjvbduCbuXWPP -DnbjjvbdssRsYydc -EPCkKvbdlhctQtqa -DoCkKvbdsQVoJcVf -EObjjvbdegkWSNpg -DoDLKvbdOAJTUKSA -DoDLKvbdliEURVSB -DoDKjvbdxsNhlqbH -DnbjjvbdOSsvGdtp -EPDKjvbdaaVeGPow -EObjjvbdNeETiIjd -DnbkKvbdJKEAJpHE -EPCjjvbdANIYsWzY -DoCjjvbdjvWmdCXw -EPDKjvbdrouoJcVf -DnbjjvbdiUzFWquC -DnbjjvbdFxtuBEYC -DnbjjvbdRkYfVHLT -EObjjvbdQwNccMID -DoCjjvbdXsMAmTnx -DoCjjvbdjJfIKMxS -EOcLKvbdbiMikGXY -DoCjjvbdQdDAoqES -EPCkKvbdVwIxVcdg -EOcLKvbdCEQAvKMf -EPDLKvbdzROmJKXA -EPDLKvbdZLrDsnLm -DncKjvbdjggMGFmk -DnbkKvbdddnrBvcK -DnbjjvbdpecdsvBI -EPCkKvbdijFgjNYS -EOcLKvbdUaBqTQqy -DncKjvbdkHgMFfNk -EObkKvbdZGvdAPSi -DnbjjvbdqUTgSRjt -DoDLKvbdqvpLcIyR -DncLKvbdLqvlytpz -DnbkKvbdKDJbpjCx -DoCjjvbdlqyUyrci -DnbkKvbdUQqPUuIN -EObkKvbdTlVnaVni -EOcLKvbdNdcshiLE -EObkKvbdkDMLRHUg -DncKjvbdIxTbILpp -EPCkKvbdePFTKssr -DnbjjvbddeOrCWcK -DnbkKvbdatbGxLTh -EObkKvbdqlzKZLgi -EPCjjvbdOTUVgFUp -EOcLKvbdpfEFTvAh -DncLKvbdZnnIdeZj -EObkKvbdZxdKODLr -DoDKjvbdjggLfGNk -EPCjjvbdRDcAopdS -DncKjvbdlZTRryHU -DncKjvbdZshiYdSn -EPDKjvbdatbHYLTh -EPDKjvbdLAjfmCXq -EPDKjvbdOFEUIiLE -DncKjvbdxVNFQxlO -DoCjjvbdrafNLfkZ -DoCjjvbdGFiqnJTq -EPCkKvbdUsmUFlWK -EObkKvbdLBLHMbXq -EPCkKvbdtlYWaUBX -EPCjjvbdSPsfjGEX -EObjjvbdIjEAJogE -DoDLKvbdNHCpNQUk -DncLKvbdYkqdUNkm -DoCjjvbdqquKmkBN -DnbjjvbdEuyQQMjF -EOcKjvbdURRPUthN -EObjjvbdmoyxvLYb -EObkKvbdGYtuAdYC -DnbjjvbdZeYGzhJC -DoDLKvbdCgLfHAzc -DoDLKvbdhuZeXSUb -DoCkKvbdjlbMZdgP -DoCkKvbdemGWgMjL -EPCkKvbdxxJJaoyk -EPDLKvbdqGEEsuaI -EObkKvbdEKHjVwjA -EOcKjvbdiBoDFWpq -EPCkKvbdffLzNfgA -EObjjvbdDoCjkXDE -EPDKjvbdhficZWJu -DoCjjvbdWWiYVdFH -EPCkKvbdKQzFOenF -DoCkKvbdmbJvxPOV -DnbkKvbdtAHQhAAr -EPDLKvbdmSYtzSci -EPDLKvbddeOqavcK -DoCjjvbdCEQBVjMf -EPDLKvbdlYrqsYft -DnbkKvbdJSyBTNXl -EPCjjvbdcbSmSATm -DoDKjvbdfNFwGmJk -DoCkKvbdGLErbhNV -EObkKvbdiZuFlQnG -DnbjjvbdxUmEpxlO -EPDKjvbdUWMPitBR -EPDKjvbdrafNLfjy -EPDLKvbdrWolDJZR -EObjjvbdhbPDFXQq -DncLKvbdqrUkNjaN -DnbkKvbdBiLCKhej -DoDKjvbdSCEFMIxk -DoDLKvbdffLzNgHA -EPCkKvbdZLqcsmkm -DnbkKvbdZMSEUOMN -DnbjjvbdzaAPHHCM -DnbjjvbdCIkBjhfK -DoCkKvbdZirgpHBf -DnbjjvbdIwtBhLpp -EObkKvbdeOeTLUTr -EObkKvbdUxgszLPO -EObkKvbdhzVGLqOG -DnbjjvbdOTTufdtp -EOcKjvbdZRNEhleR -EPCjjvbdKyRKSzuG -DoCkKvbdZtJJYcsO -EOcLKvbdemGXGmKL -EPDKjvbdJXsahMQp -DoDLKvbdhbObeWqR -EObjjvbdFVxpPljF -EOcKjvbdaNLBruMg -DoCjjvbdpyPIGpcx -EOcLKvbdZMRcsmkm -EOcLKvbdnGeXmNgZ -DoDLKvbdjlalZeGo -DoDLKvbdaSGDHtGL -EPCkKvbdCTAbsewS -EPCjjvbdZjSgofbG -DnbjjvbdJutecdfi -EPCkKvbdIryBSmYM -DoCjjvbdfekzOHHA -DnbkKvbdREDAoqES -EPCjjvbdtTSTYzEc -EPCkKvbdmoyyVkYb -EObkKvbdmfdxMnGy -DoCkKvbdwuNFQxkn -DncKjvbdsBelkfjy -EPDLKvbdQvmdDLhD -EPDKjvbdBhkCLJFj -DoCkKvbdeJiqutzn -EOcLKvbdqTsfrSKt -DoDLKvbdakLfOmcA -DncKjvbdKaLHMawq -EPCkKvbdznopdcMY -DoDKjvbdZtJIyDsO -DoDLKvbdsQVnjCvG -DncKjvbduDDUvuno -DoCkKvbdJYUCHlQp -DnbkKvbdnBiwYPNu -EObjjvbdlYrqryHU -EPCjjvbdqcdiPnWB -DoCjjvbdUQpoUthN -EPDKjvbdsZlQTAhO -EOcKjvbdtbbtwWOo -EPDLKvbdJuuGDdgJ -EOcKjvbdjggMGGOL -EPDLKvbdHffyxwxH -EOcLKvbdSCEElIxk -EObkKvbdIwsbHkqQ -EPDLKvbdjbkjqHUg -DnbjjvbdnQZxujxb -EPDKjvbddePRbWbj -DoCkKvbdhtydwRuC -DoDKjvbdCDoaWKMf -EOcKjvbdRjyGVGjs -EObjjvbddCTNSATm -EOcKjvbdZLrETmlN -EPDKjvbdlrZUysDi -EOcLKvbdwtmFRZMO -EPCjjvbdtTRrxydc -EObjjvbdeFPSBvcK -DoCkKvbdwuNFRZLn -DnbjjvbdhytfLpmf -EPCkKvbdrykpTAgn -EObkKvbdRDcApRDr -DoCjjvbdZnnIeFZj -EOcLKvbdePErkUTr -DoDLKvbdrbGNLgLZ -EObjjvbdVZIUZjoO -DncLKvbdzHYlAMeX -DnbkKvbdbsDLTcia -EPCjjvbdOSsufdtp -DncKjvbdpstHSSLU -DncKjvbduDDVWuoP -EPDKjvbdiMEdNuCy -EOcKjvbdtbcVWuno -DoDKjvbdqUTgRqjt -DncLKvbdZyDjNcLr -DoDLKvbdRWmdDLgc -DncKjvbdZLqdUOMN -DoDKjvbdijGIJlwr -EObjjvbduMYXBUAw -DoCkKvbdHDkWJajK -DoCjjvbdRpTfifEX -DoCjjvbdUyHszKnn -EPDKjvbdqZPIGpdY -EPDKjvbdRWmdCkhD -EObkKvbdsrrSyZdc -EOcKjvbdYlSDtNlN -DncKjvbdbKkennDA -EPCkKvbdiZuGMQmf -EPCkKvbdEztQeLbi -EPCkKvbdaRebgsfL -DoCkKvbdBcpAuilf -EOcKjvbdyNsIYShc -EPCjjvbdcIlijewY -DoCjjvbdmbKXXoOV -DncLKvbduDCtwWPP -EPDKjvbdnCJwXoOV -EPCjjvbdjcLkQgUg -DnbkKvbdtcCtwVno -DncKjvbdGFjRmiUR -DncLKvbdrWpLcJYq -DncLKvbdKWVGDdfi -EPCkKvbdnUuZkJrG -EPCjjvbdiCPCeWqR -DncKjvbdEYYMUUTl -EObjjvbdrpWOicWG -DoDKjvbdFejSOIsq -DnbjjvbdqiAJdmOe -EOcKjvbdUyITzKnn -DoDKjvbdfMfWgMjL -DnbkKvbdXrkaMtOx -DoCkKvbdKefIBaRV -EPCjjvbdyTNhlqbH -EPCjjvbdtlXwBUAw -EOcKjvbdRosfjFdX -DoCjjvbdYpldiMeR -DnbjjvbdwzIFexFS -DncKjvbdSCDeLhyL -DncLKvbdrzLpSaHn -DncKjvbduCcVWuoP -DoDLKvbdatagXkTh -DnbkKvbdsCGMlGkZ -EPCkKvbdkWXNdBww -DncKjvbdJcKCpjCx -EOcKjvbdNxPVzdNt -EPCkKvbdKRZeOfOF -DncLKvbdcIljLGXY -EPDLKvbdVhXuwfxz -DoCjjvbdaoffckzd -EOcKjvbdLhbLpxAS -DnbjjvbdnHExMmgZ -EObjjvbdbhljKfXY -DnbjjvbdkDLkRGuH -EPDLKvbdfHkWSORH -EObjjvbdzoPqFClY -DncKjvbdznopdbkx -EObjjvbdnUtzLKRf -EPCkKvbdZQldiMeR -DoDKjvbdFjeScHmV -EPDKjvbdEOcLKwCd -EPDKjvbdyqOmJKXA -EOcKjvbdSQTfiecw -DoDLKvbdDoDLLXDE -DoDKjvbdhlEcmuDZ -EObjjvbdfHkWRmqH -DnbkKvbdIGfzYwwg -DncLKvbdUWMPjUAq -EPDKjvbdkHflGGOL -DnbkKvbdnPzZVjyC -EPDLKvbdSBceLiYk -DncLKvbdUtMsfLvK -DnbkKvbdbrcLTdJa -EObkKvbdIwtCHkqQ -EPDKjvbdtbcVWvPP -EObkKvbdtbcVWuoP -DoDKjvbdKVtfEFGi -EPCjjvbdMRvlytpz -DoDLKvbdwuMeRYlO -EOcKjvbdlhdTqVRa -EPDKjvbdiGjCyVjV -DnbjjvbdrDeJQNua -DoDKjvbdrbFmMHKy -EOcKjvbdfHjurNpg -DnbkKvbdZRNFJMeR -EOcKjvbdqFdEsvBI -DnbjjvbdZirgogCG -DoDLKvbdDncKjwDE -DoCkKvbdjhGlFfOL -EObjjvbdmaivxOnV -EObkKvbdKkAhWAJy -EOcKjvbdNrtWHEuQ -DnbkKvbdFkFTChMu -EObkKvbdeOdrjstS -EOcKjvbdIwsbHlQp -DoCkKvbdeATpmXif -EOcLKvbdKaKgMaxR -EObkKvbdUGznLvvF -DnbkKvbdbLMGPODA -EObjjvbdTkvOaVoJ -EOcKjvbdsQVoKDVf -EPDKjvbdznopdcLx -DoDLKvbdpfDdsvAh -DncKjvbdrDdhpNua -EOcLKvbdhficZVjV -DncKjvbdFxuVBEYC -EPDKjvbdzjVQQETU -EObkKvbdKRZePGNe -EObjjvbdDncLLXDE -EOcLKvbdYkqctNkm -DoDKjvbdtvOYKRTA -DoCkKvbdmajWxPNu -DncKjvbdIjEAJofd -EPCkKvbdiCPDFWqR -EOcLKvbdIHHZxwwg -EOcKjvbdYpmEiNFR -EOcLKvbdQmYCZNtz -EOcLKvbdVYhTykPO -EPCkKvbdJKEAKPfd -DoCjjvbdRkYfUfjs -EPDLKvbdlZTSTZGt -DoDLKvbdNGbpNQVL -DoCjjvbdvAdZTOdh -EPCjjvbdliDsqUqa -EPDKjvbdSPsfiecw -EOcKjvbdYlRcsmkm -DnbkKvbdwXMAvBVu -EPCkKvbdRjxfVGjs -EOcLKvbdCIkCKiFj -DoCkKvbddxZssrFz -EOcKjvbdREDApRES -EOcLKvbdTpqPVVIN -EObjjvbdaaWEeoow -EOcKjvbddeOrCXCj -EOcLKvbdAMgySvyx -EPDLKvbdNPwqVnHT -EObkKvbdwuMeRYlO -DoCkKvbdTkuoAuoJ -EPDKjvbdmJDspuRa -EPCjjvbdNHCpNQVL -DncKjvbdGcjvKBij -EOcKjvbdbQHHELzd -EPDKjvbdPxmAGrqj -EPCjjvbdRbDdkiYk -EPDLKvbdTAFJHand -DoDKjvbdqmZjZMHi -EObjjvbdtSrTYzFD -DncLKvbdhlEcmtby -EObjjvbdmJEUQuSB -DncKjvbddndsKstS -EPDLKvbdmgFYNOGy -DnbjjvbdSCEElIyL -DncKjvbdmaivxOmu -DoDKjvbdFVyPomKF -DnbkKvbdMpXqWOHT -EObjjvbdKefICBRV -EObjjvbdqGDdtWBI -DnbkKvbdCJLCLIfK -EObkKvbdLqwNZtpz -DoDLKvbdiifHjMwr -DoCkKvbdddoRawDK -DncKjvbdbrcKscjB -DnbjjvbdrSVLNkAm -DnbjjvbdffLynHHA -EObkKvbdTAFJHbPE -DncKjvbdDncKkWcE -EOcLKvbdrouoKDVf -EOcLKvbdZisIPfbG -EOcLKvbdiGicYuiu -DoDLKvbdVgxWXfxz -DoCkKvbdffMZmgHA -EObjjvbdWfZZtAPT -EPDLKvbdEzsqElCi -DoCkKvbdYSlAlsoY -EPDLKvbdFWYpPmKF -DoDKjvbdkNCMZdfo -EPDLKvbdehLWSOQg -DnbjjvbdxxJKCPyk -EOcLKvbdMfcQMpVL -EOcLKvbdnVVZkKRf -EObjjvbdczYoxZQb -EPCkKvbdSQUGiedX -DoDKjvbdeuzwpJzs -DoDLKvbdqZPHfqDx -DoCjjvbdKeehCBQu -DnbkKvbdADSYJyiQ -DoCjjvbdFkFTDHlu -EPDKjvbdZoOJEdzK -EPCjjvbdZjTIQGbG -DncKjvbdZHWdAOri -EPCjjvbdeXystRez -EObkKvbdIxTagkpp -EObjjvbdxZgfFxEr -DoDLKvbdjhHLfGNk -EObkKvbdTfznMWue -DoDLKvbdOSsufeVQ -DncKjvbdVUNTelWK -EPCjjvbdZQmFImEq -DnbjjvbdkClLQftg -DnbjjvbdRXNdDLhD -DncKjvbdTqQoVUgm -EPCjjvbdNQYRVmgT -DoDLKvbdnUuZjiqf -DoDKjvbdbsCjsdJa -EOcKjvbdFkEsDINV -DoDKjvbdyOTHxSiD -EOcKjvbdkMbMZdgP -DnbkKvbdeEnqavcK -DoCkKvbdxZhFfYEr -DncKjvbdNPxQunGs -EOcLKvbdOYOuzdNt -DncKjvbdJbicRKDY -DncKjvbdjAQHAofj -EOcKjvbdWWiYVcdg -DnbjjvbdjFKftoAO -EPCkKvbdTXkLmzjx -EPCkKvbdWSNxBeMD -DoCkKvbduMXwBTaX -DoDLKvbdLBKfmBxR -DoCjjvbdEObjjwDE -EPDKjvbdTlVnaVoJ -DoDLKvbdhgJcZViu -EObjjvbdatbHXjtI -EOcLKvbdZeXfzgiC -EPCkKvbdeFPRbXCj -EPCkKvbdZQleJMdq -DnbjjvbdUWLojUAq -EPCjjvbdFaOpyJzm -DnbkKvbdANIYrwZx -EPCkKvbdbBWEeopX -DoDLKvbdczYpYYpb -EPCkKvbdbVBfxLTh -DoDKjvbdLBKflawq -DoCkKvbdyOSgxSiD -EPDKjvbdkDLkQgVH -EObkKvbdjmBlZdfo -EPDKjvbduoTzqLOt -EOcLKvbdaRebhUFk -EPDKjvbdatbGwjtI -EOcLKvbdCIjbLIfK -DncKjvbdkIGkeemk -DncKjvbdxVMeRZMO -EOcKjvbdRXODcMHc -DnbjjvbdqquLOLAm -DoDKjvbdDHLfHAzc -DoCkKvbdnVVZkKRf -DoDLKvbdGcjvJbKK -DoCjjvbdzoQRFDLx -DoDLKvbdmuUzLKRf -EPDLKvbdtumwiqTA -EOcKjvbdmJDsptrB -EPCjjvbdIGgZxwwg -EPDLKvbdxLXDgzzG -DnbkKvbdQwNdCkhD -DnbjjvbdcasNSAUN -EPCkKvbdTulQKTaR -EOcKjvbdhgJbyVjV -DoDLKvbdKVteceHJ -DnbjjvbdHgGzYwxH -EPCjjvbdxnSgxTJD -EPDKjvbdyYJKCPzL -EOcKjvbdOFDtJJKd -EObkKvbdRadEkhxk -DoCkKvbdiifHjNXr -DoCjjvbdnUtyjirG -EObkKvbdJpydoGNe -DoDKjvbdZLqctOLm -DnbkKvbdsBfMkfkZ -EOcLKvbdOStWGeVQ -EPDLKvbdijGIJmYS -DoDLKvbdxxJJbQZk -DncKjvbdHbLydzAD -EOcLKvbdyTNiMqag -EPDKjvbdMgComQVL -DoDLKvbdzitoocsU -EPDKjvbdsBfMkfjy -DoCkKvbdFyUtaEYC -DoDLKvbdJKEAJpGd -DoCkKvbdygZMAMeX -EPCkKvbdJqZdoFnF -DnbkKvbdiBnbdvqR -EOcLKvbdSQUGjFdX -DnbkKvbdmSYtzTEJ -DoCjjvbdehKvSOQg -EOcLKvbdGckVibJj -DncKjvbdhficYvJu -EPDKjvbdwuMeRYkn -EOcLKvbdFejSNiUR -EPCjjvbdOFEUJJLE -DnbkKvbdXsLaMtOx -EPDKjvbddZyPxYpb -EPCkKvbdhzVFkqNf -DoDKjvbdOEdUIiLE -EPCkKvbdnGeXmOHZ -EObkKvbdiMEdNuCy -DoDLKvbddoFTLTtS -EObkKvbdIxTbHlQp -DncLKvbdZRMdhmEq -DoDLKvbdZnmheEyj -EPDKjvbdKeegbApu -DncLKvbdNVTSLNAX -EOcKjvbdKDJbqKCx -EPCjjvbdFfKSOIsq -EPCjjvbdxnShYSiD -EOcLKvbdOStWHFVQ -DncLKvbdsPvOicWG -DnbjjvbdxnTHwsJD -DoDKjvbdLAkGmBwq -DoCkKvbdwMvAMceN -EOcLKvbdmRyVZsDi -EPCkKvbdmpZyWKyC -DoDLKvbdrykpTBIO -DoCjjvbdVgwvYHYz -EPDLKvbdTvMPjUBR -EOcLKvbdgFkzOGgA -DnbkKvbdVBBpsRRy -DnbjjvbdRzKISbvA -EObjjvbdxnTIXsJD -EObjjvbdZoOJEdyj -EPCjjvbdHDjuibKK -EPCjjvbdezuxdiUX -EOcKjvbdYTMAmToY -EObjjvbdJYTbILpp -DoDKjvbdkClLRHUg -EPDKjvbdTkvPAvPJ -EObkKvbdeAURNXjG -DncLKvbdTukpKUBR -DoCjjvbdcTDKsdJa -DoDKjvbdBsAcUGXS -EObjjvbdDoCjjvcE -EOcKjvbdtlYWaTaX -DnbjjvbdRDbaPpcr -EPCjjvbdrylPsAgn -DoCkKvbdOhAYZAYa -DnbjjvbdiUydwSVC -DoCjjvbdwzIFfYFS -DoCkKvbdZshiZDrn -DoCkKvbdZoOIddyj -DncKjvbdpssgSSKt -EPCjjvbdrSUkNkBN -EPDKjvbdjJfIJlxS -EOcLKvbdxVNFRYkn -DoDKjvbdWWhwvEFH -DncLKvbdRDcBQQcr -DnbkKvbdliETpuRa -EPCjjvbdZRMdiMeR -DnbkKvbdiMEdOVCy -EPCjjvbdznpREbkx -DoCkKvbdwzIFexFS -DnbjjvbdmSYuZrdJ -DoDLKvbdCWzchdov -EPDLKvbdpfEFTvAh -EPDLKvbdyOTIYTIc -DncKjvbdNQXqVnHT -DoDLKvbdCgMFgAzc -EOcKjvbdIwtBgkpp -EPDKjvbdRjyGUfjs -EObjjvbdACqwjZiQ -DoDKjvbdpstGrSKt -DnbkKvbdnGdwmOHZ -DncKjvbdiZtfLpnG -DoDLKvbdaSGCgtFk -DoCkKvbdFfJqnIsq -EPCkKvbdkNCLzEgP -EOcKjvbdFeirOJTq -EOcLKvbdUtNUGMWK -EObkKvbdSQUHJfEX -EPCkKvbdqquKmkBN -DnbjjvbdbhmKKfXY -DoCkKvbdIsYaTNXl -DoCjjvbdZoNheFZj -EOcLKvbdBhjbLIfK -EOcKjvbdatafwjsh -DoCjjvbdkxrrSyHU -EPDLKvbdSCEElIxk -EOcKjvbdfMevfmKL -EPCjjvbdMJBlRYAS -DoCjjvbdSxKkmzkY -DnbkKvbdkNCLydgP -EObkKvbdkxsSTZHU -DoCjjvbdRpUGiedX -EOcKjvbdjblLRGuH -EObkKvbdyTNiMrCH -DnbjjvbdZeXfzhJC -DoDKjvbdZxdJmblS -DncKjvbdOStWHEuQ -DoCkKvbdyNsHwsIc -EPDKjvbdkxrqryHU -EObjjvbdZLqctNlN -DoDLKvbdxnSgxShc -EPDLKvbdnBjWwoNu -DoDKjvbdkIHMGGOL -EObjjvbdqUUGrRkU -DncLKvbdRjyGVHKs -EPDKjvbdhfjCyWJu -EPCkKvbdHELVjBjK -DncKjvbdgQBzvcwh -DoDLKvbdVAaqSpqy -DoCkKvbdySnJNSBg -DoDLKvbdpeceUWAh -DncLKvbdaRebgsfL -EOcKjvbdZLqctNlN -EObjjvbdtbbtvvPP -DoCkKvbdZMSDtNlN -EOcKjvbdsBelkfjy -EPDLKvbdTpqPVVIN -DnbjjvbdBiKbKhfK -DnbjjvbdOFEUIiKd -EPCkKvbdSiZjRAAl -EObkKvbdwjwDgzyf -EPCjjvbdhlEdNtby -EPCjjvbdhtydwSUb -EOcKjvbdnQZyVjyC -DoDKjvbdRzKIScWA -EOcLKvbdLBLHNCXq -DoDLKvbdssSTYzFD -EObjjvbdEvYpPlie -DncLKvbdhficYvKV -EPCjjvbdnUuZkJqf -DnbjjvbdXnRAXtut -EPDKjvbddijRutzn -EOcLKvbdEvYpPljF -DoCjjvbdTulQKUAq -EObkKvbdxmsIYShc -EPDLKvbdkyTRryHU -EObjjvbdCEQAvKNG -EObjjvbdGYuVBEYC -EPDKjvbdvAdYsOeI -EObjjvbdRpUHKGEX -EPCkKvbdKDJcQjDY -DoDLKvbdunszqKoU -DoCjjvbdJvUfEEfi -DncLKvbdrpWPJcWG -DoCkKvbdajkfPNcA -DnbjjvbdFpATXHFy -EObkKvbdFfJrOJTq -DncLKvbdZnnJFEyj -DoCjjvbdOEctIiKd -EPDLKvbdVhXuxGxz -EPDKjvbdySmhlrCH -EOcKjvbdiGjDZWJu -DncKjvbddZyQYZRC -DncLKvbdziuPpETU -DncLKvbdJTYaTNXl -EPCjjvbdNddThiKd -DnbkKvbdbAudepPw -EOcKjvbdMowpunHT -DoDLKvbdmbKXYPNu -DoDLKvbdezvZEiTw -DnbjjvbdrMyixkgi -DnbkKvbdKWVGEFGi -DoCjjvbdkDLjpftg -DnbjjvbdJqZePFme -EObkKvbdDwxLsssl -EPCjjvbdmoyyWLYb -EPCkKvbdFjdrcHmV -DoCkKvbdDwxLtTsl -EOcLKvbdoAKztHdO -EPDLKvbdTkuoAuoJ -DncLKvbdURRPVVHm -EPCkKvbdKCicRJcY -DoCkKvbduDCuXWOo -DoCjjvbdRXNdDMID -DoDKjvbdBcpBWJlf -DoCjjvbdTqROttgm -DncKjvbdRadFMIxk -DoDLKvbdCSaDTewS -EOcKjvbdQlxCYmtz -DncLKvbdeOeSkUTr -DnbkKvbdTqQntthN -DnbjjvbdhbObdvpq -EPDLKvbdMowqVmgT -DncKjvbdANIZTWzY -EPDLKvbdiVZeXRtb -DncLKvbdYNqAXtvU -EOcKjvbdfIKurNpg -DoCkKvbdFpATWfey -EPCjjvbdHkazmwRL -DoDKjvbdJvUfDdgJ -EPCkKvbdSBdElIxk -DoCkKvbdbsCjtEJa -DoDLKvbdvBEYsOdh -EOcLKvbdGGJqmhsq -EOcLKvbdJSyBSlxM -DncLKvbdnQZxukZC -EOcLKvbdySnIlrCH -DoCjjvbdIjEAKPgE -DoDLKvbdhlEcnVDZ -EPDKjvbdZeYGzghb -EPDKjvbdbKlGOnDA -EPDKjvbdkMbMZdgP -EOcLKvbdDoCkKwCd -DnbjjvbdLBLGlbXq -EPDLKvbdZxcinCkr -DoCkKvbdqTsfrRjt -DoCkKvbdADSYJzIp -DoDKjvbdbUagYKsh -EObjjvbdjAQHAofj -EOcKjvbdDoDKkXDE -EPDKjvbdSZigsCvA -EPCkKvbdKRZePGOF -EPCjjvbdKaKgNCXq -EObkKvbdxxJKBoyk -EOcKjvbdxmrgwsIc -DnbkKvbdmozYvKyC -DoCkKvbdqquLOLAm -EObkKvbdDncLLXCd -EPDLKvbdjcMKpftg -EPCjjvbdwkXDgzzG -DoDLKvbdHffyxwwg -DoCkKvbdvAdZSneI -EOcLKvbdrovOjDVf -EOcLKvbdsPuoJbuf -DoDLKvbdySnJNSBg -EObkKvbdXsMAltOx -DncLKvbdFfKSOJTq -EPCkKvbdddnrCWcK -DoCjjvbdySmhlrBg -DnbjjvbdNxPVzcnU -DncKjvbdhtzEvrVC -DoCjjvbdQwODblHc -DoDLKvbdjcLjpgVH -EOcLKvbdbKlGOmcA -EPDKjvbdfMfWflik -DncKjvbdmbJwXnmu -EOcLKvbdTkuoAvOi -DnbjjvbdsZkoraIO -DoDKjvbdZMSEUOLm -EOcLKvbdsCFmLfkZ -DncKjvbdUxhTyjnn -EPDKjvbdRosfjGEX -EOcLKvbdmuUzKirG -EPCkKvbdGGJrOItR -EObjjvbdEXwktUUM -DnbkKvbdiifHimXr -EPDKjvbdmJDspuSB -EObjjvbdwyhGFwdr -DncKjvbdatafwkUI -EPDLKvbdYNqAXtut -DoDLKvbdEPCkLWcE -EOcLKvbdqceJQOWB -EPDKjvbdySnJNSBg -DnbjjvbdyzdnSIIh -DoDKjvbdrDdiQNvB -DoCkKvbdYkqdTnLm -DoCkKvbdlZTSTYgU -EPDKjvbdMpXqWNfs -EObkKvbdJbicQjDY -DoDLKvbdGAoRYizm -DncKjvbdmgExNOHZ -DoCjjvbdznoqFDLx -EOcKjvbdieLGtoAO -DoCjjvbdMfbpMotk -EObkKvbdyzdnSHiI -EObkKvbdcSbjscia -DoDKjvbdNGcQNQUk -EPDKjvbdNGbpMpVL -DoDLKvbdUQqPVUgm -DnbjjvbdVvhwuceH -EPDKjvbdDxXkstTl -EPCjjvbdPyNAHTRj -EPDLKvbdeOdsLTtS -DoDKjvbdTAEiICPE -DoDKjvbdZisIQGaf -EObkKvbdxVMdpxkn -EPCkKvbdnUtzKjRf -EOcKjvbdhtydvrVC -DoDKjvbdbrcLTcia -EPDLKvbdbhlikFvx -EPDKjvbdANIZSwZx -EPDKjvbdtbbuXWOo -EObjjvbdliDtQtqa -DncLKvbdGLFScIMu -DnbkKvbdfMfXGljL -EObkKvbdCTBDTewS -EPDKjvbdSiZiqAAl -EOcKjvbdFfKSNhsq -EPCjjvbdyYJKBpZk -DncKjvbdAMgyTWyx -DnbkKvbdpaJFAXIE -EOcKjvbdEYYMUUTl -EPCjjvbdeFOrBvcK -DoDLKvbdptUHSRkU -DoCkKvbdOYPVzcnU -DnbjjvbdijFhKMxS -DnbkKvbdEKHivXjA -DncLKvbdsPvOicVf -DoCjjvbdmbJvxOmu -EOcKjvbdDxYMUUTl -DoDKjvbdZtIhxdTO -DncKjvbdTlVoAuoJ -DoDKjvbdFyUuBDwb -EObkKvbdQYmAGsSK -DnbkKvbduLwwAsaX -EPDKjvbdegkWRmpg -EPDLKvbdRDcAoqDr -DoCjjvbdFWZPolie -DoCkKvbdbhmJkGWx -DncLKvbdrWpMDJYq -DnbjjvbdaaWEeoow -DoDLKvbdzHYlANFX -DoCkKvbdjFLHUoAO -DnbjjvbdZyEKNbkr -DoDKjvbdLrXMyuQz -EPDLKvbdwNWAMdFN -DoCkKvbdkWXODaxX -EOcKjvbdraelkgKy -EOcLKvbdmSZVZsDi -EPCjjvbdkMbLzEfo -EObjjvbdaSFbgtFk -EObkKvbdmIctRUqa -DncKjvbdhtydvquC -EPDKjvbdZoOJEeZj -DoDLKvbdyXiJaozL -EOcLKvbdVwIxWEFH -DnbkKvbdYpmFJMdq -EPDLKvbdjKGIKMwr -EPCkKvbdFpASwHGZ -DncKjvbdKQzEnfNe -DoDLKvbdkVwODaxX -EPCjjvbdzaAOffal -EObjjvbdnHEwlnGy -DncLKvbdLqwMyuQz -EPCkKvbdWRnXaeMD -DoCkKvbdcbSlrAUN -EPDKjvbdMJBlRYAS -EOcLKvbdZxcimbkr -DncLKvbdCDpBVimG -DoDKjvbdGdKvKBjK -EPDLKvbdziuPodSt -DnbkKvbdbrbjtEKB -EOcLKvbdmIcsptqa -EPDKjvbdMRwMyuQz -DoDLKvbdfHkVrNqH -DnbkKvbdLZRKSzuG -EPDKjvbdTfzmkwWF -EOcLKvbdSKxeuHLT -EPDLKvbdkHgLfGNk -DoDLKvbdVhXuxHYz -EOcKjvbdkHgMGGOL -DoDKjvbdEARhmZvw -EPDLKvbdjKFgimXr -EObkKvbdSQUGiecw -EPCjjvbdjKFhJlxS -DoDKjvbdDxXlTtUM -EPDLKvbdelfWgMik -EOcKjvbdtcDVXWOo -DoDKjvbdiZuFlRNf -DoCkKvbdsBellHKy -EPCkKvbdjlbLyeGo -EOcKjvbdhfibxujV -EObjjvbdhyuGMROG -DoDLKvbdgQBzvdYI -DoDKjvbdeATpmXjG -EPDLKvbdjKFgilxS -DoDKjvbdrpWPJbuf -DncLKvbdDncLKvcE -DoCkKvbdkVvmdCXw -DncLKvbdGcjujCJj -DncLKvbdpxngfpcx -DnbjjvbdiCPCdwQq -EPDLKvbdijFhJlwr -DncKjvbdhgJbxvKV -EPCjjvbdZxcjNbkr -DncKjvbdZQleJMdq -DncLKvbdyfxlAMeX -EPCjjvbdFfJrNiUR -EPDLKvbdzjVQPdSt -DoDLKvbdjAQHBPfj -EObjjvbdZoOJFEzK -EObkKvbdFpATWgGZ -EPDKjvbdvAcxrneI -DoDLKvbdxrnJMrCH -DoCkKvbdjmCLydfo -EPCkKvbdegjuqmqH -DoCkKvbdSBdFLiZL -EObkKvbdbAvFFopX -DncLKvbdGQASwGey -DnbkKvbdQccAopdS -EPCkKvbdZshiYdSn -EPCjjvbdHDjujCKK -EObjjvbduDDVWuno -DoCjjvbdzjVQQDsU -EOcLKvbdeFOqavcK -DoDLKvbdyXhibPzL -DoDLKvbdrzMPsAgn -EObkKvbdUtNTfMWK -EOcLKvbdLqwNZuQz -EPDKjvbdqBJFAXHd -DoCkKvbdnUuZkKSG -DoCjjvbdZHXEAOsJ -DncKjvbdQdDBPpcr -DnbkKvbdCIkBkIej -DnbkKvbdMgDPmQUk -DnbkKvbdxxIjCPyk -DnbjjvbdZsiIxdSn -DoCkKvbdADRxJzJQ -EObjjvbdkxsSTZHU -DncKjvbdWXIxVdEg -DnbjjvbdLrWmZtpz -EPDKjvbdhzUelQnG -DoDLKvbdSBceLhxk -EObjjvbdWIXvYGxz -EPDKjvbdEYXktUUM -EObkKvbdhlFENtby -EPDLKvbdNwnuzcmt -EOcKjvbdaaWEfPpX -DncLKvbdddoSCWcK -EPDKjvbdmaiwXnnV -DoDLKvbdMgDQMpUk -DoDLKvbdjFKfuPAO -DncLKvbdnGeYMmfy -DncLKvbdrSUjmkAm -EOcLKvbdfHkWRnQg -DnbjjvbdnCKWxPNu -DnbjjvbdraemLgKy -EObkKvbdWWiYWDdg -DoCkKvbdKfFgaaQu -EPCkKvbdaSFcIUGL -EOcKjvbdkxrqryHU -DncKjvbdRDbaQQcr -DncLKvbdbVBgXjtI -DoCjjvbdqZPHfqDx -DnbkKvbdcyxowxpb -EPCkKvbdWXIxWDeH -DoCkKvbdyXiKBozL -DnbkKvbdlZSrTYft -EObjjvbdGdKujBij -DnbjjvbdtcDVXWPP -DoDKjvbdZnmhddyj -EObkKvbdTukoisaR -EObkKvbdzoPqFCkx -DncLKvbdLhalQxAS -EPCkKvbdVwIwudFH -DoDKjvbdjKGIKNYS -DoDLKvbdjhHLeenL -EPDKjvbdJTZBSlxM -DoCjjvbdFaOqZJzm -DoDLKvbdnBjXXnnV -DoCjjvbdeFPSCXDK -EPCjjvbdbAvFGPow -DnbkKvbdVwIwvEFH -EObjjvbdqUTfrSLU -DncKjvbdqlyixkhJ -DoDKjvbdSLZFuGjs -DncLKvbdsCGNLfkZ -EPDLKvbdaofgDkzd -DoCkKvbddiirWUzn -EOcKjvbduCcVWuno -DnbkKvbdSPsfjGDw -DoCkKvbdFWYpQMie -DoDLKvbdRECaQRES -EPDLKvbdhfibyVjV -DnbjjvbdqTsgSSLU -EObkKvbdrXQMChyR -DncLKvbdNrtVfduQ -EObjjvbdiUzEvqtb -DncKjvbdUaCQsRRy -EPCjjvbdRbEEkiYk -DncKjvbdUtNUGMVj -EPCjjvbdzHYlAMeX -EPCkKvbdeEoRbXCj -DoDLKvbdcScLUDia -DoDLKvbdtbbuWuno -EOcKjvbdbUafwkTh -DoCjjvbdtcDVXWOo -EOcKjvbdHgGyxxYH -EOcLKvbdWSOXbEkc -DoCkKvbdKeehCBRV -DncLKvbdMgComQVL -DoDKjvbdUMVoBVoJ -DoCjjvbdzoQRFCkx -DoCkKvbdUWMQJsaR -DnbjjvbdkNCLydgP -EOcKjvbdmozYvKyC -DnbkKvbdmgExMnGy -DncKjvbdznpQeDMY -DoDKjvbdZxcjNbkr -EOcKjvbdqdEiQNua -EPDLKvbdfHkVrNpg -DnbkKvbdXsMBMsoY -EObkKvbdcJNKLGXY -EPDLKvbdVqmwbEkc -EPCkKvbdJcJbpibx -EObjjvbdYNqAXtvU -EObkKvbdjAQHApGj -EPDKjvbdrbFmMHLZ -DnbkKvbdPIAXyAYa -DoDKjvbdSLZGVHLT -DoCkKvbdDnbkLWcE -DncKjvbdzoPpeDMY -EPDKjvbdQwNdDLhD -EPDKjvbdhfjCxuiu -DoCjjvbdajkenmcA -EPDKjvbdtTSTYyeD -DoCjjvbdijFhKMwr -DoDLKvbdpfDeTuaI -EPCjjvbdJXtCHlQp -EOcKjvbdjbkkRGuH -EObkKvbdVTlselWK -DoCkKvbdauCHXkTh -DnbjjvbdSLZGVGjs -DoDLKvbdehLWRmqH -DncKjvbdSBdFLhyL -DoDLKvbdmajXYPOV -EOcKjvbdpeceTvAh -EPCjjvbdNdctIhkE -EOcLKvbduWNwjQsA -DoCjjvbdtvOYKRTA -DncKjvbdqiAJeNOe -DnbjjvbdUtNUGLvK -EPDKjvbdMgColotk -EOcKjvbdQlxCZNtz -DoDKjvbdmfdwmNfy -EPDKjvbdrovPKDVf -DnbjjvbdDjIJuwjA -EPCjjvbdsBfNMHLZ -DoCjjvbdJbjDRJcY -EPDLKvbdZRMeJNEq -EPCkKvbdRkYfVGkT -DncLKvbdRbDeLiYk -EPCjjvbdqiAJdloF -DoCjjvbdFyVUaDwb -DoCjjvbdMRvmZtpz -DoDLKvbdGQATWffZ -EPCjjvbdwtmFQyMO -EOcKjvbdTIzKRAAl -DoCkKvbdsQVnicVf -DoDLKvbdFfKRmhtR -EOcKjvbdsCFmLfjy -DoDKjvbdddnqbXDK -DoDKjvbdYgWdAOri -DoCkKvbdmuUyjjSG -EObkKvbdhficYvJu -DoCkKvbdQlxCZNtz -EPCkKvbdGZVUaEXb -DncLKvbdEXxMTtTl -DoDKjvbdGFirNiUR -EPCjjvbdpssgRrLU -EObkKvbdVZHsykOn -DncKjvbdyTOJMrBg -EOcKjvbdRacdlIyL -EObkKvbdiCOcFWqR -DoDLKvbdRjxfVGkT -EOcLKvbdiBncFXQq -DncLKvbdnQZxukYb -DoDKjvbdpaIeAWgd -DncKjvbdVqnYCEkc -DnbjjvbdZRMdhmEq -EPCjjvbdhgKDYuiu -EOcLKvbdCIkBjhfK -EPCkKvbdZnmhdeZj -EOcKjvbdTppnuUhN -EOcLKvbdbVBfxKsh -EPDKjvbdFVxpQNKF -DnbjjvbdjvWnDaxX -EObjjvbdANIYrwZx -EObjjvbdauCHXjtI -EObkKvbdZirgpGaf -EObjjvbduoTzqLPU -DoDLKvbdxZhFeweS -DoCjjvbdILaznWqL -DncLKvbdaMkBrtlg -EObjjvbdNrtVgFUp -DnbkKvbdRzKHsCvA -DoCkKvbdiZuFkpnG -DnbkKvbdEztRElDJ -EPCjjvbdRECaQQdS -EPCjjvbdqqtkNkAm -EObkKvbdyNrhXriD -DoDLKvbdegkWRmqH -DncKjvbdNQXqWNfs -DoDLKvbdRadFLhxk -EPDKjvbdxUmFQyLn -EPCjjvbdxxJKBoyk -EObkKvbdnVUzLJqf -DnbjjvbdSQUGiedX -DncLKvbdrpVnjCvG -DoDKjvbdZirgpGbG -DncKjvbdOAJTUJrA -DnbjjvbdUyHsyjoO -EPDKjvbdfpBzvdXh -EPCjjvbdyTNhlqag -DncKjvbdLBKflaxR -DoCjjvbdVwJXvEEg -EOcKjvbdVqnXadlD -DoDKjvbdyNrgxSiD -EObjjvbdnVVZjjRf -DnbjjvbdFeiqmiTq -EObkKvbdFVxpQMie -DnbkKvbdIBkydzAD -EPCkKvbdZjTHofaf -DncLKvbdnPzYukZC -EObkKvbdLYqKSzuG -Dnbjjvbdxmrgwrhc -EObkKvbdTkuoBWOi -EObkKvbdIrxaSlxM -EOcLKvbdJqZeOfOF -DoCjjvbdBhjbKiFj -EPCkKvbdrDeJPnVa -EPCkKvbdNwoVzcnU -EOcLKvbdXmqAYVWU -EPCkKvbdZeYGzhJC -EOcKjvbdNddUIhjd -DoDKjvbdjggLeemk -EObkKvbdxZgefXeS -EOcKjvbdgFkzOGgA -EObkKvbdNdcsiIkE -EPDKjvbdbiMikFwY -EPDKjvbdelfWfmJk -EOcKjvbdHELWJajK -DoDLKvbdZRMeIldq -EOcLKvbdRXNccMHc -EPCkKvbdQlxCZNtz -DoCkKvbdyTOJMqag -EPDLKvbdCTAcTevr -EOcKjvbdrpVnicWG -DnbkKvbdZLrETmkm -EOcLKvbdRpTfifEX -DnbjjvbdQcbaPqDr -DoCkKvbdEuxpQNKF -EPCjjvbdNeEThiKd -EPDKjvbdVYgtZjoO -DoCjjvbdZRMdhleR -DoCjjvbdZsiIyDrn -EPDLKvbdaSGCgtGL -EPDLKvbdqTtGqrKt -DoCkKvbdnVUzKjSG -EPCjjvbdzQoMiJwA -EPDKjvbdXrlBMtOx -DoCjjvbdNHColpVL -EObkKvbdXnRAXuVt -EObjjvbdMJCMQxAS -EObkKvbdIrxaTMxM -DnbjjvbdbAudfQQX -DnbkKvbdnCKXYOmu -DoDKjvbdEXxMUUTl -EObkKvbdyXhiaozL -EObjjvbdEJhKVwjA -EOcKjvbdpfEFTuaI -EOcKjvbdbVCHYLTh -DncLKvbdyqOliJwA -EOcKjvbdkxrqsZHU -DncKjvbdDjHjVwjA -EPCkKvbdkDMLQfuH -EPCjjvbdUVlPjUBR -DoDLKvbdjJfHimXr -DoCkKvbdEuxooljF -DoDLKvbdYzcGRjWZ -DoDKjvbdwyhGGYFS -DnbkKvbdsrrSxyeD -EPCkKvbdxmrhXrhc -EPDKjvbdDjHivXjA -EObkKvbdfMfXGlik -EPDLKvbdGdKvKBij -DoCkKvbdbLMGOmcA -EPCkKvbdRXNdDLgc -EPCjjvbdZsiIxcrn -DoDKjvbdpyPIGqEY -EPDKjvbdlZTRryHU -DoDKjvbdUslsekvK -DncKjvbdKfFhCBQu -DncLKvbdSCDeMIyL -EPDKjvbdJcJcRJcY -DoDLKvbdraellHLZ -EPCjjvbduDCtwWPP -DnbkKvbdBdPaWJlf -EPCkKvbdqFceUVaI -DnbkKvbdcyxoxYqC -DnbkKvbdlYsSTYft -EObjjvbdZHXEAOsJ -EObjjvbdURROtuHm -EPCjjvbdZLrDsnMN -EPCjjvbdfIKvRmpg -EPDLKvbdwWlBVaVu -EObkKvbdZMSDsmkm -EPDKjvbdKNAEZfuB -DnbjjvbdhyuGMROG -EObjjvbdJuuGDdgJ -EPDLKvbdgQBzwDxI -EObjjvbdjvXNdCXw -EPCjjvbdlZSrSyGt -DoDKjvbdXsLaMsnx -DoDLKvbdTlVoAuoJ -DnbkKvbdptUGrSLU -EObkKvbdEztRFMCi -EOcLKvbdTkvOaVoJ -EObkKvbdDoCjjwCd -EPCkKvbdTfznLwVe -EObkKvbdRjyGUfjs -EPDKjvbdVviXvEFH -DnbjjvbdKkBIWAKZ -EOcLKvbdqFdFUVaI -EOcLKvbdBhjakJFj -DncKjvbdauBgYKsh -DnbjjvbdxKvdHzyf -DoCjjvbdxVMdqYlO -EPCjjvbdEPDLLXDE -EPDLKvbdVvhwucdg -DncKjvbdaRfDITfL -EPDKjvbdfpBzvcxI -DoCkKvbdGLFTDHmV -DoDLKvbdcTDKtDjB -DnbkKvbdZRMeIldq -EObjjvbdRjyGVGkT -EPCjjvbdlhctRVRa -DnbjjvbdyXhibPzL -DnbjjvbdFpASvgFy -DnbjjvbdKCicRJcY -DnbkKvbdPxmAGrrK -EPCjjvbdpstHSSKt -EObkKvbdiZtelQnG -DoDLKvbdKkAgvAJy -EObjjvbdsPvPKCuf -EOcLKvbdhyuGLqOG -EPDLKvbdyOSgxShc -EObkKvbdmJDsptqa -EPCjjvbdbVCHYKtI -DoCkKvbdCJLBkIfK -EPDKjvbdTqQnuUgm -EOcLKvbdypnmIjXA -DoDLKvbdiLddOUby -DoCkKvbdaSFbgtGL -EPDLKvbdraellGjy -EObkKvbdWRmwbEkc -EPCjjvbdDoDLKvcE -DnbjjvbdjEjfuPAO -DnbjjvbdqvokbiYq -DnbkKvbdVZITzLOn -EPDKjvbdUWLpJtAq -EObkKvbdwtmFQyMO -DoDLKvbdFWZQPmKF -EPDKjvbdLBKgMawq -DncLKvbdANIYsWyx -EObkKvbdqvolDJYq -EOcKjvbdQlwbZOUz -EPCkKvbdlqyUzTEJ -EPCkKvbdSLYfUgKs -DoCjjvbdRotHJfEX -EOcKjvbdrXQMCiZR -DncLKvbdaofgELzd -DoDKjvbdehKvSNqH -EPCkKvbdzaAOfgBl -DoCkKvbdVUMsfMVj -DoDLKvbdUGznLwVe -EPDLKvbdDoDKjwDE -DoCjjvbdANHxsXZx -EPCkKvbdJpydnenF -EPCjjvbdtTRsZZeD -DoDLKvbdnQZyWLZC -EPCkKvbdKNADyfta -EPCkKvbdUVlPjTaR -DncLKvbdeOeSjstS -DncKjvbdXrlAmUOx -DoCkKvbdxnTIXrhc -EPDLKvbdZjTIQGaf -DoCjjvbdPxmAGrrK -EPDKjvbdLZQirztf -DoDLKvbdkHflGFnL -DoCjjvbdiMFEOUby -DnbjjvbdhaoDFXQq -EPCkKvbdyzeNqhIh -EPDKjvbdbUbGwkUI -DoCkKvbdEXxLsstM -DoDLKvbdaRebhUGL -EObjjvbdMfbpNQUk -DoDLKvbdCEQAuilf -EObjjvbdMowpunHT -DoDLKvbdzHYlAMeX -DoCkKvbdegkVqnQg -DnbkKvbdwWlAuaVu -DncKjvbdFfJqnItR -EObjjvbdZjTHpHBf -EPCkKvbdbsDKtEJa -EOcLKvbdZtIiZESn -DoDLKvbdpxoIHRDx -EPDLKvbdTpqOtuIN -DnbjjvbdmoyxvKxb -DncKjvbdqGEEtWBI -EPCkKvbdQwNdClHc -DoCkKvbdHELViajK -EPDLKvbdCJLBkIfK -EPDLKvbdvwMBWBVu -EPDKjvbdxrmiNRag -EOcKjvbdxVMeQyLn -DoCkKvbdraelkgLZ -EPCjjvbddndsLUUS -DoCjjvbdhgKDYvKV -EPDKjvbdBiKbKiFj -DncKjvbdKkBIWAKZ -DnbjjvbdjlakzEgP -EObjjvbdNrtWGeUp -EPDKjvbdidkGuPAO -DnbkKvbdjAQHBPgK -DoCkKvbdUxgtZkPO -DoDLKvbdDoCkLXDE -DoDLKvbdkVvmcaxX -EPCkKvbdmfeXmOHZ -DoCjjvbdHDkWJajK -DoDLKvbdkHgMGFnL -EObjjvbdBdQAuilf -EPDKjvbdxUleQxlO -DoDKjvbdJbjDRJcY -EPDKjvbdXsMAltOx -EOcKjvbdIrxaSmXl -DoDLKvbdyYJJbQZk -DoDLKvbdQlwaxnUz -EObkKvbdqvpMDIyR -DoCkKvbdhzVGLpnG -DncKjvbdJKEAJofd -EOcLKvbdZLrETnLm -DncKjvbdQvnDcMID -EPDLKvbdiLddOUby -EOcKjvbdeJiqvUzn -DnbjjvbdsBemMGkZ -EPCkKvbddtAUASmW -EPCjjvbdiLeEOVCy -EPDKjvbdkxrrSyHU -DoCjjvbdURQoVUhN -EOcKjvbdtkwwBUBX -EOcKjvbddeOqawCj -EOcKjvbdbAvEfPow -EPCkKvbdzROmIjXA -EObjjvbdKDKCpibx -EPDKjvbdIGfyyYXg -EOcLKvbdeOdsKssr -EOcKjvbdsBelkgKy -DoDKjvbdJYUCIMRQ -EOcLKvbdjcMLQgVH -EOcLKvbdJTYaSmXl -DoDLKvbdNddUJIkE -DoDLKvbdFjdsChNV -DnbjjvbdmttyjjSG -EPDLKvbdVgwuxHYz -EOcLKvbdsCGMkfjy -EOcKjvbdKWVGDeHJ -EPDLKvbdjJegjMwr -DoCkKvbdNHDQMotk -DoDLKvbdjmBkydgP -DnbkKvbdSLZFtfjs -EPDKjvbdjbkjpfuH -EObjjvbdkVwNdBww -DncKjvbdFxtuBEYC -EPCkKvbdrMzJxkhJ -DoDLKvbdptUGrSKt -EOcKjvbdhzUelQnG -EObkKvbdsQVoKCuf -DoCkKvbdzitpPcsU -DoCkKvbdySnJMqag -DncKjvbdZRMeImFR -EObkKvbdYzcFrKVy -DoDKjvbdrNZjZMIJ -EPCkKvbdEvYoolie -EOcLKvbdLBKgNCXq -DnbkKvbdrpVnjDWG -EObkKvbdLLBHvAJy -DoCkKvbdqmZixkgi -DoCjjvbdhytfLpmf -DnbkKvbdVZHsyjoO -EObkKvbdWWhxWEEg -EObkKvbdhfjDZWJu -DoCjjvbdZoOIddzK -DoCjjvbdCDoaWJmG -DoCkKvbdzitoocrt -EOcLKvbdOSsvGduQ -EOcLKvbdVqnXbElD -EPDKjvbdgFlZnHHA -EOcKjvbdUsltFkvK -EPCkKvbdePFSkTsr -EPCkKvbdssSTYzFD -EOcLKvbdVTlselWK -DncKjvbdZRMeJMdq -EOcKjvbdYSlAlsnx -DncLKvbdSZihTDWA -DnbjjvbdvvlBWAuu -EOcLKvbdEvZPoljF -EPDKjvbdHELWJbJj -DoDKjvbdDjHiuxKA -DncLKvbdrMyjYkgi -EOcLKvbdRbDdlIxk -DoDLKvbdFVyQQMie -EOcLKvbdZxdJmcMS -EPDKjvbdFejRmiUR -EPCjjvbdnPyxujxb -DoCkKvbdjKGIKNXr -DoCjjvbdYSlBNUPY -DoDLKvbdZshiZDsO -EPDLKvbdkyTRsYft -DncKjvbdJbicQicY -DoCkKvbdXGZZtAOs -DnbkKvbdZjSgpGbG -DncKjvbdWSOYBeMD -DoDLKvbdKNADyfta -DoDLKvbdLBKgMbYR -EObjjvbdNddThhkE -EPCjjvbdQdCaPqES -DnbkKvbdvBDySoFI -EPCkKvbdDoDLLWcE -DncLKvbdaSGDHtGL -EObkKvbdKNADzGta -DncLKvbdTAFJHaoE -EOcLKvbdTAFJIBoE -DoDLKvbdUtNTelWK -EPCkKvbdKefICApu -EObkKvbdySmhlqbH -EPDLKvbduaEYroFI -DnbjjvbdSKxfVHLT -EObkKvbdhkdcnVDZ -DnbkKvbdCSaDTevr -DoCkKvbdiBoCeXQq -DncLKvbdZjShQGaf -EPCkKvbdIwsagkqQ -DnbkKvbdnCKWwoNu -DncKjvbdelfWgNJk -EOcLKvbdSPtHKFcw -EObjjvbdZRNEhleR -DoCkKvbdbLMGPNcA -DoCkKvbdRkZFtfjs -EOcLKvbdySmhmSBg -DoCkKvbdWHxVwgYz -EObjjvbdURQntuHm -EPDKjvbdySnJMqbH -EOcLKvbdOStWHEtp -EPCjjvbdeOeTKstS -DncLKvbdssRsZZdc -EObjjvbdrovPKCuf -EPDKjvbdiZuFkqOG -DncLKvbdsBfNLfjy -EOcLKvbdCDpAujNG -EPDKjvbdOSsugFUp -DoDLKvbdNQYRVmfs -EOcLKvbdTAEiHaoE -DoCjjvbdEPDKjwDE -EPCkKvbdqUUGqqkU -EPDKjvbdtbcVXVoP -DnbjjvbdhbOcEvqR -EOcKjvbdCTAcUGWr -EPCkKvbdQdDApQcr -DnbjjvbdTfznLwWF -DnbkKvbdCDoaVjMf -EPCjjvbdBsBDUFvr -EPCkKvbdWWiXuceH -DoCjjvbdJcJcRJbx -DoDLKvbdsCGMlHKy -EPCjjvbdSBceLhyL -DoDKjvbdHffzZYYH -EPCkKvbdvAdZTOeI -DnbkKvbdxwhjBpZk -DncKjvbdOFDtIhjd -DoCjjvbdmpZxujxb -EOcKjvbdIryAsMwl -EPCkKvbdTqQnuUhN -DncKjvbdOSsvHEtp -EPDLKvbdZoOIdeZj -DnbkKvbdKeegbAqV -EPCjjvbdqFceUWAh -DnbkKvbdCWzchdpW -EPCkKvbdzQnlhiwA -DoDLKvbdqdEiQNua -DncKjvbdddoRawCj -EPDLKvbdlYrrSxft -DnbkKvbdRWnECkgc -DncKjvbdGYuUaEYC -EPDLKvbdZsiIxcrn -DoCjjvbdJbibqJbx -EPDKjvbdGYtuBDxC -DnbjjvbdCEQAvKMf -EObjjvbdvAcyTPEh -DoCkKvbdxwhjBozL -DoDKjvbdNsTugFVQ -DoDKjvbdkHgLeemk -EOcLKvbdwWlBVaWV -EOcLKvbdrNZjYkgi -DnbkKvbdJYUBglRQ -DnbkKvbdjvWmdCXw -EObjjvbdmajXYPOV -DncKjvbdDihJuxKA -EPCjjvbdwzIGGYFS -DoDKjvbdMpYQvOHT -DncLKvbdbhljLFwY -EObjjvbdelevgMik -DnbjjvbddePSCWbj -DnbjjvbdKQydnenF -DnbkKvbdZQmEhmFR -DoDKjvbdjKFgimYS -EObjjvbdANIZSvyx -DoCjjvbdfHkWRnRH -EObkKvbddiiqutzn -EOcKjvbdqYnhHQdY -DoDKjvbdKCjDQjCx -DoDLKvbdjgflFfNk -EOcLKvbdtTRrxzEc -DnbkKvbduLwwBUAw -DncLKvbdkWXOEBxX -EPDKjvbdNxPVzcnU -EPCjjvbdUMVnaWOi -EObkKvbdZQmFImEq -DncLKvbdQvmdDMID -EObjjvbdGFjSNhsq -EOcLKvbdbAvFFpQX -DoCjjvbdkCkjqGuH -EPCkKvbdbLLeoNcA -DoDLKvbdemFwGmJk -EOcKjvbdVUMtFlWK -EPDLKvbdWXJXucdg -DncLKvbdqcdhpNua -DncLKvbdGYuUaDxC -EPCkKvbdGZUtaDwb -EOcLKvbdjuwODaxX -EOcKjvbdSKyFuHKs -EOcLKvbdNQYQvOHT -EPCkKvbdNGcQNPuL -EOcLKvbdPIAYZAZB -EObjjvbdMfcPlpVL -EPCjjvbdLAjflbXq -EPCjjvbdySmhmRbH -EPDKjvbdxsNhmSBg -EOcKjvbdZMSDsmkm -DoCjjvbdbAudfQQX -DoCjjvbdePErjtTr -DncKjvbdtkxXBUBX -DoCkKvbdqvokbiYq -DnbjjvbdMfbpMouL -DnbjjvbdijFhKNXr -DoDKjvbdhgJcZVjV -EPDKjvbdIHGzZYYH -DnbjjvbdNsTufeVQ -DnbjjvbdqlyixlIJ -EPDLKvbdmaivxPOV -DnbkKvbdmJDsptrB -DnbjjvbdQYmAGsSK -EOcKjvbdZjTIQHCG -EPDKjvbdqGDeTuaI -EOcLKvbdADSYJzIp -DncLKvbdeuzwoizs -EObjjvbdFyUuBEXb -DncLKvbdnUtykJqf -EPCjjvbdelfXGmKL -EOcKjvbdKCjDQjDY -DncKjvbdaaVeGPow -DncKjvbdqvolDJYq -DoCjjvbdDnbjkWbd -DoCjjvbdjlakyeHP -DoCkKvbdLZRJrztf -DncKjvbdZisIQHCG -EPDLKvbdZyDjNbkr -DnbkKvbdLAjfmBwq -EOcKjvbdtSqryZeD -EOcLKvbdIMBzmvqL -EObjjvbdiVZdvqtb -DoDLKvbdMgDPmQVL -EPDLKvbdMgCpNPtk -EObjjvbdKVuGDeHJ -EOcLKvbdjJehJlxS -EPCkKvbdhlEcmuDZ -DoDKjvbdHfgZyXwg -EPCjjvbdShyiqABM -EPDLKvbdMgColouL -EPDLKvbdVqmwadkc -EPCjjvbdnCKWwnmu -DncKjvbdRpUGjGEX -DoDKjvbdkWWnECYX -DnbjjvbdkMalZeGo -EOcKjvbdxUleRYkn -EObkKvbdFxtuBDxC -EObjjvbdnGdwlnGy -EObkKvbduaEYsOeI -EPCkKvbdyTOJMrBg -EObjjvbdDHMFgAzc -DnbjjvbdEOcKkXCd -EPDLKvbdBhjbLIfK -EPCkKvbdZtJJZETO -EOcLKvbdIwsagkqQ -DoCkKvbdZyDjNbkr -DnbjjvbdBsAbsfWr -DoCjjvbdeOeSjssr -EObkKvbdVUNUGMWK -DncLKvbdfMfWfmKL -DoCjjvbduaEZTOdh -DoCkKvbdZisIPgBf -DnbjjvbdVZHtZjoO -DoCjjvbdCWzchePv -EObjjvbdJmAEZfuB -EObjjvbdvvkaVaWV -DoCjjvbdiiegjNXr -DnbjjvbdcScLUEJa -DncLKvbdJXsbHlQp -EPCjjvbdrpWOjDVf -DoDLKvbdDnbjjwDE -DnbjjvbdxnShYSiD -DoCjjvbdqGEFUWBI -DoDKjvbdtSrTYzEc -EObkKvbdEPDLLWcE -DoDKjvbdKQzEnfOF -EPDLKvbdIwtBhMRQ -DoCjjvbdTvLojUBR -EPDLKvbdZyDimbkr -EPDLKvbdptTfrSKt -DncLKvbdkMbLyeHP -EOcKjvbdKfFhBaQu -EObjjvbdeEoRbXDK -EOcKjvbdHDjvJbJj -EObkKvbdEztQeLcJ -DncKjvbdUtMsfLuj -DnbjjvbdRXOECkgc -DncKjvbdLAjfmBxR -EOcLKvbdsPvPJcVf -EPCjjvbdygYlAMdw -DnbjjvbdmuVZkKRf -EPCkKvbdSZigrcWA -DncLKvbdcJMikGWx -EOcKjvbdGLErcHlu -DoDKjvbdKNADygUa -EPDLKvbdMfbolpUk -DoDLKvbdUxhTyjoO -EPCkKvbdMtrqjmAX -EPDLKvbdLBLGmBxR -DoCjjvbdrzMQTAgn -EPDLKvbdUxhTykPO -DnbkKvbdnVUzLJqf -DoCkKvbdLYpirztf -EPDLKvbdFejSOItR -DncLKvbdvlvANDeN -DncLKvbdwtleRYkn -EObkKvbdcJNKLFvx -EPCjjvbdYSkaNTnx -EOcLKvbdSxKlNzjx -DnbjjvbdHbMZdzAD -EPCjjvbdXnRAXuVt -DoDKjvbdQmYBxnUz -DoCkKvbdWSOYCEkc -DnbkKvbdemGXGlik -EObjjvbdNeDsiJLE -DoCkKvbdbiMijfXY -EPCjjvbdmIdTptrB -DoCjjvbdEztQeMDJ -DncLKvbdCIjbLIfK -EPCjjvbdhkeENuDZ -DoCkKvbdAMgxsWzY -DoCjjvbdiZtelQnG -EOcKjvbdWXJXuceH -EOcLKvbdZRMeJMeR -EPCkKvbdiVZdvquC -DoDLKvbdkVvmdCXw -EObjjvbdnHExMmgZ -EPDKjvbdHgHZyYYH -EPDKjvbdRbEFMJYk -EPCkKvbdvBEZSndh -DnbkKvbdcScLTdJa -DoDLKvbdcJMijfXY -DnbjjvbddndrjstS -EPDLKvbdbiNJjevx -DnbkKvbdOSsvGduQ -DoDKjvbdMowpvNfs -DoCkKvbdZjSgpGaf -DnbkKvbdddnqawDK -DoDLKvbdKaLGmCYR -DoCjjvbdmuVZkKSG -EOcKjvbdZQldiMdq -EObjjvbdRNXayOUz -DncLKvbdeuzxQJzs -DncLKvbdEOcKkXCd -DncKjvbdhtyeXSUb -DnbjjvbdEObjkXDE -DncLKvbdKQyePGNe -EOcLKvbdHgGzZXwg -EObkKvbdrMzJxlIJ -EObkKvbdRXNdClHc -DoDLKvbdwzIFexEr -EPDKjvbdJYUCIMQp -DnbkKvbdhbOcFWqR -EOcKjvbdnGdxMmgZ -EObjjvbddeOqawCj -EPCjjvbdqTsgSSKt -DncKjvbdJXtBhLqQ -DoDLKvbdatagYKsh -EOcKjvbdjEkHUoAO -DncKjvbdLFfICBRV -DnbkKvbdKQydoFme -EPDKjvbdhlFEOVCy -EPCkKvbdZxdJmblS -EPDKjvbdJbjCqKCx -DncKjvbdwNWANDdm -EPDLKvbdpyPHfqDx -EPCjjvbdOTTufeVQ -EPCkKvbdtbbtvvOo -DoCjjvbdbBWEfQQX -EObjjvbdKNAEZgVB -DnbjjvbdJXtBgkqQ -EPCjjvbdGYtuBEXb -DoDLKvbdZjShQGaf -DoDLKvbdQmYCYnUz -EOcLKvbdpedFTvAh -EObjjvbdKQydoGNe -EPCkKvbdKDJcRKDY -EObkKvbdrafMkfkZ -EObkKvbdiCObdwRR -EPCjjvbddBsMrAUN -DoDKjvbdWIXvXgYz -DoDKjvbdkClKpftg -EOcKjvbdkCkjpftg -EOcLKvbdVrOYBeLc -EObkKvbdmoyxukZC -EPCjjvbddZyQXyRC -DoCkKvbdhbPCdvqR -DoCkKvbdJvUeceGi -EOcLKvbdVqnXaeMD -DoCkKvbdWWhxVceH -EPDKjvbdiGjDZVjV -EObjjvbdGAnpxizm -DoCjjvbdiZuFlQnG -EOcKjvbdTqRPVVIN -EPCjjvbdqdEhomvB -DoCkKvbdLAkHMaxR -EPDLKvbdOEdThiKd -DnbkKvbdkxrrTZGt -EOcLKvbdEPDLLXCd -DoDLKvbdTIzKRAAl -EPDLKvbdSCDeLiZL -EPCkKvbdpyOgfpdY -EPCjjvbdtkwwBTaX -EPDKjvbdiBoCeWqR -DoCjjvbdhgJbxujV -DoDLKvbdqdEhpNvB -EOcKjvbdkCkjqGuH -EPCjjvbdhbObeXQq -EOcKjvbdxsOImRbH -DoCjjvbdKWVFceHJ -DoDKjvbdBiKbKiGK -EPDKjvbdnGeXmNgZ -EPDKjvbdiifHjNYS -EOcKjvbdauBgXjsh -DnbkKvbdUtMsfLvK -DncKjvbdNrtVgEuQ -EPDLKvbdUsmUGLvK -EOcLKvbdNGcQMpVL -EPCkKvbdqmZjZLhJ -EObkKvbdFfKSOJUR -DncKjvbdhaoCeXRR -DoCkKvbdmfdwlnGy -EPCjjvbdjbkjqGuH -DoDKjvbdlqyVZsEJ -DnbjjvbdWWiYVcdg -EOcKjvbdeATqMwjG -EOcKjvbdqUTgSSKt -DncKjvbdqwQMDJZR -EPCkKvbdsQVoJbuf -DoCjjvbdVTmUFlVj -DoDKjvbdmajWxPOV -EOcKjvbdUQpoUthN -DoDKjvbdwMvAMdEm -EPDLKvbdDnbkLXDE -DncLKvbdFfKSNiTq -DncKjvbdIryBSlwl -DoDKjvbdmgEwlmfy -DncKjvbdqwPkbhyR -DncLKvbdNeETiJKd -EObjjvbdDoCjkXCd -EObkKvbdjgflFfNk -DncLKvbdxsNhlrCH -DoCjjvbdeFOrCWbj -EObjjvbdkNBkzFHP -DoCjjvbdxrmiNSCH -EOcLKvbdVwJXvDeH -EPCkKvbdZRMdhmEq -EObjjvbdjSzhsKiz -DoCkKvbdqdEiQOVa -EOcLKvbdpaJFAWhE -EPDLKvbdRkYfVGjs -DncKjvbdMpXqWNgT -EOcLKvbdVYhUZkPO -DoCjjvbdUxhTyjnn -DoCkKvbdOYOuzcmt -DoDKjvbdZLqdUNlN -DoDLKvbdJSyBTMxM -DoDLKvbdYORAXtut -DncKjvbdHffzYxXg -DncLKvbdmpZyVjyC -EOcKjvbdmfeXlnGy -DoDLKvbdkHfkeenL -DoDLKvbdJTZBSmYM -EObkKvbdrMzKZMHi -DncLKvbdiLeDmuCy -DoDKjvbdjvXNcbYX -DnbkKvbdrJAJeMne -DoDLKvbdvlvAMdFN -EPCjjvbdZLrDsmlN -DnbjjvbdaaVdfPpX -EObkKvbdrbFlkfjy -DoDKjvbdGLErbhNV -DoCjjvbdCIkCKhfK -DnbjjvbdeEoSBwDK -DncLKvbdirziSjiz -EPDKjvbdwzIGGYEr -DncKjvbdbVCGwkTh -EObkKvbdakMFnmcA -DnbkKvbdRpUHKFdX -DoDLKvbdMSWlytpz -DncLKvbdpssgRrKt -EPCjjvbdZRMeImEq -DoCjjvbdqrVKmjaN -EObjjvbdjAQGaPfj -DoDLKvbdyqOmJJwA -DnbjjvbdQccApRES -DoDLKvbdIsYaSmXl -EPCjjvbdrovPKDWG -EPDLKvbdqdEhpOVa -DoCkKvbdVviYVdEg -DoCjjvbdqZPIGqEY -EPCkKvbdOTTvGeVQ -DoCkKvbdDncLLXCd -EObkKvbdvBEYsOeI -DoCjjvbdYORAYVVt -EOcLKvbdhgKCxuiu -DoDKjvbdddoRbWcK -EObkKvbdmoyyWKyC -EOcLKvbdyYJJbQZk -DnbjjvbdUyIUZkPO -DncKjvbdFyUuBDxC -DoCjjvbdnQZyVjyC -DoDLKvbdatbHYKsh -DoCjjvbdczYowxpb -DncLKvbdIsZAsMxM -EPDKjvbdGKeTChMu -DoCkKvbdptTgSRjt -EPDKjvbdMtrqjmAX -DncLKvbdKQzEoFme -EObjjvbdFxtuAcxC -DncKjvbdkDLkRHVH -EPCkKvbdunszqKnt -DoCkKvbdezuxeJTw -EObkKvbdzjVQQDsU -EPDLKvbdjKGIKMxS -DoCjjvbdcyyQXxqC -EObkKvbdhtydwRtb -DnbjjvbdfNGXHNKL -DoDKjvbdmoyxujxb -DncLKvbdmuVZkJqf -EObkKvbdZyDjNbkr -DnbkKvbdyXhiaozL -EObkKvbdKWUfDeHJ -DoCkKvbddoFTLUUS -DnbjjvbdJvUfEFHJ -EObjjvbdsrqrxzFD -EObjjvbdmgFYMmfy -DnbjjvbdbrcLTcjB -EPDKjvbdZtIiZETO -DncKjvbdSLZGVHLT -EObjjvbdhtzFXSVC -EOcKjvbdvAcxsPEh -EOcKjvbdbrbjsdKB -DoDKjvbdezuxdiTw -DoDKjvbdhkdcnVDZ -DoCkKvbdNddUJIkE -DnbjjvbdsCGMlGjy -EOcKjvbdssSSxydc -DoCjjvbdSPtHJfDw -DoDLKvbdmRyVZrdJ -EOcLKvbdBdQBVjNG -EPCjjvbdtvOXipsA -EOcLKvbdDwwlUUUM -EObkKvbdhkeENuDZ -EOcKjvbdwygfGYEr -DncKjvbdbsCkUEJa -DnbkKvbdvlvAMceN -EPDKjvbdTvMPitAq -EPDLKvbdMowpvOHT -EOcKjvbdNQXpvNgT -DncKjvbdYzcFqiuy -EObjjvbdqUUGrRjt -EOcKjvbdUaBqTRSZ -DnbjjvbdrafMkfjy -DncLKvbdmgFXmNfy -DncKjvbdNrtVfdtp -EOcKjvbdVZITyjoO -EPDKjvbdTukpJtBR -DoDLKvbdyOTHxTIc -DnbjjvbdsBfNLfkZ -EPCjjvbdmJDtRVSB -EObjjvbdmJDtRUrB -DnbjjvbdiVZeWrVC -DncKjvbdBiKajhfK -DnbkKvbdziuQPcsU -EOcKjvbdGFiqnJTq -DoCjjvbdAMhZTXZx -DncLKvbdDjHiuwjA -DnbkKvbdBdQBVjNG -EPCjjvbdqlzKYkgi -DncLKvbdLLBIWAJy -DncLKvbdbhljKfXY -DncKjvbdaogHELzd -DnbkKvbdjEkGtoAO -DnbjjvbdGdKvJbKK -EPDLKvbdqrUjnKaN -EObjjvbdnVUykKSG -EPDKjvbdVrNwbFMD -DoDKjvbdvlvAMdEm -EPCjjvbdaaWEeopX -EPDLKvbdULuoBVoJ -EPDLKvbdzjUpPcsU -EPDKjvbdZnnJEdyj -EPDKjvbdtlXwAsaX -EPCjjvbdjJfHimXr -EPCkKvbdxwiKBpZk -DoCkKvbdLiBlQxAS -EObkKvbdXFxytAOs -EObjjvbdnQZxukYb -DncKjvbdZxcjNcMS -DnbkKvbdQcbaQQcr -EObkKvbdVgxVwgYz -DoDLKvbddoEsLUUS -EOcKjvbdTppnttgm -DoDKjvbdBhkBjhej -EPCkKvbdlhcsqVRa -DoDKjvbdZshiYcsO -DoDKjvbdtcDUvvPP -DnbkKvbdRkZFuGjs -DoCkKvbdaaVeFopX -EObkKvbdYORAXtut -DncLKvbdqwPlDJYq -DoDLKvbdbBWEepPw -DnbkKvbdVvhxWDdg -EObkKvbdfHkVqmpg -DncKjvbdaMjartmH -EPCkKvbdBhjbLIej -DoCjjvbdCIjbKiFj -DoDKjvbdkIHLefOL -EOcKjvbdrbGMlGkZ -DncLKvbdPxmAGsRj -EOcKjvbdZxdKODMS -DncKjvbdkDLjqHUg -EOcLKvbdjEkHUoAO -DoDLKvbdrovOjDVf -DncLKvbdZshiZESn -DncKjvbdUyIUZjnn -EPDLKvbdxmrhYSiD -DoCjjvbdaNKasUlg -DnbkKvbdYqMeJMdq -DncKjvbdZoOIeEyj -EOcKjvbdemGXGlik -EObjjvbdyzdnRhIh -DncKjvbdHEKvJbJj -EObkKvbdSCDdlIxk -EPCjjvbdGAoQxizm -DoCjjvbdaNKasVMg -EObkKvbdePErkTtS -EPCjjvbdlhdUQuSB -EPDKjvbdNQXpvOGs -DoCkKvbdXnRAYUut -EObkKvbdcTCkUEKB -DncLKvbdmRyUzSdJ -EPDLKvbdrSVLNkAm -DoCkKvbdJvUecdgJ -DoDLKvbdRDbaQRDr -EPDKjvbdYlSETmlN -EPCkKvbdbUagYKtI -EPCjjvbdssRrxzFD -EPCjjvbdRMwbYmtz -DnbjjvbdxrmhmRag -DoDKjvbdTvLpJtAq -EPDKjvbdVBBprprZ -DnbkKvbdRkYeuGkT -EOcKjvbdmbKWwoOV -EOcKjvbdZeYGzghb -EPCjjvbdFeirOJUR -DoCkKvbdZsiIxcrn -EPDKjvbdDnbkKvcE -DoDLKvbdsrrTZZeD -DncKjvbdJbjCpicY -DnbjjvbdcyxpXxpb -EPCjjvbdrXQLbhxq -DncKjvbdzROmJJwA -DoDKjvbdqdFIpNvB -EPDKjvbdkHfkfGNk -DoDKjvbdFjdsDINV -DoDKjvbdUyITyjoO -EOcLKvbdiUzEwRtb -EPCkKvbdmfeYMmgZ -DncLKvbdHgGyyXxH -EObkKvbdMuTSLNAX -DncKjvbdtbcUwWOo -DoCjjvbdVwIxWEFH -EOcKjvbdhgJcZWKV -DoCjjvbdsCFllHLZ -EPDKjvbdGcjvJbKK -EOcLKvbdnGeYNNfy -DncKjvbdZnnIeFZj -DoDKjvbdxUldqZLn -EOcKjvbdrovOibvG -DoDKjvbdUWLpKTaR -DncKjvbdePFTKtTr -EPDLKvbdFxtuAdYC -DoDLKvbdfIKvRnQg -EPDLKvbdypnmIjXA -DncKjvbdbUagYLUI -EPDKjvbdnVUyjiqf -EObkKvbdKWVGDeGi -EObkKvbdaNKbSuMg -DoDKjvbdNVSqkNAX -EObkKvbdhbPDFWqR -DoDLKvbdLGFhBaRV -EOcKjvbdbrcLUDjB -EObjjvbdZHXEAPTJ -EPCjjvbdCSaDTevr -DncLKvbdgQBzvcxI -EObjjvbdidjfuPAO -DoDLKvbdzjUoodTU -DncKjvbdGLEsChNV -EPCjjvbdNeDshiLE -EObjjvbdGGKRnIsq -EObkKvbdeYZtTqez -EOcKjvbdQwODblHc -DoCkKvbdkClLRHVH -EPCkKvbdxUldqYkn -EPCkKvbdvBDxsPFI -DnbkKvbdqvpLcIyR -DncKjvbdqmZixkhJ -DoDLKvbdkVwNdCYX -EObkKvbdUxgsykPO -EPCkKvbdjcLjpgUg -DnbjjvbdbUagYKtI -EObjjvbdDjHjWXjA -EObjjvbdrykpSaIO -EObjjvbdrbGMlGjy -DncLKvbdVYhUZjnn -DoDLKvbdjlakydfo -DnbkKvbdVTmUGMVj -EObjjvbdZjTIQHCG -EOcLKvbdZxcjNcLr -DoCkKvbdqTsgSRjt -DnbjjvbdCIkBkJFj -EPCkKvbdaogHELzd -EPCjjvbdNPxQunGs -EObjjvbdxZhFfXeS -DoDKjvbdjblKqHUg -EObkKvbdNPxRWNgT -DoDKjvbdkaNOmALA -EPDLKvbdxsOImSCH -EOcLKvbdZshhyETO -EPDLKvbdIHHZyYYH -DoDKjvbdliEURVRa -EObjjvbdiVZeXRtb -EOcKjvbdiHJcYvJu -EOcKjvbdIsYaTNXl -DoCkKvbdtlXvaTaX -EOcKjvbdNQYRVnHT -DoDKjvbddjJqvUzn -DoDKjvbdULuoBVoJ -DoDLKvbdUslselVj -EPCkKvbddePSCWbj -EPDKjvbdNeDtIiKd -EOcKjvbdiUzFXSUb -DoCkKvbdmRyVZsEJ -EPCjjvbduLwwAtBX -EPDLKvbdxZgfGXdr -DnbkKvbdBcpAujNG -DnbjjvbdZtJIyDrn -EObjjvbdmbJvwnmu -EPCjjvbdXnRAYVWU -EOcLKvbdyOShXsJD -DoCjjvbdptUGqqkU -DnbkKvbdFpASwHGZ -DnbkKvbdwtleRYlO -EPCkKvbdnHFYMmfy -EPDKjvbdKCjDQjDY -EObkKvbdeqaWzlDP -DoCkKvbdbLMGPODA -DoCjjvbdpyPIGqDx -EOcKjvbdbhmKLFwY -DoDLKvbdEOcKjwCd -EPCkKvbdePFTKtUS -EPCkKvbdtvNwipsA -EPCkKvbdzoQQdblY -EOcLKvbdKjaHvAJy -EPDKjvbdvPTzpkOt -EPDKjvbdMJCLpxAS -EObkKvbdWWhwvEEg -DnbkKvbdcJNJjevx -DoCkKvbdNQXpunGs -EPDKjvbdWSNxBdlD -EPDKjvbdwyhFeweS -DncKjvbdddnrCWcK -EObjjvbdeKJrVtzn -EObjjvbdrykosBIO -EPDKjvbdiiehKMxS -DncKjvbdrWpMCiZR -DoCjjvbddoFSjssr -DoCjjvbdbhmKKfWx -EObjjvbdmajWwoNu -EOcLKvbdDxYLstUM -EPCjjvbdddoRawDK -DncKjvbdmuUzKjSG -DoDKjvbdLFegbBRV -EPCkKvbdySnJMqbH -DnbjjvbdLLAgvAKZ -EPCjjvbdraemMHLZ -EObjjvbdnUtzLKSG -EPDKjvbdkDMLQgVH -DoDKjvbdkHgMGGOL -DoCjjvbdxsNiNSCH -EObkKvbdNQXpvOHT -EObkKvbdQwNdDLgc -DnbjjvbdegkWRnRH -DnbkKvbdGZUuAcwb -DncLKvbdiMEcmuCy -DoDLKvbdFfJqnJTq -DoDKjvbdZnnJFEzK -EOcLKvbdTqRPUtgm -EOcLKvbdRjyFuHLT -EOcKjvbdhtzEwRtb -EObjjvbdTXjkmzjx -DoDKjvbdqdFJQOVa -DoCkKvbdGckViajK -DncLKvbdDxXlUTsl -EOcLKvbdeUAUASlv -DnbkKvbdzjUpQETU -DnbkKvbdtcCuWuoP -DncLKvbdauBgXkUI -DoCjjvbdUVlPitBR -DnbkKvbdFfJrOItR -DoDLKvbdxnSgwsJD -EPCkKvbdXsMBNToY -DncLKvbdCTAcUFwS -DoDKjvbdhgJbxvJu -DoDLKvbdhkeDnUby -EObkKvbdEvZPpNKF -EPCjjvbdiHJcZWJu -EObjjvbdIHHZyYXg -DoCkKvbdegkVqmqH -DoCjjvbdxVNFRZMO -DoDLKvbdUQpntuIN -DoDKjvbdEJhJuwjA -DoDKjvbdkHflGGNk -DnbkKvbdmttykKRf -DncLKvbdZxdJmblS -DnbjjvbdZQmEhmEq -DoCjjvbdJcJcQjDY -DoDKjvbdBhkCLIej -DoDLKvbdmIcspuRa -DnbjjvbdqiAKElne -DoCjjvbdJpzEoFnF -EOcKjvbdyOShYTJD -DoCkKvbdmuVZjiqf -DoDLKvbdSCDeLhyL -EOcKjvbdJvUedFGi -EObkKvbdehLWRnRH -EPDKjvbdxmrhXriD -DoDLKvbdOTUWGeVQ -EPCjjvbdzRPMhiwA -EPDKjvbdKRZePGOF -DoCkKvbdrDeIomvB -EPDKjvbdkVvmdBww -DoDKjvbdIGfzYwwg -EPDLKvbdFVyPpNKF -DoDKjvbdhytfLqNf -DnbjjvbdMfbomQUk -EOcLKvbdtcDVXWOo -DoDKjvbdqwPlDJYq -EOcLKvbdZshiZETO -EOcLKvbdeEnrCXCj -EOcKjvbdZLrDsnLm -EPCjjvbdLYqKSzuG -DncLKvbdMtsRjmAX -DoCjjvbdJTZArlxM -EPCkKvbdlZSrTZGt -DncKjvbdRyjITCvA -DoCjjvbdEuxpPmKF -DnbkKvbdTYKkmzjx -DoDLKvbduDDVXWPP -DncLKvbdjAPfaPgK -DncLKvbdrEFJPnVa -EPCjjvbdrXQMChyR -DnbkKvbdznpQeDLx -DoCkKvbdjgflFfOL -EObjjvbdjlalZdgP -DoCjjvbdtbcUvvOo -DoCkKvbdrEFIonWB -EObjjvbdwXMAvAuu -DncLKvbdePFSkUTr -EPCkKvbdTppoUuIN -EPDKjvbdIxUCHlQp -DnbkKvbdBiLBjiGK -DoDKjvbdliDspuRa -EObjjvbdFkFTDIMu -EPCjjvbdsQVnjDVf -EPCjjvbdKefIBaRV -DoDKjvbdIryAsNYM -DoCkKvbdsrqrxzEc -EPCjjvbdLqwNZuQz -EOcLKvbdcIlikGXY -DoCjjvbdADSXizIp -DoCkKvbduaEZTOeI -DncKjvbdvBDyTPEh -EPCkKvbdRkZFuHKs -DoDLKvbdSLZFuGkT -EOcLKvbdfekzOHHA -EOcLKvbdkaMoNALA -DncLKvbdkNCMZeGo -EObjjvbdNsUVfduQ -EPCjjvbdZoNiEeZj -DoDLKvbdLYpirzuG -EPDKjvbdmoyxujyC -DoCkKvbdaMjbSuNH -EPDLKvbdxxIjCPzL -DnbkKvbdVAaqSprZ -DoCjjvbduVmxJqTA -DoCkKvbdRkZGVHLT -DoDKjvbdEuyQPljF -DnbkKvbdptUHSRkU -DncLKvbduLxWaUAw -EObjjvbdaaVdfQQX -EPDLKvbdWWiYVdFH -EOcLKvbdfelZmgHA -DoCjjvbdADRxKZiQ -EOcKjvbdfHkWSORH -EObkKvbdTAEiIBoE -DncKjvbdEKIKVxKA -DoCkKvbdkDMKpgVH -DnbkKvbdCWzciEpW -EObjjvbdxZgefXeS -EOcLKvbdsZkpTBIO -DoDLKvbdrJAKFMne -EPDKjvbdkWXNdBww -DnbkKvbdRbEFLhyL -DncLKvbdWXJYWDeH -EOcLKvbdijFgjMwr -DoDLKvbdnHExMnGy -EObkKvbdZeYGzhJC -DnbjjvbdEvZPpMie -EObjjvbdYpldiMdq -DoCjjvbdfRaWzlCo -EPCjjvbdGYtuBDxC -EOcLKvbdQYmAGrrK -EPCkKvbdlhcspuSB -DoDLKvbdezvZFIsw -EOcKjvbdlYsSTZHU -DnbkKvbdmfeXmOGy -DncLKvbdKDKDQicY -DncKjvbdZjTIQHCG -DnbkKvbdgFkzOHHA -DnbkKvbdaNLBsVNH -DoCjjvbdBsBCtGWr -DncKjvbdqdFIomvB -DnbkKvbdkNBlZdfo -DnbkKvbdSQTgKGDw -DoCkKvbddoFTLTsr -DoDKjvbdEYYLtTtM -EOcKjvbdVwJYWEEg -DoDLKvbdyOSgwrhc -DoCkKvbdZMRdUOLm -DoDLKvbdYSlBMtOx -EPCkKvbdkxsRsYft -DnbkKvbdrzLpTAgn -DncKjvbdRjxfUgKs -DnbkKvbdqquLNkAm -DoDLKvbdRMxCYnUz -EPCjjvbdZoOIdeZj -EObkKvbdrpWOicVf -EPDLKvbdkCkjqHVH -EOcKjvbdmSZUzSci -EObjjvbdRjxfUgLT -EObjjvbdNddThhjd -DoCjjvbdKVuFcdfi -EPDKjvbdzjVPodTU -DncKjvbdJTYaSmXl -DncKjvbddZyQXyQb -EPCjjvbdCIkCKiFj -EPDKjvbdTkunaWOi -EObjjvbdfIKuqnRH -DoCjjvbdZRMdiMeR -DnbjjvbdMpXpunHT -DoDLKvbdZRNEhmFR -EObjjvbdaoffdLzd -DoDLKvbdvAdYsOdh -DnbjjvbdSLZGUgLT -DoCjjvbdSCDdkiZL -DoDLKvbdelewHNKL -DoCjjvbdRXNdDMHc -EObjjvbdkWWnDaww -EObjjvbdcyxoxZRC -DncKjvbdelfWfljL -EObjjvbdZnnJEdzK -EOcKjvbdkHflGFnL -DoCkKvbdhbPCdwRR -EPDLKvbdHDkWKCKK -DnbkKvbdRadEkiYk -EOcLKvbdFWYopNJe -DoDLKvbdqTsfrSKt -EObjjvbdxnSgxTJD -EPDLKvbdxZhFewdr -EPCkKvbdTvLojTaR -EObjjvbdfIKuqnQg -EPCjjvbdDxXlTssl -EObjjvbdQvmccLhD -EObkKvbdRNXayOUz -EPCjjvbdatbGxLTh -EOcKjvbdOSsvGeVQ -EPDKjvbdePFTKstS -DnbjjvbdlYsRsZHU -DnbjjvbdZisIQGaf -DoCkKvbdsrqsYzEc -EObjjvbdfILVqnRH -DnbkKvbdZHWdAPTJ -DoDLKvbdEPCkLXCd -EObjjvbdEXwktTsl -DncLKvbdFVyQPlie -DncKjvbdNsUWHEtp -EOcKjvbdyqOmJKXA -EOcKjvbdADSYJyhp -EPDKjvbdUyIUZjoO -EOcKjvbdmJEURVSB -DnbjjvbdIwtBgkpp -EPCjjvbdZQmEhldq -EPCkKvbdDjHiuxKA -DoDKjvbdrEEiQOVa -DncKjvbdKDKDQjCx -DncKjvbdZRNFJMeR -DncLKvbdwygeeweS -DncLKvbdnUuZkKSG -DoDKjvbdvwMAvBWV -DoCjjvbdBhkCLIfK -DnbjjvbdoznDkXoA -EOcKjvbdjgflFemk -EObkKvbdKVtfDdgJ -DnbjjvbdXrkaNUPY -DncKjvbdhlEdNtby -EPDKjvbdemGWfmJk -DoDLKvbdlhctQtrB -EObjjvbdnVVZkJqf -EObjjvbdwuNEpyMO -DoCjjvbdTpqOuVHm -EObjjvbdbLLennDA -DoDLKvbdiGjDZWKV -EPDLKvbdFjeTDHlu -DoDLKvbdDxYLstUM -EPDLKvbdiUzFXSVC -DncKjvbdJYTbHkpp -DoCkKvbdZshhxdSn -EPDKjvbdxrnIlqag -EOcLKvbdiHJcYvJu -DnbjjvbdkVwNcaxX -EObjjvbdpyPIGpcx -EPCkKvbdauCGxLUI -EObkKvbdWRnXadkc -DnbkKvbdVUNUGLvK -EObkKvbdDxYLsssl -DnbkKvbdCJKbKhfK -DncLKvbdbhmKKfXY -EOcLKvbdZoOIeFZj -DoDLKvbdkNCLzFHP -EObkKvbdpxnggQdY -EObkKvbdYqNFJNEq -EPCjjvbdyzdnSHhh -EOcKjvbdczZQYZQb -DncKjvbdZyDimblS -DncLKvbdyOTIXrhc -EObjjvbdhzUelQnG -EObjjvbdFjeTChNV -DoCjjvbdwMvANEEm -DoDLKvbdRXOEDMID -DncKjvbdiHJcYvJu -EOcLKvbdhtzFWrVC -DncKjvbdVYgsykPO -DoCjjvbdGGKRmiUR -EPDLKvbdQmXbYnUz -DnbkKvbdkIGlFemk -DoCjjvbdSPsgJfDw -DncKjvbdzjVQPcrt -EPDKjvbdmfdxNNfy -EPDKjvbdZyDimblS -DoDKjvbdANIZSvzY -DoCkKvbdJqZdoGOF -EOcKjvbdcJMijewY -DncLKvbdNQXqWNfs -DncLKvbdkNBlZeGo -DoCjjvbdHffzZYXg -DoDKjvbdjhHMGGOL -DnbkKvbdiCObdvpq -DoDLKvbdYlRctNkm -EObkKvbdiUzEwRuC -DncLKvbdMfbomPuL -EPCkKvbdlZSrSyGt -DncLKvbdvAcxroFI -DoCjjvbdNGcQNQUk -DncKjvbdWSNxBeLc -EPCkKvbdqvokcIyR -DncLKvbddZyQXxqC -DoCkKvbdvPTzqLPU -DncLKvbdZxcjNblS -EPCjjvbdkMbLzFHP -EPCkKvbdlYrqsYgU -DnbjjvbdWSOXbFMD -DnbkKvbdWeyZtAPT -EPCkKvbdEKHivYKA -DoCkKvbdkNBkyeGo -DoDLKvbdiBoDEvqR -DoDLKvbdRkYfVGjs -EOcKjvbddneSkUTr -EObjjvbdFejRnItR -DncLKvbdLAjgMbXq -DnbkKvbdUGznLwVe -DoDKjvbdLqwNZtpz -EPDKjvbdUxhTyjnn -EPDLKvbdkNBkyeHP -DoCjjvbdgFkzNgHA -EObjjvbdunszpjnt -EPCkKvbdtAHQhABS -DnbjjvbdbKkfOnDA -DoCjjvbdVviYWEFH -DoCjjvbdGZUuAdXb -EObjjvbdhlFDmuCy -DncLKvbdyfyMAMdw -EObjjvbdFyUtaDxC -DnbkKvbdeEoSCXDK -EOcKjvbdbVCGwjtI -EOcLKvbdTAEhgand -EObkKvbdRpUHJecw -DnbjjvbdZsiJZDrn -DncLKvbdtSqrxyeD -DoDKjvbdJSxaSmYM -EPCkKvbdjuvnECYX -DoDLKvbdrMyjYkgi -DnbkKvbdjJegjNXr -DoDLKvbduaDxsOdh -DoDLKvbdmIcsptrB -EObkKvbdFkFTDHmV -DnbjjvbdYORAYVVt -DncLKvbdddoRbWcK -EPDLKvbdLrWmZuQz -DoDLKvbdliETpuRa -DoCjjvbdbrcKsdKB -DoCkKvbdHkazmvpk -EPCjjvbdUaBpsRRy -EObkKvbdKfFhBaQu -DoCkKvbdKQydnfNe -EOcLKvbdDjIKVxKA -DncKjvbdpeceUWBI -DncLKvbdKaLHNBxR -EPDLKvbdptTfrRkU -EPDKjvbddndsLTtS -EObjjvbdMpXpvOHT -DnbkKvbdaMjaruNH -DoCkKvbdpecdtVaI -DncLKvbdRpTfjGEX -EObkKvbdCSaCsevr -DoCkKvbdnHEwmNgZ -EObjjvbdfHjuqmqH -DoDKjvbdKWVGDeGi -DoDLKvbdWHxVxHYz -DnbjjvbdXsLaMsnx -EPDLKvbdDjHiuwjA -DnbjjvbdaaWFGQQX -DnbjjvbdsrrTZZdc -DoCjjvbddneTKtUS -DoDKjvbdcJMjLFvx -DoDKjvbdaNKbTUlg -DnbjjvbdkHflFfOL -EObjjvbdJpzFOeme -DoCjjvbdrounibuf -DoCjjvbdHgHZxwxH -EOcLKvbdSKxeuGkT -EOcLKvbdzQoNJJwA -EObjjvbdZnnJEdzK -DoDLKvbdJuuFcdfi -DncKjvbdIryBSmYM -EObkKvbdyYJJaozL -EObjjvbdFkEsDHmV -DnbkKvbdfMfXHMjL -DnbkKvbdLGGIBaRV -EOcLKvbdRXNdDMHc -DoDKjvbdegjvRnRH -DnbkKvbdKeegaaQu -DnbjjvbdkMakzEgP -DoDKjvbdcTDKtEKB -DncLKvbdhaoDEvqR -DncLKvbdmgEwmNfy -EPDKjvbdCIjbLIfK -DncLKvbdJvUedEgJ -DoCjjvbdFVxpPljF -EOcLKvbdJYUCIMRQ -EPDKjvbddwyssrFz -DoDKjvbdiMEdOUcZ -DoDKjvbdZQleIldq -EPCkKvbdnQZyVkYb -DoCjjvbdNGbpNPuL -DoCkKvbdOStVgFVQ -EOcKjvbdGBPQxizm -DnbjjvbdOXoVzcnU -DncKjvbdyqPNIiwA -DoDLKvbdkIGlGGNk -EPDKjvbdbiNKLFvx -DoCkKvbdCTBCsfWr -DoDKjvbdShyjRABM -EPCjjvbdxwhjBozL -DoCkKvbdqUUHSSLU -DoDKjvbdbBVdfPow -DoCkKvbdqYnggRDx -DoCkKvbdtkwwAsaX -EPDLKvbdZMSDsnMN -EPDLKvbdZjTIQGbG -EPCjjvbdzoPpdblY -EPDKjvbdVviYWEFH -DnbjjvbdUsltGLuj -DoCkKvbdQdDAopcr -EPDKjvbdZxcjNbkr -EPCjjvbdZisHpGbG -EPDKjvbdEuxpPmKF -EOcKjvbdQwNccLgc -EPCjjvbdEYYLstUM -EObkKvbdZRNEhmEq -DoDKjvbdaRfDIUGL -DncKjvbduaDxsOeI -EObkKvbdmaiwYPOV -EOcKjvbdKDJbqJbx -DoDKjvbdQvnEDLgc -DnbkKvbdtlXvaTaX -EPDKjvbdzQoNIiwA -EOcLKvbdNeDsiIjd -DnbkKvbdBdQAvJlf -DoCkKvbdhzVGMROG -EPDLKvbdUaCQsRRy -EOcLKvbdZisHogCG -DoCkKvbdlqxtzTDi -DoCjjvbdRkZGUgKs -EObkKvbdZnmhdeZj -EOcLKvbdZjTHogBf -DncLKvbdhytfLqNf -EPCkKvbdnPyxvKxb -DncLKvbdjcMKqHVH -EPCkKvbduWNwjRTA -DnbkKvbdwygfGXeS -EObjjvbdTlWOaVoJ -EPCjjvbdUtNUGLvK -EObkKvbdKkAgvAKZ -EObkKvbdaMkCTUmH -EPDKjvbdOFDshhjd -EPDLKvbdhzUfLpmf -EPCkKvbdkySrTYgU -EOcLKvbdFfKSNhsq -DncKjvbdOAJTUKSA -EPDLKvbdrDeJPmvB -EPCkKvbdKRZdnfNe -EPCjjvbdRDcAoqDr -EOcKjvbdNHDQNPtk -EOcLKvbdVTmTfMVj -EOcKjvbdrXQMChyR -DoCjjvbdZQmFJNEq -EPCkKvbdWRmwadkc -EObkKvbdSCDeLhyL -DncKjvbdyNsHxTJD -EPDKjvbdtSrTYydc -DoDLKvbdiGjCxuiu -DoCkKvbdrNZjZLgi -EPDLKvbdJmADzGuB -DncLKvbdtcCuWuno -DnbjjvbdDxXktTtM -EPCjjvbddZyPxZQb -EPDLKvbdlqxtysDi -DoDLKvbdbAueGPpX -EObjjvbdVviXvDdg -EPDKjvbdBdQAvKMf -DnbkKvbdPxmAHSqj -DoDLKvbdUsltFlWK -DncKjvbdVhYWYHYz -DoDKjvbddwzTtSFz -DncLKvbdIGfzYwwg -EPCjjvbdmJDsqUrB -EPCkKvbdGQASwGey -EOcLKvbdTlWOaVoJ -DncLKvbdLFehCBRV -DnbjjvbdTkvOaVoJ -EPCkKvbdwXMAvBWV -EObjjvbdpxnhGqDx -EOcLKvbdsrqryZeD -DoDLKvbduVnXjQsA -DncLKvbdRotHKFdX -EOcKjvbdnUtyjirG -EOcKjvbdCJLCLJFj -EOcLKvbdSCEFLiYk -DoDLKvbdjcMLQgVH -DoCkKvbdLBLGlaxR -EObkKvbdZQldiNFR -EOcLKvbduMXwAsaX -DncKjvbdxrnIlrBg -EObkKvbdehKvRnRH -DoDLKvbdRosfiecw -DoCkKvbdFjdrcINV -EPCjjvbdkWWmdBxX -DnbjjvbdFkFTDHlu -DoCjjvbdTAEhgaoE -DoDKjvbdANIZTWyx -EObkKvbdJSyAsNYM -EPDLKvbdqTtHRqkU -EPDKjvbdbBVeFoow -EPCkKvbdYSkaMsoY -DncLKvbdDnbkKwDE -DncKjvbdMSWlzUpz -DncKjvbdauCHXjsh -DoCjjvbdTvMQKUBR -DoDLKvbdrRuLOLAm -EOcKjvbdatbGxKtI -DncLKvbdNGcQMotk -EPDKjvbdiCObeWqR -DoDKjvbduDDUwVno -DncLKvbdYlRcsmkm -DncKjvbdbAueFoow -EObkKvbdYTMBNToY -DncKjvbdvAdYsPEh -EObjjvbdBdQBWKMf -DnbkKvbduCbuWuno -EOcLKvbdKWVGEFHJ -EObkKvbdcyyQXxqC -DnbkKvbdaMjasUmH -EPCkKvbdmgEwlmfy -DoDLKvbdrDdiQOVa -DoDKjvbdUyIUZjnn -DnbkKvbdnBjXYOnV -EOcKjvbdRpTgJfDw -DncKjvbdjcLjqGuH -DnbkKvbdZjTIQHCG -EOcKjvbduVnYKRTA -DnbkKvbdGckWJbKK -EObjjvbdZyEJnDMS -DncKjvbdNsUWGduQ -EObjjvbdKQzEoFme -EOcKjvbdVUMtGLvK -EPDKjvbdrJAKFMoF -DoCkKvbdNrsvHFVQ -DncLKvbdSKyGUfjs -DoCkKvbdVvhxWEFH -DncLKvbdFejRnIsq -EObjjvbdVYhUZkOn -DoCjjvbdxUmEpxkn -DoDLKvbdBiLCKhej -DoDKjvbdIjEAJofd -EOcKjvbdwzHfFwdr -DncKjvbdFjeTDHlu -DnbjjvbdbiMjKewY -DnbjjvbdaNLCTUlg -EObjjvbdDwxMUUTl -DoCkKvbdmttykKSG -EPDKjvbdiUyeXSVC -EPDLKvbdWIYVwfxz -EPDLKvbdemFvgMik -DoCkKvbdUyHszKoO -EObkKvbdTXkMNzjx -DoDKjvbdSQTgKFdX -DnbjjvbdLiBkpxAS -EPCkKvbdRosgKGEX -DoCkKvbdmfdwmNgZ -DncLKvbdiHJbyViu -DncLKvbdxrnJMqbH -EOcKjvbdhlFENtcZ -DoCjjvbdbKkennDA -DnbkKvbdGckWKBjK -DnbjjvbdUyIUZkOn -EPDKjvbdeEnrCXDK -EOcKjvbdsBfMkgKy -DncKjvbdxsNiNSBg -EPDKjvbdkNCLzEgP -EPDKjvbdSKyGVGjs -DoDKjvbdrWolChyR -DncLKvbdWSNwaeLc -EOcKjvbdJYTbHkqQ -DnbjjvbdZshiZDsO -DoDKjvbdSKxfUfjs -EPCkKvbdptTgRrKt -EPCjjvbdREDApQdS -DncLKvbdtvOXjRTA -EPDKjvbdemGXGljL -EObjjvbdBdQAvJmG -EPDLKvbdhuZdwRuC -DncLKvbdjvWnDaxX -EPDLKvbdFVxopMie -EPCkKvbdajkeoNcA -EPCjjvbdSPsfifEX -DnbkKvbdBsAcTfWr -EPCjjvbdEOcLLWcE -DoCjjvbdZLrDsmlN -EPCkKvbdxnSgxTIc -EObjjvbdGQATXGey -EObkKvbdbsDLUEKB -DoCjjvbdrSVKmjaN -EPCkKvbddneTLUUS -DoCkKvbdxmrgwsJD -EPDKjvbdGYuVAdXb -DncLKvbdauBfxLTh -EPDLKvbdrMzKZLgi -EObkKvbdUsltGLvK -DnbjjvbdDxXlTstM -EObkKvbdsBfNLgLZ -DncKjvbdidjgUoAO -EPDLKvbdJJdAKQHE -EOcKjvbdbBWFFpQX -EPCjjvbdSZihTDWA -EPCkKvbdhgKCxuiu -DncKjvbddneTLUTr -DoDKjvbdczZPxZRC -DnbjjvbdlYrrTYft -DoDKjvbdWXJXvEEg -EPDLKvbdbhmJkFvx -EPCjjvbdDxYLtTsl -EPDKjvbdqdFIonVa -EObjjvbdCIjbLIej -DnbjjvbdmbKXXnmu -EPDKjvbdlZTSTYft -EPDKjvbdwXMBVaWV -DnbjjvbdSPtGjGEX -DoDKjvbdrMzKYlHi -EPCkKvbdiVZdwSVC -DnbjjvbdptUHSSKt -DncLKvbdcSbjscjB -DoDKjvbdSPsfiecw -EOcKjvbdegkVqnQg -EObkKvbdjuvmcbXw -DncKjvbdCJLCKhfK -EObjjvbdVqnYBeMD -DoCjjvbdKCjCqJcY -DncLKvbdZRMdhmEq -EOcKjvbdrRtkOKaN -DoDLKvbdRpTfiedX -DoCjjvbdRMwbZOUz -DoCjjvbdrXQMDIxq -EObjjvbdsrqsZZdc -DnbjjvbdfjfzbfAE -DoCkKvbdJSyBTMxM -EPDKjvbdnCJvwoNu -DoCjjvbdmbJvwoNu -DnbkKvbdFWZQPljF -DncLKvbdxnSgwriD -DnbjjvbdVvhwucdg -DoCjjvbdjgfkfFnL -DncLKvbdzRPMiKXA -EOcLKvbdqZPHgREY -EPCkKvbdrylPsAgn -EPCkKvbdVZITykPO -DoCjjvbdhkeEOVDZ -EOcKjvbdUVkpJtAq -EOcKjvbddCTMrAUN -EPDKjvbdZeXfzghb -EPCjjvbdiMFDmuDZ -EPCjjvbdJKEAJpHE -EOcLKvbdajkeoODA -DnbjjvbdZRNEhmFR -EOcLKvbdNHCpNQVL -EObjjvbdmRxtzSci -DoCjjvbdzRPMhjXA -DnbkKvbdnGdwmNfy -EObkKvbdvAcxsOeI -DoDLKvbdBsAcTevr -DoCkKvbdozmdKxPA -DnbkKvbdTlVoBVoJ -EPCkKvbdqwQLcIxq -DncLKvbdbiMjLGWx -DoDLKvbdfHkWRnRH -EOcKjvbdbVCGxKsh -DoCjjvbdTqRPUthN -DoCkKvbdbQGgELzd -EOcLKvbdQZNAHSrK -DoDLKvbdZyDjNbkr -EPCjjvbdqiAJdmOe -EObkKvbdKaLHNBxR -DncKjvbdyXhjBozL -EObjjvbdDjIKWYKA -EOcKjvbdLFegaaQu -EPDKjvbdZjTIPgCG -EOcLKvbdfHjuqnQg -DnbjjvbdlhcsqVRa -DoCjjvbdMuSqkNAX -DncLKvbdCIkBkIej -DncKjvbdUaCQsQqy -EObjjvbdRbDdkhyL -EOcKjvbdpssfrRkU -EOcKjvbdLGFhBaQu -EPCkKvbdqqtjnLBN -EOcLKvbdWRmwbEkc -EObjjvbdpedFTuaI -DoCkKvbdJJdAJofd -DoDLKvbdwNWANEEm -EPCkKvbdYgWdAOri -DoDLKvbdvAcyTOeI -DnbkKvbdbhmJjfWx -EOcLKvbdypnliKXA -EOcKjvbdZyEJnClS -DoCjjvbdZoNhdeZj -EPCkKvbdkDLkRGtg -EObjjvbdNsUWGdtp -DnbjjvbdZQldhmFR -EOcKjvbdYpmEhldq -EPCkKvbdZQmEiMeR -DnbjjvbdhytfLpnG -EObjjvbdmtuZkJrG -EObjjvbdGLEsDINV -EPCjjvbdVhXvYHYz -DoDLKvbdKefICAqV -DncKjvbdUtMsfLvK -EOcLKvbduaEZTOeI -EPDKjvbdddoSBwDK -DoCkKvbdffLymgHA -DnbkKvbdbAueGQQX -DnbkKvbdbrcLTcia -EPCjjvbdRbEElJYk -DoCkKvbdGFirNiTq -DoDKjvbdNdctIhkE -EPDLKvbdQccAoqES -DnbkKvbdFfKRnJUR -DnbjjvbdFfJrNiUR -EPDLKvbdCfkegAzc -EPCjjvbdRXNccMHc -DoCkKvbdZjShPgBf -EOcKjvbdSLZGUfkT -DoDLKvbdBcpAujMf -EOcLKvbduWNwiqTA -DoDLKvbdpyOgfqEY -EOcKjvbdcScKtEJa -EObjjvbdnCJwXoNu -DnbkKvbdjFLGtoAO -DoCjjvbdXrlBMsnx -EPDKjvbdhgJcZWJu -DoCjjvbdiBoDEvpq -EPDKjvbdczYoxYqC -DoDLKvbdjFLHVPAO -DnbjjvbdbPgGdLzd -DoDKjvbdWIYWYGxz -DncKjvbdhytfLpnG -EObjjvbdfHjuqnQg -DnbjjvbdmgExMmgZ -EOcLKvbdhgKDYuiu -EPDKjvbdmJEURVRa -DoDLKvbdJpyePGNe -DoDLKvbdlhdUQuRa -EObkKvbdmuUzLKSG -DnbjjvbdxwhjBozL -EPDLKvbdVZIUZjnn -EPDLKvbdJpydnfOF -EPCkKvbdqqtjmjaN -EPCkKvbdZoOJFFZj -DnbjjvbdmttzKjRf -EPDLKvbduWOXjQsA -EOcLKvbdwtleRYkn -DoCjjvbdLYpjSzuG -EObjjvbdIsYaSmYM -DnbjjvbdyzeORhJI -EOcLKvbdkWWnECXw -EPDKjvbdVviYVcdg -DoDKjvbdBcoaVjMf -DoCkKvbdiMEcmuDZ -EObjjvbdLKaHvAKZ -DncLKvbdJTZArlwl -EOcLKvbdhaoCeWpq -DncLKvbdrWpLcJZR -EObkKvbdHkaznWpk -DnbjjvbdzjVPocrt -EOcKjvbdyqPMhiwA -DoCkKvbdpstHRqkU -DnbkKvbdRkYfVHKs -DoDLKvbdVgwvYGxz -EOcKjvbdFfKSNiUR -DnbkKvbdqquLOLBN -DncKjvbdOAJTTjSA -DoDKjvbddneSkUTr -EObkKvbdlqyUysEJ -DoDKjvbdbhmKKevx -EOcLKvbdiCObdwQq -EPCkKvbdFejSNiTq -EObkKvbdwygfGYEr -EPDLKvbdsQWPKDVf -DncKjvbdjbkjpfuH -EPDKjvbdRkZFuGjs -EPDKjvbdwyhFfXdr -DncKjvbdcIlikFvx -DoCkKvbdiUydwSVC -DncKjvbdiUzFXSVC -EOcKjvbdjKFgimYS -EPDKjvbdjvXODaww -EPCkKvbdRbDdlJZL -EObkKvbdrEEhpNvB -EObjjvbdrpVoKDWG -DoCjjvbdNxPVzcnU -EPDKjvbdVgwvYHYz -DnbjjvbdmuUyjirG -EObjjvbdrSVLNkBN -DncKjvbdUWLojUBR -EOcLKvbdwygefXeS -EObkKvbdhaoDEvqR -EOcLKvbdGGKRmiUR -EOcKjvbdeEnqawDK -EPDLKvbdGGJqnItR -DoDLKvbddeOrBvbj -DnbkKvbdiVZeWquC -DncLKvbdJcJcQjDY -EPDLKvbdkDMLQgUg -EObjjvbdemFvflik -EObkKvbdwzHeewdr -DoCjjvbdHDjuiajK -DoCkKvbdrEEiPnVa -EOcLKvbdypnmJKXA -DoDLKvbdmgFXmOHZ -EObkKvbdUsmUFkuj -EPDLKvbdcScKtDjB -EPCkKvbdUyITzLOn -DncKjvbdZnnIddyj -EPCkKvbdaaVeGPow -DoCjjvbdSQTfifDw -DoDKjvbdDoDKkXCd -DncLKvbdhtzEwRuC -EObkKvbdMpXqVnGs -DoDKjvbdDncLLXCd -DoCkKvbdtcDUwVoP -DoDKjvbdtSqryZdc -EPDKjvbdbBWFGPpX -EPCjjvbdmRxtyrdJ -DoDLKvbdGckVjCJj -EObjjvbdzoPpeCkx -DnbjjvbdKWVFceHJ -EPCjjvbdSKyGVHLT -DoDLKvbdelevgNKL -DoCjjvbdTXjlNzkY -DoDLKvbdpstHSSLU -EPDKjvbdhgKCxuiu -EObkKvbdZQleJMeR -EPCjjvbdKVuGDdfi -DncKjvbdUGzmkvvF -DncKjvbdxrnJMqbH -EPCjjvbdKVuGDdgJ -EObjjvbdptTgRqjt -EObjjvbdCDpAujMf -EPDKjvbdczZQXyRC -DncLKvbdqYngfpdY -EOcLKvbdqBIeAXIE -EPDLKvbdZLrETmlN -EPDKjvbdNeEThhjd -EOcLKvbdmbKWxOnV -DoCkKvbdCDoaWKNG -EOcLKvbdEOcKkWbd -EPCkKvbdNQXpvOGs -EPDLKvbdFyUtaDxC -EPDKjvbdbLMGOnDA -DoDLKvbdJcJcQjDY -EPDLKvbdOTUWHFUp -DoCjjvbdmgFXlnGy -EOcLKvbdRDbaQRES -DoDLKvbdcyxowxpb -EPDLKvbdliEURVSB -EOcKjvbdXnRAXuWU -DoCkKvbdDnbjjwDE -DoCkKvbdKVuGEEfi -EObkKvbdyOTHxShc -EPDKjvbdySnIlqbH -DoDLKvbdHELWJbJj -DnbjjvbdyOTHxShc -DnbjjvbdczZQXxpb -EPDLKvbdZLrDsmkm -EPCjjvbdfNGWflik -EPDKjvbdmbKWwnmu -DncKjvbdrDdiPnWB -EObjjvbdHDjvKCKK -DnbkKvbdUVkojTaR -EObjjvbdptTfrSKt -EPDKjvbdFxttaEXb -DoCkKvbdjvXNcbYX -DoCkKvbdSLYfUgKs -EOcKjvbdHakzEzAD -DncLKvbdiCObdwQq -EPDLKvbdZLqdUNlN -DoDLKvbdhkeDnVCy -EPCkKvbdemFvgNKL -EObjjvbdliDtQuRa -EObkKvbdwuMdpxkn -EObkKvbdirzhrkJz -EPCjjvbdJYTahLqQ -DncLKvbdIHGyxwwg -EPCjjvbdSQUHKGEX -DoCjjvbdZshiYcsO -EOcLKvbdPyNAHSrK -EPCjjvbdbsCjscia -EObjjvbdUWLojUBR -DoDLKvbdKeehBaQu -EObjjvbdjuwODaww -DoDLKvbdtkxXAsaX -DncLKvbddneSkTtS -DnbjjvbdZtJIxcsO -DnbjjvbdJTYaTNXl -EPCjjvbdGKeTDHlu -DoDLKvbdKQydoGNe -DoDKjvbdVrOXaeLc -EPCkKvbdzHYlAMeX -DoDLKvbdBvzchdov -EObkKvbdapGgELzd -DoDKjvbdaMkBsUlg -DnbjjvbdVUNTelWK -EObjjvbdiHJcZWKV -DncLKvbdZoNheEyj -DncKjvbdDHMFgAzc -DnbkKvbdFpATXGey -EPDKjvbdMpXqWOHT -EPCjjvbdmSZVZrdJ -EPDKjvbdcIljKfXY -DoCkKvbdjcLkRGuH -DoDLKvbdGYuVBEXb -EObkKvbdWXIxWDeH -DncKjvbdQlxCZOUz -DnbjjvbdYNqAXtut -EPDLKvbdGdKvJbJj -DoDLKvbdGLFSbglu -EPCkKvbdRjxfVGkT -DoCkKvbduCbuXWOo -DoCjjvbduCbtvuno -EObkKvbdjAQGaQGj -DoDLKvbdqBJFAXHd -EOcKjvbdkClKpgVH -EOcLKvbdiMFDmtby -EPDLKvbdjvXNcbXw -EPCkKvbdxUmFRYkn -DoDKjvbdHgGyyYXg -DoCjjvbdRzJhScWA -DnbkKvbdlZTRsYgU -DnbkKvbdFVxpQNJe -EPCkKvbdZyEJmcMS -EObjjvbdZQldhmFR -EObjjvbdYSlBMtPY -DncLKvbdvBDxsOdh -DoDLKvbdvAdYrndh -DoCjjvbdZyEJmcLr -DnbkKvbdKaLGmCXq -DnbkKvbdZQmFImEq -EOcKjvbdqvolDIxq -DnbkKvbdVqnYBdkc -DoCkKvbdnPyxvLZC -EOcLKvbdmJEURUqa -DoDLKvbdfHkVrNpg -DoCjjvbdznopdblY -DoCkKvbdjvWmdCXw -EOcKjvbdunszpjnt -EObkKvbdzoPqFDMY -EObjjvbdDxXktTtM -EObjjvbdBcoaVjMf -DncKjvbdtcDVWuno -EObjjvbdpyOggQdY -DnbkKvbdwWkaWAuu -EPCjjvbdajkeoODA -EOcKjvbdKNAEZfta -EOcKjvbdZisIQHCG -DncLKvbdEXwksstM -DoDKjvbdtbbuXVoP -DncLKvbdDxYMTstM -DoCkKvbdcyyPwxpb -EPCkKvbdxmrgwsJD -DoDKjvbdYSkaNUOx -EOcLKvbdxwhjCPyk -DncKjvbdUsmTekuj -DnbkKvbdkVwOECXw -EObkKvbdnBjXYOnV -DncKjvbdcasNSATm -EPDKjvbdTAFIhCOd -DnbkKvbdkWWnECYX -DnbkKvbdFjeSbgmV -DoCjjvbdJzoewdAN -DnbkKvbdZeXfzhIb -DncKjvbdMJCLqYAS -DoCkKvbdGLFTCglu -DoDLKvbdMuSrLNAX -EOcKjvbdqceIomvB -DoDLKvbdegkVqnRH -DoDKjvbdKfGICBQu -EOcKjvbdEvYopNKF -DnbjjvbdlrZVZsEJ -DoDLKvbdqqtjmjaN -DncLKvbdQmXaxmtz -EPDKjvbdCDoaVjNG -EPCkKvbdqquLNjaN -DnbjjvbdKRZdoFnF -DoCkKvbdkVwOECYX -DncKjvbdGQATXGfZ -DncLKvbdCDpAujMf -EOcKjvbdDxXlUUTl -EPCjjvbdYkrEUNlN -DnbjjvbdZtJIyETO -DoCjjvbdXsMAltPY -EOcLKvbdxxIjCPzL -DoDLKvbdSLZFuHLT -DncKjvbdFVyQQMjF -DoCjjvbdFaOpyJzm -EPCjjvbdrJAJdmPF -EOcLKvbdMuSqjmAX -DncLKvbdEJgiuxKA -EPDKjvbdBdQAuimG -DnbjjvbdWXIxVdFH -DnbkKvbdHDkVjBjK -EPDKjvbdnHEwlmgZ -EPCkKvbdBiKbKhfK -EPDKjvbdhyuGLpnG -DoCkKvbdZsiJZDsO -DnbjjvbddBrlrAUN -DoCkKvbdYqMeIldq -DncLKvbdZLqdUNkm -EOcLKvbdMuSrKmAX -DoCkKvbdDxXksstM -EOcKjvbdqdEiPmua -DoCjjvbdOEdUJIjd -DoCkKvbdEObkLWbd -EObkKvbdfekynHHA -EPCkKvbdrEFIpNvB -DnbkKvbdnBjXXoOV -EPCjjvbdmgEwmOGy -DncKjvbdKCjDQjCx -EPDKjvbdJqZdoGOF -DncKjvbdUsmTfLuj -DoDLKvbdjcMKpgUg -EPDLKvbdSQUGjGDw -DnbjjvbdRacdlJYk -DncKjvbdYgXEAOsJ -EPCjjvbdhficZWKV -DoDKjvbdGAnpxizm -EPCkKvbdRbDeLhyL -DoDKjvbdiBncEwQq -DoCkKvbdxZgfFxFS -DoCjjvbdqvpMChyR -EObjjvbdbUbGxKtI -DoCkKvbdEObkKvcE -DnbjjvbdKQzEnfNe -DoCjjvbdRWnDblID -DnbkKvbdkxrqsYgU -DncLKvbdqwPlCiYq -EPDKjvbdSZjHsDWA -DncLKvbdEPCjjvbd -EOcLKvbdpyPIGpcx -DncLKvbdbVCGwkTh -DnbkKvbdnPzZWKxb -EObkKvbdGKeTDIMu -EOcKjvbdiifIKNYS -DncLKvbdnQZxvKxb -EPDLKvbdGFjSNiUR -DnbjjvbdRNXaxnUz -EPCjjvbdOTTvGduQ -EObkKvbdUtMselVj -DoCjjvbdnUuZkKSG -EPDKjvbdQmXaxnUz -EPCkKvbdNeDtIhjd -DncLKvbdNxOuzdOU -DncKjvbdJJdAJpGd -DoDKjvbdwuNEqYkn -DncKjvbdZMSDtOLm -DnbjjvbdNeDsiJLE -EPCjjvbdJpzEoGOF -EPCjjvbdkDLkRGtg -DoCjjvbdUWLpJtAq -EPDKjvbdfMfWfljL -EPCkKvbdrMzJyMIJ -DoCjjvbdJKEAJofd -DnbjjvbdnBiwXoNu -DoCjjvbdDihJvYKA -DnbkKvbdSZigsDWA -DoCjjvbdFejRmhsq -DnbkKvbdaMkCTVNH -EObkKvbdczZPxZRC -EPDKjvbdVZIUZjnn -DoDKjvbdkySrTZGt -DoDLKvbdsPvPKDVf -DoCkKvbdwWlBVaVu -EPDKjvbdANIZSvyx -EPCkKvbdnHFYNNgZ -DnbkKvbdNdcsiIkE -EPDLKvbdDoCkLWbd -EPDKjvbdQccBPqDr -EObkKvbdSPsfifEX -EOcKjvbdelfXHNJk -EObkKvbdFfKRmiUR -EOcLKvbdKCibqKDY -EPDLKvbdUWLpJsaR -EPCkKvbdKfFhCBQu -EOcKjvbdmuUzLJrG -EOcLKvbdBdQBVjMf -EOcKjvbdfpBzvcwh -EOcKjvbdmRyUzSci -EOcKjvbdFVxpPlie -DnbjjvbdDwwlUUUM -DncKjvbdUyHsyjoO -DoCkKvbdUslselVj -DncLKvbdmuUykJqf -DncLKvbdLFfHbApu -DncLKvbdhyuFlROG -EPDKjvbdxnTIYTJD -EPDKjvbdTulPjUAq -DoCjjvbdCDoaWJlf -DoCkKvbdbLMGOnDA -EPDKjvbdOStVfdtp -EPCkKvbdZRMeImFR -DoDLKvbdiVZeXRuC -EPDKjvbdRosfiedX -DoCjjvbdnGeYMnGy -DoCjjvbdiiehKNYS -DncKjvbdbhmKKfXY -EOcLKvbdnBjXXoNu -EPDKjvbduLwwAtAw -EOcLKvbdygYlAMeX -DoCkKvbdNsTvHEtp -EPCjjvbdsrrTYzFD -EPCkKvbdBdQAuimG -DncKjvbdmfeYMnHZ -EOcKjvbdxZhFexEr -DncLKvbdZshhyETO -EObkKvbdOFEUJJLE -DoDLKvbduDCtvuoP -EOcKjvbdGZVVBEYC -EObjjvbdZRMeJNEq -DnbkKvbdkxsRsYft -DnbkKvbdsBfNLfjy -EOcLKvbdNPxQvOHT -DnbjjvbdpstHRqkU -EOcLKvbdZQleJNFR -EPCjjvbdxVNEpxkn -DoCkKvbdwtmEqZLn -DoCkKvbdGAoQxizm -DoDLKvbdVqmwaeLc -DoDKjvbdKfGHaaQu -DoCjjvbdcJNKLGWx -EPDLKvbdrzMPsBHn -DncKjvbdfoazwDxI -EPDKjvbdZyEJnClS -DnbjjvbdwMvANDeN -EObjjvbdZshiZETO -EPDKjvbdUslselVj -DoDKjvbdwtmEpyLn -DncLKvbdJTYaTMxM -EPDKjvbdvBDxsOeI -DoDKjvbdxrmhmSCH -EPDLKvbdjJegjNYS -EOcKjvbdJvUedEgJ -DnbkKvbdVZITyjoO -DoDKjvbddePSCWbj -DncKjvbdWIXvXgYz -EPDKjvbdZQmFJMeR -DnbjjvbdqdEiPnWB -DoDLKvbdUVkojTaR -DoDLKvbdFVxpPmJe -EPCjjvbdxmsHwsIc -EPDLKvbdiiehJlxS -EPDLKvbdCTAbsewS -EPCjjvbdzoPpdbkx -DnbkKvbdijGHilxS -EPDLKvbdOYOuzdNt -EOcLKvbdTppoUuIN -DnbkKvbdcScLUDia -EOcLKvbdePFTLUTr -EOcLKvbdhgKCxvKV -EPCkKvbdrJAKFNOe -EOcKjvbdVwJXucdg -EPCkKvbdNddUJJKd -DncLKvbdJYUCHlQp -EObjjvbdkVvnDaxX -EPCjjvbdNeDsiJLE -EPDKjvbdyzeNqhJI -EPCjjvbdmIdTqUrB -EPDKjvbdZoOJFEyj -DoDKjvbduaDxsOeI -EPCkKvbdKjaIWAKZ -DncLKvbdKaLHMbYR -EOcKjvbdrafMlHKy -EPCjjvbdhtzEvqtb -EPCkKvbdddoSCXDK -EOcKjvbdzjUpPdTU -EPCjjvbdLZRJrzuG -EOcKjvbdaMjaruMg -DoCkKvbdyOSgwsJD -EPCjjvbdKDKCqJcY -EObkKvbdvAcxrneI -EObjjvbdwuMeQxkn -DncLKvbdmSZUysDi -DnbkKvbdcIlijfWx -DoDKjvbddndrjtTr -EOcKjvbdwtmEqYlO -EOcKjvbdYzcFqivZ -DnbkKvbdCDpBWJmG -EOcKjvbdaSGCgsfL -EObjjvbdIwtBhLqQ -DnbkKvbdyzdmrIIh -EPDLKvbdWexzUAOs -DncLKvbdRXNdCkgc -EOcKjvbdkVwNdBww -DncLKvbdIGfzYxYH -DoCkKvbdbAvFGPow -DoCkKvbdQlxBxnUz -DncKjvbdqrUkOKaN -EPDLKvbdZisIQGaf -DoDKjvbdsQWPJbvG -DncLKvbdjhHMFfNk -EObkKvbdwNWAMdFN -DoCkKvbdeKKRutzn -EObkKvbdJpyeOfNe -EOcKjvbdQmXayNtz -DncKjvbdnHExNNgZ -EPCjjvbdULuoBVni -DoCjjvbdqquLNjaN -EPDKjvbdyzdnSIJI -DnbkKvbdQvnDcLgc -DoCkKvbdtcDUvvOo -DnbjjvbdnGeXmNfy -DoDKjvbdxsNhmRbH -DoDKjvbdtTSSyZeD -DoDKjvbdRadFMJZL -EOcKjvbdUaCQrpqy -DoDLKvbdEJgivXjA -EOcLKvbdGFjSOItR -EPDLKvbdaSGDIUGL -DnbjjvbdJYTagkqQ -EOcLKvbdZLrDsmlN -EOcLKvbdEJgiuwjA -DoDKjvbdxUleRYlO -DnbjjvbdQwODcLhD -EObkKvbdOTUVgEtp -EObkKvbdRMwaxnUz -EObjjvbdrEFJPmua -EOcLKvbdiUzEvquC -DoDKjvbdMpYQumfs -EPCkKvbdhancEvqR -DncKjvbdkNCMZdfo -DncLKvbdZHWdAOri -EObjjvbdlrYuZrci -EObjjvbdgLGzbfAE -EObjjvbdcTCkUEJa -EPDLKvbdVAbRTRRy -DoCjjvbdYqNEiMeR -DncKjvbdBvzchdpW -DnbkKvbdtSqryZdc -EPCjjvbdwygeeweS -DoCkKvbdqlzJyLhJ -EOcLKvbdtbbtvvOo -DoDKjvbdrSVKnLAm -DnbkKvbdfMevgNKL -EObjjvbdRacdkhyL -EPCkKvbdFpASvgGZ -EPDLKvbdZoOJFEyj -EPCjjvbdzjUpPcrt -EOcKjvbdcbSlrATm -EOcKjvbdqwPkbhxq -DnbjjvbdHELVibKK -EPDKjvbdZQldiMeR -DnbjjvbdpstGqrKt -DoDKjvbdGFjRmiUR -EPCkKvbdssRsZZdc -DnbkKvbdlqxuZsDi -DncKjvbdEXwlUTtM -DnbjjvbdyzdnRhIh -EPCjjvbdkCkkRGtg -EOcLKvbdLrWlytpz -EPCkKvbdCEQAvKNG -DncLKvbdVwIxWDeH -EObkKvbduMYXBTaX -DoCkKvbdRyihTDWA -DnbjjvbdkaMoNALA -DnbjjvbdaMjartlg -DoCkKvbdNVTSKmAX -DoDLKvbddwystRez -EPCjjvbdcImJjevx -DoCkKvbdeAUQlwjG -DoDKjvbdZxcjNblS -DncLKvbdkIGlFenL -DoCjjvbdfHjurNqH -DoCkKvbdiBoDFXRR -EPDLKvbdvBDyTPFI -DnbkKvbdUxhUZkPO -EObjjvbdqZOhHQdY -EOcKjvbdSCDeLiZL -DncKjvbdozmckYPA -DncKjvbdgGLymgHA -DncKjvbdILaznWpk -EPCjjvbdqUTgSSKt -DoCkKvbdrovOjCuf -EOcLKvbdKfGIBaQu -EPDKjvbdCIjajiFj -EPCkKvbdmoyxujyC -EObkKvbdySnJMrCH -EOcLKvbdHDjujBij -EObjjvbdrMyiyMHi -DoCkKvbdiifHimXr -DnbkKvbdbsCkTcia -DnbkKvbdMfbpNPtk -EOcLKvbddoErkUTr -DncLKvbdqZOhGqDx -DnbjjvbdDncKkXCd -DoCjjvbdSCEElIxk -EPCkKvbdbUbHXjsh -DnbkKvbdCTAcUGWr -EPDLKvbdZtIiZESn -DnbjjvbdrDeJPnVa -DoCkKvbdZisIQHCG -DncLKvbdgFkzOHHA -EPCkKvbdmfdxMmfy -DncLKvbdMIbMRYAS -EOcKjvbdaogGckzd -EOcLKvbdLAkHMawq -DncLKvbdxwiJbQZk -DncLKvbdauBgYLUI -DnbkKvbdnQZxvKyC -EOcKjvbdFkEsChNV -DoDLKvbdpstGrRjt -EPDLKvbdlYrrSxgU -DnbjjvbdZQmFIldq -DoCjjvbdbhmKLFvx -EObkKvbdsBellGjy -DncLKvbduCcUwWOo -EObkKvbdJuuGEEfi -DoCkKvbdIwtCHkqQ -EPCkKvbdaMkBruMg -DncLKvbdEARiMyvw -EObjjvbdmgExNOGy -DoCjjvbdpfDdsuaI -EPDLKvbdEzspdlCi -EPDKjvbdqdFJQNua -DnbkKvbdnBjWxOnV -EPDLKvbdZisHogBf -EPCkKvbdjcMKpftg -DnbkKvbdauCGwjsh -DoDKjvbdlYrrTZHU -EOcLKvbdzjVPpDrt -DoCkKvbdQdDApQdS -DoDKjvbdehLWRmpg -EPDLKvbduoTzpkPU -DoCkKvbdliDspuRa -DoDKjvbdEXxLsssl -EObjjvbdZsiJYcrn -DoCkKvbdaaWFGPpX -DoCkKvbdrafNMHLZ -DoCjjvbdmgEwlnHZ -EPCkKvbdFkEsCgmV -DncKjvbdqmZjYlHi -DoCkKvbdfILWSORH -DoDLKvbdnCKXYOnV -DnbkKvbdHgGyyYYH -DoDLKvbdEKHjVxKA -EPDKjvbdbAueGPow -DnbkKvbdFyUuBDwb -EPDKjvbduCcUvvOo -EObkKvbdauBfxKsh -EObjjvbdZjTIPgBf -EObkKvbdNGbolpVL -EOcKjvbdeFOqbWbj -DoCjjvbdvwMAvBVu -DnbkKvbdzRPMhjXA -DncKjvbdFkErcIMu -EPCjjvbdhlFEOUcZ -DoCkKvbdJbjCpicY -EPCkKvbdZGwEAOri -DnbkKvbdNQYQunHT -DoCkKvbdkIHMFfOL -EObkKvbdHELVjBij -DoDLKvbdZQldhleR -DoDLKvbdVTmTelVj -DnbjjvbdJTZArlwl -DnbkKvbdCDpAvKMf -DoCjjvbdDxYLtUTl -DoDLKvbdwkWcgzyf -EPDLKvbdLBKgNCYR -DoDLKvbdZMSEUNkm -EOcLKvbdxUmEpxkn -EOcKjvbdGLFTDHlu -EOcLKvbdyYJKCPyk -DoCjjvbdDnbjjvcE -DoDLKvbdatbHXjtI -EObjjvbdbiMjLGWx -EPDKjvbdTYKlNzjx -EOcKjvbduDDUvvPP -EObkKvbdliETpuSB -DnbjjvbdrWolDIxq -EObjjvbdqZOggQcx -EOcLKvbdyXiKBoyk -DnbjjvbdqmZiyMIJ -EPCjjvbdULuoAuoJ -DoDLKvbdYzcGRivZ -DnbjjvbdtkwwBTaX -DnbjjvbdJbicQicY -DoCkKvbdTukojTaR -EPCkKvbdHbLydzAD -EObjjvbdVTltGLvK -EPCjjvbdUsmUFkuj -EPDLKvbdTqROuVIN -DncLKvbdYkrETnLm -DoCkKvbdeFPSBwDK -DnbjjvbdNGcPmPtk -DnbjjvbdWHwuxHYz -DoDLKvbdNUsRjmAX -EOcKjvbdZjTHpHBf -DncKjvbdWXIwvDeH -EOcLKvbdrJAKEloF -DoCjjvbdFeirOJUR -EOcKjvbdWWhwvEEg -DncKjvbdKeehBaQu -DnbjjvbdZLrDsmlN -EOcLKvbdZnnIeFZj -DoCkKvbdjKGHjMwr -EObkKvbdmIctQtqa -DoCjjvbdkClKpfuH -DnbjjvbdcTDKscia -DnbjjvbdADSYKZiQ -EObkKvbdygZMANFX -EPCjjvbdaMkCTUlg -DoDKjvbdzjVPodTU -EPCkKvbdIxTagkpp -EPCjjvbdZjSgpHBf -EOcLKvbdiCOcEvpq -EOcLKvbdsQWOibvG -DoDKjvbdEuxoomJe -DoDKjvbdmuVZkKSG -DoCjjvbdSZjITDWA -DoCkKvbdCJLBkJGK -EPCkKvbdliDsqVSB -DoCjjvbduaDxrneI -EOcLKvbdtvNxJpsA -EOcKjvbdEuyPoljF -DnbjjvbdwWlAuaWV -DncLKvbduMXvaTaX -EObjjvbddxZstSFz -EPDLKvbdmttykKSG -EPCjjvbdfIKvRnRH -DoDLKvbdjgfkeemk -DoCkKvbdHELVjBjK -EObjjvbdaRecIUGL -DnbkKvbdmSYuZrci -DoDLKvbdKfGHaaQu -EOcLKvbdIwsahLpp -EOcLKvbdEuyPomKF -DoCkKvbdsQWPJcVf -DnbjjvbdbPgHDkzd -DoDKjvbdZMSETnMN -DoDKjvbdJSyBTMwl -EPCkKvbdSCDeMIxk -DoDLKvbdtkwwBTaX -DoCjjvbdtbcVWuoP -EPCjjvbdozmdKxPA -DoCjjvbdtkwwBUBX -DoDLKvbdQdDBPpcr -DoCjjvbdJbjCpjDY -EPCjjvbdCTBDTfWr -EPDKjvbdYNqAYUut -DoDKjvbdURRPVUgm -EOcLKvbdNPwqVmfs -DoDKjvbdsCGMkgLZ -DoDLKvbdZtIiYcsO -EObjjvbdhficZWJu -EPCjjvbdTqRPUuIN -EPCjjvbdyOShXsIc -EOcLKvbdliETqVRa -DncKjvbdYqMdhmEq -DoCkKvbdKfGHbBQu -DnbkKvbdqBIeAXIE -EPDLKvbdQZNAHTRj -EObkKvbdRosgJecw -EPCjjvbdKQzEnfOF -DoDKjvbdzRPMiKXA -DnbkKvbdGcjvJbJj -DoCjjvbdbAvEeoow -DncKjvbdFVyQPmKF -EPDLKvbdRzKIScWA -EPCkKvbdKkAhWAJy -EPCkKvbdJqZdnenF -DoCkKvbdVUMtGMWK -DncKjvbdBiLBjiGK -DnbkKvbdjvWnDbYX -DnbkKvbdwuNEqYkn -DoDKjvbdegjurORH -EObjjvbdpeceTvAh -DoCkKvbdAMgySwZx -EPCkKvbdlZSqsZGt -EPDLKvbdbrbkTdKB -EPDKjvbdhzUekpnG -DncLKvbddeOqbWbj -EPCjjvbdsPunibvG -EOcLKvbdVwIxVdEg -DoCjjvbdkIHLefNk -DnbkKvbdxmrhXrhc -EPCkKvbdziuPocrt -EOcLKvbdNUsSLNAX -DncKjvbdhkddNtcZ -DoCjjvbdMpYRWNgT -EObjjvbddZxoxYqC -EOcLKvbdNVTRjmAX -EPDKjvbdZjTIQHCG -DnbkKvbdHEKvJbKK -EOcKjvbdiGibxvJu -DnbjjvbdsCGNMGjy -DoCjjvbdBhkBjhfK -EPCkKvbdSCDdkhyL -DnbjjvbdNPwpvNfs -EOcLKvbdJTZBTNYM -DncKjvbdqGEFTvBI -EObkKvbddneSjtTr -DncLKvbdqdFJPmua -EPDKjvbdrbFmMGkZ -DoCjjvbdhXZAzzAJ -EOcKjvbdkxsSSxgU -EPDKjvbdrEEhonVa -DnbkKvbdYzcGSKVy -DoCjjvbdzROmJJwA -EPDLKvbdOEdUJJKd -EPCjjvbdqquKmkAm -EOcLKvbdZyEKODLr -DnbkKvbdIsZAsMxM -DnbjjvbdZjTHofaf -DoCjjvbdrSUkOLAm -EPCjjvbdBsAbsewS -EObkKvbdUsltGLuj -EPCkKvbdANHyTWyx -EObkKvbdsBemMGjy -EObjjvbdMoxRVmfs -EPCkKvbdNGbolouL -EPDLKvbdjKGHimXr -DncKjvbdUMWPAuni -EOcLKvbdOEdUIhkE -EPCkKvbdjKGHimXr -EPCkKvbdhuZdwSVC -DoCjjvbdCIkBjiFj -EPCkKvbdxZhGFxFS -EObjjvbdOFDtJJKd -DoCkKvbdfNGWgNKL -EPDLKvbdcarmSATm -DoDKjvbdkNCMZeHP -DoDLKvbdkMakyeGo -DnbjjvbdiHJcYvKV -DnbjjvbdWWhxVcdg -EPDKjvbdVUNTelVj -DoDKjvbdZGvdAPTJ -DoCjjvbdDncLLXCd -EPDKjvbduDCuWuno -DoCkKvbdPyNAHTSK -DncKjvbdqwPlDIyR -EOcKjvbdYzbfSJvZ -DnbkKvbdRotGifDw -DoDLKvbdRDcBQRDr -DoDKjvbdEARiNZvw -DncKjvbdJSxaTNYM -EPDKjvbdVwJXvDeH -EOcKjvbdQwOECkhD -DoCjjvbdEPCkLWbd -EPDKjvbdVBBpsRSZ -EOcKjvbdddoSBwCj -EOcKjvbdFkFScINV -EObjjvbdpstGrSLU -EPDLKvbdhaoDFXRR -EPDKjvbdKfGICApu -EObkKvbdBsAcTevr -EObkKvbdhkeDmtby -DoCkKvbdqYngfpdY -EOcKjvbdsPvPKCvG -DoDLKvbduVmwiqTA -EOcKjvbdidkGtoAO -EPCkKvbdyzeORgiI -DoCkKvbdmJDsqUqa -DncLKvbdiGibyVjV -DncKjvbdhtzEwSVC -EOcLKvbdZRMdiNFR -EOcKjvbdrafMkgKy -DoDKjvbdZGwEAOsJ -EOcLKvbdjmCMZeHP -DncLKvbdjKFgimYS -EPCjjvbddZxpYZRC -DncKjvbdjmBkzEgP -EObkKvbdkIHLeemk -EPDKjvbdjAQGaQGj -DncLKvbdSPtHJfDw -DoCkKvbdGKdsChNV -EPCjjvbdrouoJbuf -EPDKjvbdlhcsqUqa -DoCjjvbdwXMBWAvV -DnbkKvbdhkdcmtby -EOcLKvbdFkEsDHmV -EOcLKvbdCIkBjhej -DoCkKvbdiLeDnVDZ -DoDLKvbdDxXlTssl -DnbjjvbdNrtVfduQ -EPCkKvbdHDkWJajK -EPCjjvbdTulQKUBR -DoDKjvbdJYUBhLpp -DncKjvbdiCOcFXRR -DoCkKvbdxsNiMrBg -EObkKvbdQlxByNtz -EPCjjvbdBhkBjiFj -EPCjjvbdNeDsiIjd -DncLKvbdBsAcTfXS -DncLKvbdDwwlUTsl -EOcKjvbdUQqPVUgm -DncKjvbdmttzKirG -EPCjjvbdKWUfEFHJ -EPCjjvbdGKdrcINV -EPDLKvbdkxrrTYgU -DoCkKvbdQdCaQQcr -DnbkKvbdvAdYroFI -EObkKvbdFxttaDwb -DnbkKvbdQdDBPqES -DncKjvbdkVwODbXw -DoCkKvbdrounicVf -EPCjjvbdBcoaVjMf -DncKjvbdcImKKevx -DoCjjvbdxLWdHzyf -EOcLKvbdcbTNSATm -EPDKjvbdRacdlJZL -EPDLKvbdZQleIleR -EPCkKvbdTfznLwWF -EObkKvbdsCFmLgKy -DoDKjvbdyqOlhiwA -EOcKjvbdtcCtwVoP -DnbjjvbdRWmdCkgc -EOcKjvbdqUTfqrKt -DnbkKvbdRyjHsDWA -DoDLKvbdYqMdiNEq -EOcKjvbdhbPCeXRR -EOcKjvbdVrNwbFLc -EObkKvbdZLqcsmkm -DoDKjvbdRWmdDMID -EPCjjvbdkWXNcbYX -DncLKvbdZyDinClS -EOcLKvbdqUTfqqjt -DncLKvbdUtNTelWK -EPDKjvbdkWWmdCXw -DoDKjvbdezuxdhtX -DoCkKvbdaSGCgtGL -EPDKjvbdVwJYWDdg -DoDLKvbdWSOYCFMD -EObkKvbdxwiJaozL -DoCjjvbdTpqOuVIN -DoCkKvbdrzLpSaHn -DnbkKvbdJutecdfi -DnbkKvbdhgKDZVjV -DncKjvbdCJKajiGK -EPCkKvbdbrcLTcia -DncKjvbdxxIibPzL -DoDLKvbdNUsRkNAX -DoCkKvbdZRMeJMdq -DnbjjvbdxsOJMqbH -DncKjvbdqAheAWhE -DoCkKvbdZnnIddyj -DoCjjvbdrpWOibuf -DoCjjvbdDxXlUUTl -EPDKjvbdZirgofbG -DnbjjvbdDnbkKvbd -EOcLKvbdoznDkXoA -DnbjjvbdozmdKxPA -DnbkKvbdfHkVqmqH -DoDLKvbdkDMLRGtg -EPDKjvbdDxXlUTtM -DoDLKvbdZLrETmkm -DoCjjvbdLAkGlbYR -DncLKvbddndsLUUS -DoCjjvbdaRfDIUFk -DnbjjvbdjJfHjNXr -DncLKvbdeFPRbXDK -DoCkKvbdJYTbIMRQ -DnbkKvbdptUGrRjt -EOcKjvbdkMbLzEfo -DoCjjvbdezuxeJUX -DoCjjvbdZMRctOLm -DoDLKvbdWWiXudEg -DnbkKvbdiiehKNXr -DoCkKvbdXrkaNUOx -EPDLKvbdZjTIQGbG -EObjjvbdeOeTLTtS -EPDKjvbdBraCsewS -EPDLKvbdLBKflaxR -DncKjvbdRzJhScWA -EPDLKvbdGKdrbhMu -DoDKjvbdFeiqmiUR -DnbjjvbdFWYooljF -DnbkKvbdUWLoisaR -EPDKjvbdfRaWzkbo -EPDLKvbdKQzEnfNe -DoDLKvbdnUtyjiqf -DnbjjvbdyNrgxSiD -EOcKjvbdjlakzFHP -DoCkKvbdjvXODaxX -DnbkKvbdLFfHaaRV -EPCkKvbdwuMeRYlO -EPDLKvbdtSqrxzEc -DncKjvbddwytTqez -EOcKjvbdZLqcsnMN -DoCjjvbdkxsSTZHU -EPDKjvbdiZtekqNf -EObkKvbdnCKWwnmu -EObjjvbdauBgYKsh -EPDKjvbdrSVKmkBN -EObkKvbdxrnImSBg -DncKjvbdZnnJEeZj -DoDKjvbdZjTIQHBf -DncLKvbdmIctRVRa -DoCjjvbdziuQQDsU -EPDKjvbdZRNFJNEq -EOcKjvbdTqRPUthN -EPCkKvbdePFSjssr -EPDLKvbdfIKuqmqH -DoDKjvbddZyQYYpb -DoDLKvbdWRmwaeMD -DoDLKvbdOYOuzcmt -DoDLKvbdxsNiNRbH -EPCkKvbdNeEThiLE -EPCkKvbdNPxQunHT -EPCjjvbduCbtvuoP -EOcLKvbdjgfkeemk -EObjjvbdjlbLydfo -DoDLKvbdxmsIXrhc -DoCkKvbdlrZVZsDi -DoDKjvbdEztRElCi -EObjjvbdBsAbsfWr -DoDLKvbdZHWdAOsJ -DnbjjvbdSCDdkhxk -EObjjvbdeFOqbWcK -EPDLKvbdZtJJZESn -EPCkKvbdKfFhBaQu -DoCkKvbdMpYQvNfs -EObjjvbdrpWOjCvG -EPDLKvbdJSxaTMxM -EPCjjvbdOSsvGduQ -DoDLKvbdtumxKRTA -EPDKjvbdBcpBWKMf -DnbkKvbdtbbuWvPP -DoDLKvbdKWUfDdfi -EPDKjvbdOStVgFVQ -EObkKvbdZnmheFZj -DoDLKvbdQwODcMID -DoDKjvbdVrNxBeMD -DoCkKvbdaSFbgsek -DoCjjvbdTvMQKTaR -DoCkKvbdZsiIxdSn -EObkKvbdakMFnnDA -DoDLKvbdJutedFHJ -EOcLKvbdhzVFlQnG -EObjjvbdzjUpQDsU -EPCkKvbdzoQQeCkx -DncKjvbdZjShPgCG -DnbjjvbdMgCpMpVL -DnbkKvbdNGbpNPuL -EObkKvbdKfFhBaRV -DnbjjvbdKQzFPFnF -EPDKjvbdCIkBkJGK -EObkKvbdmajXXnnV -DoCkKvbdNwnuzcnU -EObjjvbdauCGwkTh -DnbkKvbdbiNKKfXY -DnbjjvbdQmYCYnUz -DoDKjvbdiLddNtcZ -EOcKjvbdeEoSBwDK -DoDKjvbdcTCkUDia -DnbkKvbdZRNEhmEq -EPCkKvbdHfgZxxXg -EObjjvbdbsDLUDjB -EPDKjvbdhbPDFWqR -DncLKvbdKNADyfuB -EObkKvbdEztREkcJ -DncLKvbdbLMFnnDA -EObkKvbdZjShPgBf -DncLKvbdbVCHXkTh -DnbkKvbdqTtHSRkU -EObkKvbdfSBWzlDP -DnbkKvbdGKeTDIMu -EOcLKvbdGcjvJbJj -EPCkKvbdMowqWOHT -DncKjvbdYpmFIleR -EPDKjvbdZxcjNblS -DncLKvbdNrtVgEuQ -EOcKjvbdqrVKnLBN -DnbkKvbdatbHXkUI -DoCkKvbdEPDKkWbd -EPDLKvbdmIdURVRa -DoCkKvbdMoxRWNgT -EObjjvbdLBKflbXq -DoCkKvbdSwjkmzkY -DoDKjvbdJbicQicY -EObkKvbdNQYQumgT -DoDKjvbdxxJKCPzL -DncLKvbdnGdxNNgZ -DoCkKvbddijSVtzn -EPDKjvbdrJAJdmOe -DnbjjvbdzoQQeDLx -DoCjjvbdZRMeIldq -DnbjjvbdkHgMGGOL -DoCjjvbdaSGChTfL -EOcLKvbdCJLCKiFj -DoCkKvbdVhXvYHYz -EPCjjvbdcSbjscia -EOcKjvbdxZgeewdr -EPDLKvbdYkqdUNlN -DnbkKvbdREDApQdS -DnbjjvbdmozZVkYb -EPDKjvbdaRecITfL -DncLKvbdZyEJmbkr -EOcKjvbdZnnIdeZj -DncLKvbdeXzTsrFz -DoCjjvbdZRMdhmEq -EOcLKvbdGGJqmhtR -EPDKjvbdIidAJpHE -DncKjvbdMRwNZtpz -DncLKvbdnBiwXoOV -DoDLKvbdqYnhGqEY -EOcKjvbdWexytAOs -EOcKjvbdiZuFlQnG -EObkKvbdVAaqTRRy -EPCkKvbdTAEhgaoE -DoDKjvbdMoxQvNfs -EPDKjvbddjJqvUzn -EObkKvbdBiKajhfK -EPDLKvbdZLqcsmlN -DoCjjvbdgPazwDwh -EPCkKvbdwkWcgzzG -EPDKjvbdlYsSSyGt -EObjjvbdZLrDsmkm -DncLKvbdbsCkUDia -EObkKvbdkxrrSyGt -DnbkKvbdnBivxOnV -DoDLKvbdZirhPgCG -EObjjvbdfMevfmKL -EPDKjvbdSQTgJecw -DoDLKvbdUWMPitAq -DoDKjvbdwtleRZMO -EObjjvbdKRZdoGNe -DoCjjvbdauBgYKsh -DoDKjvbdXrlAlsnx -DncKjvbdUMVnaVni -DncKjvbdiHKDYvKV -DnbkKvbdySnJNSCH -EPCjjvbdfNGWgNKL -EOcLKvbdnQZxujxb -EObjjvbdVgwvXgYz -EOcLKvbdjKGHimYS -DnbkKvbdhanbeXQq -DncLKvbdhzUfLpmf -DoDLKvbdczZPxZRC -EPDKjvbdRNYBxnUz -EOcLKvbdlrZVZrdJ -DncKjvbdtcDUwWOo -EPCkKvbdQvmdDLhD -EPCjjvbdfMfWfljL -DoCjjvbdZyEKNbkr -EOcKjvbdgPazvcxI -DncKjvbdfNGXHMjL -DncLKvbdEKHjWXjA -EObkKvbdZjSgogCG -EPCjjvbdxnSgxShc -EPCjjvbdqrVKmkBN -EPCjjvbdbBVdepQX -DoCkKvbdrXQLbhxq -DoCjjvbdbVBfxLTh -EPCkKvbdHlBznWqL -EPDKjvbdTAEhgaoE -DnbjjvbdCfkfHAzc -DnbkKvbdptTfqqjt -EPDLKvbdWIXuwgYz -EObjjvbdrJAJeNPF -DncLKvbdKDKDRJcY -DnbkKvbdrDeIpNvB -DncLKvbdVwIwudFH -DncKjvbdICMZdzAD -EPCkKvbdsQVnjDVf -EPDKjvbdiZuGMRNf -DoDLKvbdIGfyyXwg -EPDLKvbdYORAXtut -DoCjjvbdhzVGMQnG -EPDLKvbdQwNcbkgc -EObjjvbdsBemLgLZ -DoDLKvbdZtIiYdSn -DoCjjvbdelevfljL -DoCkKvbdcyxowxqC -EPDLKvbdZMRdUNlN -EOcLKvbddZyPwyRC -EPCjjvbdZLrDsnLm -EPCkKvbdgPazwEYI -DoDKjvbdqFdEsvBI -EOcKjvbdVviXvDdg -EPCjjvbdCWzdIdov -DncKjvbdrSVKnLBN -EObkKvbdiLddNtcZ -EPDLKvbdrDdiPmvB -EPDKjvbdKDKDRKCx -DoDKjvbdtSqsZZeD -DoDLKvbdwuNFRYlO -DoCjjvbduLwvaTaX -EObjjvbdtkxXBUBX -EOcLKvbdSQTgJfEX -EObjjvbddneTKtUS -DoDLKvbdAMhYsXZx -EOcLKvbdczZPwxqC -EPDLKvbdjbkjqGtg -EOcLKvbdFkEsChMu -EObjjvbdbsCkUDia -EObkKvbdEzsqElDJ -EPDLKvbdGZUuBEYC -DoCkKvbdzROmJJwA -EPDKjvbduMXwAsaX -EPCjjvbdqwQMDJZR -DoDKjvbdqUUHSRkU -DoCkKvbdwtleQxkn -DnbkKvbdQvnEClHc -EPDKjvbdjvXNcaww -DoCjjvbdjggMFenL -EPDLKvbdJYUBhLpp -DnbkKvbdkNCLyeGo -DoCjjvbdDoCkLWcE -EOcKjvbdYqMeJNFR -EPCjjvbdRDcApQdS -EObjjvbdjblKpgVH -EPDKjvbdqqtjnKaN -DoDLKvbdwtmFRYlO -DoCjjvbdnHEwmNgZ -DncLKvbdaMjasVNH -DncKjvbdnUtzLKSG -DoDLKvbdkySrSyGt -EPCjjvbdyNsIXriD -DoCkKvbdRadFMIyL -EOcKjvbdqvokbhxq -EPCjjvbdYkrEUOLm -EPDKjvbdrpWPKCvG -DncKjvbdxUldpyLn -EObjjvbdrbFmMHKy -DoCjjvbdZHWdAPTJ -DncKjvbdEPDLKwDE -DnbjjvbdZHWdAPTJ -DoDLKvbdNrsvHFUp -DncLKvbdCTBDUFvr -EPDLKvbduDDUvuno -DoDLKvbddwystSFz -DnbkKvbdmbJvwoNu -EPCjjvbdcbTNSAUN -DnbjjvbdnVUzKjRf -EOcLKvbdYlRdUOMN -DoCjjvbdTAFIgand -DnbkKvbdpeceUVaI -DoDLKvbdlZSrTYft -EPCjjvbddePRbXDK -EOcLKvbdJqZdnfNe -EPCkKvbdRaceLhyL -EPDKjvbdLAkGlaxR -EPCjjvbdqGDdsvAh -DnbjjvbdxZgefYEr -EObkKvbdKWVGEFGi -EPCjjvbdSQUHKFdX -EPDKjvbdDxYLsssl -EPCjjvbdfHjvSNqH -EPCkKvbdQwODbkhD -EOcKjvbdZnmiFEyj -EPCkKvbdqwQMChyR -EOcLKvbdZyDimcLr -EObjjvbdjAQGaQGj -EPCkKvbdZtJJYdTO -EObjjvbdjFKgUoAO -DnbkKvbdcScLUEKB -EPDKjvbdjcMLRGuH -EObjjvbdqlzKZLgi -EOcKjvbdFfJrNiUR -EObkKvbdKaKgNBxR -EOcKjvbdHDjujBij -EObkKvbdFejSOJUR -DncLKvbdMIalRYAS -EOcKjvbdVTlsekvK -DoCjjvbdUQqOtthN -DnbjjvbdVYgtZkOn -DnbkKvbdrovOicVf -DncKjvbdKfGIBaQu -DnbjjvbdjuvnDaxX -EPDLKvbdHakzEzAD -EPDLKvbdyzdnRhIh -DoCjjvbdZGvdAPTJ -DoDLKvbdqvolChyR -DncLKvbdjlbLyeHP -EPCkKvbdmIdTptrB -EPCkKvbdQcbaPqES -DoDLKvbdddoSBwCj -DnbjjvbdjvWnECXw -DnbjjvbdZisHofbG -EOcKjvbdZQldhldq -DnbkKvbdfekymfgA -DnbjjvbdLBKgMbYR -EPCjjvbdEARiMzWw -EObjjvbdtSrTYzEc -EPDKjvbdZoOIddyj -DnbkKvbdcSbjtEKB -EObjjvbddndsKssr -DoCjjvbdxnSgxShc -EPCjjvbdOTUVfdtp -DoCkKvbdUtMselWK -DnbjjvbdJpydoGNe -DoCkKvbdGQASwGey -DnbjjvbdnGdxMnGy -EPDKjvbdHDkVibKK -DoCjjvbdtbbuXWOo -EPDKjvbdKWVGEEgJ -EObkKvbdGLEsCgmV -DoCkKvbdbrbjtEKB -EPDLKvbdRzJgrcWA -EPCkKvbdaRecITfL -EObjjvbdrbGMlHKy -DnbkKvbdZdwfzgiC -EPDKjvbdVwJXudFH -DoCjjvbdiZtekqOG -EObkKvbdqrUkOKaN -EObkKvbdySnImRbH -EObjjvbddoFTKstS -EOcKjvbdyOTHxTJD -DncKjvbdFVxoolie -DoCkKvbdFejRnIsq -EPDLKvbdptUGrRkU -EOcKjvbdajlGOnDA -EPDKjvbdrRtkOKaN -EOcKjvbdzoQQeDLx -EPCjjvbdrafMlGkZ -EPCjjvbdmpZyWKyC -DoCkKvbddBrlrAUN -DnbkKvbdMgDPlpVL -DnbjjvbdUxhTzKoO -DoCkKvbdSCDdlIyL -EPDKjvbdmbJvxPOV -EPCkKvbdNGcQMpUk -EPCjjvbdVqmxCFLc -DoDKjvbdrDdhonWB -EOcLKvbdYTLaNToY -DoCkKvbdkIGlFemk -EPDKjvbdNrsvHFVQ -EPDLKvbdrzLoraHn -EObkKvbdraelkgLZ -DoDLKvbdBdQAujMf -DncKjvbdwzIGGYFS -EOcKjvbdZeXfzhIb -DoDKjvbdbAueGPpX -DoCjjvbdZtJJYcrn -DoDKjvbdyqPNJKXA -DoCkKvbdTAFIhCPE -DoDLKvbdjblLQgVH -DoCjjvbdZtJJZDsO -EOcLKvbdrNZixkhJ -DoCjjvbdzoPpdblY -DnbkKvbdqcdhpNvB -DncKjvbdYpldhleR -DoCjjvbdmRyUysEJ -DoCjjvbdJXtBgkqQ -EOcKjvbdVwJYWDeH -DoDLKvbdZLqdUOLm -EPDKjvbdEXwlUUTl -EObkKvbdoznDkYPA -EPCkKvbdEASJNZvw -EPCjjvbdFjdsCglu -DoCkKvbdTlWPBWOi -DnbjjvbdcTCjsdKB -EObkKvbdkySrTYft -EPCkKvbdLrXMytpz -DncKjvbdZQmEhleR -EOcLKvbdHkaznWpk -DnbkKvbdHfgZyXxH -EObkKvbdpecdtWAh -DnbkKvbdRadElJYk -EPCjjvbdTXkMNzjx -DoCjjvbdmSYtzTEJ -EPCkKvbdZsiJZDsO -DncKjvbddoErkTtS -DoCkKvbdZRMdiMeR -EObkKvbdTfzmkvvF -DncKjvbdpxnhHQcx -EPDLKvbdaMjbStlg -DoCjjvbdkHfkefOL -DoCjjvbdqqtkOLAm -DnbjjvbdyzeNqgiI -EOcKjvbdiLeDnUby -DncKjvbdyYIjCPyk -EOcKjvbdpfEFUVaI -EPCjjvbdZirgpHBf -DnbkKvbdKWUecdgJ -EOcLKvbdiHKCxvJu -EPDKjvbdcTCkUEKB -EOcLKvbdaMkBsVNH -EPDLKvbdJutfEFGi -EPCkKvbdFaOqZJzm -EObjjvbdhaoCdvqR -EPCkKvbddZxpXxqC -DnbjjvbdZxcinDLr -DoDLKvbdpssfqrKt -DoCjjvbdqTsgRrLU -EPDLKvbdEYXlUTtM -EObjjvbduVmwjQsA -EOcLKvbdNPxQunHT -DnbjjvbdBhjajiGK -DoCkKvbdUGznMXVe -EPDKjvbdVwIwvEFH -EObkKvbdRMwayNtz -DoDLKvbdQZNAGrrK -EObjjvbdKWUedFGi -DoDLKvbdaNKartlg -DncKjvbduWOXipsA -EObjjvbduVmxKRTA -DoDKjvbdygZMAMdw -DoDLKvbdqTsfrRkU -DoCjjvbdEvYpQMjF -EObkKvbdNPxQunGs -EObkKvbdsZlPsAgn -DnbkKvbdZnnIddzK -EPCkKvbdNQXqWOHT -DnbkKvbdGLFSbhMu -DoDKjvbdrzMPraIO -DnbkKvbdZirgofaf -EPDKjvbdijFhJlxS -DncKjvbdWRmxBeLc -DnbkKvbduDDUvuoP -DoDKjvbdiZuGMQmf -EObkKvbdelfXGljL -EPDLKvbdfNFvfljL -DncKjvbdGKdrcINV -EObjjvbdFfJqnIsq -EOcLKvbdILaznWqL -DncLKvbdJutedFHJ -EOcLKvbdIwtBhLpp -EPDLKvbdsrrSyZdc -EPDKjvbdczZQXxpb -DncLKvbdDoCjjvcE -EPCjjvbdpxoIHREY -DoCkKvbdxxJJbPzL -EPCkKvbdVZIUZkPO -EPDLKvbdULuoBWPJ -EPCkKvbdfMfWfmJk -DnbjjvbdZtIiZETO -DoCjjvbdiMEcnUby -DoCkKvbdcyyPxZQb -DoCkKvbdZirgofaf -EObkKvbdozmdLYPA -DoDKjvbdYkrEUNkm -DoCkKvbdLqwMzVQz -EObjjvbdLFfICBRV -EObjjvbdjJehKNYS -DoCjjvbdEJgiuwjA -EPCkKvbdyqPNIiwA -EPDKjvbdNdcsiIjd -EPCjjvbdauBgXjsh -DnbkKvbdyzeORgiI -EPCkKvbdsCGNLgLZ -EObkKvbdtbbtwVno -EObjjvbdwuMdqZLn -EObjjvbdSQTfiedX -EPCjjvbdmttyjjSG -DncLKvbdnHFYMnGy -DncKjvbdxmsIXrhc -EPDKjvbdQYmAGsRj -EObjjvbdfoazvdYI -DoDLKvbdhaoDEvpq -EObjjvbdDihKVwjA -DoCjjvbdZMSDtNlN -DnbjjvbdhlFDnVDZ -EPCjjvbdiCPCdwRR -DncLKvbdULuoBVoJ -DoDLKvbdyYJKBpZk -DoDLKvbdRbDdlIyL -EOcKjvbdYSlAlsoY -DoCkKvbdySmhlqbH -EOcKjvbduWNxKRTA -DnbkKvbdFjeTDIMu -DoDLKvbdzaAPGgCM -EPCkKvbdBhkCLJGK -DnbkKvbdYpmFJNFR -EPCjjvbdQccBQQdS -EOcKjvbdqGDdtVaI -EOcLKvbdILazmvqL -EPDLKvbdajkennDA -DoDKjvbdxVMdqZLn -EPDKjvbdNPxQunGs -EObjjvbdhytfMROG -EPDKjvbdEXxLtTtM -EPDKjvbdZnnIdeZj -DoDKjvbdGKeTChNV -DncLKvbdjmCMZeGo -DnbkKvbdQwNdClHc -DncKjvbdXrlBMtOx -DoCkKvbdzaAOgHBl -DncLKvbdcIlijewY -EObjjvbdrbFllHKy -EOcKjvbdmbJwXnmu -EObkKvbdssSSxydc -DoDKjvbdSQTgKGEX -DnbjjvbdUyHtZkPO -EPCjjvbdFyUuAdYC -DoCkKvbdqFcdsvBI -EOcLKvbdqwQLbhyR -DoCkKvbdbsCkUEKB -EPCjjvbdIjEAKQHE -DnbkKvbdaNKbTUmH -EObkKvbdnCKWxPOV -EOcLKvbdZxcinClS -EObjjvbdhlFDnVDZ -DncLKvbdpyPHfpdY -EOcKjvbdTlVoAuoJ -EOcKjvbdmbKXXoOV -DoCkKvbdxsOImSBg -DncKjvbdZHXEAPTJ -DoDLKvbdDjIKVwjA -DoDLKvbdnCJvwoNu -EPCjjvbdZeYGzghb -EPDKjvbdHffzYxXg -EObjjvbdirzhrkJz -DoCjjvbdZnnJFFZj -EPDKjvbdeATqMwif -DoDKjvbdbVCHXjsh -DoCjjvbdGckVjCKK -EOcLKvbdyYJJbPzL -DoCjjvbdiCPDFWpq -EOcLKvbdIwtCILqQ -DoDLKvbdKQzFOfOF -EOcKjvbdNPwqWNgT -EObjjvbdZLqcsmkm -EPDLKvbdnPyxvKxb -DoDLKvbdKjaHvAKZ -EObjjvbdjKFgjNYS -DnbkKvbdLAkGmCXq -DoDLKvbdeEoSBwCj -DnbjjvbdHlBznXRL -DnbjjvbdKfGHbBRV -DnbkKvbdZQldiMdq -EOcLKvbdnBivwnnV -DncKjvbdsQVoKDWG -EObkKvbdypnlhiwA -EObkKvbdrykpTAgn -DoCjjvbdaMkBsUmH -EPDLKvbdRDcBPqES -DoCjjvbdpxngfpdY -EOcKjvbdEztRFLbi -EOcLKvbdcbTNSAUN -DoCkKvbdjcLjpfuH -EPCkKvbdjSzhsKiz -EPCkKvbdoAKztIDn -EPCjjvbdMgDQNPuL -DoDLKvbdKNAEZgVB -EPCjjvbdZsiJZDsO -EOcLKvbdkCkkQfuH -DoCjjvbdnGeXmNfy -DnbjjvbdrpVoJbuf -DoCkKvbduCbuWuoP -EObjjvbdSwkMNzkY -DoCkKvbdrNZiyMHi -DnbjjvbduDCtvuoP -DoDLKvbdMuSqjmAX -EObkKvbdsQVnicVf -EPCjjvbdmfeYNNgZ -DncLKvbdmIdURUqa -EPCkKvbdGBPQyJzm -EPCjjvbdZRNFImEq -DncKjvbdNddUJJLE -EObkKvbdaSFbgsek -DncKjvbdDoCkKwDE -DoCjjvbdtkxWaUBX -DncLKvbdfNGXHMjL -EPCkKvbdqTtHSSKt -DnbkKvbdxmrhXsJD -DnbjjvbdmttykKSG -EObjjvbdqcdhomua -DoCkKvbdVTlsfMVj -DnbkKvbdRECaPpcr -DnbkKvbdijFhKNYS -EObkKvbdIwsbIMRQ -EPDLKvbdJbibqJbx -EPDKjvbdxxJKCPyk -EOcKjvbdjuvnECYX -DnbkKvbdKRZePFme -DnbkKvbdMpYRVnGs -EOcKjvbdfMevgNKL -DoCkKvbdmfeXmOHZ -DncLKvbdFpATXGey -DoDKjvbdJXtCIMQp -EObjjvbdZshiZDsO -EPDLKvbdaRfDHsfL -DncKjvbdMIakqYAS -EObjjvbdSLZGUfjs -DoDKjvbdBcoaWJmG -DoDKjvbdEuxpPlie -EObjjvbdJcJbqKCx -DoCjjvbdxwhiapZk -DnbkKvbdsBemLfkZ -DoDLKvbdHgGyxwxH -EOcKjvbdQdDApRDr -EPDLKvbdKWUfDeHJ -DnbjjvbdjvXODbYX -DoDLKvbdHELWJbKK -DncLKvbdgFkynHHA -EPCkKvbdPxmAHSqj -DoDLKvbdYkqdTnLm -EPCkKvbdJYUCILpp -EOcKjvbdxwhjBpZk -DoCjjvbdiMFENtcZ -DoCjjvbdnCJvwoOV -DoDKjvbdSKxetgKs -EOcKjvbdWRmxCFMD -EOcLKvbdpedFTvBI -EObkKvbdbAvEfPow -EObkKvbdZnmiEeZj -DnbkKvbdtTSSyZeD -EPCkKvbdPxmAGsRj -EPCkKvbdVTmUGLvK -EObkKvbdJmADyfta -EOcKjvbdwWlBVaWV -DoDLKvbdjcMKqGtg -EOcLKvbdGGJrNiTq -DnbkKvbdgPazvdYI -EPCkKvbdGLEsDHmV -DnbjjvbdqceIomua -DncLKvbdjbkjpgUg -DoCjjvbdSxLLmzkY -EPDLKvbdjKGHilxS -EPDKjvbdmbJvwoNu -EPDKjvbdjmBkyeHP -EPDLKvbdzROliJwA -DnbjjvbdUaBprprZ -DoDKjvbdtbbtwWPP -DnbjjvbdURQoVVHm -DoCjjvbdjbkjqGuH -DoCjjvbdRbEFLhyL -DncKjvbdBcpAujMf -DoCkKvbdPxmAGrqj -EPDLKvbdZRMeImFR -EOcLKvbdcScKscia -EObjjvbdeXytTrFz -EPCjjvbdKfGICBQu -DncKjvbdijGIKMwr -EObjjvbdZLqctOLm -EObkKvbdSLZFuGjs -DnbjjvbdZMRcsnMN -EPCkKvbdWSOYBeMD -EObjjvbdRacdlJYk -DnbjjvbdFyVUaEXb -EObjjvbdRbEFLiYk -EObjjvbdZjTIQGaf -EPCkKvbdNsTugEtp -DoCkKvbdEASIlyvw -DoCjjvbdsrrSxzFD -DoDLKvbdQwOEDMID -EPDKjvbdaaVeGQPw -DoCjjvbdFejRnItR -EObkKvbdRacdlIyL -DnbjjvbdGGJqnIsq -DoDLKvbdGYtuBDxC -DncKjvbdbLMGPODA -EObjjvbdqYoIGpcx -DncKjvbdrykosAgn -EPCjjvbdJbjDQjCx -EObjjvbdkySqsYft -EPDKjvbdxwhjBpZk -DncKjvbdauBfwkTh -EPCkKvbdtSrSxydc -DoDKjvbdMRvmZuQz -DncLKvbdnUtyjiqf -DoDKjvbdSLYetgKs -DoDLKvbdJbjCqJcY -EPDLKvbdShyiqAAl -EPDLKvbdSQUHJfDw -EOcLKvbdijFhJmYS -EPDLKvbdvwMBWAvV -EObjjvbdeXytUSFz -EObjjvbdWXJXuceH -EPCkKvbdrDeIomvB -DncKjvbdczZQXyRC -DnbjjvbdQlxCZOUz -EPCjjvbdQccApRDr -DoCkKvbdqiAJdloF -DoCjjvbdDwwktTtM -EPCjjvbdRpUGjGEX -DnbkKvbdWfYytAPT -EPCjjvbdUMVoBVni -EObkKvbdxnShYTIc -EObjjvbdVAaqSprZ -DncLKvbdKVtfDdgJ -DoCjjvbdliEUQtqa -DnbjjvbdiGjCyWKV -DnbjjvbdqrVLOLBN -EObkKvbdUaCRSqSZ -EObkKvbdTkvPAuni -DoCjjvbdIGgZyXwg -DoDLKvbdssRsYzEc -DnbjjvbdZLqdTmkm -EPCjjvbdUtNTfLvK -DncKjvbdfMewGmJk -EOcLKvbdCTBDTfWr -EPDKjvbdFpASwGey -EPCjjvbdZLrETmkm -EPDLKvbdyXhjCQZk -DnbkKvbdeATqMxJf -DoCjjvbdjJfHilwr -EPDKjvbdzitopESt -EPDKjvbdEuxopMjF -DoCkKvbdvBEYroFI -DnbkKvbdrNZiyMIJ -EPCjjvbdxVMdpyMO -DnbkKvbdQlxCZOUz -DnbkKvbdqmZiyLhJ -DncLKvbdXnRAXuWU -EObkKvbdRadElJYk -DncKjvbdLiBkqYAS -DnbjjvbdmRyUysDi -DoDKjvbdKCicQjDY -EOcLKvbdRkZGVGjs -DoDKjvbdtSrSyZdc -EOcKjvbdRyjISbvA -EPCjjvbdHffyyYYH -EOcKjvbdaogHDkzd -EPCjjvbdidkGuPAO -EOcKjvbdCDpAujMf -DoCkKvbduVnXjQsA -DnbjjvbdTulQJtAq -DncKjvbdqTsgRrLU -DoCkKvbdzdynzdyp -EObkKvbdemGXHNKL -EOcKjvbdJXtCHlRQ -EPDKjvbdegkWRnQg -DoCjjvbdyXiKCPyk -EPDLKvbdlZTRsZHU -DoCjjvbdfNFvgNKL -DnbjjvbdbVBgYLTh -DncKjvbdcJMikFvx -EPDLKvbdUMVnaVoJ -DoCkKvbdgQBzvcxI -DoCjjvbdZtIhxdSn -EPCjjvbdRWnEDMID -EObkKvbdjlakydfo -DncLKvbdrpWOicVf -EOcKjvbdhgKDYuiu -DoDKjvbdmIdTqUqa -EPCjjvbdwtleQxkn -EObkKvbdcJNKKfWx -DncLKvbdNsUWGdtp -DoDKjvbdWSOXbEkc -EPCkKvbdpyOhHREY -DoDKjvbdkyTSTYft -EPCjjvbdFjdrbgmV -DncLKvbdrounjDWG -DoDKjvbdVTmTfLvK -EPDLKvbdSCDeLiYk -DoCkKvbdrXPlDIxq -DncLKvbdKVuGDeHJ -DnbjjvbdrWokcIxq -EObjjvbdKVuGEEfi -EPDLKvbdrbGMlGjy -EPDKjvbdlqxtzSci -EOcLKvbdwygeeweS -EObjjvbdjKGIKNYS -EObkKvbdVrOXbElD -DnbjjvbdrMzKZLgi -EPCkKvbdMpXqWNfs -EPDLKvbdrSUkOLAm -EPDKjvbdZisIPfbG -EPDLKvbdRDbaQRES -DncKjvbdVTmUGLvK -EOcKjvbdYzcGRjWZ -EObjjvbdMuSrLNAX -DncKjvbdjgflGFnL -DncLKvbdWIXvXfxz -DoDLKvbdNHComPtk -EOcLKvbdSBceLhyL -DoCkKvbdZRMeImFR -EPDLKvbdiifIKMwr -DoCkKvbdvBDxsOeI -EPDLKvbdxmsHxShc -EOcKjvbdcyyPxZRC -DoCkKvbdsBfNMHKy -DoDLKvbdaRebhTfL -DncLKvbdypoNJKXA -EObkKvbdzRPNJKXA -DnbkKvbdTvLoitBR -EOcKjvbdWHwuxGxz -EObjjvbdZHWdAPTJ -DnbjjvbdySnJMqag -EPCkKvbdtTRsYzFD -EPDLKvbdhytelQnG -EPCkKvbdTppntuHm -DnbjjvbdZeYGzhIb -EPCjjvbdIwsaglQp -DoCkKvbdpstGrRkU -EObjjvbdCJLBjiFj -EOcLKvbdePErjstS -EPDKjvbdpxnhGqDx -DnbjjvbdZyEKOClS -DoCjjvbdpyOhHREY -DncLKvbdNGcPmPuL -DoDLKvbdQwNccLgc -EPDKjvbdmbJvxPNu -DnbkKvbdQwOEDMHc -DoDKjvbdXrlAltOx -EPCkKvbdGQASvgGZ -EOcLKvbdmttykKSG -EOcLKvbdGLFSbgmV -DncLKvbduCbuWvOo -EPDKjvbdSQTfiecw -DoCkKvbdYkqctNkm -DoDLKvbdlZSqsZHU -DoDLKvbdqGEEtVaI -EObjjvbdhytekpmf -DoDKjvbdmuUzKiqf -EObjjvbdrMyiyLhJ -DoDLKvbdEARhlzWw -EObjjvbdaRfCgsek -EPDKjvbdaNKaruNH -EOcLKvbdJqZeOenF -DnbjjvbdTfzmlXVe -DoCjjvbdzQoNIjXA -EObkKvbdMpYQvNfs -DncLKvbdVrOYCElD -DoCjjvbdijGIJlwr -DoDLKvbdrXQMDIyR -EPDLKvbdEYYMUTtM -DncKjvbdkHgMFenL -DnbjjvbdqdFIpOWB -EObkKvbdqFceTvAh -EObjjvbdyOSgxSiD -EOcKjvbdDnbkKvcE -DoDLKvbdYqMeImFR -EObkKvbdwtleRZMO -EPCkKvbdrWolCiYq -EObjjvbdrXPkcJYq -DoCkKvbdtlXvaUBX -EOcLKvbdeYZssrFz -DoDLKvbdnGeYMnHZ -EObkKvbdYTLaMtOx -DoDLKvbdJcJcRKDY -EPDKjvbdeKJrVtzn -DoCkKvbdrSUkNjaN -DncKjvbdeATqNXjG -EObkKvbdqlzJyLhJ -EObjjvbdDjIJvXjA -EObjjvbdzGyMAMdw -DoDLKvbdFfJrNiTq -EOcLKvbdBhkCKiGK -EObjjvbdpssgSRjt -DncKjvbdKaLGlbXq -EOcLKvbdlYrqrxgU -EPCjjvbdVqmxBeLc -EPDLKvbdZQmFJNFR -DoCkKvbdkCkkQfuH -DncKjvbdauCGwjsh -DoCjjvbdEASIlywX -DncKjvbdLAjgNBxR -DncKjvbdCDpBVimG -EOcLKvbdqlzJxkhJ -EPDLKvbdtvNxKRTA -DnbkKvbdGLFScINV -DoCkKvbdQvmdCkhD -EPDKjvbdFjdrbhNV -EPCkKvbdZLrETnLm -EPDLKvbdTvLoisaR -EPDLKvbdsrrTZZdc -EPCkKvbdZMRcsmlN -DncLKvbdxnTHxTIc -EOcKjvbdzROliJwA -EOcKjvbdsQVnjDVf -EObkKvbdqGDdsvBI -DncKjvbdwtleQxkn -EObjjvbdTqRPUuHm -DnbjjvbdVwIwvEFH -EPCjjvbdZshhxcsO -DoCkKvbdKCibqJbx -EOcKjvbdUVlQKTaR -EObkKvbdVTmUFlWK -EOcLKvbdmIctRVRa -DoDKjvbdPIAYZAYa -DoCkKvbdjvWnDbXw -DnbjjvbdtvNwjRTA -EObjjvbdNHComQUk -EOcKjvbdySnImRbH -DoCjjvbdDjIKVxKA -DncLKvbdKefHbApu -EObjjvbdehLWRmpg -EOcLKvbdJTZAsMwl -DoDKjvbdZirgpHCG -EObkKvbdozmcjxPA -EObkKvbdsZkosAgn -EPCjjvbdSxKlNzjx -DoCjjvbdfILVrNpg -EPCjjvbdGGKRnJTq -DnbjjvbdpssgSSLU -DoDKjvbdrDdiPmvB -EPCkKvbdZtJJYcsO -DoDLKvbdNdctIhkE -EPCjjvbdcImJkFvx -EOcLKvbdGLErbhNV -DoCkKvbdnQZxukYb -EPCkKvbdWSNxBeLc -EPCkKvbdsPvOjDWG -EOcLKvbdeFOqavbj -EPCjjvbdjAQHApHK -EPDKjvbdwXMBVaVu -DncLKvbdMowqWNfs -DoCkKvbdRbEFMJYk -DoCkKvbdrNZjZLhJ -DoCjjvbduDCtwWPP -EObjjvbdNeEUJIjd -DnbkKvbdlYsRsYgU -DoCjjvbdUxgsyjnn -EObkKvbdbLMGPODA -DoCkKvbddneTKtUS -EOcKjvbdvvkaWAuu -EPDKjvbdVUNUFkuj -EObjjvbdKDKDQjCx -EPDKjvbdnUuZjiqf -DoCkKvbdsCFmMGkZ -DncKjvbdrpVnjDWG -DnbjjvbdiZtfMQmf -DoCkKvbdwWkaVaVu -DoCjjvbdSCDeLiZL -DncKjvbdEYYLtTsl -EPDLKvbdOSsufeVQ -EOcLKvbdWSOXadlD -EPDLKvbdpaJFAXHd -DncKjvbdSCDdkhyL -DoCjjvbdIMBzmvqL -DnbkKvbdVUMsfLvK -DoCkKvbdlhctQuSB -DncKjvbdJuuGEFGi -EPCjjvbdJSyAsMwl -EOcKjvbdUtMtGMVj -EPCkKvbdHDkWKCKK -DncLKvbdySnImRag -EPCjjvbdwMvAMcdm -DnbkKvbdelevfmJk -EPDKjvbdYORAYUvU -EPCkKvbdVwIxWDeH -EObjjvbdtvOXipsA -DncLKvbdhlEdOUcZ -EOcLKvbdTlVoAuoJ -EPCkKvbdNQXpunHT -EOcLKvbdWXJXvDdg -DnbkKvbdZoOJFEzK -EObkKvbdmbKWwoOV -DnbjjvbdiHKDYvKV -DncKjvbdfSBWzlDP -DoCkKvbdLBKflawq -EObkKvbdUsmUFkvK -EObjjvbdLqwNZtpz -DoCkKvbdsBfNLfjy -DncLKvbdjvWmcbYX -EObkKvbdaMkBruMg -EPCkKvbdHkazmvqL -DnbjjvbdRyjHrbvA -EPCkKvbdNQXpvOHT -EObjjvbdOYPVzcnU -DoCjjvbdaSGCgtFk -DoDKjvbdxmsHxSiD -EObjjvbdZirgogCG -EOcLKvbdmuVZkKSG -DncLKvbdUyHszKnn -DnbkKvbdxmsHxTJD -EPCkKvbdVrOYBdkc -EOcLKvbdhkdcmuDZ -DncKjvbdwuMdpyLn -EObkKvbdxVMdpxlO -EPDKjvbdmbKWwoOV -DoCjjvbdhkeDmtby -DncLKvbdLFehCBQu -DoCkKvbdYSkaNUOx -DnbkKvbdmaivxPNu -EPDKjvbdfNFvgNKL -EPDKjvbdhlEdOUcZ -EPDLKvbdTukpKUAq -DncKjvbdUVlQKTaR -DnbkKvbdYgWdAPSi -DoDKjvbdIwsbHkpp -EOcKjvbdlZTSTYgU -DoCkKvbdNHColpVL -EPCjjvbdxrmhmRag -EObkKvbdUxgsyjnn -DoCjjvbdsQVoJbvG -DoCkKvbdBdQBVjMf -EObkKvbdIHHZxxXg -EOcKjvbdJuuFdEgJ -DoDLKvbdwyhGGXeS -DnbkKvbdSKyFuGkT -DoDKjvbdiGibxvKV -DncKjvbdnBjXXoNu -DnbkKvbdFpATWffZ -EPCjjvbduDCtvvOo -EObjjvbdIsZArlxM -DncKjvbdEvYopMjF -EObjjvbdwuMdqYkn -DoCjjvbdwyhFfYEr -EPCjjvbdqUTfrSLU -EOcLKvbdzGxlANEw -EPCjjvbdEOcKjwCd -EPCkKvbdOSsvGeUp -DncKjvbdhlEcnUcZ -EPCkKvbdUVkoitAq -DnbjjvbdOAJTTjSA -DncKjvbdqmZiyLhJ -EObjjvbdpstGqrLU -EPDLKvbdFxuVAcwb -DoCkKvbdauBgYKsh -DnbjjvbdZMRcsmkm -EOcLKvbdqrVLNkBN -DoDKjvbdNQYRWNgT -DoCjjvbdCTBCtFvr -DncKjvbdZyEKNcMS -EPCkKvbdVviYVdFH -DoDKjvbdePErjtUS -EObkKvbdwtmFRZLn -DncKjvbdpedEsvAh -EPCkKvbdzoQRFClY -DoDKjvbdIxTbIMQp -DoDLKvbdxsOImSCH -EPCjjvbdYfwEAOri -EOcKjvbdnPyyWLZC -EOcKjvbdhlFEOVCy -DoCjjvbdwyhFfXdr -DnbkKvbdZQmEhleR -DnbjjvbdbAudepPw -DnbjjvbdMpXqVmgT -DncLKvbdNeEUIhjd -EObkKvbdMfbomQUk -DoCkKvbdqvpMDJYq -DoDLKvbdfekzNfgA -EOcLKvbderAvzlCo -EOcLKvbdiZtelQnG -EPDLKvbdRXNdClHc -EPDKjvbdNrsufeUp -DncKjvbdZQldiMeR -EObkKvbdiLdcmtby -DncLKvbdZQmEhleR -DncLKvbdZRNEiMdq -DncLKvbdWRmwadlD -EPDLKvbdGLEsDHlu -DncLKvbdZjTIPgCG -EObjjvbdxnTIXsIc -EPCjjvbdliETptqa -EOcKjvbdlrZUyrci -DoDKjvbdbKlFnnDA -DnbjjvbdwXLaWBWV -DoCkKvbduaEZSoFI -EPCjjvbdRyjHrbvA -EPCjjvbdLhakpxAS -DoCkKvbdmaiwXoNu -EOcKjvbdyNrhYShc -EObjjvbdsCFllGjy -DnbkKvbdZshhxdTO -DoDKjvbdZjShPfaf -EOcKjvbdmajWwnmu -EObjjvbdJvUfEFHJ -EPCkKvbdOEcsiIkE -EPCkKvbdkNBlZeGo -DoCjjvbdVviXudFH -DnbkKvbdjJfHjMxS -DoDLKvbdGBPRZJzm -EOcKjvbdiCObdvqR -DnbjjvbdVwJYWDeH -DncKjvbdGAoQxizm -EObjjvbdxmsIYSiD -DncLKvbdqqtkOLAm -EObjjvbdvvlAvBWV -DncKjvbdvAdZTPFI -EOcKjvbdjAQHAogK -EObkKvbdpxoIHRDx -EPCkKvbdffLynGgA -EPDLKvbdTvLpKUAq -EOcKjvbdmttzKjSG -DoCkKvbdqwQMChyR -DoDKjvbdrzMPsAgn -DoDLKvbdyYJKCPyk -DoCkKvbdRbEEkhxk -EPCkKvbdBdQAuilf -EPDLKvbdRaceMIyL -EOcKjvbdraelkfjy -EOcLKvbdEASIlzWw -DnbkKvbdOSsvGeUp -DnbjjvbdmuVZkJrG -DnbkKvbdVwIwvDeH -DoDKjvbdwWlAvBVu -DncKjvbdSKyFuGjs -DoCkKvbdOXnuzcmt -DncKjvbdrXPlDJZR -EPDLKvbdsBfNMGjy -EPDLKvbdiifHilwr -DnbkKvbdjvWmcbYX -DoDLKvbdZnmhddyj -EPCkKvbdemFvfmKL -EPDLKvbdNxPVzcnU -DnbjjvbdRkYfUgLT -EPCkKvbdZRMdhldq -EObjjvbdYqMdhmFR -DncLKvbdJvVGDeGi -EPDKjvbdUtMsfLuj -DoDLKvbdZyEJnClS -DnbkKvbdjcMKqGtg -EPCjjvbdDnbjkXDE -DnbjjvbdLGGICAqV -EPDKjvbdWIXvYGxz -EOcLKvbdBiLCKhfK -DnbkKvbddwzUURez -EOcLKvbdZQldiMdq -DncLKvbdKVtfEFGi -DoCkKvbdvAcxsPEh -DncLKvbdjvWmcbXw -EObkKvbdqiAJeNOe -EOcLKvbdUMWPBWPJ -EPCjjvbdOFDshhjd -EOcLKvbdVrNxBeMD -EPDKjvbdiGicZWKV -EObkKvbdtTRrxzFD -DoCjjvbdjJfHilxS -DoCjjvbdelfXGmKL -EPCjjvbdIrxaTMwl -EOcLKvbdRECaPpcr -DnbkKvbdiLeDmtby -EPDLKvbdGcjvKCJj -EOcKjvbdWWiXuceH -DoCkKvbdpstHRrLU -EPDLKvbdkHgLeemk -EPCkKvbdzGxlANEw -EObkKvbdjKGHjMwr -EPCkKvbdiUzEvquC -EOcLKvbdwXMBWBVu -EObkKvbdeKKRvUzn -DncLKvbdSBceLhxk -DoDLKvbdJbibqJbx -DncKjvbdeAUQlxJf -EPDKjvbdbUafwkUI -DoCkKvbdxnTIXriD -EPDLKvbdRacdlJYk -EOcLKvbdmgFXlnGy -EOcKjvbdHELWJaij -EPDLKvbdLhbMQxAS -DnbkKvbdhbPDFXRR -EOcKjvbdqwQMDIxq -DncKjvbdeOdrkTsr -EObjjvbdyOSgwriD -EPCkKvbdjmCLyeHP -DnbjjvbdZisHpGbG -EOcKjvbdIHGzZXwg -DncLKvbdwWkaWAvV -DoDKjvbdffLzOHHA -EPCjjvbdqZPIHREY -DoCkKvbdDjHivYKA -DoDLKvbdYNqAYVWU -EPCkKvbdzjUpPcrt -DncLKvbdlqyVZrdJ -DncLKvbdDoDLLXDE -DoCjjvbdcSbjtDia -DoDKjvbdDxXlUTsl -DncLKvbdJYTahLpp -EObkKvbdNQXqVnHT -EObjjvbdijGIJlxS -EObjjvbdOStVfdtp -EPCkKvbderBWzlCo -EObjjvbdKQzEnenF -EPCjjvbdmtuZkKRf -EPCkKvbdEJhJuxKA -EPCjjvbdgGLymfgA -EObjjvbdRbDeLhxk -EOcKjvbdrSUkNkAm -DoDLKvbdEOcLLXDE -EObjjvbdBhjbKiFj -DoDLKvbdBdQAuimG -DnbjjvbdDwwkstTl -DoDLKvbdVwJYVdEg -EOcKjvbdACqwizJQ -EObjjvbdZsiIyETO -EObkKvbdGLFSbhMu -EOcLKvbdFkFTChNV -DnbjjvbdVBCRSprZ -DoCjjvbdssRsYydc -DoCkKvbdUMWOaWOi -DoDKjvbdYSlBMsnx -EObkKvbdNsTvHFVQ -EPDKjvbdZisIPfaf -EOcLKvbdpssfqqjt -EPCkKvbdNHCpMpVL -EPDKjvbdczZPwxpb -EPCjjvbdnBivxPOV -DoDKjvbdUtNTelVj -EPDKjvbdjhHMFfNk -EObjjvbdEuyPolie -EPDLKvbdKQydneme -EPCkKvbdQvnECkgc -EPDLKvbdatbGxLTh -DoDLKvbdNPxQvOGs -DoDLKvbdySnImSCH -EObkKvbdvBEZTOeI -DoCjjvbdatagXkUI -DnbjjvbdmbKXXnnV -EOcLKvbdmbKXXoNu -EPCkKvbdNsUWGduQ -DncLKvbdpssgSRjt -EPDLKvbdiUzFXSUb -EObkKvbdyzeORgiI -EOcLKvbdKDKDQibx -DoCjjvbdmJDtQuSB -DncLKvbdaNKaruMg -DnbkKvbdOEctJJKd -EObjjvbdkVvnECXw -EObkKvbdKaLHMbXq -DoCjjvbdYzcFqiuy -DoCkKvbdvwLaWAvV -EPDLKvbdnBiwXoNu -EOcLKvbdLBKgNBwq -EPCkKvbdCJLBjiFj -EObjjvbdptUGqrLU -DoCkKvbdWXJYWEFH -EOcLKvbdNeEThiLE -EPCjjvbdtAHQhAAr -EOcKjvbdUGzmlXVe -DnbkKvbdrylPsBIO -EPCjjvbdICLzEzAD -EPDKjvbdrpVoKCuf -EPCjjvbdRkZFuGjs -Dnbjjvbdznopdbkx -DoDLKvbdmgFYNNfy -EObjjvbdptUHRrKt -DoCkKvbdhfjDZWJu -DncLKvbdLGFgbBRV -EPCjjvbdZnnIeEyj -DoDKjvbdmtuZjirG -EPCkKvbdmbJvwoOV -DncLKvbdJpydoFme -EPDKjvbdFyUtaEXb -DnbkKvbdqFcdtWAh -DnbjjvbdWRnXaeMD -EOcKjvbdCIkBkJGK -EOcKjvbdJTZBSlxM -DnbjjvbdziuPocsU -DnbjjvbdhzUelQmf -EPCjjvbdUaBqSprZ -DncLKvbdxZgefXdr -EObjjvbdKVuFdEgJ -EPCjjvbdAMgyTWzY -DnbjjvbdiHJbxuiu -DoDLKvbdUtNTekuj -EPCjjvbdUQpnttgm -DoDLKvbdVAbRTRSZ -DncKjvbdkxsSTYgU -DnbkKvbdMfbomQUk -DoCjjvbdTAEiHbOd -DoCjjvbdczZPxYpb -DnbkKvbdUVkojUBR -DncKjvbdddnqavbj -DoDLKvbdxwhiapZk -DoDKjvbdZirhPfaf -DoDKjvbdTukoitAq -DoCjjvbdrJAKFMne -EObkKvbdZQmEhmFR -DoCjjvbdHgHZyXxH -DncLKvbdNHCpNPuL -DoCkKvbdfIKvRmpg -DoCjjvbdNsUWHEtp -DoCjjvbdpfDdtWAh -DoDLKvbdBhkCKiGK -EObjjvbdtSqsYydc -EPDLKvbdQccBPqES -EOcLKvbduMXvaUAw -EOcLKvbdZMRctNkm -EObjjvbdRadFMIxk -DncLKvbdjhGlFfOL -DoCjjvbdhtzEvqtb -DnbjjvbdUtNUGMWK -EPCjjvbdaaWEfQQX -DncKjvbdunszpkOt -DoDKjvbdEJgjWYKA -DoCkKvbdQYmAGsRj -DoCjjvbdmozYujyC -DnbkKvbduVnYKRTA -DnbkKvbdZxcjNblS -EPDKjvbdzRPNIiwA -EObkKvbdzitopESt -EObjjvbdfILVrNpg -DoCjjvbdNGcPmPuL -DnbjjvbdEYXlUUTl -DnbjjvbdraellHKy -DoDKjvbdZQmEhmFR -DoCkKvbdZnnIdeZj -DnbjjvbdjcMKpgVH -EObkKvbdTfznLvue -EOcKjvbdFkErcIMu -DncKjvbdGdKvKBjK -DoCjjvbdVvhwvEFH -EPCkKvbdmJEUQuSB -DncKjvbdIsZBSlxM -DnbkKvbdmbJvxPNu -DoDKjvbdTqRPVUhN -DoDLKvbdwygefXdr -DnbjjvbdLGGHbBRV -DncLKvbddijSVtzn -EObkKvbdZnnJFFZj -EOcKjvbdCTBCsfXS -DoDLKvbdmttzKjSG -EOcKjvbdyNsIXsIc -EOcKjvbdbVBgXjtI -EOcLKvbdGFjRnJUR -DnbkKvbdYTMBMtOx -EPCkKvbdNGcQMouL -DoDKjvbdJcKDQibx -DoDLKvbdrpWOicWG -EOcKjvbdRaceMIyL -EPDLKvbdWWiYWDeH -EPDLKvbdczZQXxqC -DoDKjvbdLBKgMaxR -DnbjjvbdZjShQHBf -DoCkKvbdKaLGlbXq -DnbkKvbdGdKujCJj -EObkKvbdIBkydzAD -DnbkKvbdqUTgSRkU -EOcLKvbdBiKbKhfK -DoDKjvbdVwIwvEEg -EPDKjvbdIjEAKQHE -DoCkKvbdEPCkLWcE -DoDLKvbdrDeJQNua -EOcLKvbdNddUIhjd -EPCkKvbdYNqAXtvU -EObkKvbdUaCRSqRy -EPCjjvbdqqtjmjaN -EPDLKvbdhbOcFWpq -DoDKjvbdULvPBVni -DoDKjvbdGGJrOJTq -DoCkKvbdqceIpNvB -EOcKjvbddePSCXCj -EPCjjvbdVUNTekuj -DnbjjvbdLGGHbApu -DoCkKvbdcTDLTcia -DnbkKvbdNsUWGeVQ -EObjjvbdZLqcsmlN -EObkKvbdxrnJMrCH -DnbjjvbdqvolChxq -EPCjjvbdaNKbSuNH -DnbkKvbdlYrrTYft -EPCjjvbdwtldpyMO -DnbkKvbdNddThiKd -EPCkKvbdjJfIJlwr -EPCjjvbdJpzEoFme -DnbkKvbdiMEcmuDZ -EOcKjvbdkVvmdBww -EOcLKvbdAMgxrwZx -EObjjvbdatbGwjtI -EOcKjvbdTAEhhCOd -DnbjjvbdfNFwHNJk -EObjjvbdVBBqSpqy -EPCjjvbduaEZSndh -EPDLKvbdpstGqqkU -DnbkKvbdIwtCHlQp -DncKjvbdrbGNMGkZ -EOcKjvbdILaznWqL -DoCjjvbdTXjkmzkY -DoCjjvbdIGfyyXxH -EOcKjvbdjKFhKNXr -EPDKjvbdRDcApRES -EObjjvbdmfdxNNfy -EObjjvbdDihKWYKA -DoCjjvbdzaAOffal -EPDLKvbdQccBQQcr -EPCjjvbdTlWPAvOi -DnbjjvbdqUTfrSLU -EObjjvbdVAbRTRRy -DoCkKvbdnCKWxPOV -EOcKjvbdFjdrbhNV -DnbjjvbdrzLpTAhO -DoCjjvbdDxYMUUUM -DnbjjvbdmoyxujyC -DnbjjvbdUVkoitAq -EObjjvbdrEEhpOWB -DncKjvbdRjyGVGjs -DoCkKvbdJJdAKPgE -DoDKjvbdKDJbqKCx -EPDLKvbdcTDLUDia -DoCkKvbdePEsKssr -EPCjjvbdJbjCqJbx -DoDLKvbddBrmSATm -EOcLKvbdlhcsqVRa -EOcLKvbdKfGICBRV -EPDLKvbdrovPJbvG -DoCjjvbdbAvFGQQX -EPDLKvbdlZTSSxft -DnbjjvbdLqvmZuQz -DncLKvbdZshiYdSn -EOcLKvbduMXvaTaX -EObjjvbdZtJJYcrn -EOcLKvbdczZPwxpb -EPDKjvbdatafwjtI -EObkKvbdsQVnicWG -DnbjjvbdrWokcIyR -DncLKvbdJuteceGi -EOcLKvbdADRwiyiQ -EPDKjvbdCIkBjiFj -EPDKjvbdrNZjYkgi -DnbkKvbdSLYeuHLT -DoDKjvbdkNBkzEfo -DnbkKvbdcyxowyQb -EPDKjvbdYkrETnMN -DoDKjvbdwWlAvAvV -EPCkKvbdczZPxZQb -EPCkKvbdKCibpjCx -EOcKjvbdhytfLqOG -DnbjjvbdxmsHwriD -EPDKjvbdmfeYMmgZ -DoCkKvbdNQXpvNfs -DncLKvbdirziSkJz -EOcKjvbdHffzYxYH -EOcKjvbdWXIxWDdg -DncLKvbdVvhwuceH -DoDLKvbdFxtuBDxC -DncLKvbdJcKCqJbx -DoCkKvbdxLWcgzyf -DnbjjvbdCJLBjiGK -EPCjjvbdcasMrATm -DoDLKvbdLFfICAqV -EPDKjvbdqmZjZMHi -DncKjvbdczZPwxqC -EObkKvbdrWpMDJYq -EPCjjvbdLFehCBQu -EPCkKvbdRzJgsDWA -DoDKjvbdIsZArlxM -DncLKvbdqFcdsuaI -DncLKvbdULvPBVni -EOcLKvbdWXJXuceH -EPDLKvbdaNLCTVMg -EObkKvbdUxhUZjnn -DncLKvbdeATplxKG -DoCjjvbdmSYtzSci -EOcLKvbdkMbLzEfo -EPCjjvbdrpVoJcWG -EPCjjvbdXrlAlsoY -DoDLKvbdUxhTzKnn -EPCjjvbdOEdUJJLE -EObjjvbdKDJcRKCx -EPDKjvbdcyxpXxqC -DnbkKvbdZxdKODMS -DncLKvbdcImJjfWx -DnbjjvbdpfEFTuaI -DnbkKvbdZoNheEyj -EOcKjvbdjFKfuPAO -DnbkKvbdFVyQQNKF -DnbkKvbdDjHiuwjA -EPCkKvbdMgDPlotk -EPDKjvbdxnShXsIc -DoDLKvbdOTUVfduQ -DncKjvbdFejRnIsq -DncKjvbdSQUHJfEX -DncLKvbdRXOEDMHc -DoCkKvbdsZkosAgn -DoDKjvbdUsmUGLuj -EPDKjvbdiifIJmYS -DoDLKvbdZQmEhmFR -EObjjvbdeUAUASlv -DoDLKvbdUsltFlVj -DoCjjvbdSiZjRABM -EOcLKvbdegkVrORH -DoDKjvbdYlRdTnLm -DncKjvbdzitopESt -DnbkKvbdhbPDEwQq -DncKjvbdSKxetgLT -DncKjvbdZQmEiNFR -EPDLKvbdUyITzLPO -DnbjjvbdznpQdblY -EObkKvbdbLMFoODA -EPDLKvbdBhjbLJFj -DoDKjvbdNwoVzdOU -DncKjvbdvBDxsPEh -DnbkKvbdSBceLiZL -EPCkKvbdOhAXyAZB -EObjjvbdZisIQGbG -EOcLKvbdAMgxrvyx -EPDKjvbdCDpAvKMf -DoDKjvbdxVMdpxlO -EOcKjvbdJbicRJbx -DoCkKvbdTppnuVIN -EObjjvbdZjTIPfbG -DoCkKvbdpyOhHQcx -DoCjjvbdfHjvSOQg -DoCjjvbdzoPpdcMY -EPDKjvbdmfeYNNfy -EPCjjvbdXGYzUAPT -DoDLKvbdypnmJKXA -DnbkKvbdBsAcUFwS -DoDLKvbdQYmAGsRj -EObjjvbdUxhTyjnn -DoCkKvbdrouoKCvG -DoDLKvbdhtydwSUb -EPCkKvbddwytUSFz -EOcKjvbdrbFmLgLZ -EObkKvbdbPffckzd -EObjjvbdDxXlTtUM -DnbkKvbdqGEFTvAh -EPCjjvbdDoCkKwDE -EOcLKvbdVviYWDeH -EPCjjvbdWSOYCFLc -DncKjvbdmbKWxPNu -DoCkKvbdZshhxdTO -DoDKjvbdwtldqYkn -DoDLKvbdYSlBMsoY -EPDKjvbdRkZFuHKs -DnbkKvbdeYZstRez -DoCjjvbdrNZixlIJ -DoCjjvbdmgFXlmgZ -EPCkKvbdYlRcsmlN -DoCjjvbdOFETiJKd -EPDLKvbdBhkCLJFj -EPCjjvbdmuVZkJrG -DnbkKvbdFjeTChMu -DoCjjvbdJTZBSlwl -DnbkKvbdozmdLYPA -EObjjvbdtbbtvuoP -DncKjvbdqUTfrSKt -DncKjvbdyTOImSBg -DnbjjvbdcTCkTdKB -EOcKjvbdKaKgNCXq -EPDKjvbdZoOIeEyj -DoDKjvbdYqMeIleR -DncKjvbdnPzZWLZC -EPDLKvbdZirhPfbG -DnbkKvbdGQATXGey -EOcKjvbdZsiJYcsO -DnbkKvbdrWpMDJYq -DoCkKvbdMuTSLNAX -EObjjvbdpxnhHRDx -EOcKjvbdzitpQESt -EPCjjvbdhuZeXSUb -DoCjjvbdNeDtJIkE -DoCkKvbdCEQBWKMf -EPCkKvbdHEKvKCJj -EPCjjvbdatbHYLTh -EObkKvbdLGGICBRV -DncKjvbdRjxeuGjs -DoDKjvbdnHFYNOHZ -EObkKvbdIryAsNYM -EObjjvbdmfdwlnGy -EOcLKvbdNeDsiIkE -DnbjjvbdJTYaSlxM -DoCkKvbdRadEkiYk -DncLKvbdjKFgjNYS -EObkKvbdZjShQGaf -EOcKjvbdKfFgaaQu -DoDKjvbdhgJbyVjV -DoCkKvbdwuNFRZMO -DncLKvbdfekzNfgA -DncKjvbduCcVWuno -EPDLKvbdVrNxBdkc -DnbkKvbdRkYeuHLT -DoDLKvbdwuNEpxlO -DoCjjvbdQccAoqDr -EOcKjvbdUGzmkvvF -DncKjvbdEJhKWYKA -EOcLKvbdssSSxyeD -DoCjjvbdVviXvEEg -DnbjjvbdEuxopNKF -EObkKvbdLAkGlbXq -DoCkKvbdZsiJZESn -DoCkKvbdhkeEOUby -DnbkKvbdbhlikGXY -EObkKvbdLBLGmCYR -EPCjjvbdxUleQyLn -DncLKvbdrbGNMGjy -DoCkKvbdddoSBwDK -EPDLKvbdkyTRsYgU -EPDKjvbdehLVqmqH -EPDLKvbdrbFmMHKy -DncLKvbdmbJvwoOV -EOcLKvbdVUNUFkvK -EPDLKvbdrpWPJbvG -DncKjvbdGAnpxizm -EOcKjvbdyzeNqghh -DoDLKvbdhbPDFWpq -DoDLKvbdfVzxQJzs -DoDLKvbdUMWPBVoJ -EOcLKvbdRpTfjFdX -EPCkKvbdpfDeUWBI -EObjjvbdmuUyjirG -EObjjvbdtbbtwWOo -EObkKvbdrylPsAgn -EOcLKvbdmSYtysEJ -DncKjvbdSCDeMJYk -DoCjjvbdTppoUthN -EPDKjvbdVTmUFkuj -EObjjvbdIsZAsNXl -EOcKjvbdSBcdlJYk -DnbkKvbdZQleIleR -DnbjjvbdddoSBvcK -EOcLKvbdNHComPuL -DncKjvbdiCPCdvqR -EOcKjvbdliDspuSB -EObkKvbdzoPpeCkx -DnbjjvbdcJMijevx -DoDKjvbddZxpYZQb -DoDKjvbdkySrSxft -DoDKjvbdyXhiapZk -EPCkKvbdOAIrsirA -EObkKvbdUaBqSqSZ -EPCkKvbdZtJIyESn -DnbkKvbdTvLoitAq -EPCjjvbdyzeNrIJI -EOcKjvbdiCPDEwRR -EPCkKvbdnCJvwoNu -EPCkKvbdIGfzZYXg -DoCkKvbdkySqrxft -DoCjjvbdZdxGzgiC -DncKjvbdzitpPcsU -DncLKvbdbVCHXjsh -EPCkKvbdlhcsqVSB -EPCjjvbdGYtuAcxC -EOcLKvbdjAQGaQHK -EObjjvbdjlakzFGo -EOcLKvbdvwMAvAuu -EPCjjvbdTqQoVUhN -EPCkKvbdeEnrBwCj -DoCkKvbdsCGMkgKy -DnbjjvbdhkeDnVDZ -EPCjjvbdOFDshiLE -DnbjjvbdDwwlUTsl -EPCkKvbdKWUedEgJ -EPDLKvbdsQVnicWG -EPCkKvbdjgflFfOL -EObkKvbdQYmAHTSK -EObkKvbdSPsgJecw -EObjjvbdjAQGaPgK -DoDLKvbdDxXlUUUM -DoCjjvbdegjuqnQg -DnbkKvbddwzTsqez -DncKjvbdxxJJbPyk -EOcKjvbdGKeTChMu -DoCkKvbdeFPSCWcK -EObkKvbddeOrBwDK -EPCkKvbdaNLBsUmH -DoDLKvbdRpTgJedX -EPCkKvbdkySrSxgU -EPCkKvbdVYhTzKoO -EPCjjvbdxxIjCPyk -EPDLKvbdVrOXadkc -EOcLKvbdEOcKjwDE -DncLKvbdmfeYMnGy -EPCkKvbdVAaprprZ -EPCjjvbdFWYpQMjF -DoCkKvbdqrUjmkAm -DoCjjvbdQvmdDLhD -EPDLKvbdeATqNYKG -DnbkKvbdLGGHaaQu -EObjjvbdezvZEhtX -DnbkKvbdjuwNdBww -DncKjvbdJTZAsMwl -EPDKjvbdkxrrTYgU -EPDKjvbdbAudfQQX -DoCkKvbdVUNUGMVj -EPDLKvbdaNLBsUlg -EPDLKvbdDwxLtUUM -EPCjjvbdMgColpUk -EPDLKvbdaogGdLzd -EPDKjvbdzGxlANFX -EPCkKvbdUQqOuUgm -DoDKjvbdEPDKkXCd -EPDKjvbdbsCkTcia -EObjjvbdTAEhhBnd -EPCkKvbdhzVFkpmf -DnbkKvbdaSFcHtGL -DoCjjvbdGBOpxizm -DncLKvbdGYttaEYC -DoDKjvbdqYoHfpdY -EOcKjvbdrouoKCuf -EOcKjvbdiCPDFWqR -DnbjjvbdVAaprqRy -EPCjjvbdePFSjtUS -DnbkKvbdLGGICBRV -EPDLKvbdkMalZeHP -DoDLKvbdJutfEFHJ -DoDKjvbdVBCRSqSZ -EObjjvbdvvlBWBWV -EOcLKvbdFVxpPmJe -DoDLKvbdKfGHaaRV -DnbjjvbdBvzdIdpW -DncKjvbdNsUWHFUp -EPDLKvbdrSVLNjaN -EPDKjvbdgGMZnGgA -DnbkKvbdSBceMIyL -EOcLKvbdSBdFLiYk -EOcLKvbdRyigrcWA -EPDKjvbdaMkBruNH -DncKjvbdUaCRSpqy -DnbjjvbdIMBzmvpk -DnbkKvbdbVCGxKtI -DncLKvbdliDtQuSB -EObkKvbdHDkVjBjK -DncKjvbdmSYtyrci -DnbkKvbdxVMdpxlO -EPCjjvbdRpTfjGDw -EPCkKvbdhancEvpq -EPDLKvbdNsTvHEuQ -DoDKjvbdfekymfgA -EObkKvbdUWLojUBR -EPCjjvbdJXtBgkpp -DoCjjvbdEPCkLXCd -EPCjjvbdZxcjNcLr -DoCjjvbdZsiJYcrn -EPCkKvbdZtIiZDrn -EObkKvbduLxWaUBX -EObkKvbdZdxGzghb -EOcKjvbdkClLRHVH -EOcLKvbdFjdsDINV -DncKjvbdNeEUIiKd -EPCkKvbdYpmFJNFR -EPDKjvbdlhcsptqa -DoDLKvbdnCKWwoOV -EObkKvbdDnbkLXCd -EObkKvbdQwOECkhD -EOcKjvbdUaCRSpqy -EPCjjvbdBcoaVjNG -DnbjjvbdxmrhXsJD -EObjjvbdcImKKewY -DnbkKvbdpyOgfpdY -DnbjjvbdpyOggRDx -EObjjvbdEOcKjwDE -DnbkKvbduCcUwVoP -EOcKjvbdhgKCxuiu -DoDKjvbdiZtelQmf -DoDKjvbdnBjXYOnV -EPDLKvbdczZPwxpb -EPCjjvbdADRwizJQ -EObjjvbdfVzwpJzs -DnbjjvbdxxIiapZk -EPCjjvbdjcLkQfuH -EPCjjvbdcyyQYYqC -DoCkKvbdEuyPpNJe -DncLKvbdcJNJkGWx -DoDKjvbdZoOIdeZj -DoCjjvbdWHxVwgYz -DnbjjvbdeEoRbWbj -DncKjvbdZMSDsnLm -EOcLKvbdbiNKLFvx -DnbkKvbdjcLjqHVH -DnbjjvbdEYXktTtM -EPCjjvbdCSaCsfWr -EOcLKvbdBdQAuimG -EObkKvbdqdFIpOWB -DncLKvbdelevgNKL -EObkKvbdZMRdUNkm -EPCkKvbdrDdiQOVa -DoDLKvbdCWzdJFQW -EObjjvbdxUleQyMO -DncKjvbdBsAcTfXS -EOcKjvbdRMxBxmtz -EOcKjvbdSKyFuGkT -EPCkKvbdEuxooljF -DncLKvbdYgWdAPSi -DoCkKvbdiHJcYvKV -EPCkKvbdZQldiNFR -DncKjvbdjAPgAofj -EObjjvbdkVvmdBxX -DoDLKvbdsBfMlHLZ -DoDLKvbduWNxKQsA -EObjjvbdOTTugEtp -DoCjjvbdIxUBgkqQ -EOcKjvbdqFceUWAh -DnbjjvbdTkunaVoJ -EPDKjvbdiZtfLqOG -DoCjjvbdcImJkGXY -DncLKvbdpstGrSLU -DncLKvbdRpTfjGDw -DnbkKvbdznpREblY -DnbjjvbdqdEhomvB -DncLKvbdIwtBhMRQ -DoDKjvbdhtzFWqtb -EOcKjvbdiBncEwQq -EPDKjvbdZQleJMdq -EOcLKvbdLAkGlaxR -DoCkKvbdZsiIyDsO -EObkKvbdeOdsKssr -DnbjjvbdJcKCpjDY -EPDLKvbdSBdElIyL -EPCkKvbdyOTHwrhc -EPDLKvbdGLEsDIMu -EPCjjvbdmJETqVRa -DncKjvbdKDJbqJbx -EOcKjvbdbsCkTdKB -EOcKjvbduDCuXVno -EOcKjvbdrXPlDIxq -EOcKjvbdqlyixkhJ -EObjjvbdRkYfUgLT -EPDLKvbdLAkGmCXq -DnbjjvbdHgGzYxXg -DncKjvbdpstHSSKt -DoCkKvbdqvolCiYq -DoCkKvbdmgFYNOHZ -DnbkKvbdqGDeTvBI -DoDLKvbdyzeNrHhh -DnbkKvbdwzHefXeS -DoDKjvbdbiMjLGXY -DnbkKvbdTulQKTaR -DnbjjvbdsPunicVf -DncKjvbdqvpLcIyR -DncLKvbdOFEThhkE -EOcKjvbdZshhxdSn -DncKjvbdpyPHfpdY -DoDLKvbdNGcPmQUk -DoCkKvbdVgwvXfxz -DoCjjvbdCgLegAzc -DnbjjvbdauCGxLTh -DoDKjvbdqFceTvBI -DoCjjvbduMYXAsaX -EPCkKvbdrSVKmkAm -EObkKvbdOYOuzcnU -DncKjvbdYkqctNlN -DncKjvbdSZjHrcWA -DoCjjvbdrEFJQNua -EPCjjvbdRosfjFcw -EObkKvbdZoNiFEyj -EPDKjvbdVgwvXfxz -DoDLKvbdhbPCdvqR -DncKjvbdqvokcIyR -DnbjjvbdpssfqqkU -DncLKvbdzoPpdbkx -DnbjjvbduaDySoFI -EOcKjvbdEASImZwX -DncKjvbdbrcKtDjB -DoCjjvbdQccBQQdS -DoCkKvbdDigjVwjA -DnbkKvbdbVBfwkUI -EOcKjvbdIsYaSlxM -DoDLKvbdKVtedEgJ -EPCjjvbdIryArlxM -DncKjvbdpeceTuaI -EObkKvbdZshiYdSn -DncLKvbdZtIhyESn -DnbjjvbdOYOuzcnU -DoDKjvbdUxhTyjoO -EObjjvbdTppoVVHm -DncKjvbdrWolCiYq -DoDLKvbdNVSrKmAX -EObkKvbdiGicZWKV -DoDKjvbduVmwipsA -EPCjjvbdNPwqVnHT -EObjjvbdelewGmJk -EOcLKvbdgGLzNgHA -DoDKjvbdcJNJjfWx -DoCkKvbdyOTHwriD -EObjjvbdEzspeLcJ -DnbjjvbdjhHLeenL -DncKjvbdOStWHFVQ -EOcLKvbdsZlPsBHn -EPDLKvbdtcCuWuno -DnbkKvbdULunaVni -EPDKjvbdJqZdnfNe -EOcKjvbdqwPkcIxq -EObjjvbdrJAJeNOe -DnbjjvbdRECaPpdS -EPCjjvbdpfEEsvBI -EPDLKvbdIsZArmYM -EPDLKvbdJYUCILpp -EOcLKvbdYlSDtNlN -EPCjjvbdJYTbHkpp -EPDKjvbdYzbfSJvZ -EPCjjvbdRaceMJYk -EObjjvbdZisHofaf -DnbkKvbdRbEElIyL -EOcLKvbdijFhKNXr -EOcKjvbdRXNdDMID -DncLKvbdbiNKLGXY -DoDLKvbdlZSrSyHU -EObkKvbdqZPIHRDx -DoDKjvbdnPzYujxb -EObkKvbdnHEwlmfy -EObkKvbdCWzdIePv -EObkKvbdqlyiyLgi -EPCjjvbdkySqryHU -EObkKvbdcImKKevx -DncKjvbdEASJMzWw -DncKjvbdRkYfUfkT -EPCjjvbdqYoIGpcx -DncKjvbdGckWKBjK -EPCjjvbdYTLaNUOx -EPDKjvbdwtleRZMO -EObkKvbdGFiqnJUR -DncLKvbdlhdURVRa -EObjjvbdqlzJxkhJ -DncLKvbdFaPQyJzm -EPCkKvbdpssgRrLU -EObjjvbdiCOcFXRR -DncKjvbdqTtGqrLU -EPCjjvbdsCFlkgLZ -EOcKjvbduWOXiqTA -EOcKjvbdkClKqGuH -EPCjjvbdMowpvOGs -EPCkKvbdxrmhmRag -DoCjjvbdiUzFXRuC -EOcLKvbdUMWPAvOi -DoDLKvbdmfdwlmgZ -EPCjjvbdehKurNpg -EOcLKvbdBsAcTevr -EPCjjvbdZjTIPgBf -EObjjvbdPIAXyAZB -EPCjjvbdCDoaVjNG -DncKjvbdrpVnicVf -DoDKjvbdlZTSSxgU -DncKjvbdGZVVAdYC -EPDLKvbdsCGMkfjy -EPCjjvbdSPsfjFdX -DoCjjvbdJXsbIMQp -DncKjvbdzeZnzdyp -DnbkKvbdlYsRsYft -DncKjvbdbiMjLFwY -EPDKjvbdyOShYSiD -DoCkKvbdOTTufduQ -EPDLKvbdVwJYVcdg -DoCkKvbdGFiqnJTq -EOcLKvbdUslselWK -EObjjvbdkxsSSyHU -EOcLKvbdxsNhmSBg -DnbjjvbdqqtkOLAm -DnbjjvbdeFPRawDK -DnbkKvbdLZQirzuG -EPCkKvbdFWYpPlie -EObkKvbdrWpMCiYq -EOcKjvbdiiehKNXr -EPDKjvbdEvYopNJe -EPCkKvbdxrmhmSCH -DoCkKvbdptUHSRkU -EOcKjvbdKCjDRJcY -DoDLKvbdrMzKYkgi -DoCjjvbdZLrDtNkm -DoCkKvbdqYnggQcx -DnbkKvbdrovOibvG -DncKjvbdADRwizIp -EOcLKvbdZisHpHCG -EPCjjvbdZRNFImFR -EPDKjvbdVwIxVceH -EOcKjvbdrDeJQNua -EPCkKvbdIxTaglQp -DncKjvbdGFiqmiUR -EPCjjvbdVwJXvEEg -DnbkKvbdwuMeRZMO -EPCkKvbdZRNFImFR -EPCkKvbdnHEwlmgZ -EPDKjvbdLYqKSzuG -DoDKjvbdZsiJYdTO -DoDLKvbdShyjRAAl -DoDKjvbdRadFLiYk -DnbkKvbdjbkjpgUg -EObkKvbdUaBpsRRy -EOcKjvbdehKuqnRH -EObkKvbdDwxMUTsl -EOcKjvbdptUHSSKt -EPDKjvbdHEKuibJj -EOcKjvbdxxIjBpZk -EObkKvbdelewGmJk -DncLKvbdTvLpKUAq -EPCjjvbdGLErbhNV -DncLKvbdfHjvRmqH -DnbjjvbdkMakyeHP -EPDKjvbdJcKCpjDY -DoCkKvbdRECaPpcr -EOcLKvbdmgFYMmgZ -EObjjvbdZRMdiMeR -DoCjjvbdYzcFqivZ -DoCkKvbdeOeTKtTr -EPCkKvbdXFxytAPT -DncLKvbdZnnJEdzK -DncLKvbdhtyeWrUb -EOcKjvbdEJgivXjA -EPDLKvbdssSTYyeD -EPDLKvbdLBLGmCXq -DnbkKvbdKeegbApu -DoDLKvbdJYUBhLqQ -EPDKjvbdwNWANDdm -DoCjjvbdKfGIBaRV -DoCjjvbdbhljLFwY -DncLKvbdmgFXmNgZ -DoDKjvbdZRMeJNFR -DoCkKvbdWeyZtAOs -DoCkKvbdbiNKLFvx -EPDKjvbdUsmTfMVj -EPCkKvbdijFgjMwr -DnbkKvbdbsCjtDia -DnbjjvbdZQleJNFR -DoDLKvbdNQXqWNfs -EOcLKvbdULunaVoJ -DncLKvbdrEEhpOVa -DncLKvbdRyigsCvA -DoCkKvbdVwJYWEEg -DncLKvbdjKGIKMwr -EObkKvbdrEFIpNvB -DoCjjvbdGLEsDINV -EOcLKvbdJSyArlxM -EPCjjvbdTJZiqABM -DncLKvbdCTAbsewS -DnbjjvbdZjTIPfaf -EPCjjvbdbPfgELzd -DnbjjvbdLBLHMbXq -EPCjjvbdqiAKFMoF -DnbkKvbdIBlZdzAD -EPDLKvbdyTNiNRag -DoDLKvbdZjSgogCG -EPCjjvbdjAPgAofj -EPCjjvbdxmrgxTJD -EObjjvbdSPsgKGEX -EObkKvbdRWnDblHc -DnbjjvbdZQmFImFR -DoCjjvbdjuwODaww -EOcLKvbdVviXvEFH -EPCjjvbdcImJkGXY -EPDKjvbdVAbQrqSZ -DoCjjvbdWWiXudFH -EPDKjvbdapGfdLzd -EObkKvbdQwOEDMID -EPCjjvbdKDKCqKCx -DncKjvbdJvUfEEgJ -EObkKvbdDoDLKvcE -EOcKjvbdqwPkbhyR -EObjjvbdyTOJNSCH -EObkKvbdZsiIxdTO -DoCjjvbdaSFbhTfL -EOcKjvbdUslsekvK -DoDKjvbdehLWSORH -EPCkKvbdBsBDTfWr -DoCkKvbdMfbpNQVL -DoCkKvbdezvZFJUX -EObjjvbdJYUBhMRQ -DncKjvbdlhcsptqa -DoCkKvbdiZtfMQnG -EObkKvbdZRMdhleR -EPDLKvbdkySrSxgU -DoCkKvbdYlSDsmkm -DnbkKvbdkNBkzEfo -EPDLKvbdyYJKCPzL -EOcKjvbdqwPkbiZR -DncLKvbdqdFJQOWB -DoDKjvbdFyUtaDxC -DnbjjvbdZyDinDMS -EOcKjvbdqrVKnKaN -DoCjjvbdMgDPlotk -EPCjjvbdUVlPitBR -DoDLKvbdbsCkTcjB -EPCjjvbdnGdwlnGy -DnbkKvbdapGfdLzd -EPDKjvbddndsKtTr -DncLKvbdsrrTZZeD -EObkKvbdqdFJQOWB -DncKjvbdRadFLhxk -DnbkKvbdfILWSORH -DnbkKvbdqZOggQcx -EPDKjvbdCDpAujMf -EObjjvbdxsOImSBg -DoDKjvbdrSUjmjaN -EObkKvbdrMyjYkhJ -EObkKvbdANHySvzY -EObkKvbdgGLynGgA -DoDLKvbdNdcshiKd -EObjjvbdePErkTtS -EPCkKvbdSCEFLhxk -DoDKjvbdIxUBhLqQ -EPCkKvbdVvhxWDdg -EOcLKvbdKfGHbBQu -DoCjjvbdajlFoNcA -DoCkKvbdQdDAopdS -DoDKjvbdSBceMJZL -DoDKjvbdOStWGdtp -DoCjjvbdGdLWKBij -DnbkKvbdvOszpjnt -DncLKvbdUVlPjTaR -DoDLKvbdliDsptrB -EOcKjvbdZisHpHCG -DoDKjvbdkVwODaxX -DoDLKvbdfVzwpJzs -DnbkKvbdDjIKWYKA -EObkKvbdrJAJdmPF -EObjjvbdeATpmYJf -DnbkKvbdQmYByOUz -EPDLKvbdxmrhXsJD -EPDLKvbdCJLBjiGK -DoCkKvbdYpmFJMeR -DoDKjvbdXnRAXuWU -DoDKjvbdiMFDmtby -DnbkKvbddZyQYZQb -DncLKvbdZtIiYdSn -EObjjvbdwMvANDdm -EPDLKvbdIwsbHkqQ -DncKjvbdURQntthN -EObkKvbdTqROttgm -EPCjjvbdTkvOaVni -EOcLKvbdfNFwHNKL -EObkKvbdjgflFfOL -EObjjvbdUQqOuUhN -DncLKvbdegjurNqH -EPDLKvbdxUmEqZMO -DoDKjvbdGcjvKBjK -DoDKjvbdVTltFkuj -DnbkKvbdLYqKSztf -DoDKjvbdUyHtZkOn -EPDLKvbdvAcyTOdh -DncKjvbdqFcdsvAh -DncLKvbdrbFmMHKy -EOcKjvbdYlRdTnLm -DoCjjvbdEASJMzXX -EObkKvbdMoxQvNfs -EOcKjvbdiHJcYujV -DnbjjvbdvAcyTPEh -DoDLKvbdGQASwGfZ -EObkKvbdMoxRVnHT -EObkKvbdhgJcYvJu -DnbjjvbduWOXipsA -DoDLKvbdQcbaQQdS -EObkKvbdUsltFkvK -EPDKjvbdKyQirzuG -EPCjjvbdmJDtQuSB -EObkKvbdXrkaMsoY -EOcKjvbdrEFIpOVa -EPDKjvbdVqmwadkc -EOcKjvbdqYoIGqDx -EObkKvbdtbbtwWOo -EPCkKvbdSKxfUfkT -EPCkKvbdmJDsqUrB -DncKjvbdhaoCeWpq -EObjjvbdFxuVAdYC -EPCkKvbdqFcdsvBI -EPDLKvbdOTUWGeVQ -EPCkKvbdlhdUQtrB -DoDKjvbdCJLCLJGK -EPDKjvbdMgCpMotk -DnbjjvbdrbFlkgLZ -DoDKjvbdqBJFAWhE -EPCjjvbdpyPHfqDx -EOcKjvbdTlVoBVni -EPCjjvbdrRtkNkBN -EPCkKvbdWWhwuceH -EPDKjvbdcImKKewY -EOcKjvbdYSlBNToY -EObkKvbdZRMeIldq -EPDLKvbdMoxRWNgT -EObjjvbdMIbMQxAS -EPCjjvbdQdDBQQdS -EObkKvbddZyPwxqC -EOcLKvbdACrXiyiQ -EPDLKvbdcSbkUEJa -DncLKvbdTkunaWPJ -DnbjjvbdvBEYrndh -EObjjvbdmIctQuRa -DncKjvbdiUydvqtb -DoCjjvbdhkdcnUby -EOcKjvbdePFTLTsr -EOcLKvbdiHJbxujV -EObjjvbdZsiJZESn -EOcKjvbdpxoHfqEY -EPDKjvbdFyUuBDwb -DoDLKvbdBiLBkJGK -EPCkKvbdliDtQuRa -DoDKjvbdhbOcEwQq -DncLKvbdRosgJfDw -EObjjvbdrzMQSaIO -EObkKvbdUsmTfMVj -EOcKjvbdWXIxWEFH -EPCjjvbdcTCjtDjB -EObkKvbdbBVeGQPw -EOcLKvbdaSGDHtFk -DoDLKvbdqFdFUVaI -EPCkKvbdxxIjBozL -DncLKvbdNddUIiLE -EObjjvbduMYWaUAw -EPCkKvbdWWiXvDdg -EObjjvbdJXsbILqQ -DnbkKvbdDnbjjwCd -DnbkKvbdxUldqZMO -DoCjjvbdKyRKSztf -DncLKvbdLFehBaQu -EPDLKvbdjvXNdBww -EOcLKvbduaEZTPFI -DoCkKvbdfMevfmKL -EPCkKvbdpxoIGqEY -EPCkKvbdKWUecdgJ -EObkKvbdmbJwYOmu -EPCkKvbdIsZArmYM -DnbjjvbdxLXDgzyf -DncLKvbdEvYopMjF -DncLKvbdmJETqVRa -DnbkKvbdrouoKDWG -EPDLKvbdbVCGwkTh -DoDKjvbdZirhPgCG -EPDKjvbdTvMQKUAq -DnbkKvbdLrWlzVQz -EOcLKvbdrEEiPmua -DnbjjvbdczZQXyRC -DncKjvbdnUtzKjSG -EPCjjvbdkNCLzFHP -DncKjvbdZyEKNbkr -EObkKvbdJuuFdEgJ -DncLKvbduCbuXWPP -EPCjjvbdyNrhXriD -DnbkKvbdIxTaglQp -EPCjjvbdJvVFceHJ -EPCkKvbdVBBprqSZ -EOcKjvbdkxrqsYgU -EPCjjvbdGLFSbhMu -EObjjvbdnPzZWLYb -EObkKvbdjblLRGuH -DoDLKvbduaDyTPFI -EPCjjvbdiifIJmXr -EObkKvbdYkqctOMN -EPCkKvbdelfXHMjL -EPDLKvbdeFOrCWbj -EObjjvbdeUAUATNW -EPCjjvbdWRmxBeMD -DoCjjvbdZxcinDMS -EOcLKvbdWRmwbElD -DoDLKvbdpssfrSLU -DncLKvbdQccApRES -DoDKjvbdGdKujBij -DoDKjvbdZLqdTmlN -DoCjjvbdbiNKLGXY -DoCjjvbdVZITzKoO -DoCkKvbdsPuoKCvG -EPDKjvbdNGbomQVL -DnbkKvbdkIHMGFnL -EPDKjvbdvPTzpjoU -EOcKjvbdczZPxZQb -DncKjvbdliEURUrB -DnbkKvbdGZUtaDxC -EPCjjvbdrMyjZLhJ -EPCjjvbdTulPjTaR -DoCkKvbdZeYGzhJC -DncLKvbdwygefYEr -DnbjjvbdehLVrOQg -DnbjjvbdZxcjNblS -DoCjjvbdSLYetgKs -EPCkKvbdVAbQrpqy -EPCjjvbdtTSTZZdc -DnbkKvbdSCEFMIyL -DoDKjvbdrDeJPmvB -EOcLKvbduDDVXVno -DoDLKvbdZdxGzhIb -EObkKvbdhgJbxujV -DncLKvbdlYsRsZHU -DoDLKvbdhzUelQmf -EObkKvbdWWhwvDeH -EPCjjvbdjgfkfFmk -EObkKvbdzaAPHGal -DoDLKvbdEPDLLXDE -DoCjjvbdTukpKTaR -EOcKjvbdhaoCeWpq -EPDKjvbdwjvdHzzG -EPDLKvbdJTZBTNYM -DoDLKvbdRECaPqDr -DncKjvbdjhGkfGNk -EObkKvbdjhGkfFmk -DncLKvbdqlyixkhJ -EObkKvbdjEkHUoAO -EPCkKvbdcasMrAUN -EObjjvbdhzUfLqOG -DoCkKvbdEvYopNKF -EPCjjvbdjuwODaxX -DncLKvbddiirWUzn -EObkKvbdOStVfduQ -DnbjjvbdypnmIjXA -DnbjjvbdRWnEClHc -EOcLKvbdbhljLFvx -EPDLKvbdJXsaglRQ -EObkKvbdhzUfLqOG -EObkKvbdnPyxujyC -DoDKjvbdBiKajiFj -DoDKjvbdZjTHpHBf -EPCjjvbdaSFcITek -EObjjvbdYzcFqiuy -DncLKvbdqdFIpNvB -DoDKjvbdLYqJrzuG -DoDLKvbdVwJXucdg -DnbjjvbdhbObdvqR -DoCkKvbdCEQBWJlf -DoDLKvbdSCDdlJYk -EPDLKvbdZyEJnCkr -DoDKjvbdvAcyTOeI -DoDKjvbdkIHLfFmk -EPCjjvbduaEYroFI -DnbkKvbdjblKpgUg -EOcKjvbdwygefYFS -EOcKjvbdliDsqUqa -DnbjjvbdjcMLRGtg -EObkKvbdRbEElJYk -EPCkKvbdqrUkNjaN -EOcLKvbdRotGifDw -DnbkKvbdUsmUGLuj -DoCjjvbdeKJqvUzn -EPDKjvbdQwNdClHc -EOcLKvbdcScLTcjB -DoCjjvbdvBDxroEh -DoDLKvbdIxUBglQp -EPDLKvbdfVzxQJzs -DncLKvbdqlzKYlIJ -DoDKjvbdaNLCSuMg -EOcKjvbdwjwDgzyf -EPDKjvbdIxTaglRQ -DoDKjvbdVTltGLuj -DoCkKvbdiMFENuDZ -EOcLKvbdZyEJnDMS -DnbkKvbdiBoCeXRR -EPCkKvbdbiMijewY -EOcKjvbdmttzLJqf -DncKjvbdYTLaMtOx -EPCjjvbdfIKuqmqH -DoCjjvbdBdQBVjNG -EObkKvbdieLGuPAO -EPDLKvbdsZlQSaIO -DnbkKvbdEztQeMDJ -EPCjjvbdIjEAJpHE -EOcLKvbdfILWRmpg -EPCjjvbdZyDinDLr -DncKjvbdLGGIBaRV -DncLKvbdmozZWLZC -DoCkKvbdlZSrSxft -EOcLKvbdFjdrcINV -EOcKjvbdQvnDblHc -DoCkKvbdqUUHRqkU -EPDKjvbdnBjWwnmu -DoCjjvbdZxcjNbkr -DncKjvbdZisIQHCG -DoCkKvbdJcJcRJbx -EPDLKvbdlhdUQtqa -DnbkKvbdrzLpSaHn -DoDKjvbdziuPpDrt -EPDKjvbdEYXlTtUM -EObkKvbdqdFIpOVa -DncKjvbdpxnhHQdY -DnbkKvbdLhakqYAS -EPCkKvbdrRtkNkBN -EObkKvbdqrVKmjaN -EOcKjvbdxUldqZMO -EOcKjvbdrbFllHKy -DoCkKvbdySmhlrBg -EPCkKvbdkxrqsYgU -EPCkKvbdZLqcsnMN -DncKjvbdFpATXHFy -EPDLKvbdZRMdiMeR -EPDLKvbdRNXbYmtz -DoCkKvbdpyPIGqEY -DoDLKvbdKaKfmCYR -EPDLKvbdrylPsBIO -EObjjvbdUQqOuVHm -EPCkKvbdezvZFItX -EOcKjvbdZirhQHCG -DoDKjvbdePFSjssr -EOcKjvbdCTAcTfXS -EOcKjvbdkxsRsYft -EPDLKvbdQwODcMHc -DoDKjvbdwuNFRZMO -EPCjjvbdEuyPomKF -DoCkKvbdpxnhGpcx -DncKjvbdiVZeWrUb -EOcKjvbdrEEiPmvB -EOcLKvbdZxdJnDLr -EObjjvbdUtNUFkvK -DoDLKvbdZQmFIldq -EObjjvbdnCJvwnmu -EPCkKvbdRWmccLgc -DnbkKvbdnUtykJqf -DnbkKvbdVBBqSpqy -EPCkKvbdZoOIddyj -DnbkKvbdZQldiNFR -DncLKvbdmRyVZsDi -DoCjjvbdcasMrATm -EOcLKvbdtbbtvuno -DoDLKvbdZtJJYdSn -DnbkKvbdGKeTDHlu -DoCkKvbdZjTHpGbG -EOcKjvbdHDjvKCKK -EObjjvbdddnqbXCj -EObkKvbdlZTSTYgU -EPCjjvbdqqtjmkBN -EObjjvbdtAGqIAAr -EObkKvbdrRtjmjaN -DnbjjvbdMRwMytpz -EPCkKvbdsQWPJbuf -DoDKjvbdqFceUWBI -DoCkKvbdnBjWxPNu -DoDLKvbdiUzFXRuC -EObkKvbdQccBPqES -DnbjjvbdOFDtIiLE -EPDKjvbdYlRcsnMN -DncKjvbdFfJrNhsq -DoCkKvbdsCFmMHKy -EPDLKvbdYkrETnMN -DoCjjvbdYNqAXuWU -EPDKjvbdrovPKDWG -DoDLKvbdbKlGOmcA -DoCkKvbdOStWHFVQ -EObjjvbdhbObeXQq -EPCjjvbdeEnrBwDK -DoDLKvbdrbFmMGkZ -DncKjvbdxZhGGYFS -EPDKjvbdbrbkTdKB -EPDKjvbdraellGkZ -EPCkKvbdssSTZZeD -EPDKjvbdDjHiuxKA -DoCjjvbdzoPqFDMY -EPCjjvbdlAlnmALA -DoDKjvbdmtuZjjRf -DoDKjvbdFpASvfey -DoCkKvbdjlakyeGo -DoDKjvbdxnSgxTIc -EPCjjvbdxZhFfXeS -EPCkKvbdqcdiPnVa -EOcLKvbdmfeYMnHZ -DoDLKvbduCbuWvOo -DoDKjvbdmIcsqUqa -EPDKjvbdzoQQdblY -DoDLKvbdRNXayOUz -DnbjjvbdrJAKFNOe -DnbjjvbdZLrEUOMN -EOcKjvbdwygeexEr -EPCkKvbdbVBfwjtI -EObkKvbdKDKDRJbx -DoCkKvbdGckWKBij -EOcKjvbdzjVQPdSt -EPDLKvbdqlzKYkhJ -DnbjjvbdajkennDA -DoDLKvbdRzJgsCvA -EObjjvbdehKuqmqH -DncKjvbdajlFnnDA -DnbjjvbdjEkHUoAO -DoCjjvbdFVyPomKF -DoCkKvbdJcJbpjCx -DnbkKvbdRaceLiZL -EPDKjvbdeEnrBwDK -DoDLKvbdxKvdHzyf -DoCkKvbdSPtHKFcw -EObkKvbdjhHMGGOL -EOcLKvbdGGJqnItR -DoCjjvbdnGdxNNgZ -DoDKjvbdbKkfOmcA -DnbjjvbdelewHNKL -EPCkKvbdcSbjsdJa -EPCkKvbdTAEhgbOd -DncLKvbdUslselVj -DnbjjvbdVrOYBeMD -EObjjvbdEzspeMDJ -EPCjjvbdcTDLTcjB -EPDLKvbdsPvPJbuf -EOcKjvbdqGEFUWBI -EPDKjvbdVgxWYGxz -EOcLKvbdSPtGjGDw -EObkKvbdGckVibJj -DoDLKvbdeEoSCWcK -EPCkKvbdQvmdClID -DncLKvbdhytelROG -EPCkKvbdeXzTtSFz -EPCkKvbdrXQMDIxq -EObkKvbdtlXvaUAw -DnbkKvbdiMFDmtcZ -EPDLKvbdJqZeOfNe -EPDLKvbdmIdUQtrB -DoDKjvbdVTltGLvK -DncLKvbdZRNEhleR -EPDKjvbdjlakydfo -DnbjjvbdFpASvfey -EPCkKvbdkySrTYft -EOcLKvbdVUMtGMVj -EPDLKvbdmRyUysDi -EPCkKvbdGKeScHlu -EObjjvbdczZPwyRC -EPDLKvbdVYhUZkOn -DncLKvbdJbibqKDY -EPDLKvbdfekzNfgA -EObkKvbdKQydoGOF -EObkKvbdVgwvXfxz -DncLKvbdQdDApQcr -DncLKvbdGFjRnJUR -DncKjvbdjgflFemk -DoDKjvbdlhctRVSB -DncLKvbdZLqctOLm -DncKjvbdfSAvzlCo -EPDKjvbdZRMeIleR -EObjjvbdZRMeJMdq -EOcKjvbdMuTSKmAX -DncKjvbdqYngfpdY -DnbkKvbdxrmiMqbH -EObjjvbdbPgGckzd -DoCkKvbdpstGqqkU -DncLKvbdmJDsqVSB -EPDLKvbdtunYKQsA -EObkKvbdDnbkKwCd -EPDLKvbdEXwkstUM -DoDKjvbdrRtkNkBN -DncLKvbdIwtCIMQp -EPDLKvbdZQmEhmEq -DnbkKvbdxmrhYTIc -DoCjjvbdCSaDUGWr -EPCkKvbdatagXkUI -DncLKvbdEPDKkWcE -DncKjvbdZjShPgBf -EPDKjvbdHDkVjCJj -DoCjjvbdsrrTYzEc -EObjjvbdhlEcnUby -DnbjjvbdemFvfmKL -EObkKvbdlhcsqUqa -DoCkKvbdZtIiYdTO -EObkKvbdEXwlTssl -DoDKjvbdhaoCdvqR -EObkKvbdliEURUrB -DoDLKvbdEYXkstTl -DncKjvbdFkEsDINV -DoDKjvbdFkErcHmV -DoDLKvbdKCjCpjDY -EPCjjvbdjJegjMxS -DnbkKvbdnCKWwnmu -DnbjjvbdqwQLbiYq -DoDLKvbdSZigsDWA -EObjjvbduVnYKRTA -EOcKjvbdTlWOaVoJ -DnbjjvbdSCDeMJYk -DnbkKvbdQvmdClID -EPCkKvbdziuQPdTU -EOcLKvbdhficZWJu -EOcKjvbdZLqdTmkm -DoDKjvbdcImKKevx -EOcLKvbdGFirOJUR -EObkKvbdREDApRES -DoDKjvbdHELWKBij -EOcKjvbdrSVLNkBN -EOcKjvbdBdQBWJlf -DoCjjvbdFpATXHGZ -DnbjjvbdqZOhGpdY -EPDLKvbdCSaDUGWr -DoDLKvbdrpWPJcWG -DnbjjvbdZsiJYdTO -EPDKjvbdJvVGEFGi -EPCkKvbdmIctRVSB -DncKjvbdBiLCKhfK -DoCkKvbdZisIQGbG -DoCjjvbduWNwjQsA -EOcLKvbdiHKCyVjV -EPCjjvbdlZSrTZGt -EObjjvbdNPxRWNgT -DncKjvbdeAURNXif -DncLKvbdOStWGeVQ -DoCjjvbdJvUeceGi -DoDKjvbdXsMBMsnx -EPDKjvbdGLFSbhMu -EPDLKvbdEvZPolie -EOcKjvbdrRtjnLBN -EPDKjvbdyOTHxTJD -EPDKjvbdmajWwnmu -EPCjjvbdrNZjZLhJ -DncKjvbdajlFoODA -DoDKjvbdrEFIpOVa -DnbkKvbdpedEtWBI -DncKjvbdqwQMChyR -DnbjjvbdnCKWwnnV -DoCjjvbdNUsRkNAX -EOcLKvbdULvPBWPJ -DncLKvbdjlalZdfo -EPDKjvbdjJfHjNYS -DoDKjvbdPxmAHTSK -DnbkKvbdmIctQtqa -EObjjvbdnHFXmNfy -EPCkKvbdqlzJyLhJ -DnbjjvbdVqnYCElD -EPDKjvbdqTsgRqkU -EPCjjvbdADSYKZhp -EPDLKvbdEvZPoljF -DoCkKvbdLFfICBRV -EOcLKvbdZRNFJNFR -EPDKjvbdpedFUWBI -EPDKjvbdVwJYVceH -DoCjjvbdGYtuBDwb -DoCjjvbdVYgtZjoO -DncKjvbdQccApQcr -EOcLKvbdWWiYWDdg -DncKjvbdyTOJNSBg -DnbjjvbdbAueFpQX -DnbkKvbdiUydwSUb -DoDKjvbdKVtfDeHJ -DoDKjvbdEObjkXCd -EOcKjvbdqlyjYlHi -EOcKjvbdfRaWzlCo -EObjjvbdRWmcblID -DoDLKvbdCDpAvKMf -DncLKvbdmuVZjjSG -EPDLKvbdkaMnmALA -EPCkKvbdcSbkTdKB -DnbjjvbdZtJIyESn -EPCkKvbdQvmccMHc -DncLKvbdfHjvRmpg -DoCjjvbdVvhwvEEg -EPCjjvbdXrkaNTnx -DnbkKvbdGFirNiUR -EObkKvbdZLrDsnLm -EObkKvbdySnJNRbH -DncKjvbdaMkBsUmH -EPCkKvbdqGEFUWBI -EObjjvbdmajXYOnV -DnbkKvbdHELWKBjK -EPDKjvbdWSOYCFLc -DncLKvbdehKurNqH -EPDLKvbdSZjIScWA -DncKjvbdZQldiNEq -DncLKvbdVwIwvEEg -DnbjjvbdauCGxKsh -DnbkKvbdKefHbApu -DoCkKvbdssSTYyeD -DnbjjvbdSPsgJfEX -DoCkKvbdeKKRvUzn -DoDLKvbdiMEcnVCy -DoDLKvbdoAKzsgcn -DoDKjvbdDoDKjvbd -DncKjvbdFWYopMie -EPDLKvbdRNXaxmtz -EOcLKvbdKefHaaRV -EPDKjvbderAvzkbo -EObjjvbdzoQREcMY -DnbkKvbdijFgjMwr -EObjjvbdhbObdvqR -EPCkKvbdySmiMqbH -EObkKvbdyzeOSIIh -DnbkKvbdjcLkRHUg -DoDLKvbdJpydoGNe -DoDKjvbdwXMBWBWV -EObkKvbdsBfMkgKy -DnbkKvbdYkqdTnMN -EPCjjvbdEPDLLWbd -EObkKvbdDwxLtUUM -DncKjvbdNrtVgFUp -EPDKjvbdZQleJNFR -EPDKjvbdJKEAKPfd -DnbjjvbdhgKCxvJu -EObkKvbdLAkHMbXq -EPDKjvbdhancEvqR -DoCjjvbdNsUWHEuQ -DnbkKvbdZjTHofaf -EPCjjvbdrDdiQOVa -EPDKjvbdkMbLzEgP -EPCkKvbdZoOJFEyj -EPCkKvbdADRxJyhp -EObjjvbdaSGCgsfL -DnbjjvbdJbjDQibx -EPCjjvbdpfEEtWBI -EOcLKvbdZxdJmblS -EPCkKvbdRpTgKGEX -DoCjjvbdzRPNIiwA -EObkKvbdzoPpeClY -EObjjvbdeFOrBwDK -DoCkKvbdOTTvHEtp -DnbjjvbdGQATWgFy -EPCjjvbdEvZQQNJe -EObkKvbdjvWnECYX -DoDLKvbdyTOIlqag -DnbkKvbdEASJNZvw -EOcKjvbdsZkosBHn -DoDLKvbdtSqsYyeD -DncKjvbdqlyixkgi -EPCjjvbdTppnuVHm -DncKjvbdatbHYKsh -DoCkKvbduVmwjQsA -EPCkKvbdvAcxsOeI -EObkKvbdRjyFuHLT -EObjjvbdTukoitAq -EOcLKvbdkySqrxft -EObjjvbdQccBPpdS -DoDKjvbdffLzNfgA -DoDKjvbdiCOcEvqR -DncKjvbdIBkzEzAD -EObjjvbdVZHsyjoO -EOcLKvbdZoNheEzK -DnbkKvbdsZkpTAhO -DnbjjvbdqFdEtVaI -DnbkKvbdIGfzZXwg -EPDLKvbdlrZVZsEJ -EObjjvbdBcpAvJmG -DnbjjvbdtSqsYzFD -EPDLKvbdJJdAJogE -DncKjvbdxVMdpyMO -EPCjjvbdQwOEDLhD -DoCjjvbdmgFXmNgZ -DoDLKvbdjEkGuPAO -EPCjjvbdACrXjZiQ -DoCjjvbdZMRdTmlN -DncLKvbdiLeDnVDZ -EObjjvbdVAaprpqy -DoDLKvbdRjyFuGjs -DnbjjvbdVAbQrprZ -EObkKvbdSZjHrcWA -EPDKjvbdVrOYBeMD -EPDLKvbdDwxMUTsl -EPDKjvbdRadElIxk -DnbjjvbdmozZWKyC -DoDLKvbdptTgRrKt -EPCjjvbdatagXkUI -DncLKvbdZLqcsnMN -DoDLKvbdfNFwGmJk -EObkKvbdqTsfrSKt -DncLKvbdZjTHpGbG -DoCjjvbduWNwipsA -EPDKjvbdauCGwkTh -DncLKvbdKVuGEFGi -EObjjvbdZirhPfaf -DoDKjvbdxKvcgzyf -DnbkKvbdxsNhlrCH -DoCkKvbdBsBDUGWr -DncKjvbdfMfXHNJk -DnbjjvbdOSsugFVQ -DncKjvbdZisIPfaf -DnbjjvbdZHXEAOsJ -DnbjjvbdLZRJrzuG -EObkKvbdwuNFQxlO -DncKjvbddxZtURez -EPCkKvbdxrmiNSCH -DoDKjvbdiUydwSVC -EObjjvbdiifIJlwr -DncLKvbdssSSxyeD -EPDKjvbdOEcsiJLE -EOcKjvbdySnIlrBg -EPCkKvbddZyQYZRC -DnbjjvbdWXJXudEg -DoDLKvbdKaLHNCXq -DoDKjvbdGGKRmiTq -DnbkKvbdlrYtyrdJ -EPDKjvbdhtzEvrVC -EObkKvbddZyQYYqC -DoDLKvbdhaoCdwRR -EPCkKvbdxLWdHzyf -DoDKjvbdySmhmRbH -DnbkKvbdZLqcsmlN -EObjjvbdZtJIxdTO -DoDKjvbdDwwksssl -EPDKjvbdFyVVAdXb -DoCkKvbdUtNUFkvK -EPDLKvbdxmsIXsIc -EPDLKvbdUsmUFkuj -EOcKjvbdGKdsDHlu -EOcKjvbdACqwjZiQ -EPDKjvbdFpASwHGZ -DoCkKvbdGZUtaDxC -DncKjvbdmSZVZsEJ -DoCjjvbdJbicRKCx -DncLKvbdTvMQJsaR -DoCjjvbdNeDtJJKd -EPCjjvbdnPzYvKxb -DoDLKvbdyTNhlrCH -EPDKjvbdRosgJecw -EObkKvbdTAEiICOd -EOcKjvbdapHHDkzd -DoCkKvbdjlakzFGo -DncLKvbdrpWPJbuf -DnbjjvbdNQXqVnHT -EOcLKvbdkNCLzFHP -EObjjvbdTukpKTaR -EOcLKvbdEuxpPlie -EPCkKvbdJuuFdFHJ -EPDKjvbdGGJqmiTq -DnbjjvbdOAIrtJrA -DnbjjvbdelfWgNKL -EObkKvbdhbOcEwRR -DncLKvbdqiAKFNPF -DncKjvbdVqnYCFMD -DoDLKvbdWHxWXgYz -EOcLKvbdNVTSKmAX -EPDKjvbduaDySndh -DnbkKvbdiifIJlxS -EPDKjvbdeATpmYJf -DncLKvbduCcVWuoP -EPCjjvbdhficYvJu -DncKjvbdehLVqnQg -EPCkKvbdrDeJPmua -DoCjjvbdTfzmlWue -DncKjvbdZoNiFEyj -DoDLKvbdxmsHxSiD -EObkKvbdVwJYVdFH -EPCjjvbduMXwBUBX -DnbkKvbdTqROuVIN -EPCjjvbdGKeTCglu -EPDLKvbdcyyPwxpb -EPDLKvbdQmXayOUz -EPDLKvbdZyDinCkr -EPDLKvbdZoNheEyj -DncLKvbdmfdxMnGy -DnbkKvbdkClLRGuH -DncLKvbdJXsbIMQp -DnbjjvbdjJegilxS -DoCkKvbdnPyxukZC -EPDKjvbdZMRcsnLm -DoCkKvbdHffzYxYH -DnbkKvbdbsDLTcjB -DoDLKvbdSwjlNzjx -DncKjvbdkaMnmALA -DncLKvbdqmZjZLhJ -DoDKjvbdqrUkNkBN -DncLKvbdmfeXmOGy -EPCjjvbdZMRdTmlN -DnbkKvbdypnlhjXA -EPDLKvbdyOTHxTJD -EObjjvbdMRwMzVQz -EPCjjvbdSCDeMIxk -EObjjvbdOXnuzdOU -EPDKjvbdOStWHFVQ -DoDLKvbdrzLpTAgn -DnbkKvbdULuoAvPJ -EPDKjvbdZxdKODMS -EOcKjvbdbAvEfPpX -DncKjvbdyOSgwriD -EPDLKvbdrJAJdmPF -EPDLKvbdauCGxKtI -DncLKvbdqrVLOLAm -EPDKjvbdkHgLfFmk -DncKjvbdUaCRSqSZ -DnbkKvbdbQGgELzd -EOcKjvbdcJMijfXY -EPCkKvbdeOeTLUTr -EOcKjvbdQmYByNtz -EPDLKvbdFxuVBDwb -EOcKjvbdGGJrNiUR -DoDKjvbddndsLTtS -EOcLKvbddZyPxYqC -EPCkKvbdSKxfVHLT -EOcKjvbdSCDdkiYk -DnbjjvbdtvNwjQsA -EOcKjvbdJXsbILqQ -EObjjvbdjcLkRHVH -EObjjvbdkCkkQgUg -DoCjjvbdTqQnttgm -EPCkKvbdEuyPoljF -DoCkKvbdTqQnuUgm -DoDLKvbdLrWlzVQz -EPCjjvbdRjyGVGkT -DoDLKvbdHEKvKBjK -DoCjjvbdnCJvxOnV -EObkKvbdptUGrRkU -EPDKjvbdQwNcblID -DoCjjvbdIidAKPgE -DoCjjvbdTYLMNzkY -DnbjjvbdEztRFMCi -EObkKvbdBhkCLJGK -EPDLKvbdZisHpGbG -EPDLKvbddePRbXDK -EObkKvbdUQpntuIN -EObjjvbdEPCjjvcE -DncKjvbdbiNJjewY -EPDLKvbdVrOYCElD -EPCkKvbdSBdElIyL -DoDLKvbdzjVQQETU -DoCjjvbdCDpAvKNG -EObkKvbdNHComPuL -EOcKjvbdGdKvJaij -DnbkKvbdqmZjYkgi -DncKjvbdQvnEClID -DncLKvbdWWiXudFH -DoDLKvbdCEQBWJlf -DncKjvbdMpXqWOGs -EPDKjvbdVBCRSqRy -EPDLKvbdqUTgSRjt -EOcLKvbdJXtCHkqQ -EObkKvbdBiLBkJFj -EOcLKvbdVvhwvEEg -EOcKjvbdCTBCsewS -EOcKjvbdyNsHwriD -DoDKjvbdwzHfFxEr -DnbjjvbdypoMiJwA -DoCjjvbdJbicQjCx -EOcLKvbdVUMsekuj -EOcKjvbdCEQBWJlf -EObjjvbdIjEAKQGd -DoCjjvbdDjIJvXjA -DoDLKvbdFyUuAdYC -DncLKvbdRotGiedX -DoCjjvbdBhkBjhej -EOcKjvbdBhkCKhfK -EPCkKvbdLFfHbBRV -DoCkKvbdNUrrLNAX -EOcKjvbdZoOIeEzK -EPCjjvbdkMbMZeHP -DoCjjvbdkVwNdBxX -EPCkKvbdNddThiKd -DnbjjvbdjcLkQftg -DnbkKvbdFkErcHmV -DnbjjvbdqGEEtWAh -DncKjvbdmSYuZsEJ -DoCjjvbdUsmTfMWK -DoCkKvbdVUMtFkvK -EOcKjvbdKfGICBRV -DnbkKvbdMSWlzUpz -EOcLKvbdVBBprpqy -EPCjjvbdnHEwmNgZ -DoCkKvbdeEoRawDK -DnbkKvbdpssgSSLU -DncKjvbdOSsugFUp -DnbkKvbdwzHfGYFS -DoCjjvbdTAEiHbPE -EObkKvbdKaLGmCXq -DnbkKvbdCWzciFQW -DncLKvbdnVVZjiqf -EPCjjvbdOStWHEtp -DoDKjvbdkIGkfFmk -DoDKjvbdZjTIPfbG -EOcKjvbdXsMAlsnx -DnbjjvbdILazmwRL -EOcKjvbdrDdiPmvB -EPDKjvbdiUzEwRuC -EOcKjvbdqAheAXHd -EPCjjvbdRyigsCvA -DoCjjvbdpyOggQcx -EPCkKvbdZyDjNblS -DncLKvbdFejSNiTq -EPDKjvbdzRPNIjXA -DncLKvbdaMkBsVMg -EObkKvbdLYqJrzuG -DncKjvbdsBfNMHLZ -EPDKjvbdjgflFfOL -DoDKjvbdCTAcUGWr -DnbjjvbdSLZGVGkT -DoCkKvbdZQmEhldq -EPDKjvbdUsmTfMWK -DoCjjvbdKefICBRV -EPCjjvbdZMSDsnMN -EObkKvbdwzIGGXdr -EObjjvbdrRtjnLAm -EPDKjvbdXrlAmTnx -EPCjjvbdZtJJZETO -DnbjjvbdieLGtoAO -DnbkKvbdnCJvxPOV -EPDKjvbdjKFgjNYS -DoCkKvbdlhcspuRa -EPDKjvbdbAvEfQPw -EOcLKvbdiGjDYuiu -DncKjvbdnQZxvLZC -DoDLKvbdaogHDkzd -DnbjjvbdMfcQMouL -DncKjvbdKaKgMbYR -DncKjvbdrbGNMHKy -DoCkKvbddoFSjtUS -EPDLKvbdNddTiIjd -EPDKjvbdhgKDZViu -EPDLKvbdkMbLzEfo -DoDKjvbdjmCMZdfo -DoDKjvbdSCDeLhyL -DoCkKvbdQwODcMID -DnbkKvbdgGLymgHA -EPDKjvbdWIYVwfxz -DnbkKvbdZLqdUNkm -DoCkKvbdYlSETmkm -DnbkKvbdLqvlyuQz -DnbkKvbdZRMdiMdq -EOcLKvbddePSCXCj -EPDLKvbdRacdkiYk -DnbjjvbdZisIQGbG -EObjjvbdrpVnibvG -DncLKvbdIxUCHlRQ -EPCkKvbdhuZeXRtb -DnbjjvbdQwODblID -DoDKjvbdezuyEhsw -DncKjvbdiLddNtcZ -EPCkKvbdiLeENtby -DnbjjvbdxKvcgzzG -EPDLKvbdRXNdClID -DncLKvbdEKHjVwjA -EOcLKvbdzoPqFCkx -DoDLKvbdliEURUqa -DoCjjvbdyOTIYTJD -DncLKvbdIHGyyXwg -EPCjjvbdShyjRABM -DoCkKvbdnPyyWLYb -EObjjvbdsPvPJcVf -EPDKjvbdTXjlNzjx -DoDKjvbddneTLUUS -EOcKjvbdmuUyjiqf -DncKjvbdZoOIddzK -DoCjjvbdpyOhGqEY -DoCkKvbdwjwDgzyf -DnbkKvbdxZgeexEr -EOcLKvbdHDjvKCKK -DoCkKvbdpxnhHQdY -DoDLKvbdLrWlzUpz -EPDKjvbdatbHXkTh -DoDLKvbdZyDinDLr -EPCjjvbdGGJqnJTq -DoDKjvbddneTLTsr -DncLKvbdyzdmqhJI -EObkKvbdRjxfVGkT -EPDKjvbdOAJTTirA -EPCjjvbdZoNiFEzK -DnbjjvbdOhAXyAYa -DnbjjvbdACqwizIp -DoDLKvbdcImJjevx -EPDLKvbdxmrhYTIc -DoDLKvbdjcLkRGuH -EPCkKvbdxVNEpxlO -EPCkKvbdKCibqJbx -DoCkKvbdjJfIKMxS -DoDLKvbdVYhUZjoO -EPDLKvbdrJAKEmPF -EOcLKvbdRDbaQRDr -DoCkKvbduWOXiqTA -DoCjjvbdZyDjNcLr -EObjjvbdbBWEeoow -EPDLKvbdUQpnttgm -EOcKjvbdlBNOmALA -DnbjjvbdSPsfiecw -DnbjjvbdwzIGGYFS -EOcKjvbdLGFgaaRV -EOcKjvbdrXQLcJYq -DnbkKvbdmbKXYPOV -DoCkKvbdZisHogCG -EPCkKvbdFVyPpMjF -EOcKjvbdYkrDsmkm -DoDKjvbdxUmEqYlO -EPDKjvbdKNAEZgUa -DoDLKvbdqZPIGpcx -DoCjjvbdMgComPtk -EObjjvbdUyHszKoO -DoCkKvbdeEnqavcK -EPDKjvbdqYoIGqEY -DoDLKvbdCDoaWJmG -EPDLKvbdlZSrTZHU -EPCkKvbdZxcinDMS -DoCkKvbdgFkzNfgA -EOcKjvbdYNqAXtvU -EObjjvbdwygefYEr -EPCkKvbdbBVdfQQX -DnbkKvbdqrVLOLAm -EOcKjvbdFjeTDINV -DnbjjvbdnHFYMnGy -EPCjjvbdrbFllHKy -EPCjjvbdZLrDtOMN -EPDLKvbdcJNKKfWx -DoCjjvbdraemMHLZ -DoDKjvbdeJjSWUzn -EPCkKvbdZnmiEdyj -DnbjjvbdwtleQxlO -DnbkKvbdDwwlUTtM -DoDKjvbdrWpMDJZR -EOcKjvbdegkVrORH -EPCkKvbdiCOcFWqR -DnbkKvbdBsBDTevr -DoCjjvbdjcLjpfuH -DnbjjvbdZxdKODLr -DoCjjvbdqceIpOVa -DoDLKvbdVvhxVceH -EObkKvbdsrqryZdc -DnbkKvbdMSWlytpz -DoDLKvbdqTsfqrKt -EPCjjvbdjKGIKNYS -EOcLKvbdiGibxvKV -EPCjjvbdKDKCpibx -EPDKjvbdQdDBPqDr -DncKjvbdozmdLYPA -DoCkKvbdTvLojUAq -DnbkKvbdbhmKLFwY -EPDKjvbdCIjbLIej -DncKjvbdkHfkeenL -DoDKjvbdtAGqIABS -EPCjjvbdRosfjFdX -EOcKjvbdraemLgLZ -DnbkKvbdxmrgxTIc -DoCkKvbdOAJStJrA -EPCjjvbdqYngfpdY -EPDLKvbdBvzdJEov -DoDKjvbdrDeIpOWB -EObjjvbdqUTfrSKt -EOcKjvbdxnShXsIc -DoDKjvbdEzsqFLcJ -EObjjvbdDxYMUUUM -EOcKjvbdjKFhKNYS -EOcKjvbdjgflGFmk -DoCkKvbdGGKRnItR -EPCkKvbdREDApRDr -EOcLKvbdNQYRWOHT -EPCjjvbdxmrgwriD -DncLKvbdbsCjsdJa -EOcKjvbdypoNIiwA -DncKjvbdZoOJFEyj -DoCjjvbdrbGMkgKy -EPDKjvbdyTNiNSBg -DoCjjvbdczZPwyQb -DoDKjvbdWfZZtAOs -EPDKjvbdznoqFClY -DncKjvbdTlVoBVoJ -EPCkKvbdIxUBhMRQ -DoCkKvbdZQmEiNEq -DoDKjvbdnVUykKRf -DnbjjvbdUtMtFlWK -EObjjvbdOTUVfeUp -DoCjjvbdZMSEUOMN -DoCjjvbdwjwDgzzG -DoDKjvbdYqNEiNFR -DoDLKvbdqiAKEmOe -EPDLKvbdfNGXHNJk -DnbjjvbdCEQBVjMf -EObkKvbdqUUGrRjt -DnbkKvbdjmCLyeHP -DnbjjvbdcJMikFwY -EPCjjvbdjuwNdBxX -DoCkKvbdeqaWzkbo -DncKjvbdTkvOaVoJ -DoDKjvbdZoOIeEzK -DoDLKvbdKDKDRKDY -DncLKvbdqwQMDJYq -EObkKvbdKeegbBRV -EPDKjvbdegjuqnRH -DoDKjvbdxwhjBpZk -EObjjvbdziuQPdSt -EPCjjvbdZyEKOCkr -EPCjjvbdRWmdCkhD -EOcLKvbdQcbaQRES -DncLKvbdIrxaTNYM -DnbjjvbdGFiqmiTq -DoCjjvbdZeXfzghb -DoCjjvbdSLZFuGkT -EPDKjvbdIryBSmYM -EOcLKvbdRyjHsCvA -EPDKjvbdzoPqFCkx -EPDLKvbdFeirOIsq -EObkKvbdLiBkpxAS -DoCjjvbdmuUyjirG -EOcKjvbdpfDeTuaI -DncLKvbdtSqsYyeD -EOcLKvbdAMhYrwZx -EOcKjvbdJSyAsNYM -DncLKvbddneTLTsr -EPDLKvbdANIYsWyx -EObkKvbdRXODblHc -DoCkKvbdYzcGRjWZ -DoDLKvbdkHgLfFnL -DoCkKvbdpyPIGqDx -EObkKvbdwuNEpxkn -DoDLKvbdJSxaTNYM -DoDLKvbdRNXbZOUz -DnbjjvbdNHDPlpUk -EObjjvbdKQzFPFnF -EOcKjvbdwkWdHzzG -EObkKvbdiCPCdvpq -EPCkKvbdwzHfFwdr -DoDLKvbdwuMeQxkn -DoDLKvbdmoyxujyC -DncLKvbdyYJKBoyk -EOcKjvbdhgJbxujV -EOcKjvbdvAcySndh -EPCjjvbdOYPVzcmt -DncKjvbderBWzlCo -DncLKvbdEuxoolie -DoDLKvbdUsmTelVj -DoCkKvbdcImKKfXY -EPCkKvbdKDJcRJcY -DoDLKvbdfILWSOQg -DoDLKvbdtcDVWuno -DoDKjvbdegjvSNpg -DncKjvbdjvXOEBxX -DncKjvbdvOszpjoU -EOcLKvbdkIGkfFnL -EPDKjvbdZxcinCkr -EOcKjvbdNxPVzcnU -DnbkKvbdNrsvHEtp -DnbjjvbdwygefXeS -EObkKvbdnHEwmOGy -EObkKvbdZRNFIleR -DoCjjvbdNHColotk -EPDKjvbdTkuoBVni -EObkKvbdkHgLfGNk -DoCkKvbdVvhxWEEg -EOcLKvbdtbcVWvOo -DoDKjvbdULvOaWOi -EObkKvbdNdcsiJLE -DoDLKvbdOYPVzdNt -DoCkKvbdNeDsiJLE -EOcLKvbdXGYytAOs -EOcKjvbdcIljLGWx -DoDKjvbdIMBzmwQk -EPDKjvbdbrcKscjB -DoCjjvbdqdEhpOWB -DnbjjvbdzoPqFClY -DnbjjvbdKDKCqJcY -EPDLKvbdZRNEhldq -DncLKvbddZyQXyRC -DncLKvbdRzKHrcWA -EObkKvbdTAFIgbPE -EObjjvbdwtmFRYkn -DoDLKvbdCTAbtFwS -EObjjvbdJzpFwdAN -DoCjjvbdCTAbsevr -EObjjvbdyzdmrIIh -DnbkKvbdANIZTXZx -EPCkKvbdVwJXvDeH -DncKjvbdmfdwlnHZ -DoCjjvbdZirhPfaf -EPCkKvbdiHJcYvJu -DnbjjvbdRMxCYmtz -EPDLKvbdZHWdAPSi -DnbjjvbdWSNxBdkc -DoDKjvbdNxPVzdNt -EObjjvbddePRawDK -DncKjvbdaSGCgtGL -DncKjvbddoFSjstS -DnbjjvbdOFETiJLE -DoDLKvbdeAUQmYJf -EObjjvbdZshiZESn -EPCjjvbdVwIwvEFH -DnbkKvbdKDKDQjDY -EPDLKvbdRbEFMJZL -DoDKjvbdiZuGLpnG -DoCjjvbdqGEEtWAh -DnbjjvbdnBiwYPNu -DnbjjvbdtlXwBTaX -DoCjjvbdqYoHfqEY -EPCkKvbdIsZArmXl -DoDLKvbdmfeYNNgZ -DoCkKvbdrafNLgKy -DnbkKvbdYfwEAOsJ -DoDLKvbdrEFIonWB -EPCjjvbdRXODcMID -EPCjjvbdZisIPfbG -DncKjvbdoAKzshEO -EOcLKvbdNQXqVmfs -DnbkKvbddoEsKssr -EPDKjvbdNeETiJLE -EPCkKvbdVgwvXfxz -EOcKjvbdIsZBTNXl -EObkKvbdFeirOJUR -EPCjjvbdVAbRSpqy -DnbjjvbdeXyssqez -EPDLKvbdZGwEAOri -DoCkKvbdVAaqSqRy -DoDLKvbdiVZeWrVC -EPDKjvbdGYuUaDwb -DncLKvbdLrXMyuQz -EPDKjvbdGZUtaEXb -EOcLKvbdzoQRFDLx -EPCkKvbdTAFJICOd -EPDKjvbdNPxRVmfs -DoCjjvbdauBfxKsh -DncLKvbdMIbLpxAS -DoCkKvbdmgEwmNfy -DoDLKvbdhanbdvqR -DoCkKvbdSLYfUfjs -DoCjjvbdTvMQJsaR -DnbkKvbdlhcspuRa -DnbjjvbdJSyBSlxM -EPCjjvbdSLZFuHLT -DoCkKvbdYTLaNUPY -EObjjvbdFeiqnJUR -EPDKjvbdYlRctNkm -EOcKjvbdHDjvJaij -DnbkKvbdnCJvwnnV -DoCjjvbdNHDPlouL -DncLKvbdWXIxWDdg -DoCkKvbdJSyAsMwl -EObkKvbdxmrhXriD -DnbkKvbdJzpGYEAN -EOcLKvbdddnqawDK -EOcLKvbdhyuFkpnG -DnbkKvbdtAHQhABS -DoCjjvbdjhGlFemk -DncLKvbdjJehJmXr -EPDLKvbdHffyyXwg -DoCkKvbdRbEFLiZL -DoCjjvbddePSBwCj -EPDKjvbdeOeTKtUS -DnbjjvbdrDeIomvB -DnbjjvbdVZIUZjoO -EPDKjvbdxmsIYTIc -EPCjjvbdDnbkLXDE -DnbkKvbdYlSDtNlN -EObkKvbdeFPSBvbj -EPCkKvbdkDMKpgUg -DoCkKvbdbKlGPODA -EObjjvbdGdLVjCKK -EPCkKvbdkCkjqGuH -EOcLKvbdqYngfpcx -EPDLKvbdeKJqvUzn -DoCkKvbdkIHMGGOL -DncKjvbdDoDKkXDE -EPCkKvbdsCGNMHLZ -EOcKjvbdyzeNqhJI -DnbjjvbdqwQLbhxq -EObjjvbdaaWEepPw -EObjjvbdDxXktUTl -DnbjjvbddwzTtRez -DnbjjvbdKQyeOfNe -EPDKjvbdbBVdepPw -DncLKvbdfSAvzkbo -DoDKjvbdqYoIHQcx -DoCkKvbdeEnrBwCj -DncKjvbdehLVqnRH -EPDLKvbdhfjDYuiu -EPCkKvbdvmWANEEm -EPCkKvbdZRNEiNFR -EOcLKvbdCSaCtGXS -DoDKjvbdbhljKevx -DoDKjvbdbBVdepQX -DncLKvbdqTsfrSKt -EPDKjvbdjEjgVPAO -DoCjjvbdFeiqmiTq -EObjjvbdcImJkGXY -EObjjvbdJbjCqJcY -DnbkKvbdjcLjpftg -EPDLKvbdWXJYWEEg -DoDKjvbdznpREbkx -EObjjvbdfILVqmqH -DnbkKvbdxwiKCQZk -EPDLKvbdOEdUJIjd -DnbkKvbdsCFmLgKy -DncKjvbdijFhKMxS -EPCjjvbdzitpQDrt -EPCkKvbdZQleImEq -DoDKjvbdZxdKNcLr -DncKjvbdGdLVjCKK -EOcKjvbdhzUfLpnG -DncLKvbdwzHfGYEr -EObjjvbdEObjjvcE -EOcLKvbdfHkVqmpg -DnbjjvbdXnRAXuVt -EOcLKvbdeFOrBwDK -EPCjjvbdzitoocsU -EPDKjvbdZxdJmblS -EObjjvbdFjeScHlu -DoDKjvbdjhGkfFmk -EOcLKvbduDDVXWPP -EPDLKvbdJYUCHkpp -EPCkKvbdkClKpgVH -EObkKvbdJcKCqJbx -DncKjvbdEXwlUTsl -EObkKvbdxwiJbPzL -DncLKvbdHDjujCKK -DnbkKvbdEuyQQMie -EPCkKvbdUaBpsRSZ -EPCkKvbddoFTKstS -EPCjjvbduaEYsOeI -DoDLKvbdcTDKscjB -DncLKvbdNdcshiKd -DnbjjvbdWSOYCEkc -EOcKjvbdZnmiEdzK -EPDKjvbdUQpnttgm -DoCjjvbdnGdwmOGy -DoCkKvbdZyDjNblS -EOcKjvbdShyjRAAl -DncKjvbdTkvOaWPJ -DoDKjvbdOEcsiJKd -DncKjvbdbVBfxKtI -EPCkKvbdrafNLfjy -DoDKjvbduaEZTOeI -DncLKvbdGGKSNhtR -EPCjjvbdnBjWxOmu -EObkKvbdKefICBRV -DncKjvbdZoNheFZj -DnbkKvbdEOcKkWbd -EPDKjvbdNGcPmQUk -EObkKvbdaMjbStlg -DnbkKvbdJYTbIMRQ -DncLKvbdJXsahLpp -DncKjvbddeOrBvbj -DoDLKvbdJSyAsMwl -EPCkKvbdZdwfzhJC -DoCjjvbduDDVWuno -DnbjjvbdEztQdkbi -EOcLKvbdUyHsykOn -EObjjvbdDjHivYKA -DoDLKvbdnUtzLKSG -DncLKvbdSLZFuGkT -DoDKjvbdlYrrTZGt -EOcLKvbdqUUGqrKt -EPDLKvbdEPCjjvcE -EPDKjvbddxZtTrFz -EObkKvbdlYrqrxgU -DoCjjvbdauCGwjtI -DnbjjvbdQZNAHTRj -DoDKjvbdMoxRVmfs -DncLKvbdOTTvGeUp -DncKjvbdcJNKKewY -DoDKjvbdmuVZjjSG -EPDKjvbdUWLpKUAq -EOcLKvbdSLZGVGjs -EObjjvbdCIjakJGK -EPDLKvbdZnmhddyj -EOcKjvbdLBKgMaxR -EOcLKvbdDjHjVwjA -DnbkKvbdYlRcsnLm -DoCjjvbdrRuKnKaN -EPCkKvbdptUHSSLU -DncLKvbdYpmEiNFR -EObkKvbdMIalQxAS -DnbjjvbdJuteceHJ -DncLKvbdFWYpPlie -EPCkKvbdmgFYMmgZ -DoCjjvbdmbJvxOnV -DncKjvbdIGfzZYXg -EPDLKvbdqTtGqrLU -EPCjjvbdWRmwbElD -EPDLKvbdGLErcIMu -EPDLKvbdwygefYEr -EPDKjvbdrSUkOLBN -DoCkKvbdNQYQumfs -DoCkKvbdRjyGVGjs -EPDKjvbdmajXXoOV -DncKjvbdIGgZxwwg -DnbkKvbdxwiJapZk -DoDKjvbdYqMdhleR -EOcLKvbdZtJIxdSn -EPDLKvbdTIzKRABM -EPDKjvbdCEPaWJlf -EOcLKvbdjgflFfOL -EPCjjvbdZjShQGbG -DoDLKvbdHDjvJbKK -EOcLKvbdBiKbLIfK -DncLKvbdiHJbxujV -EObkKvbdKeehBaQu -EPDLKvbdYSlBMsnx -EObkKvbdmJDsptrB -DoDKjvbdTkuoAvPJ -EPDKjvbdZyEJnDLr -EPCkKvbdZoNhddyj -EPDKjvbdVZHsykOn -DnbkKvbdjJegjNYS -DoDLKvbdtcCtwVno -EOcKjvbdkIHLefOL -EOcKjvbdYkqdTnLm -DnbkKvbdiZuGMQmf -DoCjjvbdZLrDsnLm -DoCjjvbdDwwktTsl -EObjjvbdRzKHrbvA -DoDKjvbdQlwaxnUz -EObkKvbdyTOImRag -EPCjjvbdQmYByOUz -EObjjvbdbrbkUDjB -DoDLKvbdGYtuAcwb -DncLKvbdePFSjssr -DoDKjvbdRbDdlIxk -DoDKjvbdwzIGGXeS -EPCjjvbdOTUVgEuQ -EPCkKvbdemGWfmJk -EOcLKvbdZQmEhmEq -DoCjjvbdZRMeJNFR -DoCjjvbdvBEZSoEh -DncLKvbdhlFDnVDZ -DoCjjvbdJJdAKPfd -EObjjvbdyYJKCQZk -EObjjvbdRzKITCvA -EPCjjvbdUMVnaWPJ -DoCjjvbdNddThhjd -EOcKjvbdNPwpvOHT -DnbjjvbdZisHpHCG -EObkKvbdGLFScINV -EOcLKvbdbsDLTdJa -EObjjvbdbhlijfWx -DoDLKvbdVZHszLPO -EObjjvbdZnnJFEyj -DoDKjvbdeOeSkTtS -DoDLKvbdkCkjpgUg -EPCjjvbdFejRnJUR -DoCjjvbdZsiIyDrn -DoDLKvbdtunYJqTA -DnbkKvbdoznELXoA -DoCjjvbdZtIiYcsO -EOcLKvbdGGKSOJUR -DoCjjvbdUMWPAuni -DnbkKvbdEPDKkWbd -EPCkKvbdUxhTzLPO -DoDKjvbdGdKvKBij -DncKjvbdmSZUzSci -EPCjjvbdZjShQGaf -DncLKvbdWRmxCElD -EPDLKvbdqvpMDIyR -DncKjvbdCJKakIfK -EPDKjvbdHELWJbKK -DoDKjvbdjlbLzFGo -EPCjjvbdTkvPBWOi -DoCkKvbdJvVGEFGi -EOcLKvbdUyHszLPO -EObjjvbdVBBpsQqy -DnbkKvbdZdxGzhIb -DnbjjvbdsPvOicVf -DoDKjvbdtcCtwWPP -EOcLKvbdwtmFRYkn -EPDKjvbdegjvSNqH -DoDKjvbdIxUBglQp -EOcLKvbdBcpAvKNG -DnbjjvbdwXMAvAvV -DnbkKvbddoEsLUUS -DncKjvbdCIkCKiGK -DoDKjvbdlZTSTYft -EPCjjvbddoEsKtTr -EObjjvbdFfJrOJTq -EPDLKvbdliDsqVSB -DncLKvbdbUagXjtI -EObkKvbdIsYaSlxM -EPCjjvbdHkaznXRL -DnbkKvbdxUmFQyMO -DoCjjvbdWWiXvDdg -EPCjjvbdSQUHKFcw -EPDLKvbdjKGIJlwr -EOcKjvbdXFxytAOs -DncKjvbdmbKWwoNu -EObjjvbdiZuFkpmf -DoCjjvbdFyVVBDwb -DnbjjvbdeqaWzlDP -EPCjjvbdRyjHsDWA -DnbkKvbdqlzJyMHi -DnbkKvbdZRNFImFR -DoCkKvbdYfwEAPSi -DoCjjvbdOAIrsjSA -EPCkKvbdaNLCTVMg -DnbjjvbdqceIomvB -DnbjjvbdsCFlkgLZ -DoDLKvbdmIdURUqa -EOcKjvbdZshhxcrn -DoDKjvbdZjTIPgCG -DncKjvbdemGWfmJk -DnbjjvbdACqxKZiQ -EObkKvbdkVvnEBxX -DncLKvbdUtNTfMWK -EPDLKvbduaDxsPFI -EObkKvbdgQBzvcxI -EObkKvbdSZihTDWA -EOcLKvbdqYnggREY -EPDKjvbdqiAJdmPF -EOcLKvbdiGjDZVjV -EOcLKvbdGZVVAdXb -DoDKjvbdhfjCxuiu -DnbkKvbduMYXBTaX -DoCkKvbdjSziTKiz -DoDKjvbdqlzKZMIJ -DnbjjvbdkVwOEBxX -DoCjjvbddtAUASmW -DoDLKvbdzjVQQESt -EOcLKvbdkySrSyHU -DncLKvbdNGbolotk -DnbjjvbddeOrBwCj -DoDLKvbdiLdcmuDZ -DoDKjvbdSPsfjFdX -DoCkKvbdbUafxKtI -DnbkKvbdcJNJkFvx -EObjjvbdFejSNiUR -EPDKjvbdQmYCYmtz -DncKjvbdfVzwpJzs -EPDKjvbdWRmwbEkc -DncLKvbdFkEsDIMu -DoCjjvbdQccBPqES -EObkKvbdKCibpjCx -EOcKjvbdLBLHNBwq -DoCkKvbdUMWOaVoJ -DoCjjvbdrbFmMGjy -EOcLKvbdJvVFdEgJ -EPCkKvbdjhHMGFnL -DncKjvbdNxOuzcmt -EPDKjvbdEXxLstUM -DoDKjvbdwygfGXeS -EObkKvbdyTNiMrBg -DncKjvbdlZSrSxgU -EPDKjvbdJXtCHlQp -EPCkKvbddndsLTsr -EObjjvbdNdcshhkE -DncLKvbdSCDeLhyL -DncLKvbdNsTvHEuQ -EOcKjvbdACqxKZiQ -DoCjjvbdptTgRqjt -EPDKjvbdOEdTiJLE -DoDKjvbdrpVoKCvG -DnbjjvbdFjeSbhNV -EPCjjvbdNGbolouL -EPDLKvbdrEFIonVa -DnbkKvbdOFDsiIjd -DoCkKvbdTqQoUuIN -EPDKjvbdeOdsKtTr -DncKjvbdyNrhXsIc -EPDKjvbdnQZxujyC -EPCkKvbdYqMdhmFR -DncLKvbddeOrBvbj -DoCjjvbdLGFgbApu -DoCjjvbdemFwHMik -DoCkKvbdRXOEClHc -DoCkKvbdZQmEiNFR -EPCjjvbdEASIlzXX -DnbkKvbdrWokbiZR -EObkKvbdHELWKBij -DnbkKvbdbUagXkUI -EOcKjvbdbsDLUDia -EOcLKvbdUWLojUAq -DnbjjvbdQvmccMID -DoDKjvbdZxcjODMS -EPDKjvbdTulPjUBR -DncLKvbdjSzhsKiz -EOcKjvbdTAFJICOd -DnbkKvbdKNADzHVB -DoCjjvbdliDtRVSB -EObjjvbdWXIxVceH -EPCjjvbdfHkWRnQg -EObkKvbdjAQGaPgK -EObkKvbdkClLRGuH -DncLKvbdZnnIdeZj -EObjjvbdlYsRsYgU -DoDLKvbdpyPHgQcx -DnbjjvbdnPyyWKyC -EObjjvbdQwNcblID -DnbjjvbdCJKajhfK -EPDKjvbdiHKCyWKV -EObjjvbdeEoRavbj -EOcKjvbdmaivwnnV -EOcKjvbdwNWANDeN -EPDKjvbdTAFIhCPE -DoCjjvbdZQleJMeR -EPDKjvbdmtuZjiqf -DnbkKvbdEPCkLXCd -EObkKvbdqGEEsvBI -EOcKjvbdmIdTqVSB -EObjjvbdJTZBSlwl -EPCjjvbdqlzKZMIJ -EPDKjvbduCbtwWOo -EPDLKvbdnPzYukYb -EPDKjvbdeFPSBvbj -EPDLKvbdHEKvKCJj -EPDKjvbdVUNUGLuj -EOcLKvbdJuuGEEgJ -EOcKjvbdzQnmJKXA -EOcLKvbdrbGMkfjy -DnbjjvbdUsltFkuj -DnbkKvbdDxYMUUUM -DnbjjvbdUQpoUuHm -EPDKjvbdRbDdlJZL -DncLKvbdmgFXlmfy -EPCjjvbdJbibqJcY -DoCjjvbdEPDLLWcE -DoDLKvbdMJCMRYAS -DoCkKvbdQZNAGsSK -EObjjvbdiCPDFXQq -EOcLKvbdVwJXvEEg -DoDLKvbdsrqsYzFD -DncLKvbdjuvnDbXw -EPDKjvbdhgKCyWKV -DoDLKvbdNdctIiKd -EObkKvbduaEYrneI -DoCkKvbdNVSrKmAX -DncKjvbdXnRAXtvU -DoDKjvbdhkddNtcZ -DoCkKvbdiBnbdwQq -DnbkKvbdLBLGlawq -DoDKjvbdygZMANEw -DnbkKvbdZsiIxcsO -EObjjvbdiBoDEwRR -DoCjjvbdHbLzEzAD -EPCkKvbdjbkkQgVH -EOcLKvbdsBemLgLZ -EOcLKvbdptUGrRkU -EPCjjvbdznpQdbkx -DoDKjvbdGYtuAdXb -EOcKjvbdzjUpQETU -EOcLKvbdypoNIjXA -DnbkKvbdSQUHJfDw -EPCkKvbdbsCjtEKB -DoDLKvbdajlFoODA -DoDKjvbdelevfmKL -DnbkKvbdCTAbsfWr -DoDKjvbdjhGlGGNk -DoCkKvbddCTMrATm -EPDLKvbdaMjbSuMg -DoCkKvbdKaLHNCYR -DncLKvbdGGKSNiTq -DoCjjvbdLZRJrztf -EPDLKvbdjlakyeGo -EObkKvbdwuMdpyLn -DnbkKvbdegjuqnQg -EPDKjvbdtTSTYydc -EObkKvbdZyDjOClS -DnbkKvbdqGEEtWAh -EOcLKvbdKQydoFnF -EPDLKvbdqUTgSSKt -DnbjjvbdMJCMQxAS -EPCkKvbdiMFDnUby -EOcKjvbdfpBzwEXh -DoCkKvbdSBceMIxk -EObjjvbdfMevgMik -EPCjjvbdjAQHAofj -EPCjjvbdZLrETnMN -EObkKvbdDoDLLXCd -DncLKvbdSZjHsDWA -DnbjjvbdOStVgFVQ -EObkKvbdbhlijfXY -DnbkKvbdjEjftoAO -DoCjjvbdeEnrCXDK -EOcLKvbdZyEKNcMS -EPDKjvbdWSNwadkc -EPCjjvbdkDLjqHUg -DoCkKvbdSCEFLiYk -DncKjvbdtkwwBTaX -EPDKjvbdCTAbsevr -DncLKvbdmfdwlnGy -DncLKvbdTukpJtBR -DoCjjvbdlYrrTZGt -EOcKjvbdnCKWwoOV -DncKjvbdMgColpVL -EPDLKvbddwytURez -DoCkKvbdakLenmcA -EPCkKvbdQvmdCkhD -DncLKvbdEARhlzWw -EOcLKvbdrXQMDJYq -EObkKvbdmJETptrB -EOcKjvbdAMgxsXZx -EPDKjvbdULvPBVni -DoDKjvbdqGEFTvAh -DoDKjvbdGLFTChMu -DoCjjvbdLBKgNCXq -DoCjjvbdOEcsiJLE -EObjjvbdSLZFuHKs -DoCjjvbdtkxXAsaX -DnbjjvbdNGbpNQVL -EOcLKvbdiLeEOUby -EObjjvbdDoCjjwDE -EPCkKvbdxrnJMrCH -EPDKjvbdJTZBTMwl -DncKjvbdBcpBWJlf -DncLKvbdGKdsDHmV -DncLKvbdDwwlUUTl -EPDLKvbdbQHHELzd -EPDLKvbdYlSEUOLm -EObjjvbdhtyeXSUb -EPCjjvbdACqxKZiQ -EObjjvbdrDdiPmua -EPCkKvbdcyxpYYqC -EPDKjvbdrXQLbiZR -DncKjvbdjmBlZeHP -DncKjvbdlYrrTYft -EObkKvbdaaWFFpPw -DncKjvbdwyhGFwdr -EPCkKvbduLxXAtBX -EObjjvbdhancEvpq -DncLKvbdbiMjKevx -DncKjvbdTIyjRABM -DoCkKvbdcImKLFvx -DnbkKvbdZjSgpHBf -EPCkKvbdGdKvJbJj -EOcLKvbdSCDeMIyL -EOcKjvbdZxdJnClS -EOcLKvbdHDkVibJj -DoDKjvbdezuxeJTw -EOcKjvbdqFceUVaI -EPDKjvbdWIYWXfxz -DoDKjvbdNQXqWOHT -DnbkKvbdOStWHEtp -EPDKjvbdLAkGmBxR -EPDKjvbdDxXksssl -EPCkKvbdTqRPVUgm -DoDLKvbdrDdhomvB -DncLKvbdptUGrSKt -EOcKjvbdiBnbeWqR -DoDKjvbdezvYeJUX -DnbkKvbdOAJStJrA -DnbjjvbdtcCuWvPP -DnbjjvbdIjEAKPgE -EObkKvbdWWiXvEEg -DnbkKvbdSBdFMJYk -EOcKjvbdQdCaQQcr -EPDLKvbdLZRKSzuG -DoCkKvbdpfEFTuaI -DnbkKvbdVBBqSqRy -DncLKvbdMoxRVnGs -EOcLKvbduoTzqKnt -DoCjjvbdxxJKCPyk -DncLKvbdVvhwvEFH -EPDLKvbdOYPVzcnU -EOcLKvbdBdPaWJlf -DnbkKvbdJSyAsMwl -DoCkKvbdYTLaMsnx -EOcKjvbdUWLpJsaR -DoCjjvbdhbOcEwRR -DncKjvbdKfGHbAqV -DoCjjvbdlZTSSyGt -DncLKvbdatbGxLTh -EPDLKvbdiGicYvKV -EOcLKvbdTIyjRAAl -EPDKjvbdZsiIyDsO -DnbjjvbdZLqcsmlN -EOcLKvbdeOeTLTtS -DncKjvbdQdCaPqDr -EPCjjvbdUGznLvvF -EObkKvbdrDdhpNvB -EPDLKvbdRadFLhxk -DnbjjvbdhytelQmf -EPDKjvbdFkFSbhNV -DoDKjvbdaSGDHsek -EObkKvbdzHYlAMdw -DnbjjvbdliDsptrB -EPCkKvbdYlSDtNlN -DoDKjvbdnPyxujxb -EObjjvbdRkYfVGjs -EPCjjvbdRaceMJZL -EOcLKvbdnUuZkJrG -DncKjvbdOYOuzdNt -DoCkKvbdJbjDQicY -DnbjjvbdRyjHsCvA -EOcLKvbdUGzmlXVe -EPCjjvbdMoxRWOGs -DncKjvbdlrZUzTEJ -DoCjjvbdJYUBgkpp -EOcLKvbdACrXizJQ -EPDKjvbdsCGMkfkZ -DncKjvbdqYnhGqEY -DncLKvbdjgflFemk -DncKjvbdrzMQTAgn -DoCjjvbdlZTSSxgU -EPDLKvbdKCibqKCx -EOcLKvbdmJDtQuSB -DncLKvbdQcbaPqES -DoCjjvbdOXoVzdNt -EObkKvbdbsCjsdKB -EPDKjvbdySmiMqbH -DoCjjvbdrMzKZLhJ -DncKjvbdtAGqIAAr -EPCjjvbdEXxMTtUM -EOcKjvbdVrOYBdkc -DoDKjvbdzROlhiwA -DncKjvbdqTtHRrLU -DnbkKvbdiUzEwSUb -DoCkKvbdZLqcsnMN -DnbjjvbdUaBqTRRy -DoDKjvbdRosgKGEX -EObkKvbdShzKRABM -DoDLKvbdqZOhHRDx -EPDLKvbdiUzFWqtb -DoCkKvbdZyEJmbkr -DncKjvbdREDBPpdS -EPCjjvbdMSWmZtpz -EPDLKvbdTAEiHaoE -DoDKjvbdNeETiIjd -EOcLKvbdqdFJPmua -DoCkKvbdRpTfjFcw -DncLKvbdznoqEcMY -DoCkKvbdFfJqmiUR -EOcLKvbdSPsfifEX -DnbjjvbdtunYJpsA -EPDKjvbdqcdiQOVa -DnbkKvbdeXyssrFz -EPDLKvbdQYmAGrqj -EObjjvbdegjuqmpg -EOcLKvbdbLLenmcA -EOcLKvbdpyPHgREY -DoDKjvbdZRMdhmEq -DncLKvbddZxoxZRC -EOcKjvbdKxpjSztf -EPDKjvbdKkBHvAJy -EObkKvbdnBiwYOnV -EObkKvbdrWolDJYq -DoCkKvbdZyEJmbkr -DoDKjvbdkDMLRHUg -EPCjjvbdQwNccMID -DncKjvbdSZihSbvA -DncLKvbdnHFXmNgZ -DncKjvbdGKeSbhMu -DncLKvbdULvPAuoJ -EOcLKvbdYqNFJMeR -DoDLKvbdMfcPmQVL -EPDKjvbdFpATWgGZ -EObjjvbdeqaWzkbo -EOcKjvbdZoNhddzK -EObjjvbdFeiqmiTq -DoDKjvbdauBfwjsh -EOcLKvbdBraDUFvr -DoDLKvbdyYIjCPzL -DnbjjvbdmRxuZsEJ -EObjjvbdMfcQMpUk -EOcKjvbdyNsIXrhc -EPDKjvbdREDBPpcr -EPCjjvbdRkYeuGkT -EPCkKvbdtAHRIAAr -DnbkKvbdxUmFQxkn -EObkKvbdtTSTZZdc -EOcKjvbdmIdUQtqa -EOcKjvbdXrkaNUPY -DoDKjvbdCWzdIePv -DoDKjvbdbBVdfQPw -EPCjjvbdZyEJmblS -DncKjvbdlZTRrxft -EPDLKvbdIxUCIMQp -DnbjjvbdKyRKSztf -EOcKjvbdNeEUIhjd -EOcLKvbdjKGIJmXr -DoDLKvbdCEPaVimG -EPCkKvbdOFDsiIkE -EOcLKvbdehKvSORH -DoDKjvbdwWkaWAuu -EPDKjvbdpxoHfpcx -EPDKjvbdJbjCqJbx -DncKjvbdZtJJZETO -EPDLKvbdsZkpTBHn -EPCkKvbdTlWPAuoJ -DoCjjvbdjggMFfOL -DoDKjvbdfMewGlik -EPDLKvbdnBivwoOV -DoCjjvbdwuNEpxkn -DnbkKvbdiifIKNYS -EOcKjvbdKVuFdFGi -EPCjjvbdZdxGzgiC -EOcLKvbduaDxsPEh -EPCkKvbdRotHJfEX -DncLKvbdCIjajhej -DoCkKvbdcImJjfWx -EOcLKvbdKVtecdgJ -DoCjjvbdeFOrBwCj -EPDKjvbdqvpLcIxq -EObjjvbdEARiMyvw -DncKjvbdbUafxLTh -DncLKvbdLAkGmCYR -DoDKjvbdxVMdqYkn -EPDKjvbdWWiYWDdg -EObkKvbdKDJbpjCx -DoCkKvbdnPyxvKyC -DoCkKvbdZsiJYcsO -EObkKvbdJpzFOeme -EOcLKvbdOSsufeUp -DoDLKvbdTfznMWvF -EPDLKvbdfNFwGlik -EPDLKvbdCDpAuilf -EPDKjvbdbiMikGWx -DoCkKvbdrbGMkfjy -DoCjjvbdWIXuxHYz -EPDKjvbdGFiqnIsq -EPDLKvbdNGbpMpVL -EOcLKvbdtSrTYyeD -DoDKjvbdjJfHjNXr -EPCkKvbdzitpPcrt -DoDLKvbdxmrgxSiD -EPDLKvbdcJNKLFvx -EPDLKvbdsrrSxydc -DnbkKvbdqceIonWB -EPCkKvbdZnnIddzK -DoCjjvbdLYpirztf -EPCjjvbdLrWlzUpz -DnbjjvbdRkZGVGjs -EObjjvbdnBivxOmu -DoCjjvbdmIdUQuSB -EObkKvbdtcCtvuoP -DnbjjvbdANIYrvzY -DncKjvbdmaivwoNu -EOcLKvbdrouoJcWG -DoDLKvbdTppoVVIN -DoDLKvbdVUMtFkuj -DncLKvbdznpQdblY -DncKjvbdEPCkLXDE -EOcLKvbdfHkVqmqH -EPDKjvbdapGgDkzd -EPCjjvbdSPsfifDw -DoDLKvbdGKeTDINV -EObjjvbdyqPNIjXA -EPCjjvbdatbGwkUI -DoCjjvbdCTAcTewS -DnbjjvbdxnTIXsJD -EOcKjvbdbKlFnnDA -DncKjvbdjJegjNXr -EObjjvbdMuTRkNAX -EObkKvbdUxgsykOn -DoCkKvbdRaceMIxk -EPDLKvbdJbibpibx -DoDKjvbdEztQdlCi -EPDKjvbdcyyPwyRC -DncKjvbdjlbMZdfo -EPCkKvbdRXNdClID -DncLKvbdtbbuXVoP -DoDKjvbdieLHVPAO -DoDKjvbdFVxopMie -EObjjvbdzoPpdblY -EPCjjvbdmIdUQuSB -EPCkKvbdYkrEUNkm -DoCkKvbdVwIxVdEg -DoCjjvbdOSsvGdtp -EPCjjvbdmSYtysDi -EObkKvbdWWiYVceH -DoDKjvbdrNZixkgi -EPDKjvbdbVCHYKsh -DnbkKvbdjKFgimXr -EPDKjvbdNsUWHFUp -EObkKvbdeAUQlwjG -EOcKjvbdTAEiICPE -DoCkKvbdZLqdUNkm -EOcKjvbdZisHogCG -EPCkKvbdKVtfEEgJ -EObjjvbdaSGDIUGL -EPDKjvbdZRNFIleR -DoDKjvbdyXiJaoyk -EObkKvbdRkYfVHKs -DnbkKvbdLAkHNCXq -DncKjvbdJpyePFnF -EPCkKvbdkHgMFenL -DoDLKvbdOFDtIhkE -DoCkKvbdtTSTZZdc -EOcLKvbdkClKpfuH -DoCjjvbdBcpBVjNG -DnbkKvbdfMfXHNJk -DoDKjvbdBsBCtFvr -DoCjjvbdHgGzYwwg -DncLKvbdSwjkmzkY -DoCkKvbdDihJuwjA -EPDKjvbdQccBPpdS -EPDKjvbdehLVqnQg -DoCjjvbdmozZVkZC -DoDLKvbdaNKasVNH -EObkKvbdrRtkOLBN -DoDKjvbdehLWRnRH -EObkKvbdSCEEkiYk -DoCjjvbdRXOEDMID -EOcKjvbdFejRmiUR -EOcLKvbdFkEsChNV -DncKjvbdWWhwuceH -EPCkKvbdNwoVzdOU -EOcKjvbdePFSkUTr -DoDKjvbdMRwMzUpz -EObjjvbdLrXMzUpz -EPDKjvbdZxdJnDLr -EOcLKvbdrRtkNjaN -EPCkKvbdTvLoitBR -DncKjvbdKeehCApu -EPDLKvbdemFvfljL -DncLKvbdeFOqawCj -DoDKjvbdZyEJnCkr -DoCjjvbdlZTRsZHU -DnbkKvbdRbDdlJZL -DnbjjvbdYqMdiNFR -EObjjvbdSQTfjFdX -DoCjjvbdgFlZnGgA -DoDLKvbdwtldqYkn -EObkKvbdjggLfFmk -DncLKvbdMgCpNPtk -DncKjvbdmpZyWKxb -EPDKjvbdVqnYBeMD -DoDKjvbdULuoBWOi -DncLKvbdezvZEiTw -EPCkKvbdjblLRHUg -EPCjjvbdBiKakJGK -DncKjvbdTukpJtAq -DoCkKvbdkWWnEBxX -EPCjjvbdnPzYvLZC -EOcLKvbdWHxVxGxz -DncLKvbdNsUWHEtp -EObkKvbdHDkWKBij -EObkKvbdVAbQsQrZ -DnbkKvbdKCibqKDY -EObjjvbdLYqKSztf -DoCkKvbdZLrDtOMN -EOcKjvbdemFvgNJk -DncLKvbdiCOcEvpq -DnbkKvbdEXxLtTtM -EObkKvbdFjdrbglu -EObkKvbdmttykJrG -DoCjjvbdePFTLUTr -DoCkKvbdWRmwadlD -DoDLKvbdVqmxCElD -EPCkKvbdnBiwXoOV -DnbjjvbdEvZQPmKF -EObkKvbdSKyGVGkT -EPCjjvbdauBgXkTh -EPCjjvbdVrNxBeLc -EObjjvbdOEcshiLE -DoDLKvbdbLMGPNcA -DnbkKvbddZxpYYqC -DoCkKvbdlZTSTZHU -EObkKvbdtlXwBTaX -EObkKvbdHffyxwxH -EPDKjvbdrpWOicVf -DncKjvbdkVvmdBww -EPDKjvbduaDySoFI -EObkKvbdsZkosBHn -DoDLKvbdTAFJICOd -DnbjjvbdpstHRrLU -DncKjvbdUQqOtuIN -EPDKjvbdVUMtFlWK -DoDLKvbdrouoKDVf -DoCjjvbdmRyUysDi -EPDKjvbdgFkzNgHA -DnbjjvbdZshiZDsO -DnbjjvbdIMBzmwRL -EObjjvbdZshhxdTO -EOcLKvbdZGwEAOri -EPCkKvbdkHflFfOL -DoCkKvbdKDJcQibx -EOcLKvbdFkEsCgmV -EPCjjvbdJutfEEgJ -DoCkKvbdOXnuzdNt -EPDLKvbduLwwAtAw -DoDKjvbdqvpLbiZR -EPCjjvbdGYuVBEXb -EOcLKvbdCJKajhfK -DnbjjvbdkMbLyeGo -EPCkKvbdijGIKMwr -DoDLKvbdJzpGXdAN -DoDKjvbdNwnuzdOU -EOcLKvbdtSqsYyeD -EOcLKvbdmRxuZrdJ -EPDKjvbdhlEcmtcZ -DoCkKvbdbiNJjevx -DoDKjvbdGckVibJj -DoDLKvbdGLFSbhMu -EPDKjvbdEObjkWbd -EObkKvbdBhkBjiGK -EPDKjvbdtAGqIAAr -DoCkKvbdWRmwadkc -EObjjvbdQdDAoqDr -EOcLKvbdwNWANDeN -EPCjjvbdMowqVmgT -EPDLKvbdegkWSNpg -EPDLKvbdjAQHAogK -DoDLKvbdvwLaVaWV -EPCjjvbdLGFgbBQu -DoCjjvbdxsOJMrCH -EObkKvbdFkFTChMu -EObjjvbdbLLenmcA -EPDLKvbdiCObeXRR -EPCjjvbdhbObdvpq -EObkKvbdVZIUZkOn -EPDLKvbdfVzxPizs -EPDKjvbdnPyyVjyC -DncLKvbdRzKITCvA -EOcLKvbdUtMsfLuj -DncKjvbdVBBpsRRy -DnbkKvbdzeZnzdzQ -EOcLKvbdUtNTfMVj -EObjjvbdqcdiQOWB -DoCkKvbdNddTiIjd -DncLKvbdrykosBHn -EPDKjvbdWRnYBeLc -DncLKvbdrXQLcIxq -EPCkKvbdUWLpKTaR -DoCkKvbdZRNFJMeR -EPDLKvbdunszpjoU -DoDKjvbdzitpPdSt -EObkKvbdvBDxrneI -DoDLKvbdVviXvDeH -EPCkKvbdDihJuxKA -EPCkKvbdNPxQunGs -DoCjjvbdmuUzKjRf -DnbkKvbdbPffdLzd -DoDLKvbdXrlBNTnx -DoDKjvbdZQmEhmFR -EObjjvbdmttzLKRf -DoCkKvbddijRvUzn -EPDLKvbdHffyyYXg -EPCkKvbdcTDKtEJa -EPCkKvbdpecdtWAh -DncKjvbdRjxeuGkT -EPCjjvbdqdEhpOVa -EPCjjvbdelfXGmJk -EObkKvbdWWhwudFH -EPDKjvbdhbObeXQq -DoCkKvbdffLynHHA -DnbjjvbdpaJFAXIE -DoDKjvbdqZPIGpcx -DoDLKvbdmaivxPOV -DncKjvbdqFdEsvAh -EPCjjvbdrpWOibvG -EPCkKvbdyfyMAMdw -DoDLKvbdhuZdvqtb -DncLKvbdWRnYBeMD -DncLKvbdDncLKvbd -EObkKvbdhzUfLpnG -EOcLKvbddoFSkTtS -EPDKjvbdbKlFoODA -DoCkKvbdRWmccLhD -EObjjvbdeAUQlxJf -DncLKvbdKVuGEEfi -EObkKvbdVvhwvEEg -EPDLKvbdhaoDEvqR -EPDKjvbdpfEFTvBI -EPCkKvbdyzeNrIJI -DoDLKvbdGckViaij -EObjjvbdnHExNNfy -EObkKvbdZLqdUOLm -DoDLKvbdDxXktTsl -EObkKvbdFVxpPmKF -DoDKjvbdNdctJJLE -DnbkKvbdTXkMNzjx -DncKjvbdbrbkUEKB -DoCkKvbdGKeSbhNV -EPDKjvbdYSkaMtOx -EPCjjvbdiGicYujV -EObjjvbdnHFXmOGy -DoDKjvbdZyDjNblS -EOcLKvbdGYtuBEXb -DnbjjvbdqGDeUWAh -DnbkKvbdTppnuVHm -EOcLKvbdPyNAGsRj -EPCkKvbdIrxaSlxM -DncKjvbdCfkfHAzc -DnbkKvbdIHHZxxXg -EPCjjvbdjKFhKMxS -EOcKjvbdehKvRnRH -EObjjvbdxVMdpyMO -DnbjjvbdSLYetgKs -EObkKvbdRjyGUfkT -DoCjjvbdwyhFeweS -DncLKvbdrJAKElne -EPCjjvbdiGjCxvKV -EPCjjvbdCIjajiFj -DoDLKvbdunszqLPU -DnbjjvbdySmhlrCH -DnbkKvbdnBjWxPNu -DoDKjvbdlhdTqUrB -DoCjjvbdGdKvJajK -EObjjvbdkySqryHU -EPCjjvbdYkqdTmkm -EObkKvbdDnbjkXDE -EPDKjvbdKDKCqKDY -EOcLKvbdeYZstSFz -EPDKjvbdZyDjNbkr -DncLKvbdPyNAGrrK -DoCkKvbdTlVoAuni -DncKjvbdEPCkKvbd -EPCkKvbdcTCkTcjB -DnbkKvbdcJNKLGXY -DnbjjvbdRkYfVHKs -DoDLKvbdaaWEfQQX -EPDKjvbdmbJvwnmu -EOcLKvbdZyDimcMS -DoDLKvbdYkrEUNkm -DoDKjvbdmaivwnmu -DoDLKvbdqYoIHQcx -EPDKjvbdLrWlyuQz -DncLKvbdkCkkQgVH -EObjjvbdrXPlChyR -DoCjjvbdJTYaTMwl -EPCkKvbdNsTvHFVQ -DnbjjvbdeEnqavcK -EPCjjvbdVvhwuceH -EPCkKvbdbLMFoODA -EPDLKvbdCIkCLIfK -DoDLKvbdbLLennDA -DncLKvbdyNrhYTIc -EPDLKvbdNHCpNQUk -DnbkKvbddndsLUTr -DncKjvbdaogHDkzd -EPDLKvbdZjSgpGbG -DnbjjvbdaSGDIUGL -EPCkKvbdjhGlFfNk -EPDLKvbdbKkenmcA -EOcKjvbdIHHZyXxH -DoCjjvbdiUydwRtb -EPDLKvbdauBgYKtI -EPDLKvbdZMSDsmlN -DoDKjvbddneSjtTr -EPCjjvbdJbibqJbx -DnbjjvbdGYtuAcwb -DoDLKvbdsQVoJbvG -DoCkKvbdxmrhXsIc -DoCjjvbdyNsHwsJD -DoCkKvbdKWVFceGi -DoDLKvbdsBfNMGkZ -DnbkKvbdJzoewdAN -EPDKjvbdwzHefYFS -DnbjjvbdBiKbKhej -EOcKjvbdjuvmdCXw -EOcKjvbdbhmKKevx -DoCjjvbdehLWRmpg -EPCjjvbdACrYJzJQ -EOcKjvbdhuZeXSUb -DoCkKvbdJcJbqJcY -EPDKjvbdYqMeJNEq -DncLKvbdmJDtRUqa -EPDKjvbdnBjWxOnV -DoDLKvbdOEctJIkE -DoCjjvbdDxYLtTtM -EOcLKvbdZnnJFFZj -EOcKjvbdKRZeOfNe -DoCjjvbdTukpJtAq -DoDKjvbdhyuGLpnG -DoDKjvbdhtzFWrUb -DnbkKvbdQccBQRDr -EPCjjvbdTukojUBR -EPDKjvbdeKKRvUzn -EOcLKvbdeXzTtSFz -DncKjvbdyTOJNSCH -EObkKvbdjmBkydfo -EPCjjvbdelevflik -DoDKjvbdZtJIxcrn -DoDKjvbdqiAJeNOe -DoCjjvbdddnqavbj -DoCjjvbdZLrDtOMN -EPDKjvbdZyEKNcLr -EObkKvbdMgDPmQVL -EPCjjvbdxrmiMrBg -EObjjvbdZGvdAPSi -EPCkKvbdvvkaWBWV -DncKjvbdfMewHNJk -DoCjjvbdlrYtyrdJ -DncLKvbdiLeDnVCy -DnbjjvbdvwLaWBWV -EOcLKvbdVBCRSprZ -DoDLKvbdYzbfSKVy -DnbkKvbdXrlBNUPY -EObjjvbdKfFhCAqV -DoCkKvbdVTmTekvK -EPDLKvbdaSGChTfL -DncLKvbdauCGwjsh -EObjjvbdBcpBWJlf -DnbjjvbdZjTIQHCG -DoCkKvbdDjHiuxKA -EObkKvbdZxdKNblS -DoDLKvbdptTfrRjt -DoDLKvbdJbjCqKDY -EOcKjvbdEJhKWYKA -DnbkKvbdssSSyZeD -EOcLKvbdZshhyESn -EPDKjvbdRjxfUgKs -DncKjvbdwygefYEr -EPCkKvbdiLeEOVCy -DnbkKvbdTvLojTaR -DoCkKvbdzdzOzdyp -EPDKjvbdVUNUGMWK -EObjjvbdqdEhonVa -EPDKjvbdKefHbAqV -DncKjvbdtSqsYzFD -DoDLKvbdZjTIPgBf -EPCkKvbdRjyFuHLT -EOcKjvbdUtMsfLvK -DoCjjvbdnHEwlnGy -DnbjjvbdURQnttgm -DoCkKvbdFfJrOIsq -DoDLKvbdjKGIKMwr -EOcKjvbdTAEiIBnd -EPDLKvbdFxttaEXb -DoDKjvbdJTZAsNYM -EPCkKvbdFejSNhtR -EPDKjvbdwkXEHzyf -DnbjjvbdbUafxLTh -DoCkKvbdZQleJNEq -EPCjjvbdmpZyVkZC -DnbjjvbdmJEUQuRa -EObkKvbdrEFIpNua -EOcLKvbdJpzEnfNe -DnbjjvbdyTNiMqag -EObjjvbdNQYQvOHT -EPDKjvbdGKdrbgmV -EOcLKvbdCJKakIej -DncLKvbdlhcsptrB -DnbjjvbdZirhPfaf -DncKjvbdZoNiFFZj -EOcLKvbdjuwNcaww -EOcKjvbdUyITzLPO -DnbjjvbdxVMdpyLn -EObjjvbdnCJwXnnV -EPCjjvbdIMBznWqL -EObkKvbdJpzFOenF -EObjjvbdlhdTpuRa -DncLKvbdSCDdkiZL -EObjjvbdZxcimcMS -EOcKjvbdxVMdqZLn -DoCkKvbdrJAKFMne -EObjjvbdXsMAmUPY -EObjjvbdeFOqbWbj -DncKjvbdCTBCsfWr -DoCjjvbdRyjHsCvA -EPDKjvbdziuQQDrt -EOcLKvbdziuPocrt -EPCkKvbdWWhwvEEg -EPCkKvbdeEoRavcK -EPCjjvbdSKyFuGkT -EPCjjvbdrEFIonWB -EObjjvbdrEFIpOVa -DncKjvbdzGyMANEw -EPDKjvbdrRtjmjaN -DoCkKvbdJbjDRKDY -EObkKvbdfNFvgNKL -DnbkKvbdZHWdAPTJ -EPCjjvbdCDoaWKMf -DncLKvbdJKEAKPgE -DnbjjvbdssSTYydc -EOcKjvbdIsYaTNYM -EPCkKvbdgPazvcxI -DoCjjvbdmozYvLYb -DnbkKvbdeATqNYKG -EObjjvbdIwsbIMQp -EPDLKvbdpssfrSKt -EPCkKvbdhzUfLpmf -EOcKjvbdNGcPlpUk -DncLKvbdhkeEOVDZ -EPDKjvbdLFfIBaRV -EPCkKvbdJuuGEFGi -EOcKjvbdRacdlJYk -EPCjjvbdmbKWxOmu -EPDLKvbdwtmFQxkn -DnbjjvbdgvyAzzAJ -EPDKjvbdNrsugFVQ -DncKjvbdmttzLKRf -DnbkKvbdZyEKNcLr -EObkKvbdxrmiNRag -DoDLKvbdiMFDnVCy -EObjjvbdWSNxBdlD -DnbkKvbdCTBDUFwS -DoDKjvbdYTLaMtPY -EOcLKvbdZtIiZDrn -EObjjvbdYzcGSJvZ -EObkKvbdCSaDUFvr -DoCjjvbdTppnuUgm -DoCkKvbdOTUVfduQ -EOcLKvbdfpBzwDwh -DncKjvbdGBPQyJzm -EPCjjvbdVZITyjnn -EObkKvbdVhXuxGxz -EObjjvbdiifHimXr -EPDKjvbdvwMAvAvV -EOcKjvbdkWXODbYX -DoDKjvbdmbKXXnnV -DoDLKvbdZsiJZDrn -DoCkKvbdlrZUzTDi -DoDKjvbdSQTfjGEX -EOcKjvbdqcdiPnWB -EOcLKvbdpssgSSKt -EPDLKvbdhkeENuCy -EPDKjvbdZQmEhmEq -DoDKjvbdZtJIxcrn -DncLKvbdhgJbxujV -DoCkKvbdDoDKkXCd -EObkKvbdZGvdAOsJ -EObkKvbdwjvdHzyf -EPCjjvbdUQpoUuHm -EPDKjvbdUGznMXVe -DnbjjvbduaEYroFI -DoDLKvbdehLWRnRH -DoDLKvbdgQBzwEYI -EObkKvbdbUagYKsh -EObjjvbdyqPMhiwA -EPDKjvbdvvkaWBWV -DnbkKvbdJTYaTNYM -DoDKjvbdZtIhxdSn -EOcLKvbduaEZTOdh -EObjjvbdkNCMZeGo -EPCjjvbdZLqdTnLm -DoCkKvbdUsltFkuj -DncKjvbdnPyyVkZC -DoDLKvbdwjvdHzzG -EPCkKvbdGKdsCgmV -DnbjjvbdiMFDmtby -EObjjvbddneSjtUS -DncLKvbdezvZFJUX -EPCjjvbdhbOcFWqR -DoCkKvbdaMjbTVMg -DoDLKvbdHDjvKCJj -EOcLKvbdpxoIHRDx -DoDKjvbdZshhxcrn -EOcLKvbdcJNKKewY -EObjjvbdTppntuHm -EPCjjvbdemGWfmJk -DoCkKvbdjcLkQftg -EObkKvbdQwODbkgc -EPDLKvbdCTAcUFwS -DnbjjvbdvOszpkPU -EOcKjvbdkClLRHUg -EOcLKvbdNHCpMpVL -EObjjvbdZMRcsnMN -DoCjjvbdpxnggQcx -EOcKjvbdyTOJNRbH -EPDKjvbdeKKRutzn -DncKjvbdrzLosAgn -EPDKjvbdYzcGRjWZ -EPDKjvbdQcbaPpdS -DnbkKvbdtkxXAsaX -DncKjvbdCDpAvKMf -EPDKjvbdHEKvKBjK -EOcKjvbdfpBzvdYI -DncLKvbdiifIJmYS -EPDLKvbddeOqbWbj -DnbkKvbdZyDinDMS -DoDLKvbdkNCLydgP -EOcLKvbddePSCWbj -DnbkKvbdZxcjNcMS -DoCjjvbdQwNccMID -EPDLKvbdiiehKMwr -EOcLKvbdCTBDUFwS -EPDLKvbdbLMGOnDA -EOcLKvbdUMWOaVni -DnbjjvbdyqPMhjXA -DncKjvbdCTAbsewS -DncKjvbdMpYQvOHT -EPDKjvbdTqRPVVIN -DoCjjvbdZxdJnClS -DoCjjvbdWSNwbElD -DnbkKvbdrWokcIxq -EObkKvbdWIYWXgYz -EPDKjvbdzitopDsU -EObjjvbdUVkojUBR -EPDLKvbdEObkLXCd -EOcKjvbdrbFmMHKy -DnbjjvbdehKuqmpg -EOcLKvbdZshiYcrn -DoCjjvbdZnnIdeZj -EOcLKvbdmttzLKRf -EObjjvbdGZUuBDwb -DoCjjvbdHDjvJaij -DnbjjvbdKQzFPGNe -DncKjvbdRbDeMJYk -DoCjjvbdezuyEhsw -DoDKjvbdwkWdHzzG -DncKjvbdEASJMyvw -DncLKvbdyfyMANEw -EPCjjvbdCSaDTfXS -EOcKjvbdCJKajiGK -EObjjvbdrJAKFNOe -DnbjjvbdFWZPoljF -DnbjjvbdmpZyVjyC -EPDKjvbdiifIKNYS -DncKjvbdGAnqYizm -EOcKjvbdiMFEOVDZ -DnbjjvbdJXtBglRQ -DoCkKvbdijGHilwr -DoCjjvbdDwxMUUUM -DoDLKvbdUMWPBVni -EPCjjvbdDwwksssl -DnbkKvbdNeDshhkE -EObkKvbdbAudfQQX -DnbkKvbdwuMdqZLn -DnbjjvbdijGHjNXr -EPCjjvbdOFETiIkE -DoCjjvbdxsOImSCH -DoCkKvbdLiBkqYAS -DncKjvbdFkFTDHmV -DoCjjvbddoErjstS -EObjjvbdyOTIXsIc -DncKjvbdeXzTtSFz -DoCjjvbdqdFIonWB -EPDLKvbdMpYRWNgT -DoDLKvbdfNGXHNJk -EPCjjvbdePErkTsr -DoCjjvbdNHCpNQVL -EObjjvbdsQVnjCuf -DnbjjvbdtcDUwWPP -DoCjjvbduaDySndh -EPDKjvbdqZPIGqDx -EObjjvbdijFgimYS -DncKjvbdZyEJmblS -DoDKjvbdirziSkJz -DncLKvbdeOeTKtTr -EOcKjvbdfpBzwEYI -DnbkKvbdezvZFItX -EPCjjvbdrRuLOKaN -DncLKvbdbrbjscjB -EObkKvbddBrlrAUN -EPDKjvbdZoOIdeZj -EOcKjvbdGYuUaEYC -EPCkKvbdNxPVzdNt -EOcLKvbdhlFDmuDZ -DncKjvbdKVtecdgJ -EPDLKvbdqlzJxkhJ -EOcKjvbdySmhlqbH -EPCkKvbdxsNiNRag -EPDKjvbdTYKkmzjx -EObkKvbdIryBTMxM -EPDLKvbdxnShXsIc -EPCjjvbdaSFbhUGL -EObjjvbdRDbaQQdS -EObkKvbdrbFmMGkZ -EPCkKvbdWXJXudEg -EOcLKvbdcJNKKfXY -DncKjvbdEuxpPljF -DncKjvbddCTNSATm -EOcLKvbdFVyQPmKF -EPCkKvbdpeceUWBI -DoDLKvbdVTmUGMWK -DoCjjvbdFyVVBEXb -EOcLKvbdTukpKTaR -DncLKvbdDHLegAzc -EPCjjvbddxZtTrFz -DncKjvbdssRsZZeD -DoDKjvbdeOeSjstS -DoDKjvbdQdDApQcr -DncLKvbdURQoUuIN -DnbkKvbdezuxdiUX -EPCjjvbdbPgHDkzd -EOcKjvbdFWZQQMjF -DoDKjvbdMfcQMotk -EPCjjvbdrWokbiYq -DoDKjvbdnGdwmOGy -EOcKjvbdnBjXYOmu -EOcLKvbdDoCjjvbd -DoDLKvbdsQVoJbuf -EObkKvbdZirhQHBf -EPCkKvbdIGgZxwwg -DncLKvbdrMzKZMIJ -DnbkKvbdkHflFemk -EObkKvbdfHkWSORH -DnbkKvbdwygfGYEr -EOcKjvbdxmrgxTJD -DnbjjvbdGdLViaij -DoDKjvbdmSYtysEJ -EObkKvbdfILVqmpg -DncLKvbdADSXizIp -DoCjjvbdznpQdbkx -DncLKvbdmbKWxOnV -EPCkKvbdJvUfEEfi -EOcLKvbdcScLTdJa -DnbjjvbdQcbaPpdS -EPDKjvbdDoDKjvcE -DncKjvbdhzUfMROG -DncKjvbdbrcKtDia -EOcLKvbdJpydoFme -DnbjjvbdxLWdHzyf -EPCjjvbdwuMeQyMO -EOcLKvbdiifHimXr -EOcLKvbdySmiNSCH -EPCjjvbdznopeCkx -EPDLKvbdZshhyESn -DoDLKvbdrDeJQNvB -DoDLKvbdILaznXQk -DoCjjvbdnUtzKiqf -DnbkKvbdjJehKMwr -EOcLKvbdDxXlUUUM -DoCkKvbdtSqsYyeD -DoDKjvbdxVMeQxlO -EPDLKvbdZjTHofaf -EObkKvbdZisHogBf -DnbkKvbdnBiwXoOV -DoCkKvbdYSkaMtPY -DncLKvbdHELVibKK -EPCkKvbdhlEcnVCy -EPCkKvbdZLqdTnMN -DoDKjvbdbsCkUEKB -EPCkKvbdMpYRVnHT -EOcLKvbdFWZQPljF -DoDLKvbdznoqEcLx -DnbkKvbdcImJjewY -EPCkKvbdvvlBVaWV -DoCkKvbdmIdTqUrB -DncKjvbdxZgeexFS -EOcLKvbdrouoJbvG -DoCkKvbdWRnYBdlD -DoCkKvbdBhjbLJFj -DnbjjvbdrouoKDWG -DoDKjvbdUxgsyjnn -DoDLKvbdakMFnnDA -EOcLKvbdZtJJYcsO -DncLKvbdrbFllHKy -EPCjjvbdmajXXnmu -DncLKvbdpyPHgQdY -EObjjvbdyNrgwsJD -EPCjjvbdaMjaruMg -DncLKvbdYfwEAPTJ -DoDKjvbdbiNKLFvx -DoCjjvbdajkfOnDA -EObjjvbdZoOJEeZj -EOcKjvbdqZOhGqEY -EOcKjvbdziuPodTU -DoDKjvbduLxWaUBX -EObkKvbdyXhjBoyk -DoDKjvbdTkunaWPJ -EObkKvbdBraCsfXS -DoDLKvbdTAEiICPE -DnbkKvbdDjHjVwjA -EOcKjvbdqlzKZLhJ -EObkKvbddneTLTsr -EObkKvbdWRmwaeMD -DoDLKvbdLBLHNBwq -DoDLKvbdUxhUZkPO -DncKjvbdYlSDsmkm -DoCkKvbdxZhGFwdr -EObjjvbdbsDKsdJa -EPCkKvbdGYuVAdYC -EObkKvbdRXNccLhD -DnbjjvbdFVxpQMjF -DoDLKvbdMgDQNPtk -EObkKvbdQvmccMHc -DncKjvbdMpXqVnHT -DoCjjvbddZxoxYqC -DncKjvbdnVUzKjRf -DoCjjvbdEuyQPmKF -DoDKjvbdLYqKSzuG -EPDLKvbdTAFJICOd -DoCjjvbdCJLCKiFj -EOcLKvbdFyVVAcwb -DoCjjvbdbQHHDkzd -DoCkKvbdNrsvGduQ -DnbjjvbdRWmcblID -DnbkKvbdQvnEDLgc -DnbjjvbdVZITzKnn -EPDLKvbdxxJJaoyk -EObkKvbddoEsLUTr -DncLKvbdZQldhldq -DoDLKvbddCSmSAUN -DoDLKvbdYpldhldq -DoDLKvbdDxXlUTsl -EPCkKvbdnGdxMmfy -DncKjvbdwWlBWAuu -EOcLKvbdkDMKpgUg -DoDLKvbdZshiYdSn -EPDLKvbdhfjCyWKV -EObjjvbdKRZeOeme -DoCkKvbdznopdcLx -EPCkKvbdZMSDsnMN -DnbkKvbdkWWmcbXw -EObjjvbdpxoHfqEY -DnbkKvbdtlYXAsaX -EPDLKvbdjvXNcaww -EPDLKvbduDDVXVoP -DoDKjvbdLGFgbBQu -EObjjvbdmuUzLKRf -EObjjvbdRaceMIyL -EPDLKvbdiHKCyVjV -DoCkKvbdxnTHwriD -EOcLKvbdZjTIPgCG -DncLKvbdBcpBVjNG -EPDLKvbdVwIxVceH -DoCkKvbdkIGkeemk -DnbkKvbdozmdKxPA -DoDKjvbdjuwNdCXw -DoCkKvbdeEoSCXCj -EPCkKvbdcScKtEJa -EPDLKvbdySnIlrBg -EPCjjvbdnQZyVkYb -DoDLKvbdqYnggREY -EObkKvbdBsBDUGXS -DnbkKvbdUWLoitAq -DoCkKvbdIGgZxxYH -DoDLKvbdvwLaWBVu -EObjjvbdmfeXlnHZ -EPDLKvbdRXNdDMID -EPCjjvbdZLrDsmkm -EOcKjvbdUQpoUuHm -DnbkKvbdEzsqFMDJ -EOcLKvbdQlwayOUz -EPDKjvbdyzdnRhJI -DoDLKvbdwzHfGXeS -EOcKjvbdTvMPitBR -EOcKjvbdJbicRJcY -DoDLKvbdFVxpQNJe -DoDLKvbduLxXBTaX -DoCjjvbdLYpirzuG -DnbjjvbdvwMAvBWV -EPCkKvbdBiKbKiFj -DncLKvbdIryArmYM -DncKjvbdySmiNRag -DncKjvbdeEoRbWbj -DoDLKvbdjuwOECXw -EPDLKvbdFWZPomJe -EObkKvbdjcMLRGtg -DncLKvbdQwNccMHc -EPDLKvbdzQoMiJwA -DoDKjvbdmSYtzSdJ -EOcLKvbdelfWgMjL -EOcLKvbdiMFENuCy -EPCkKvbdezvZEhsw -EPDLKvbdUVlPisaR -EPDKjvbdbKlGOmcA -EObkKvbdzGyMANEw -DoDKjvbdXFxzUAPT -EPDLKvbdqrUkNkAm -EOcKjvbdPxmAGsSK -EOcLKvbdyfyMAMeX -EObjjvbduDDUwVoP -DncLKvbdyYJJbQZk -DoDLKvbdxVNEqYkn -EPCjjvbdNPxRWOHT -EObkKvbdYqNEiNEq -EPDKjvbdXrlAlsoY -EPDLKvbdbrcKtEJa -EObjjvbdGdKvJbJj -DoCjjvbdrDeJPnVa -DoDKjvbdZLrETnMN -DoDKjvbdKVuGDeGi -DoCkKvbdZtJIyETO -EObjjvbdYSlAlsoY -DoDLKvbdCSaDUGWr -EObjjvbdmfeYNNgZ -DoDKjvbdtumwiqTA -DncKjvbdqFdEtWAh -EPCkKvbdauCHXjtI -DnbjjvbdvOszqKoU -EOcKjvbdxrnImSBg -DoCkKvbdjvWmdBww -EPCjjvbdmuUzKiqf -EObjjvbdNdcsiIjd -EOcLKvbdNPxRVnGs -EObkKvbdSPsgKFdX -EPDLKvbdVAbQsQqy -EPDKjvbdVZHsyjoO -DncKjvbdJzofXdAN -EObkKvbdFjeTChNV -DnbjjvbdjJegjNXr -DnbkKvbdZLrDsnLm -DnbjjvbdbAueGQQX -DncLKvbdQcbaQQdS -DnbjjvbdFjdrbglu -DncLKvbdAMgxsWyx -DnbjjvbdRpUHKGDw -DncLKvbdMfcPlpVL -EObjjvbdIwtBhMRQ -EPCkKvbdelfXGmKL -DoDLKvbdFkErbhMu -EPCjjvbdHffyyYXg -DoDKjvbdOEctJIkE -DoCkKvbdKkAgvAKZ -EObjjvbdzitopDsU -EPCjjvbdRpUHJfEX -DoCkKvbdZLrDtNkm -EPCkKvbdijGIKNXr -DoCjjvbdxUmEpxlO -DnbjjvbdIxTbIMRQ -EPCkKvbdMfbpMotk -DncLKvbdjlbLzFGo -EObkKvbdrRtkNjaN -DnbkKvbdRosgKFcw -EPDLKvbdpfDeUWAh -DnbkKvbdkxsRryHU -EPCkKvbdkVvmcbXw -EOcKjvbdhficZWJu -EPDKjvbdCEQBWKMf -DoCjjvbdUyITzKoO -DnbjjvbdaNKbStmH -EPDLKvbdFWYpQMie -EObjjvbdhytekqNf -EObjjvbdeXyssqez -DnbkKvbdLAjgNCYR -DncKjvbdSBdFLiZL -EPDKjvbdBhkBjiGK -DoDKjvbdmajWxOmu -DoCjjvbdrMzJyMHi -DoDKjvbdZLqctOMN -EOcKjvbdnPzYujxb -DncKjvbddoFTKstS -DncLKvbdjcMLRGuH -DoCkKvbdbUagYKtI -DncLKvbdVAaqTRSZ -EPCjjvbdOEdTiJLE -EPCjjvbdJvUfEFHJ -DnbjjvbdIryBTNYM -EPDKjvbdYpleJNEq -DncKjvbdZGwEAOri -DncLKvbdBdQAvJmG -DoCkKvbdmIdTqUqa -EPCkKvbdtcCuWuno -EPCjjvbdmuUyjjSG -DncLKvbdjAQHApHK -EPCjjvbdGdKujBjK -EPDKjvbdYkrETmlN -DncKjvbdYORAYUut -DnbkKvbdiHKCxvJu -EPCjjvbdkHgLfGOL -DoCjjvbdpssfqqkU -EPDKjvbdZnmheEzK -EPDLKvbdySmhlrCH -EPCkKvbdjJegilxS -DoCkKvbdqcdhpNua -EPDKjvbdIHHZyXxH -DnbjjvbdjmBkydgP -DoCjjvbdYkqcsnLm -EPCkKvbdZnmhdeZj -EPDLKvbdDjIJuwjA -EOcLKvbdnQZxvKyC -EPCkKvbdBhkCKiGK -DnbjjvbdYkrDsnMN -DncLKvbdyzeNqghh -DncLKvbdrRuKmjaN -EPCjjvbdssRsYzEc -DoDLKvbdZQleJNFR -EObjjvbdZQleJMeR -EPDKjvbdtvNxJqTA -EObjjvbdbBWFGPpX -EPDLKvbdajkeoODA -EPDLKvbdSZihTCvA -EObkKvbdZMRdTnMN -EPCkKvbdsCFmLgKy -EObjjvbdVvhxVceH -EPCkKvbdaaVeFpQX -DoCjjvbdZQmEhleR -EOcKjvbdhzUfLpmf -EPCkKvbdREDBQRDr -DncLKvbdemFwHNJk -EOcKjvbdGAnqYizm -DncLKvbdtTRsZZdc -DoDLKvbdGGKRmhtR -DoDLKvbdIidAJogE -DoCkKvbdxZhGFxEr -DncLKvbdpxoHgREY -DnbjjvbdQcbaQRES -EPDKjvbdjAPfaPgK -EPCkKvbdvwMAuaWV -EOcKjvbdZLrDsnMN -DncKjvbdyqOlhiwA -EObkKvbdRacdkiYk -DoDKjvbdUWMQJsaR -EPDKjvbdUGzmkvvF -DoCjjvbdhbPDFXRR -EObjjvbdXGZZtAPT -EPCjjvbdMoxRWNgT -EOcKjvbdGFiqmhtR -DoCkKvbdNPxRWNgT -EObkKvbdyNrgxTJD -EPDKjvbdrXPkcJYq -EOcLKvbdFjeTChMu -DncKjvbdjvXNcaww -DncKjvbdkMbMZdgP -EOcKjvbdDnbkLXDE -EObjjvbdbBWFGPow -DoCjjvbdAMhZSwZx -EPDLKvbdZRNEiMeR -DoDKjvbdqdEiQNvB -DoCkKvbddePRavbj -EPDKjvbdaMjbStlg -EObkKvbdHgGyxxYH -EOcKjvbdtkxXBUAw -DnbjjvbdmSZUysEJ -EObkKvbdrXQLbhxq -EObkKvbdVTlsfMWK -DoDKjvbdSLZGUfjs -DoCkKvbdFVyPpMjF -DoCjjvbdhgKCyViu -EPCkKvbdZMSDtOLm -EPCjjvbdySmhlqag -EPDKjvbdWRmwadlD -EPCjjvbdqZPHfpdY -DoDLKvbdXsMBMsoY -DncLKvbdelewHMjL -EObjjvbdYpleImEq -DoDKjvbdZirgogBf -EOcLKvbdrXPlChxq -EPCkKvbdFVxpQMie -DoCkKvbdrNZjZMHi -EOcKjvbdDjIJuxKA -DncLKvbdeOeSkTsr -DoCjjvbdZoNhddyj -DoDKjvbdkWXNcaxX -DoDLKvbdTpqOtthN -DnbjjvbdehKuqnQg -EPCjjvbdmgFXlmfy -DncLKvbdShyiqAAl -EOcKjvbdKaKgNBwq -EPDKjvbdEztREkbi -EOcKjvbdVviXvEFH -EPDKjvbdcIlikGWx -EPCkKvbdUWLojUAq -EPDLKvbdOStWHEtp -DoCjjvbdHlBzmwRL -DnbjjvbdWIYVxHYz -EPDLKvbdADSXjZhp -EPDKjvbdRzJgrcWA -EObkKvbdxrnIlqag -EObjjvbdRosgKFcw -DoDKjvbdkySrTYgU -DncKjvbdsrqrxydc -EPDLKvbdZyEKODLr -EPCjjvbdEXxMUUTl -EOcKjvbdtcCtwWOo -DncLKvbddndrkTtS -EPDKjvbdrafMkfjy -EPCjjvbdJcJbpibx -EObkKvbdFfJqnIsq -EPCkKvbdyNsHwriD -DoCjjvbdaRebgsfL -DnbjjvbduoTzpjnt -EPCjjvbdZGvdAOsJ -DoDKjvbdmozYujyC -EPDKjvbdZGvdAPSi -DnbjjvbdmSYtzTDi -DoCjjvbdRotGjFdX -EObkKvbdSBceLhxk -DoCjjvbddijRvUzn -EObkKvbdMgDQNPtk -DoCkKvbdFVxoomKF -DncKjvbdGcjujBjK -EPDKjvbdBcpAvJlf -DncLKvbdLBLHNCYR -EObkKvbdmIctQtrB -DoDLKvbdFpATXGey -EPCkKvbdbrbkUDjB -DncLKvbdcTCjtEJa -DncLKvbdBsAbsfXS -EPDKjvbdFpATXGfZ -DoDKjvbdwuMeQxlO -EObkKvbdqUUGqrKt -DncKjvbdZyEKODLr -EPDKjvbdjhHLefNk -EPCkKvbdrbFmMGjy -DoCkKvbdsQWOjCvG -DoCjjvbdLBLHMbXq -EObjjvbdrpVnicVf -EPCjjvbdVqmwaeMD -DncLKvbdRNYCYnUz -EObjjvbdRXNdCkhD -DncKjvbdIHHZyYXg -DnbjjvbdyTOJMrCH -DoDLKvbdUsmUFkuj -DncKjvbdQcbaPqES -DnbkKvbdmgFYNNgZ -EOcKjvbdkySrTYgU -DoCjjvbdHlBzmwQk -DnbjjvbdaSFcITek -EObjjvbdQdCaPqDr -DncKjvbdxVMdpyLn -EOcKjvbdiMEdOVCy -DoCjjvbdRosgJecw -DncLKvbdkDMLQftg -EPCkKvbdKDKCqKDY -DoCjjvbdjvWnDaww -EOcLKvbduVnYJpsA -DoDLKvbdWRnYBdlD -DoDKjvbdssSSxzFD -EPDLKvbdJYTaglRQ -EOcLKvbdhzUfLpmf -DoDLKvbdJutfDdgJ -EOcKjvbdxmrgwrhc -EObkKvbdwWkaVaVu -EOcKjvbdxrmiMrBg -DoDKjvbdRDcApRES -DoCjjvbddjJrVtzn -EOcKjvbdxVNEqYlO -DoCjjvbdJJdAJofd -DoDLKvbdemGWfmJk -EOcKjvbdnPyyWKyC -DoCjjvbdbrcLTcia -DoDKjvbdjuvmdCXw -DncLKvbdtkwvaUAw -EOcKjvbdHDkViaij -EObkKvbdRDbaPpcr -EOcLKvbdtSqryZeD -EOcKjvbdrRuLOKaN -EOcKjvbdczYowyRC -DnbkKvbdjcMLQfuH -DncKjvbdmbJwYOnV -EPDLKvbdZnmiFEzK -EPDKjvbdjbkkQgVH -EObkKvbdJTZArmYM -DncKjvbdSPsgJfEX -DncLKvbduMYXBUBX -EObkKvbdkIHMFfOL -EOcKjvbdYORAYVWU -DoCjjvbdyzdmqghh -DncLKvbdtumwiqTA -EPDKjvbdQmYCZOUz -DoCjjvbdtcCtvvPP -EObjjvbdVTmUGMVj -EObkKvbdBsAcUGXS -DoCjjvbdqYngfqDx -EPCkKvbdtkxXBTaX -DoDLKvbdACqwiyhp -DncKjvbdraelkgKy -EPDKjvbduLwvaUBX -DncKjvbdpssgSSLU -EPCjjvbdIxTbHlRQ -EPDKjvbdPyNAGrqj -DoDLKvbdnCJvxOnV -EObkKvbdZRNFJNEq -DoCjjvbdFxuVBEYC -EOcKjvbdVAbRSpqy -DnbjjvbdJbibqKDY -DoDLKvbdKCicQjCx -EPCjjvbdNrtVgFUp -EOcLKvbdZQleJNEq -DoDLKvbdaRebgsfL -DoCkKvbdCIjakIej -EOcLKvbdBraDUGWr -EPDLKvbdADRxKZiQ -DoCjjvbdHkazmvpk -EPDKjvbdUsltGLvK -EOcKjvbdTkvOaVoJ -DncLKvbdZnmiEdyj -DoDKjvbdZtJJYdSn -DoDLKvbdbiNJjfWx -DnbjjvbdIsZBTNYM -EPCkKvbdhbPDEvpq -DncKjvbdqlyjYlIJ -DoCkKvbdbsDLTcia -DoDKjvbdKCjCqKCx -DoDLKvbdnBiwYOmu -DnbkKvbdjKGIKMwr -EPCjjvbdHgGyxxYH -EOcLKvbdcyxpXxqC -DncLKvbdlZSrSyGt -EPCjjvbdTAFIhCPE -EObkKvbdZdwfzgiC -DoDLKvbdSLYfUgLT -DoCjjvbdRMwayNtz -DnbjjvbdCflGHAzc -DoCjjvbdrJAKFNOe -EPCjjvbdjblKpgUg -EPDLKvbdQccAoqDr -DnbjjvbdCJKbKhfK -EPDLKvbdiGibyWJu -EOcLKvbdyNsHxShc -EPDLKvbdmIcspuSB -DnbjjvbdnGdxNOHZ -DoCkKvbdhzVGMRNf -DoDLKvbdeFPRawDK -EObjjvbdsQWOjCvG -EObkKvbdhzUelQmf -EObkKvbdeJirWUzn -DncLKvbdxxIibPzL -EObkKvbdSBceMIxk -DoCkKvbdehKvRmqH -EObjjvbdRbDeLiZL -EObjjvbdGYtuAdYC -DnbjjvbdHDkVibKK -DoCjjvbdKQyeOfNe -DoCkKvbdmbJvxOmu -DoCkKvbdULvOaWPJ -DncLKvbdrWpMCiZR -EObjjvbdhytfLqNf -DoCjjvbdgPazvdXh -DoCjjvbdiHKDYuiu -EPDKjvbdRWnDbkhD -DncLKvbdrMzKZLhJ -EObkKvbdyXhiaoyk -EPCkKvbdjmCLydfo -DnbkKvbdDxYMUTsl -EPDKjvbdxmrgxSiD -DnbkKvbdmSYtyrci -EPCjjvbdqvokcIxq -DoDLKvbdXsMAmUPY -DncKjvbdDoDKkWcE -EPCkKvbdMgDPmQUk -DoDLKvbdKyQirztf -EPCjjvbdmajWwnmu -EOcLKvbddCSlrATm -EPDLKvbdrJAKElne -DoCkKvbdIsZBTMxM -DnbkKvbdffMZnGgA -EOcKjvbdJcKDQjDY -EObjjvbdxsOJMrCH -EObkKvbdEKHiuwjA -DncKjvbdunszpjnt -DoDLKvbdZjTIQHCG -DnbjjvbdsQVnibvG -DnbkKvbdGQATXHGZ -DnbkKvbdBsBDTfXS -DoCkKvbdBsAbsevr -DoCkKvbdRXNdDLhD -EPCjjvbdRadElJZL -DnbkKvbdxwhibPzL -EOcKjvbdCJLBjiFj -DncLKvbdZMSDsmkm -DoDKjvbduaEZSoFI -EPCjjvbdhgJbxujV -EOcLKvbdCJLBjhfK -DoCkKvbdZisHpHBf -DoCkKvbdqFdFUWBI -EPCkKvbdDGlFgAzc -DncKjvbdZxcjNblS -EPDLKvbdLqvmZuQz -DoDKjvbdxZhGFxFS -EObkKvbdZdxGzhIb -DoDLKvbdqwQMChyR -DoCkKvbdjlalZeGo -DncKjvbdZRNEhldq -EPCkKvbdZHXEAPSi -DoDKjvbdDoDLKwCd -DnbkKvbdmbJwYPNu -DncKjvbdMfcPlouL -DoCkKvbdQwODblHc -DoCjjvbdNQYQunGs -DnbjjvbdlqxtzSci -EOcLKvbdrDdhpNua -DncLKvbdKefICApu -EPDKjvbdatagXkUI -DoCjjvbdaofgDkzd -EObkKvbdIrxaTMwl -DncLKvbdSLYfVGkT -EPCkKvbdelevfmKL -DncKjvbdFfKSOIsq -EObjjvbdfILVqnQg -DncLKvbdZjShPgCG -DoCjjvbdrNZixlHi -DnbkKvbddoFTKstS -EOcKjvbdWSNwbFMD -EPDLKvbdpxngfqDx -EOcKjvbdIHGyxxYH -EOcLKvbdvwMAuaVu -EOcKjvbdkxrqryGt -DncLKvbdZjShQHBf -DnbjjvbdiUzEvquC -EObkKvbdpxoHfpcx -DoCkKvbdGAoRZJzm -EOcKjvbdehLVrOQg -EPDKjvbdkDMLRGuH -DnbkKvbdKCjDRKDY -EPCjjvbdLGFhBaRV -EPDLKvbdaMjbSuNH -DncKjvbdWfYzUAOs -DoCjjvbdsBelkfjy -DncLKvbdZnmheFZj -EOcLKvbdatagYLUI -EObkKvbdWXJXvEEg -DoDKjvbdZMRdTmlN -EPCjjvbdWXIwvEEg -DoCjjvbdkCkjqHUg -EPCjjvbdijFhJlxS -EPDKjvbdmSZUysEJ -DoDKjvbdMgDQMouL -EPCkKvbdrDdhomvB -EPCjjvbdRNXbYmtz -EPCkKvbdUtMtFlWK -DnbjjvbdGcjvJajK -EPDKjvbduaDyTOeI -DncLKvbdziuPocrt -DoCjjvbdcScKscjB -DncKjvbdmgExMmfy -EObjjvbdJcJcQibx -EPDKjvbdMpXpvNfs -EObkKvbdyqPNIjXA -EPCjjvbdCSaDUGWr -EOcKjvbdZnnJFEyj -EObkKvbdyOSgwriD -EPCjjvbdtkwwAtBX -DnbkKvbdDncLLXDE -EOcKjvbdZshhxcsO -DoCjjvbdxVMdpxlO -DncKjvbdLGGHaaQu -DoCkKvbdxUmFQyMO -EPDKjvbdpfEEsvAh -DoCkKvbdZRMdhldq -EPDLKvbdYzberJuy -EObjjvbdfHkWSOQg -EPDLKvbdRMxByNtz -DncLKvbdmoyyWLZC -EObkKvbdhtydvrVC -DoCkKvbdVhYWYGxz -EPDKjvbdbVCHXjsh -EPCkKvbdTlWPBVni -DncLKvbdFkEsCgmV -DnbkKvbdIsYaSlxM -DncKjvbdzaAOffbM -DncLKvbdaSFcHtGL -DoDLKvbdiGjDYuiu -EObjjvbdDigjVwjA -DncKjvbdqmZixlIJ -DnbkKvbdRjxfUgLT -EObkKvbdeAURNYKG -EPCjjvbdjvWnECXw -EPCjjvbdNQXqVmgT -DoDLKvbdxmsHxShc -EPCkKvbdqwPlChxq -DnbjjvbduLwwAsaX -DncKjvbduCbuWuno -DnbkKvbdJpydnenF -EPDLKvbdRXOEClID -DncKjvbdSKyFuGkT -DncKjvbdczZQYZRC -EPCkKvbdGZUtaDxC -EPCjjvbdOAJTUKSA -DnbkKvbdsZlQSaHn -DncKjvbduWNwiqTA -DoDLKvbdRNYCZOUz -DoCkKvbdVTmTfMVj -EOcLKvbdeATpmYJf -DncKjvbdbUbGxKsh -DnbkKvbdLZRKSztf -DncKjvbdcJMjLFwY -DnbkKvbdRadEkhyL -EPCkKvbdauBgXkTh -EObkKvbdrJAKFNOe -EOcKjvbdDnbjkXDE -DoDKjvbdrafMlGjy -EOcLKvbdliDtRVRa -EObjjvbdZjShQHCG -DnbjjvbdZnmiFEyj -EPDKjvbdbAueFpQX -EPCjjvbdVwJYVcdg -EObkKvbdijGIJmYS -DoCjjvbdJpyeOenF -DoDKjvbdYlSDsnMN -DncLKvbdehLVqmqH -DnbjjvbdTppnuVHm -EOcKjvbdSLYetgLT -EPCkKvbdZyEKOClS -DoDKjvbdHDjujBij -EPCkKvbdHkazmvpk -EObkKvbdkxrrTYft -EPCjjvbdOTUVfeVQ -DoCjjvbdYzbfSKWZ -DncKjvbdkxrrSxgU -EObjjvbdEOcKkXCd -EPDKjvbdcTCkTcia -DoDKjvbdatagXkTh -DoDLKvbdNHCpMpUk -DoDKjvbdhtzEvquC -EPCjjvbddePSBvbj -DoDLKvbddneTLUUS -DncLKvbdijFhKMwr -EPDLKvbdpxoIHRDx -DncLKvbdqquLOKaN -EPCkKvbdSCEEkiZL -DoDLKvbdvAdYroEh -DncLKvbdDwwksstM -EOcKjvbdKWVFcdgJ -EPDKjvbdZnmhdeZj -DoCjjvbdJSyBTMxM -DoDLKvbdtcDVXVoP -EOcLKvbdbAudfPow -EPCjjvbdpfDdtWAh -DncKjvbduCcUwWOo -DnbjjvbdGFirOItR -DnbjjvbdLBKgNBxR -DnbjjvbduVnYJpsA -DnbjjvbdjuvnDbXw -DoDKjvbdFkFTDINV -EOcKjvbdEvZQQMie -DoCkKvbdMfbolpUk -EPCjjvbdhbPCdwQq -DoDKjvbdZyEKNblS -EPCjjvbduCbtwWPP -DnbjjvbdgLGzbfAE -EObjjvbdqGDdsvAh -EPDLKvbdNGbolotk -DoCkKvbdSPsfifEX -DncLKvbdbVCGwjsh -EObkKvbdijGHjMwr -DnbjjvbdRosfifDw -DoCjjvbdQccApRDr -DoDKjvbdqTtHSSKt -EOcLKvbdsQWPJcVf -EObkKvbdeOdsLTsr -DncLKvbdcTDLUDjB -DoDKjvbdVgwvXfxz -EOcKjvbduoTzqKnt -EPCjjvbdYNqAYVWU -EObjjvbdemGXGmJk -DoCkKvbdVgxWXfxz -DoCjjvbdqlzKZLgi -EPDLKvbdLFfHaaQu -DnbkKvbdcSbkTcjB -EObjjvbdgGLzNgHA -EObjjvbdZjSgpGbG -DnbjjvbdGckVjBij -EOcLKvbdUMVnaWOi -EObkKvbdrylQSaHn -EPDLKvbdZHWdAOri -DoDKjvbdyfxlAMdw -DnbjjvbdZMSDsnLm -DoDKjvbdOTUVgEtp -DnbkKvbdJSxaSlwl -DncKjvbdkNCLzFGo -DoDKjvbdfMevgMik -DnbjjvbdMgDPlpVL -DncKjvbdqquLOLAm -DoCkKvbdfNFwGlik -DncLKvbdpxnhHRDx -DoDLKvbdZMRdTmlN -EPCkKvbdURRPVVHm -EPCkKvbdmgEwmOHZ -EOcLKvbdVAapsRSZ -DoCjjvbdczZPwxpb -EPDLKvbdWXIxWDdg -EPCkKvbdUVlQJtBR -EOcKjvbdelfWgNJk -EPDKjvbdUtMtFkuj -DnbjjvbdRkZFtfjs -EObkKvbdCJLCLJGK -DoDLKvbdKVuGEEgJ -DncKjvbdIxTbHkqQ -DncLKvbdMSWlzUpz -EPCkKvbdKefICAqV -EOcKjvbdtunXjRTA -DoDLKvbdZMSETmlN -EObkKvbdapHHELzd -EObkKvbdmRxtyrdJ -DoCjjvbdtTSSxzEc -EObjjvbddeOrBvbj -DncLKvbdJYUBgkpp -EPCjjvbduLxXBUAw -DnbjjvbdSLYetfjs -DncKjvbdzQnmIiwA -EPCjjvbdRpUGjFdX -EOcLKvbdddnqbWcK -EOcKjvbdWWhwucdg -EOcLKvbdCWzdJEov -EPDKjvbdTkuoAuni -DncLKvbdqUTgSSLU -DoDLKvbdNHDQMotk -DncLKvbdWXJXvEEg -EPCjjvbdaNKaruNH -EPDLKvbdraelkfjy -DncLKvbdLqvmZtpz -DnbjjvbdNddThhkE -DoDKjvbdzoQQdcLx -EPDKjvbdYpldiNFR -EObjjvbdZtJIyDsO -DoCkKvbdWWiYWDeH -DoCkKvbdeEoSBwDK -DoCjjvbdBsAcTevr -EObjjvbdqvpMChyR -EPCjjvbdsCGMlHKy -DnbkKvbduLwwAtAw -EObkKvbdMRwMyuQz -DncLKvbdwWlAuaWV -DncLKvbdHgHZxwxH -DncKjvbdBsAcTewS -DoDLKvbdJpyePFme -DncKjvbdVUNUFlWK -DncKjvbdEYXktTtM -DncLKvbdwMvANDeN -DnbkKvbdtSrTZZeD -EOcLKvbdJYUBhMRQ -DncKjvbdlYrrTZGt -DoDLKvbdliDsqUrB -EObjjvbdegjuqnQg -EObjjvbdlZSrTZHU -DncLKvbdfNGWfljL -DoDLKvbdLFegbBQu -DncLKvbdemGXGmKL -EPDKjvbdDwwksssl -DnbjjvbdxmsIYTJD -DoDLKvbdBsBCtGWr -DoCjjvbdIsYaTNYM -DncKjvbdJuuGEEgJ -EObkKvbdkySqsYgU -DnbkKvbdNPwqWNfs -EPDLKvbdmIdTptrB -DoDLKvbdyqOmIjXA -EPCjjvbdhkeEOUcZ -DoDKjvbdJqZePFme -EPDLKvbdfSAvzlCo -EObjjvbdbhljLFvx -EOcLKvbdaMkBsUmH -DoCjjvbdKyRKSzuG -EObjjvbdcSbjtEJa -EOcLKvbdkHflGFmk -DoDLKvbdemFwHMjL -EObjjvbdSLZGVHLT -DoCjjvbdJXtCILpp -EOcLKvbdaaVdfPow -EOcLKvbdFpATWgGZ -DoCjjvbdxZgeewdr -EObkKvbdeEnqawCj -EObjjvbdhytfMQmf -DnbjjvbdoznEKxPA -DnbjjvbdoAKzsgdO -DoCkKvbdYzbfRivZ -DoDLKvbdqqtkOKaN -DncLKvbdqvokcJYq -EPDKjvbdOStVfeUp -DoDKjvbdZxcinDLr -DoCkKvbdcyyQYYqC -EObkKvbdcIlikGWx -EOcLKvbdffLzNgHA -EPCjjvbdMtsRkNAX -EOcKjvbdpeceTvBI -EOcKjvbdZsiIxcsO -DncLKvbdJvVGDdgJ -DnbkKvbdZMRdTmlN -EPDLKvbdnCJwXnnV -EObkKvbdxUldqZLn -EPCjjvbdNddUJIkE -DoCjjvbdyYJJapZk -DnbjjvbdpxoHgQcx -EObjjvbdHDjvKBij -DncKjvbdUtNUFlWK -EPCkKvbdkVvmdBww -DnbjjvbdgGMZmgHA -DoDLKvbdmIdTqVSB -EOcLKvbdzitpPdTU -DncLKvbdkxrqrxgU -DoCjjvbdVBBpsRSZ -EOcLKvbdGFiqmiTq -EOcKjvbdxsOJMqag -DoCkKvbdHDkVjCJj -EPDKjvbdjSziTKiz -EOcKjvbdCTAbsewS -EPCkKvbdkWWnDbYX -DoDLKvbdJSxaTMxM -DoDLKvbdMoxRWNgT -DoDLKvbdmuVZkJrG -EPDKjvbdbUbHXjtI -DnbjjvbdkWWnEBxX -EOcLKvbdnPyxukZC -DnbjjvbdXrlBMtOx -DoDLKvbdJuuGEFGi -EPDKjvbdUaBprprZ -EObjjvbdsrqrxydc -EObjjvbduCbtwWOo -DoCkKvbdSLYeuHLT -DoDKjvbdKQyePFme -EOcKjvbdeYZssrFz -DoDKjvbdpxoHfpdY -EPCkKvbdcIljKfXY -EPDKjvbdDwwksstM -DnbkKvbdsQWOicVf -EPDLKvbdIidAKQHE -DoDLKvbdrDeJPnWB -EOcLKvbdZoNiEeZj -EObjjvbdptTgRrLU -EPDKjvbdmRyUzTEJ -DoDLKvbdFxtuBEYC -DnbkKvbdehLVqmqH -EPCjjvbdUtNUGLuj -DoDLKvbdxVNEqZLn -DncKjvbdySnImRbH -DoCjjvbdbLMGPNcA -EPCkKvbdzQoMiKXA -DnbkKvbdbiMijevx -EOcKjvbdSQTfiedX -DnbjjvbdZisIQHBf -EObkKvbdYpleIldq -DncLKvbdjmBlZeHP -DncKjvbdSCDdkhxk -DnbkKvbdrykpTAgn -EObkKvbdZQldiMeR -DnbjjvbdeYZssqez -EPDLKvbdlYrrSyHU -EOcLKvbdTpqOttgm -EOcKjvbdCJLCLIej -EPDKjvbdUQqOttgm -EObkKvbdGBOqZJzm -DncKjvbdqwQMDIyR -EPDKjvbdbBWFFoow -EOcLKvbdZMRctOLm -EPCkKvbdHEKuibKK -DnbjjvbdNddThiKd -DncKjvbdJuuFdEgJ -DncLKvbdRzJgsDWA -DncLKvbdRWmdCkhD -EPCjjvbdZRNFImEq -EOcLKvbdUaBqTRSZ -EObkKvbdWIXvYGxz -DoDKjvbdrRuKnKaN -DoCjjvbdYgXEAPTJ -DoCkKvbdwuMeQyMO -EPDLKvbdkHfkfFmk -DoDKjvbdTqQnuUhN -DoCkKvbdbKlFoODA -EObkKvbdrzLoraIO -DncLKvbdFxuVAdYC -DoCjjvbdZQldiMeR -EOcKjvbdJTZBTNXl -EPDKjvbdsQWPKCvG -EOcLKvbdeEoRawDK -EPDLKvbdtTSSxzEc -DncLKvbdliDsqUqa -DnbjjvbdZQleImEq -EPCjjvbdaSGDITek -DoDLKvbdRWnDbkhD -EPDLKvbdpedEsvAh -EPCkKvbdYpldhldq -DoCjjvbdZoOJEdyj -EOcLKvbdmoyxvKyC -EObjjvbdmSZVZsEJ -DoDLKvbdqUUGrSLU -EPDLKvbdmpZxujyC -EPCjjvbdCDpBVilf -EPCjjvbdFfJrNhsq -DoDKjvbdsZkosBIO -DnbjjvbdiBnbdvpq -DncKjvbdkDMKpftg -EPCkKvbdatbGxLTh -DoCjjvbdJTYaTNXl -DnbjjvbdhkdcnVCy -DncLKvbdyNrgxTIc -EPDLKvbdyNsHwriD -EPDLKvbdBdQBVilf -DoDLKvbdIsYaTNXl -DnbkKvbdkxsSTZHU -EPCjjvbdBsBDUGWr -EOcLKvbdgQBzwDxI -DnbjjvbdjblLQfuH -DnbkKvbdbVBgYKsh -DncLKvbdMgComPuL -EPDLKvbdqceIpOVa -DnbjjvbdqFceTvAh -EPCjjvbdFWYpQNJe -DoDLKvbdHDjujBjK -DncLKvbdIHGyyXxH -DnbjjvbdeFOqawCj -DoDKjvbdGQASwGfZ -DncLKvbdrWokbhyR -DncKjvbdSKyFtfkT -DoCkKvbdemFvfmKL -EPDKjvbdxsNhmRbH -EOcKjvbdsPunicVf -EObjjvbdrbGNMGjy -EPDLKvbdOXoVzcnU -EOcLKvbddZxpYYpb -DoDKjvbdVBBpsRRy -EPDKjvbdHDkWKCKK -DoCkKvbdSiZjRAAl -EPDKjvbdURQoVVHm -DoCkKvbdpyPHgQdY -EOcKjvbdGAoQxizm -DnbjjvbdMpXpvNfs -DncKjvbddndrjtUS -DnbkKvbdlhcsptqa -DoCkKvbdfNFvfmKL -EPCkKvbdHffyxxXg -DoCkKvbdYpleImFR -DoCkKvbdbBVdfPpX -DncLKvbdWSNxBdlD -EPDKjvbdSQTfjFcw -EPCjjvbdkxrqsYgU -EPDKjvbdrovOjCvG -DoCjjvbdaSGCgsek -DncLKvbdZGwEAOri -DoDLKvbdJmADzHUa -DoCjjvbdNdcshiKd -DoCkKvbddneTLTtS -EObkKvbdMoxQumfs -DncKjvbdVgxVwfxz -DoDKjvbdGcjuibKK -EObkKvbdTqQnuUhN -DncKjvbdURRPUuIN -EObkKvbdbrbjtEJa -DnbkKvbdKQyeOenF -EObjjvbdbKkfOnDA -EPDLKvbdlhdTptrB -EObjjvbdxnTHxTJD -EObjjvbdKCjCpjDY -DoDLKvbdMSWmZtpz -DoCkKvbdBsBCsfXS -DnbkKvbdfRaWzkcP -EPDKjvbdbAvFGQQX -DoCjjvbddoFSjtUS -DnbjjvbdypoNJJwA -EPDKjvbdzdzOzdyp -EObjjvbdJpzEoFme -DoCkKvbduCbuXWPP -EPCkKvbdFfJrOItR -DoDLKvbdkIGlFfOL -DnbjjvbdbAudfPpX -DoDLKvbdtAHRIABS -EOcLKvbduDCuWuno -DoDKjvbdkHgLfGNk -EOcLKvbdxZhFeweS -EObkKvbdUxgszKoO -EOcKjvbdiBoCeXRR -DnbkKvbdZeXfzhJC -EObkKvbdtcDUvvPP -EOcKjvbdMtrrLNAX -DnbkKvbdWXJYVceH -DnbkKvbdJbjCpibx -EPCkKvbdajlFnnDA -DnbjjvbduaEZTPEh -EOcKjvbdGcjuibJj -DncLKvbdKefHbAqV -DoDKjvbdUxgtZjnn -EPCjjvbdVZITzKnn -EPDKjvbdHkaznXRL -DnbkKvbdOEdTiIkE -DnbjjvbdiGjDYvJu -DoDKjvbdnUtykJrG -EPCkKvbdBdQBWKNG -EPDKjvbdsBemLfkZ -EPCjjvbdtumwiqTA -EOcKjvbdnCKXYPOV -DncLKvbdVwIxVdFH -DnbjjvbdWIYWYGxz -EObkKvbdFpATXHFy -DoCjjvbdauBgXjtI -DnbkKvbdTqROuVHm -DnbjjvbdlhcsqUqa -EPDLKvbdxZhGGXeS -DoDLKvbdZjTHogCG -EOcKjvbdbKlGOnDA -EObjjvbdLiBlRYAS -DncKjvbdxrnJMrCH -EOcLKvbdMJBlRYAS -EOcKjvbdUsmTekuj -DnbjjvbdEYYMTssl -EObkKvbdZMSEUNkm -DncLKvbdGGKSNhsq -DoDKjvbdGZVVAdXb -EPDKjvbdKRZdoFnF -EOcLKvbdEXwlUTtM -DoDKjvbdEztQeLcJ -DoCkKvbdJYUBglQp -DoCkKvbdJTZAsNXl -EObjjvbdvmWAMdEm -EPCjjvbdxZgefYFS -DncKjvbdtTRrxzEc -EOcLKvbdiGjDZWJu -DoCkKvbdYlRctOLm -DncKjvbdDxXlTtUM -EPCjjvbdcyxpYYqC -EOcLKvbdqGDeUWBI -DnbjjvbdnPyxvLZC -DoDLKvbdKefHbApu -DoCkKvbdjblKqHVH -EObkKvbdTfzmkvue -EOcKjvbdZnmiEdzK -EOcKjvbdDxXkstTl -EPDLKvbdBdQAujMf -DoDKjvbdGZVVBDwb -DoDLKvbdEvZPpMie -EPCjjvbdVwJXuceH -DoDLKvbdRjyFtgLT -DoCkKvbdXsLaNTnx -DnbjjvbdDHLfHAzc -DoCkKvbdVBCQrprZ -DoCkKvbdyNsIYShc -EPDKjvbdyXiJbPzL -DoCjjvbdUsltFlWK -EPCkKvbdcyyQYZRC -DnbkKvbdddnqbWbj -EPCkKvbdmuUyjjSG -EObkKvbdZyDinDLr -DnbjjvbdZtIiZESn -EPCjjvbdVBCRTRRy -EOcLKvbdCWzciFPv -EObkKvbdrEFJPnWB -DnbkKvbdqUUHSRkU -EPDLKvbdlqyUyrci -DoCjjvbdIMBznXQk -DoCjjvbdUxgsykOn -EPCjjvbdXsMBMsnx -DncKjvbdjuvmdBxX -EOcLKvbdkIGkeemk -DoCjjvbdjKGIKNYS -EPDLKvbdSLZGVGjs -EOcKjvbdMfcPmQUk -DoCjjvbdrNZjYlIJ -EOcLKvbdkyTSTZHU -EObjjvbdjAQGaQHK -EPDKjvbdMoxRVnHT -EObkKvbdeATpmXif -EObkKvbdFjdsDHmV -DncLKvbdbLLfOmcA -EPCkKvbdunszqLOt -DnbkKvbdnQZxvLZC -DncLKvbdZyDjNblS -DnbkKvbdptTfrSKt -DoDLKvbdzaAOgHCM -EPCjjvbdhbPCeXRR -DnbkKvbdmuVZkKSG -DoCkKvbdziuQQESt -DnbkKvbdhgKDZWKV -DnbjjvbdULuoBWPJ -DncLKvbdWXJXucdg -DoCjjvbdRacdlJYk -DoDLKvbdegjvSNqH -EOcLKvbdnUtzLKRf -EOcKjvbdFxtuBEXb -DoCkKvbdmIcsqUrB -EObjjvbdULvPAvPJ -EOcLKvbdSwkLmzkY -EPCkKvbdSZjITCvA -EPCkKvbdeOdrjtUS -EPCjjvbdIxUBhLpp -EObkKvbdqiAJeMoF -DnbkKvbdhlEcmtcZ -EOcLKvbdFejRnJTq -EOcKjvbdwXMAvBWV -DoDKjvbdmpZyWLZC -DoCjjvbdGLErbhNV -DoDLKvbdmaivwnmu -EOcLKvbdOXoVzcnU -DncLKvbdBhjbLJGK -EPDKjvbdZjTIQGaf -DoCkKvbdgPazwEYI -DncLKvbdGGKRmiUR -EObjjvbdfHkWRmpg -DnbkKvbdXrkaNUPY -EPCkKvbdzQoMhiwA -EOcKjvbdrpWOjDVf -DncKjvbdZtJJZDrn -EPDKjvbdqZOggRDx -DnbjjvbdhgJbyWKV -DoDKjvbdiVZdwRuC -DoDKjvbdIwtCHkpp -DoDKjvbdVAapsRRy -EPDLKvbdwjvcgzzG -DoDLKvbdRyihScWA -DoDLKvbdrRuKmkAm -DnbkKvbdqGDdsuaI -EPCkKvbdAMhYrwZx -DncKjvbdSPsfjGEX -DncKjvbdczYpXxpb -DoDLKvbdkIHMGFmk -EPCjjvbdkClKqHUg -EObkKvbdxVMdqZMO -DoDKjvbdBdQBVjMf -EObkKvbdZjTHpGbG -EPDKjvbdTfzmkvue -EPCkKvbdLAjfmCXq -DoCjjvbdLGGHbApu -EPDKjvbdEzsqEkcJ -DoDKjvbdwygfGYFS -DoDLKvbdhgJbyWKV -EPDLKvbdZshiZETO -EPDLKvbdKWUfDdfi -DnbkKvbdqYoHgQcx -DncKjvbdnGeYMmgZ -EPDKjvbdKCjDRKDY -DoCkKvbdJcKDQibx -EObkKvbdZoNiFFZj -EPCkKvbdUyHsykPO -EOcKjvbdtvNxKQsA -EObjjvbdatafwjtI -DoDLKvbdhzVFkpmf -EObkKvbdMgComQVL -EPCkKvbdSCEEkhxk -DoDLKvbdgFlZnGgA -EObjjvbdZMSETnLm -EObkKvbdtumxKQsA -EObjjvbdZoOIddyj -EOcLKvbdqZOggQcx -EOcLKvbdKfFhBaQu -DncLKvbdzGxlANEw -EObjjvbdehLWRnQg -EObkKvbdEPCjkWbd -EObkKvbdqYnhHRDx -EObkKvbdjvXODaww -DnbjjvbdqTsgSRkU -EOcKjvbdTqQoVVHm -DnbjjvbdQmYBxnUz -DnbjjvbdpyOhGqEY -EOcLKvbdLGGHbAqV -EObkKvbdZirgpHCG -EObkKvbdqYnhGpcx -DncLKvbdrbGNLgKy -EObkKvbdkySrSxgU -EOcLKvbdeAUQlwjG -DncKjvbdkVwNdCYX -DoCjjvbdJvVGDeHJ -EPCkKvbdEuyPpNKF -EOcKjvbdDjHivXjA -DnbjjvbdkNCLydfo -EPCjjvbdZjTHogBf -DoDKjvbdGKeTDINV -DnbkKvbdJXtBglQp -DnbjjvbdFejSOIsq -EOcKjvbdhytelRNf -DnbjjvbdbBVdeopX -DoCkKvbdFjdsDINV -DoDLKvbdjvXNcbXw -DnbkKvbdZdxGzhJC -EPDLKvbdjAPgBQGj -EObjjvbdJXsbHkqQ -EPDKjvbdiVZdwRtb -EObjjvbdGFjSNiTq -EPDKjvbdznpQdbkx -EPCjjvbdemFvgNKL -EPDKjvbdWXIxWEEg -DncLKvbdEObkKvcE -DnbjjvbdLAjfmCYR -EPDLKvbdEXwkstTl -EObjjvbdFfKSNhsq -DncKjvbdygZMANFX -EPCkKvbdYqNFIleR -DoCkKvbdSKyGUgLT -DncKjvbdBdQBVjNG -DnbkKvbdbUagYLTh -EOcKjvbdsPunjDWG -DncLKvbdrEFIonVa -DncKjvbdaSGChTfL -DoCkKvbdcJNKKfXY -EObkKvbdULuoBWOi -DncLKvbdKWVGEEgJ -EPCkKvbdqFdEsuaI -EPDKjvbdAMgySvyx -DncLKvbdiUzEwRuC -EObjjvbdZoNheEzK -DnbkKvbdZLrETnMN -EObjjvbdKWVFcdfi -DoDLKvbdcScLUEJa -EPCkKvbdIwsbIMRQ -EOcKjvbdsBemMHKy -EOcLKvbdzitoodSt -EPDKjvbdrMyjZLhJ -DnbjjvbdaRfCgsfL -DoCkKvbdKQzEnenF -EOcLKvbdUGznLvue -DncLKvbdZxcinCkr -DnbjjvbdEuyPpNKF -DncKjvbdGFirOIsq -EOcLKvbdVqmxBeMD -EOcLKvbdwuMeRZLn -DnbkKvbdBhkBkIej -EOcKjvbdNQXpumfs -EObkKvbdVBCRTRSZ -DoDLKvbdZeYGzhJC -DncLKvbdREDBPqES -DnbjjvbdvBEZSoFI -EPCjjvbdakLeoNcA -EPDLKvbdeFOqbWbj -EPDLKvbdiGicZWJu -EPCkKvbdEKHiuwjA -EPCjjvbdwkWcgzyf -DoDKjvbdmpZyVkZC -EPCkKvbdSZihSbvA -EPDKjvbdelevfmKL -DnbjjvbdeATplwif -DoCjjvbdGAnpxizm -EPDKjvbdTlWPBWOi -EOcKjvbdmSYtzTEJ -DncLKvbdnGeXmNfy -DoDKjvbdTIzJqAAl -EOcKjvbdqdEiPnVa -EOcKjvbdcTCkUEKB -DoCjjvbdEvYopMjF -DoDLKvbdwuMdpyMO -EPDKjvbdEuyQPlie -EOcLKvbdVUMsfMVj -EObjjvbdijFgilxS -DoDKjvbdnPyxujyC -EOcKjvbdTAFIgbPE -DnbkKvbdZxdJnDLr -DncLKvbdqdEiPmua -EOcKjvbdhgJcZVjV -DnbkKvbdRbEFLhxk -DoDKjvbdmaivwoNu -DoCkKvbdZQmFJMdq -DncLKvbdeYZtTqez -EObkKvbdqYoIGpdY -DnbjjvbdEASJMyvw -DoDKjvbdwzHfGYFS -DncKjvbdjvXOECYX -DncLKvbdbBVdepQX -DoDLKvbdrEFIomua -DnbjjvbdYgWdAOsJ -EOcKjvbdkMakydfo -EPCjjvbdegkWSNqH -EPDLKvbdYlSEUNkm -EPDLKvbdzRPMhjXA -DnbjjvbdmSZUyrci -EPDKjvbdiiehKNXr -EPDLKvbdwzIGGXdr -DncKjvbdSLYetfkT -EOcLKvbdURROtuHm -EPDLKvbdEYYLtUUM -EOcLKvbdaSGDIUFk -DnbkKvbdhfibyViu -DncKjvbdeFOqavcK -EPDLKvbdZtIhyETO -EOcKjvbdsPuoKDVf -DoDLKvbdBhkBjiGK -EPDLKvbdnQZyVkYb -DncLKvbdNsTugEtp -EPCjjvbdCDpBWJmG -DoCkKvbdmIdTqVRa -EOcKjvbdptUHRqjt -DnbjjvbdRpTfifDw -DncKjvbdaRebgtFk -EPDLKvbdEARiMyvw -EOcKjvbdyNsHxShc -DoCkKvbdxKwDgzyf -DncKjvbdwuNFQyLn -DncLKvbdegjvSORH -DncLKvbdOStWGdtp -EOcLKvbdcTCkTdKB -DncKjvbdRECaQRES -DoDLKvbdkIHMFemk -EPCkKvbdfjfzcGAE -DncKjvbdZLqdTnLm -EOcKjvbdIMBzmwRL -EOcKjvbdwzHeexFS -EPCjjvbdKVuFdFHJ -EPCjjvbdRXODcLgc -DoDLKvbdlrZVZrdJ -EPDKjvbdjKGIJmYS -EObkKvbdHEKujCJj -DncKjvbdNddTiIjd -DoDKjvbdZjSgpGaf -DoCjjvbdmfeXlnHZ -EPCjjvbdRosfifDw -DoCjjvbdZxcinDLr -DoCjjvbdNeDsiIjd -EPDKjvbdVgxVwgYz -DnbkKvbdqTtGrRjt -DnbkKvbdTqQntuIN -DncKjvbdBvzdJEpW -EPCjjvbdqUUHRrLU -DnbjjvbdqcdhonWB -DncKjvbdHDkWKBjK -DnbkKvbdxVMeQxlO -EObjjvbdkClKpgVH -EOcLKvbdCSaDUGXS -DncLKvbdUQqOttgm -DoCkKvbdZxcjOClS -EPDKjvbdVqmxCFMD -DnbjjvbdqmZixlHi -DnbjjvbdiUydvquC -DoCkKvbdOTTugFVQ -EOcKjvbdUQpoVVIN -DoCkKvbdNHDPlpVL -EOcLKvbdDncLKwCd -EOcLKvbddeOrCXCj -EObjjvbdqvolChyR -EOcLKvbdaofgELzd -DoDLKvbdrpVoKDWG -DncKjvbdaMjasUmH -EObjjvbdliETqUrB -DncLKvbdXsLaMtOx -EObkKvbdrykpTAhO -EPDKjvbdehKvRmpg -EObjjvbdUxhTzKnn -DncLKvbdTfznMXVe -EPDLKvbdqUTfqqkU -DoCjjvbdHELWKCKK -DoDLKvbdwuNFQyMO -DoCjjvbdffLynGgA -EOcLKvbdSLYetfkT -EPDKjvbdtTRryZeD -EPDKjvbdddoRbXDK -DoDKjvbdFVxooljF -DoDLKvbdxsNiNSCH -DoDLKvbdsCGNMGkZ -EOcLKvbdkHfkfFnL -EPCkKvbdqrUjnLAm -DnbkKvbdHELViajK -EOcKjvbdNHDQMouL -EPCkKvbdWWhxVdFH -DnbkKvbdUWMPitBR -DncLKvbdZoOJFFZj -DncKjvbdcIljKewY -DoDLKvbdVUNUGLvK -EObkKvbdNsTufdtp -DnbjjvbdGKdsCgmV -EObkKvbduDCtwWPP -EObjjvbdkMbMZeGo -EPCkKvbdJSyAsNXl -DnbjjvbdmbJwXnmu -EPCkKvbdRjxeuGkT -EObkKvbdaSFcITek -EPDLKvbdGYtuAdYC -DoDKjvbdFeirNiUR -EPCjjvbdhyuGMQmf -EObjjvbdDxYLstUM -EObkKvbdFfKRmhtR -DnbkKvbdyTNhmSCH -EPCjjvbdJSyAsNYM -EPCkKvbdEuxpQMie -DoDLKvbdkClLQgUg -DnbkKvbdssRrxzEc -EPDLKvbdRMwbZNtz -EPCkKvbdssSTYyeD -DoCkKvbdYqMeImEq -EOcLKvbdjuwOECXw -EOcKjvbdOTUWHFUp -EPCjjvbdliDtQtrB -EPDKjvbdZxdJmblS -DoDKjvbdbVCHXkTh -DoDKjvbdpstHSRjt -EOcLKvbdNPwpunGs -DoCkKvbdLAjgNCXq -DoCjjvbdDoDKjvbd -DoCkKvbdZirgpHBf -EPDLKvbdezuxdiTw -DoCkKvbdLrXMyuQz -DncLKvbdqlyjYkgi -DnbkKvbdLrWlzUpz -DoCjjvbdhytfLpnG -EObjjvbdxrmiNSBg -EPDLKvbdqquLNjaN -EObjjvbdiHKCyVjV -DncKjvbdjSziTKiz -EPCjjvbdCflGHAzc -EPCjjvbdZtJJZDrn -EPCjjvbdJKEAKQHE -EPDKjvbdIxTbHlRQ -EOcKjvbdZRMdhmEq -EOcLKvbdmttykJqf -DncLKvbdEzsqFMDJ -EPDKjvbdJuteceGi -EOcKjvbdemFvfmJk -DoCkKvbdkySqsZGt -EOcLKvbdlrZVZsDi -EOcLKvbdEXxLstTl -DnbkKvbdkNBlZeHP -DncLKvbdauCHYKsh -EPCkKvbdhuZeXSVC -EPCjjvbdOTTufdtp -DoDKjvbdDoCkKwCd -DoDLKvbdOAIrsirA -EPCjjvbdlAmPNALA -EOcLKvbdiBoCdwQq -DoCkKvbdnCJwYOnV -EOcLKvbdqwQLbhxq -DncLKvbdGYuVBEYC -EPCjjvbdcyyQXxqC -EPDKjvbdrEEiPmvB -DnbkKvbdJbibqJbx -DncLKvbdiGjCxuiu -EObjjvbdjKGIJmXr -EPCjjvbdFkEsDIMu -EPDKjvbdCWzchePv -EObjjvbdEObjjwDE -EPCkKvbdQdDApRDr -DoDLKvbdbAvEfQPw -DoDLKvbddtAUATNW -DnbjjvbdUxhUZkOn -DnbjjvbdwNWANEEm -EPCjjvbduDCuWuoP -DnbjjvbdjAQHApHK -DncLKvbdJzpFxEAN -DncKjvbdwtldpxlO -EObjjvbdBraCtGWr -EPDKjvbdJmADzGuB -DoDLKvbdRadEkiZL -DoCkKvbdAMhZTXZx -DoCjjvbdqGDeUVaI -DoCjjvbdVvhxWDdg -EOcKjvbdSBceMIyL -DnbkKvbdRkYfUfjs -EOcLKvbdFWYpQMjF -DoDLKvbdhlFENuCy -EObkKvbdiCObeWpq -DnbkKvbdHELWJaij -EObkKvbdCTAcTfWr -EPDKjvbdbrcLTdJa -DoDLKvbdDncKkXDE -DoCkKvbdmSYtzSdJ -EOcLKvbdVZHszLPO -DnbjjvbdhkdcmuCy -DnbkKvbdLrXNZuQz -EPDKjvbdZnmiFEzK -EPCkKvbdlrZVZsEJ -DnbjjvbdqmZixkhJ -DoDLKvbdcTCjsdKB -DoCkKvbdcyyPxYqC -DoDKjvbdssRrxydc -DoDKjvbdvPTzpjnt -EObjjvbdZLqctOMN -DoDLKvbdRNXbYnUz -DncKjvbdJYUBglRQ -EObkKvbdkIGlGFnL -DoDLKvbdiUzEwSUb -EPDKjvbdeEnrCWbj -DoDLKvbdRbDdkhxk -EObjjvbdYzcFqjWZ -EOcLKvbdjggLfFnL -DncLKvbdgQBzwEXh -DoCjjvbdQlxByNtz -DnbkKvbdoznDjwoA -DnbkKvbdVgwuxHYz -DoDLKvbdaaVdepQX -DoDKjvbdLZRKSztf -EPDKjvbdbUbHXkUI -EOcLKvbdjhGkfFmk -EObkKvbdeEoSBvcK -DncKjvbdUtMtGMVj -EPDLKvbdJTZAsMxM -DnbkKvbdOEdUJJKd -DoDKjvbdZHXEAPSi -EObkKvbduaDyTPFI -DnbjjvbdqAiFAWhE -EObjjvbdelevgNKL -DnbjjvbdTAEhgbPE -DoDKjvbdnPzZVkZC -DoDKjvbdQwNdDLhD -DnbjjvbdnBjWwoNu -EObkKvbdfMewGljL -DncKjvbdrpVnjCuf -EPDLKvbdLGFgbBRV -EObkKvbdkCkkRHUg -EObkKvbdTlVoAuoJ -EPDLKvbdrMyjZMHi -EOcLKvbdWHwuxHYz -EOcKjvbdLrXNZtpz -EObjjvbdbQHHDkzd -EOcLKvbdfILWRnRH -EPCjjvbdyfyMAMeX -DncLKvbdNHCpNQVL -EPCjjvbdFkEsDHlu -DncKjvbdGGJqmhtR -DnbkKvbdvAcxrndh -DoCjjvbdqGDeTvBI -DoCjjvbdJvUfDdgJ -DoCjjvbdUVlPisaR -DoCkKvbdqTsgSRkU -EObjjvbdjblKpftg -EObkKvbdtcDVXWPP -DnbkKvbdfHkVqnRH -DncLKvbdmoyxvLZC -EObjjvbdkHfkfFnL -EPDKjvbdwNWAMcdm -EPCjjvbdJpzFOfNe -DncKjvbdmbJvxOnV -DncKjvbdTqQnuUgm -EOcLKvbdTpqOuVHm -DoCjjvbdYlSETmkm -DoDKjvbdjEkGuPAO -DoCkKvbdwygefXdr -EObkKvbdrXPkcJYq -DoCjjvbdxUleQyMO -EOcLKvbdBsAcTfXS -EPDLKvbdLBLGlbXq -EObjjvbdmbJvwnnV -DnbjjvbdbVCGwjsh -DnbkKvbdxUmEpyMO -EPCkKvbdYSlBNTnx -DoDKjvbdeOeSkUTr -DncLKvbdqmZixlHi -EPCkKvbdNHCpNQVL -DoCkKvbdDigjWXjA -EObjjvbdrDeJQNvB -EOcLKvbdJuuGDeHJ -DoCkKvbdddnrCXCj -DoDKjvbdqTtGqrKt -DoDKjvbdeOeTKstS -EObjjvbdySmiNRbH -DnbjjvbdZshiYdTO -EObjjvbdnCKXXnmu -EPDKjvbdqiAKFMne -DoDKjvbdNeEUIiKd -DnbjjvbdzitpPdTU -EPCkKvbdzaAOffal -EOcKjvbdZtIiZDrn -DoCjjvbdtSrTYyeD -DoDLKvbdFVxopNJe -DoDLKvbdJJdAJpHE -DoDLKvbdHDjuiaij -EObkKvbdUWMQKUAq -EPDKjvbdTpqOuVIN -EOcLKvbdqvpMChyR -DoCkKvbdVviXudEg -DoCkKvbdGLErbgmV -EPCkKvbdZirhPfbG -DoCkKvbdWXJYVceH -DnbjjvbdhkeEOUcZ -DncKjvbdSPtHJedX -DncKjvbdFfKRnIsq -DncKjvbdWWhxVdEg -DoCkKvbdOStWHEuQ -DoDLKvbdEuyQPmKF -DncKjvbdrpVoKDWG -DoCjjvbdKVtfEEfi -DoCjjvbdWXIwudEg -EPDKjvbdSCDeMIyL -EPDKjvbdDoDKkXCd -DoCkKvbdJpzEnenF -EPDKjvbdaaWEfPow -DoCjjvbdVwJXucdg -EPCjjvbdauCHYKtI -EOcLKvbdNeDshhkE -DncLKvbdNGcQMpVL -EOcLKvbdIryBSmXl -DnbkKvbdTAFJICPE -EOcLKvbdrMzKYlHi -EOcKjvbdznopeDMY -EOcLKvbdMRvmZuQz -DncKjvbdeFOqbXCj -DncLKvbdbhlijfWx -EOcKjvbdqdEhpOWB -DoDLKvbdUWMQJsaR -DoDLKvbdptUGqrLU -EObjjvbdaSGChUFk -EPCjjvbdYTMAltOx -DncKjvbdEPCkLWbd -EOcKjvbdKCjDRKCx -EPDKjvbdZyDjNcMS -DncLKvbdFfKRnJUR -EPDKjvbdrNZiyLhJ -EOcKjvbdZeXfzgiC -EOcKjvbdbUbGwkTh -EPDLKvbdHfgZxwxH -DncLKvbdrovOjCuf -DnbjjvbdfNGWflik -DnbkKvbdZoNiFEyj -EPCjjvbddneTKtUS -EObjjvbdRbDdlIxk -EOcKjvbdKfFgbBRV -EPDKjvbdFyUuBDxC -EPCkKvbdiUzFXRtb -EPCjjvbdrJAJeNPF -DncLKvbdVAbRSqSZ -EObjjvbdaNKbTVMg -DoCkKvbdlhctQtqa -DoDKjvbdZshiZDrn -EPDLKvbdFkFSbglu -EPCjjvbdHffyxwxH -DncKjvbdTvLojTaR -DnbkKvbdauCHXkUI -DoDKjvbdGdKuiajK -EOcKjvbdkClKqHVH -EPDLKvbdnUtykKSG -DnbkKvbdBiKbKhej -DoDLKvbdHffzZXwg -EPCjjvbdbrbkTcjB -DoCkKvbdVwJYWDdg -DncLKvbdJJdAJogE -EPCkKvbdJvUfDdfi -DoDKjvbdZeYGzgiC -EObjjvbdZyEJnDMS -EOcLKvbdmSZVZsEJ -EPCkKvbdDnbjjvbd -EPCkKvbdJvVGDeGi -DoCjjvbdTXkLmzkY -DnbkKvbdLqwNZuQz -DncKjvbdZtIiYcsO -DoDKjvbdLYqKSztf -DnbkKvbdULuoBVni -EObkKvbdiBnbeWqR -EObjjvbdfILWRmqH -DncKjvbdezvYdhsw -DnbjjvbdJvUfEEfi -EPCkKvbdRpUHKGDw -EObkKvbdZGwEAPTJ -EOcLKvbdcTCkUEKB -EObjjvbdGAoQxizm -DnbjjvbdNwoVzcmt -DncLKvbdJbicRKDY -DnbkKvbdGZVVAcxC -EPCkKvbdRadFMJYk -DnbjjvbdxsNiNRag -DnbjjvbdiBncFXRR -EPCjjvbdySmiNRbH -DoDKjvbdeATqMxKG -DnbjjvbdtSrSyZdc -EOcKjvbdwtldpyLn -EPDKjvbdqwPkbiYq -EPDLKvbdzitpPcsU -DoDKjvbdDjHiuwjA -EPCkKvbdfMewGmKL -DncKjvbdlrYtyrci -EPCjjvbdZQldiMdq -EPDKjvbdJbjDQjCx -DncKjvbdqTsgRrKt -EPCkKvbdEvZQPljF -DoCkKvbdUsltGMWK -EOcLKvbdEJgivXjA -DnbkKvbdePFTLTtS -EPDKjvbdEYYLstTl -EPDKjvbdMfcPmPuL -DoDKjvbdBsAcTevr -EPDLKvbdwtleRZMO -EObjjvbdRotHJfDw -EOcKjvbdJuuFdFHJ -DnbjjvbdZoOIeFZj -DoDLKvbdsZlQSaHn -EPCjjvbddoFTLTtS -DncKjvbdbVBgXjsh -EPCkKvbdaMkBrtlg -EPDKjvbddiiqutzn -EObkKvbdiZuFkpnG -EPCkKvbdIxTaglRQ -EOcKjvbduaEYrndh -DnbjjvbdzQoMiJwA -DoCkKvbdsCGNMHKy -EObjjvbdMoxQunHT -DnbkKvbdxwiJbPzL -EOcLKvbdJbibpjCx -DncKjvbdIxTbHkpp -DoCkKvbdwuMeQxlO -EOcKjvbdKeehCBRV -EPCkKvbdZxdKNblS -EPCjjvbdLFegbBQu -DoCkKvbduLwwBUBX -DoDKjvbdjlbMZeHP -DoDLKvbdjAPfaPfj -EObjjvbdqGEFTvBI -EObjjvbdeAURNXif -EObjjvbdxmrgxTJD -EPCkKvbdqGDeUWAh -DncKjvbdqTsfqrKt -EObjjvbdjEjftoAO -EOcKjvbdNrtWHFUp -EObkKvbduCcUvvOo -EPCkKvbdvwMAvBWV -DncLKvbdtkwwBUBX -DoCjjvbdVZHsyjnn -EPDKjvbdQccBQQdS -DnbkKvbdjgfkeemk -EPDLKvbdFyVVBDxC -DncLKvbdrNZiyMIJ -EObjjvbdHfgZxwwg -DoDKjvbdqceIomvB -EPCkKvbdNGcPlouL -DoCkKvbdCIkBkIej -DoCjjvbdjKFhJmYS -EObkKvbdBsBDUGWr -EObkKvbdnQZxvKyC -DnbjjvbdhzVFkqOG -EPCjjvbdGLFScHlu -DoCjjvbdtlXwAtBX -DoDLKvbdUtMtFkvK -DoCkKvbdBvzchdov -DncLKvbdlZSrTZHU -EOcKjvbdZnnJEdyj -DncKjvbdYpleJMdq -EPDKjvbdiMEcmtcZ -EPCjjvbdfelZmgHA -DnbkKvbdLhalRYAS -DncKjvbdehLWRnRH -DnbjjvbdeKJqvUzn -EPCjjvbdqqtkOLBN -EOcLKvbdfRaWzlDP -DncLKvbdhtzFWquC -EObkKvbdJvVFdFGi -EObkKvbdMfcPlotk -DoCjjvbdtcCuWvPP -DnbjjvbdwtmFRZMO -DoDKjvbdsPvPKCvG -EPCjjvbdmfdwmOHZ -EPDLKvbdMgDPlouL -DoDKjvbdnGdwlnHZ -DoCkKvbdVwJXudFH -EObjjvbdQdCaQQcr -DnbkKvbdYSkaNUPY -DoCjjvbdULvPAuni -EPCjjvbdSZihScWA -DoCkKvbdBiLCKhej -DnbkKvbdhXZAzzAJ -EOcLKvbdQYmAGsRj -EOcLKvbdZtJIyDrn -DnbkKvbdNsTufduQ -EOcKjvbdEXxMUTsl -DoDLKvbdKyRJrzuG -DoDKjvbdrWpLbhxq -DnbjjvbdrDeIonWB -EPDKjvbdHELViaij -DoDLKvbdBdQBWJmG -DncLKvbdRjyGUfkT -EPDLKvbdYNqAYUut -EPDKjvbdRXNdClID -EPCkKvbdNwnuzdOU -EOcLKvbdjmBkydfo -DoCjjvbdrpWPKDVf -EPCkKvbdZyEKNbkr -EOcKjvbdQZNAHTRj -EOcKjvbdwtmEpxkn -DncLKvbdLhbMRYAS -DoCjjvbdsrrTZZdc -DncKjvbdxmrgxShc -EPCkKvbdmozZVkZC -EPCjjvbdbsDLTcia -DoDKjvbdGKeScIMu -EPCjjvbdrEFIpOWB -EOcKjvbdmpZxukZC -DoCkKvbdTkunaVni -DoCjjvbddneSkUUS -EPCjjvbdTlVoBWPJ -DoDKjvbdxsNhmSCH -EPCkKvbdVviXvDdg -DnbjjvbdwzHfFwdr -EPDKjvbdfMewHMjL -DoCjjvbdbsDKtDjB -EPDLKvbdUQpoVVIN -EObkKvbdrEFJPmua -EObkKvbdhlEcnUcZ -DoDKjvbdZRMeIleR -DnbjjvbdmajXYOnV -DoDKjvbdaRfDHtGL -DoCjjvbdbhljKewY -DoDLKvbdDwwksssl -DncLKvbdUMWOaVoJ -DncKjvbdWWiYWDdg -DoCjjvbdyXiJbQZk -DnbkKvbdHDkVibKK -EPCjjvbdtSrSxzEc -EOcLKvbdaSGChUFk -DnbkKvbdYSlBNUOx -EPDLKvbdJTZBSmYM -DoCjjvbdTkvOaWOi -DncKjvbdMowpvNfs -EPDKjvbdeEnqavcK -EOcLKvbdiifIJlxS -DnbkKvbdqceIpNua -EPDKjvbdrNZixkhJ -DncKjvbdiHKDZViu -DnbkKvbdrDdiPnWB -DncLKvbdLGFhCAqV -DoCjjvbdwuMdqYlO -EPCjjvbdePFTKssr -EObjjvbdVBCQrpqy -EObjjvbdbrcKsdKB -DnbkKvbdBvzciEpW -DoCjjvbdIHGyyXxH -EObjjvbdrzLpTAhO -EOcKjvbdemGWgNJk -EObkKvbdVZHtZjnn -EOcKjvbdiCObeXRR -EPCkKvbduoTzpkPU -DoCkKvbdrNZjYkgi -DnbkKvbdTAEhgand -EOcKjvbdhuZdwRuC -DoDLKvbdWWiXuceH -EPDKjvbdZoOIddzK -DncLKvbdVAbRSprZ -DnbjjvbdhgKDZWJu -DoCkKvbdVZITykOn -DoCkKvbdiGibyWKV -EPDLKvbdwyhGGYFS -DoDKjvbdiHKCxvJu -EPDLKvbdhyuGLpnG -EPDKjvbdOAJStKSA -EOcKjvbdzitpPdSt -DoCkKvbdzROlhjXA -DoDLKvbdtTSSxzEc -DoDKjvbdzoQRFCkx -DnbkKvbdxnSgxShc -DnbjjvbdiBoDFWqR -DoCjjvbdnBjWwoNu -DncLKvbdVYhTzKnn -DncLKvbdkIGkefNk -DnbkKvbdlqxuZsEJ -EOcLKvbdACrYJzIp -EPDKjvbdmaiwYOnV -EOcKjvbdYkrEUNlN -DoCjjvbdVUNTfLuj -DoDLKvbdfHkWSOQg -DnbkKvbdBraCsfXS -EOcKjvbdMJBkpxAS -DoDKjvbdcyyQXyQb -EObkKvbdeEnrCXDK -EObkKvbdFejSNiTq -DoCjjvbdEYXkstTl -EPDKjvbdyYIjBpZk -DncKjvbdiHJcZWKV -DncKjvbdQdDAoqDr -EObkKvbduDDUvvOo -EPCkKvbdzGyMANEw -DoDKjvbdQvnECkgc -DncKjvbdVviXudEg -DoDLKvbdQZNAHTSK -EPDKjvbdkCkjqHUg -EObjjvbdwyhFeweS -DoCjjvbdxwiJbQZk -EOcLKvbdEPDLLXDE -DncLKvbdVrNwbFLc -DoCkKvbdjAPgBPgK -EOcKjvbdpstGqqjt -EPDLKvbdHDkVjCKK -DncKjvbdirzhrjiz -DnbjjvbdxrnJNSBg -EPCkKvbdraelkgLZ -DncLKvbdptTgRqjt -DoCkKvbdIsYaTMxM -DoCjjvbdMpXqVnGs -DoDLKvbdUVkoitBR -DoCkKvbdjmCLyeHP -DoCjjvbdiVZeWquC -DoCjjvbdVUMtFlWK -EPDLKvbdxKvdHzzG -DoDKjvbdiMEdNuCy -EPDKjvbdwzIFfYEr -EObjjvbdJXsagkpp -EPCkKvbdxrmhmSBg -DoDKjvbdlqxuZsDi -EPDKjvbdsQVoJcVf -DnbjjvbdEYYLstUM -DncLKvbdkHgLfGNk -EPCjjvbdbsDKtDjB -DnbjjvbdJcKDQibx -DoCjjvbdyzdnSIIh -DnbkKvbdrpWOjCuf -EObjjvbdbAudeopX -DnbkKvbdYkqctNlN -EPDLKvbdfHkWRnRH -EPDLKvbdXmqAYUut -DncKjvbdFyVVBEXb -DnbkKvbdrDdhpNua -DncKjvbdeAURNXjG -DoCkKvbdOTUVgEuQ -EPCjjvbddwyssrFz -DoCjjvbdMpYRWNfs -DoCkKvbdjuvnDaww -DnbkKvbdVhXvXgYz -EObjjvbdTulQKTaR -EObjjvbdOAJTUJrA -EPDLKvbdsZkosBIO -DoCkKvbdhgJbxvKV -EPCjjvbdnBivxOnV -DncKjvbdxrnIlrCH -DncLKvbdzaAPHGbM -EPCkKvbduMXvaUBX -DnbkKvbdSBceMJZL -EObjjvbdJpzEoGOF -DnbkKvbdWexytAPT -DnbkKvbdkVwNcaxX -EOcLKvbdEYYLsstM -DoCkKvbdRosfiedX -EOcKjvbdwuMdpyMO -EObjjvbdUsmUFlWK -EObjjvbdjuwOECXw -DncKjvbdqlzJxkgi -DoCkKvbdiHJbxujV -EPDLKvbdakMFoNcA -EOcLKvbdmIcsqUqa -EPCkKvbdeKKSVtzn -EPCkKvbdvBEZTOeI -DncKjvbdpstHSRjt -EOcKjvbdKVuGEEfi -DoDLKvbdZQldiNFR -EPCjjvbdxnTIYShc -EOcKjvbdtunXjQsA -EPDKjvbdjcLkRHVH -DncKjvbdDoDLLXCd -DnbjjvbdZyEJnDMS -DoDLKvbdFkFTCgmV -EOcKjvbdhkddOUby -EPDLKvbdNeEUJIkE -DnbkKvbdyzeNqghh -EPDKjvbdFVxopMjF -EOcKjvbdGdLVibKK -DncKjvbdBdQAvJlf -DoDKjvbdbiNKLFwY -EPCkKvbdnGeYNNgZ -EPDLKvbdEYXlUTsl -DncLKvbdOEcsiIjd -DncKjvbdKaLHMbYR -DncKjvbdyTOIlrCH -EPCkKvbdMpXpumgT -EPCjjvbdtbbtwVno -DoDKjvbdrRtkOLAm -EObjjvbdbLLfPNcA -DncKjvbdjmCLydgP -DnbkKvbdTkuoBVoJ -DnbkKvbdSCDdlJYk -EObkKvbdCEPaVjNG -DoDLKvbdFaOpxizm -EPCjjvbdfMevgMjL -DoCkKvbdYzcGRjVy -DnbjjvbdKRZdoGNe -EPDLKvbdZisIQHCG -EOcLKvbdZMSEUOMN -DoCjjvbdiGibxuiu -EPDLKvbdZQmFJMeR -DoCkKvbdsBemLfjy -DncLKvbdzoPqEcMY -DncLKvbdMoxRWOGs -EOcLKvbdFeirOJUR -DoDLKvbdpyOgfpdY -DncLKvbdyzeOSIJI -DoDLKvbdRkZFuHKs -DnbkKvbdxVNEqZLn -DoCjjvbdMgDPmPuL -EPDKjvbdZQmEhmFR -DncKjvbdBraDUFwS -DoCkKvbdqqtjmkAm -EPDLKvbdLZQirzuG -DoDLKvbdlYsRryGt -EOcKjvbdKaLHNBxR -EOcKjvbdTqQoUthN -EObkKvbdhbObeXRR -EPDKjvbdJutfDeGi -DoDLKvbdRkZFuGkT -EOcKjvbdrbGNLgKy -DnbjjvbdmpZyWKyC -EPDKjvbdHELVjBij -EPCjjvbduDDUvuoP -EOcKjvbdrDeIonWB -DoCjjvbdnPyyWLZC -EPDKjvbddndrjtUS -EObjjvbdjuvnDbYX -EPDLKvbdCIkBjhfK -EObkKvbdZjTHogCG -EOcKjvbdjJehKNYS -DnbkKvbdSxLMNzkY -DoDLKvbdKDKDRJcY -EPCkKvbdmpZxvKxb -DnbjjvbdssSTYyeD -EObjjvbdHDkVibJj -DnbkKvbdSLZFtgLT -DoCjjvbdxnTIXriD -DnbkKvbdcSbjsdJa -DoCkKvbduoTzpjoU -DoCjjvbdXsLaNUOx -DoDLKvbdcScKtEJa -DnbkKvbdfpBzwDwh -EPDKjvbdjlakyeGo -DnbjjvbdYzcFqivZ -DncLKvbdCIkBjiGK -EPDLKvbdxZhFfYFS -EObjjvbdrEFJQNvB -DoDLKvbdjAPgBQHK -EOcLKvbdkDLjqHUg -DoCkKvbdiUzFWqtb -DoCkKvbdKVtfDdfi -DoDLKvbdwkXEHzyf -EObjjvbdqcdhpOWB -EPCkKvbdeEnrBvbj -DoCkKvbdCTAbsewS -DnbjjvbdNHCpMouL -DoDKjvbdSQUGiecw -DoDLKvbdelevfmKL -DoCkKvbdySnImSCH -DncKjvbdANIZSvzY -DncKjvbdrJAJeNPF -EPCjjvbdqTtGqqjt -EObjjvbdaRfDHsfL -EPCkKvbdrJAJeMne -EPDKjvbdiGjDYvJu -DoDKjvbdMgCpMpVL -DncKjvbdZjTIQHCG -EOcLKvbdJYTbILqQ -DoCkKvbdzoPqEbkx -EPDLKvbdvlvANDeN -DncLKvbdatafwjsh -DncLKvbdJuuFcdgJ -DncLKvbdwXMAvBWV -DoDLKvbdaMjbStmH -DoCkKvbdeOdsLTtS -DoDKjvbdbLLeoNcA -EPDKjvbdJKEAJpGd -DnbjjvbdZnnIeEyj -EOcLKvbdunszpjnt -EObkKvbdmoyyWKxb -EObkKvbdILazmvpk -EPDKjvbdQlwbYmtz -EPCjjvbderAvzkcP -EObkKvbdegjvSORH -EOcKjvbdsrqsYydc -EOcKjvbdfIKvSORH -DnbkKvbdFjdsDIMu -EPDKjvbdpstHRqjt -EOcLKvbdWRmxCElD -EOcLKvbdkHflGFnL -DoCjjvbdZjTHofbG -EObjjvbdeEoSBwCj -EPCkKvbdJSyBTNXl -DnbkKvbdUaCRTQqy -EPDKjvbdSLZFtfkT -DncKjvbdyNrgwsJD -DoDKjvbdezuxdiUX -DoDLKvbdACrXiyhp -DoDLKvbdxwiJaoyk -EOcKjvbdUxhTzLOn -DnbjjvbdnHFYNNfy -EOcLKvbdhanbeWqR -DoDKjvbdzHYlAMdw -DoCjjvbdKyRJrzuG -DncLKvbdliETpuRa -EObkKvbdczYpXyRC -DoDKjvbdFfKRnIsq -EPDKjvbdVAbQsRSZ -DncKjvbdezvZEiUX -DoCkKvbdZisHofbG -EPDKjvbdjKFgilxS -EOcLKvbduVmxKQsA -DnbjjvbdhuZeWrUb -EObkKvbdGYuUaDxC -DoDLKvbdaaWFGPpX -DnbkKvbdUQpoVUhN -EPCjjvbdZxdJmcMS -DncKjvbdhbPCdwRR -EObkKvbdZRMeJNFR -DnbjjvbdTlVoBWOi -DoCkKvbdatbHYKtI -EObkKvbdiHJbxvJu -DncKjvbdsQWOjCvG -DncLKvbdRosfjGEX -EObkKvbdREDBQRDr -EOcLKvbdeEnqawCj -EPDLKvbdGZVUaEXb -EPDLKvbdIryArmXl -EObjjvbdiiehJlwr -DoCkKvbdMJCMRYAS -DnbkKvbdlrYtzTDi -DoDLKvbdnGeXlmfy -DoCkKvbdSCDeMJZL -EObkKvbdLFegaaRV -DoDKjvbdGGKRmhsq -EObkKvbdiLdcnVDZ -DnbjjvbdGBOqZJzm -DnbjjvbdhfjCxvKV -EPCjjvbdlBNPNALA -EOcKjvbdtbbuXWPP -DncLKvbdEPCjjwDE -DoDLKvbdLqwNZtpz -EPDLKvbdbVCGwkUI -DncLKvbdZyDimcLr -DncLKvbdfILWSNpg -DoDKjvbdFVyPpNJe -DncKjvbdqiAJeMoF -EOcKjvbdqrVLOLAm -DoCjjvbdehKuqnQg -DoDLKvbdGLFTCglu -DoCjjvbdXrlBMtPY -DncKjvbdlYrrTYgU -EPCkKvbdWSNxCFMD -DncKjvbdUVkoitAq -DncLKvbdfHjvSORH -DoCkKvbdCEPaWKMf -EObkKvbdmbJvxPOV -EPDKjvbdwzHefXeS -EOcKjvbdvvlAvAuu -DncLKvbdpxngfqDx -DnbjjvbdIwtCIMQp -DncKjvbdHDjvKBjK -EOcKjvbdjmCLzFGo -DnbkKvbdZMRdTnMN -EObjjvbdEOcLLWbd -DoDLKvbdkNBlZdfo -EPCjjvbdemGXHNKL -EOcLKvbdkxrqryGt -EOcKjvbdsPvPKDWG -EOcKjvbdXsMAlsoY -DnbkKvbdmIcspuSB -DoCjjvbdUaBpsRRy -EOcLKvbdSPsfiedX -EOcKjvbdSCEEkiYk -DncKjvbdWXJXudEg -DncLKvbdRyigrbvA -DoDLKvbdUMVoAvOi -DnbjjvbdZtIhxcsO -EOcLKvbdJXsbHkpp -DnbkKvbdZtIhyETO -DncLKvbdHlBzmvpk -EObkKvbdzHZMAMeX -EPDKjvbdKCjCpjDY -EOcKjvbdjblKqHUg -DoDKjvbdGGJrNiUR -DoDLKvbdrEFIomvB -EPCkKvbdrovPKDVf -DoDKjvbdpxnhGpdY -EPDKjvbdemGWgNKL -EPDLKvbdTlWPAuoJ -EOcLKvbdhuZeWqtb -DnbkKvbdhyuGLpnG -EObjjvbdSBcdlJZL -DnbkKvbdeEnqbWcK -DnbjjvbdJKEAJofd -EObjjvbdbQGfckzd -EPCjjvbdRkYeuHLT -DoDLKvbdXrlBMtOx -EObkKvbdznoqFCkx -EPDLKvbdjggLfFnL -EPDKjvbdhuZdwSVC -EPCkKvbdeEoRbXDK -EPCkKvbdKaKgNCYR -DoDLKvbdWWhxWDdg -EPCjjvbdqUTfqqjt -EOcKjvbdcSbkTdJa -DncKjvbdauCHXjtI -DoCkKvbdQlwbZNtz -DnbjjvbdqvolCiYq -EOcLKvbdePFSjstS -EOcKjvbdhgKDZWKV -EObkKvbdCgLfHAzc -DncKjvbdnUuZkKSG -DnbjjvbdlhctRUrB -DoDKjvbdpyPHgREY -DoCkKvbdjJegimXr -EPDKjvbdfHkVrORH -EPDKjvbdyTOIlqbH -EPDKjvbdjKFhKNYS -EPDKjvbdFWZPpMie -EPCjjvbdIwsahLpp -EObkKvbdKfGIBaQu -DncKjvbdGFirOJTq -DnbjjvbdpedFUWBI -EPCkKvbdNeDshiKd -EObjjvbdBiLBjhej -EObjjvbdCJKbLJFj -DncKjvbdvwMAuaWV -DnbjjvbdZRMdhleR -DncKjvbdhgKCyViu -DoCkKvbdhficZWKV -DnbjjvbdwkWdHzyf -DncLKvbdVBBqSprZ -EOcLKvbdUsmTelVj -EOcLKvbdFxuVBEYC -DoDKjvbdKaLHMbYR -EPCkKvbdGdKuiaij -EPDKjvbdfIKvRnQg -DncKjvbdfekzNfgA -DoCkKvbdJbicRJbx -EOcKjvbdIwsagkpp -DncKjvbdOEctIiKd -DncKjvbdOTUVfduQ -EPCkKvbdFWZPomKF -EObjjvbdezvZFJUX -DoCjjvbdtSrTYzFD -DoCkKvbdbVCHYLTh -EPDLKvbdZMRdUOLm -DoDLKvbdNwoVzdNt -EPDLKvbdFaPRZJzm -DoCjjvbdxZhGFweS -EPCjjvbdZQmFImFR -DnbjjvbdsQWOibvG -DoCjjvbdSBdFMIxk -EPCkKvbdEObkKvcE -DoDKjvbdqFcdsvAh -EOcKjvbdezuyEhsw -DnbkKvbdVqnXaeMD -EObjjvbdnGeXlmgZ -DncLKvbdCIkBkIfK -EPDLKvbdpecdtWAh -EPDKjvbdsQVnjCvG -DoDKjvbdkDMLQfuH -EObjjvbdAMhZTWzY -EPCjjvbdiCObdvqR -DoDKjvbdUWLoisaR -DncLKvbdSPtHKGDw -EObjjvbdaNLBrtmH -EPDKjvbdUyHszKoO -DoDKjvbdQwNccLhD -EPDLKvbdnVUzKjRf -DoCkKvbdRyigrcWA -EOcLKvbdbiNKLGXY -DncKjvbdlhctRVSB -DoCkKvbdNPxRWNfs -EObjjvbdANHxsXZx -DnbjjvbdNrsvHEuQ -EPCjjvbdmbJvxPNu -EOcKjvbdJvVGEFGi -EPDKjvbdUWLoitAq -DoCkKvbdkDMKpfuH -EOcLKvbdfjfzbfAE -EOcLKvbdczZQYZRC -DoDLKvbdQwNcblHc -EObkKvbdOTTugEtp -DncKjvbdbUagYLTh -EPCjjvbdfNGWfmKL -EObjjvbdiVZdvrUb -DncLKvbdZyDinDMS -EPCkKvbdmaiwYOmu -EOcLKvbdqUUHSRkU -DncLKvbdDncKjvbd -DoCkKvbdVqmxCElD -EPCkKvbdaRfDIUFk -EOcKjvbdjKGIJlxS -DncLKvbdkxrrTZHU -DncKjvbdypnmIjXA -DoDLKvbdJpyeOfOF -DoDLKvbdwXMBVaVu -DoDKjvbdKfFhCAqV -DoCjjvbdIxTahLqQ -EOcLKvbdADSYKZiQ -DoCkKvbdMowpunHT -EOcKjvbdgKfzbfAE -EPDKjvbdhkddOVDZ -EPDLKvbdemFwHMik -EPCjjvbdUVlQKTaR -DncLKvbdRWnECkhD -DnbjjvbdkWXODbYX -DoCjjvbdZeYGzghb -DoCkKvbdSKyFtfkT -DoDLKvbdBhkCLJFj -DncKjvbdlhdTqVRa -EPDKjvbdqqtjmjaN -DoDLKvbdZjTHofbG -EPDLKvbdJmADzHVB -DoDLKvbdSBceLhyL -EObjjvbdqwPlCiYq -DncLKvbdYORAXtvU -EPDLKvbdZnnJEdyj -DoCjjvbduWNxKQsA -EPDKjvbdWSNxCElD -DoCkKvbdRjyFtgLT -DoCkKvbdeOeSkUUS -EOcKjvbdDihKVxKA -EObjjvbdffLymgHA -DoDLKvbdcScKsdKB -EPDLKvbdlYsSSyGt -DnbjjvbdGKeTDINV -DoDLKvbdCTBCtGXS -EObjjvbdEASIlyvw -EPDLKvbdfMfWfmKL -DoCkKvbdpstGqrLU -DncLKvbdtlXwAsaX -DoDKjvbdNrsvHEuQ -EObjjvbdCTBDTfXS -DoDKjvbdkMalZeHP -DoDLKvbdQccBPqDr -DnbkKvbdYqNEiNEq -DnbkKvbdvBDyTOeI -DnbjjvbdLAkGmBxR -EObkKvbdLiBlRYAS -EPCjjvbdTukpKUBR -EObkKvbdhuZeWqtb -DoDLKvbdZyEJmbkr -DnbjjvbdxrmiNSCH -EPCjjvbdKWVFdFHJ -EPCjjvbdRWmcblID -EPCkKvbdsQVoJcVf -EPCkKvbdGcjuibJj -DoCjjvbdJuteceHJ -DnbjjvbdLLAhWAJy -DncKjvbdULunaWOi -EOcLKvbdHlBznXQk -DoDKjvbdvBDxroEh -DoDKjvbdzaAPHGbM -DoDLKvbdUyITyjoO -DnbkKvbduaDxroFI -EObkKvbdAMhZSvzY -EObjjvbdDoDKkWbd -EObkKvbdGKdrbhNV -EPCkKvbdmgFXlnGy -EOcKjvbdzdzOzdzQ -EPCkKvbdKkBHvAJy -EOcKjvbdqAiFAWhE -DoCjjvbdQvmdClID -DncKjvbdMtsSKmAX -EObjjvbdziuPpETU -DoDKjvbddZyQYZQb -EPDLKvbdauBgXkTh -DnbkKvbdnCJvwnmu -DoCjjvbdxUmFQyMO -DncKjvbdXGYzUAPT -EPDLKvbdOAJTUKSA -DncKjvbddZyPwxqC -EOcKjvbdqlzKYlIJ -DnbjjvbdkVvnDaww -DnbjjvbdZdxGzhIb -DnbkKvbdDwxLtTsl -EObkKvbdGKdrcHmV -DncKjvbdTAFJHbOd -DoDKjvbdEObkKvcE -DnbkKvbdaNLCSuNH -DoDLKvbdDxYLtTtM -EObjjvbdVZIUZjnn -DoCkKvbdNsUVfduQ -EOcLKvbdGGKRmhtR -EPDKjvbdbKlFnmcA -DncKjvbdvvlAvBWV -DoCjjvbdliEUQtrB -DnbjjvbdjgfkfGNk -EPDKjvbdlYsSTYft -DoDLKvbdbKlGOnDA -EPDKjvbdjAPfaPfj -DnbkKvbdzGyMAMeX -DoCjjvbdZnmhddzK -EPCkKvbdIMBzmwQk -EObkKvbdjEkHVPAO -EPCkKvbdQccBPpdS -EPCjjvbdhgKCxvJu -DncLKvbdVgxVxHYz -EOcKjvbdxVNFQxkn -DoDKjvbdbLMGPNcA -DncLKvbdGckWJajK -DnbkKvbdrMyiyLgi -EOcLKvbdKefICApu -DoCjjvbdqFdEtWBI -EPCkKvbdYSlBNUPY -DoCjjvbdIwsbILpp -EPCjjvbdmgFYMnHZ -EObjjvbdQvmccMID -DncLKvbdURQntthN -EOcLKvbddxZtUSFz -EPCkKvbdhtzFWqtb -EOcKjvbdVBCRSpqy -DncKjvbdtbbtvvOo -EPCkKvbdczZQYZQb -DnbjjvbdQwODcLgc -EPDLKvbdtunXipsA -DncLKvbdBhjajhej -DoDKjvbdNrtVfduQ -EOcLKvbdKWUfDdfi -EObjjvbdpstHRrLU -DnbjjvbdznpRFClY -EPCjjvbdfNFvgMik -DoCjjvbdUsltGLvK -DnbjjvbdlqyVZsDi -DoCkKvbdNPwqWOHT -EOcLKvbdakLeoNcA -DoDKjvbdsCGNMGkZ -EPDKjvbdaRfDHsfL -DoDKjvbdZtIhyDrn -EPDLKvbdOStVgFUp -EPCkKvbdeATplxKG -DncLKvbdySmhlrBg -DoDKjvbdnCKWwoOV -DnbjjvbdDncKjvcE -EOcLKvbdwzIGGXdr -EObjjvbdmIdTqVSB -DnbjjvbdUGznLwVe -DncLKvbdTkvOaWPJ -DncKjvbdyOSgwsIc -DncKjvbdjmCLzFGo -DoDLKvbdpssfqqkU -EPDKjvbdmtuZjirG -EOcKjvbdOFEThhkE -DoDKjvbdIMBznWqL -EPCkKvbdJvVFcdfi -EPDKjvbdnBivxOmu -EObkKvbdTvLojTaR -DoCkKvbdMRwNZtpz -EObjjvbdEARhlzXX -DnbjjvbdcScLTcjB -DncKjvbdxmrhXrhc -DoDKjvbdEvZQQNKF -DncLKvbdGLErcHmV -DoDLKvbdFkFTChMu -DoCkKvbdOFETiIkE -EPDKjvbdnVUzLKRf -EPDKjvbdmuUzKjSG -EPCjjvbdwuNFQxkn -DncLKvbdeATpmXjG -EObjjvbdxUmEpxkn -EPDKjvbdcSbkTcjB -EPCjjvbdmbKXXoNu -EPDKjvbdSQUHKFdX -DoDKjvbdCTAbsewS -EOcLKvbdVwJYVdFH -DoDKjvbdZtIiYcsO -EPDKjvbdhkeENtcZ -EObkKvbdGBOpyJzm -EPCkKvbdRMxCYmtz -DoCjjvbdzjVPocsU -DoDLKvbdrDdiPnWB -EPCjjvbdFjdsDIMu -DoDLKvbdSLZGUgLT -EPDLKvbdKefHaaQu -DoDKjvbdKCibpicY -EOcLKvbdijGIJmYS -EObjjvbdelfWgNKL -DnbkKvbdbhmKKfWx -DoDKjvbdSQUHKGEX -EPCkKvbdnGdxMmgZ -DncLKvbdJJdAKPgE -EPDLKvbdmRyUyrdJ -EOcLKvbdhzUfLqOG -DoDKjvbdLAjgMaxR -DoDKjvbdRosfjGEX -EObkKvbdpssfqqjt -DnbkKvbdjAQHAofj -DncLKvbdidkHUoAO -DoCkKvbdCIjbLIej -DncLKvbdelfWfmKL -DoDLKvbdxUleQxkn -EPDLKvbdEvZQPljF -DncLKvbdJbjDQjCx -DncLKvbdyOTIXriD -DoDKjvbdTulPjUAq -DnbjjvbdJSyAsNYM -EOcLKvbdbBVeGQQX -EPCjjvbdbKkenmcA -EPCjjvbdiGjDZWJu -DncLKvbdcSbjsdJa -EObkKvbdZtJIyDsO -DoDLKvbdrafMkgLZ -DoCjjvbdiMFDmuDZ -DnbkKvbdnUtyjirG -EPDKjvbdfNFvflik -DoDLKvbdrWokcJZR -DncKjvbdWWhxWDdg -EPDLKvbdNeDtJJKd -EOcLKvbdqlzKYkhJ -DncKjvbdSQUHKGDw -DoCkKvbdkHflFfOL -EPCkKvbdRXNdDMID -DncLKvbdSLZFtfkT -EOcLKvbdZQldiMeR -DnbjjvbdSBdElJYk -DncLKvbdwWlBVaWV -DoCjjvbdhzUfLqOG -DoDLKvbdmJEUQuSB -DnbjjvbdULvPBVoJ -EPDLKvbdYkrDtOMN -EPDKjvbdHEKujBij -EObjjvbdJuuGDdfi -EObjjvbdzaAOgGbM -DncLKvbdkClLRHUg -EObkKvbdYTMAmToY -EObjjvbdxVMeQyLn -DoDKjvbdrEFJQNua -DncKjvbdYSlBNTnx -DnbjjvbdrSUkOLAm -EOcLKvbdrylQTBIO -DnbjjvbdrouoKDVf -DoDLKvbdwWkaVaVu -DoCkKvbdZQmFIleR -EPCjjvbdiLeENtby -DoCjjvbdrDeJQNua -EObjjvbdIGfzYxXg -DoCkKvbdySmiMqag -EOcKjvbdbVBgYLTh -DoDKjvbdLFehCApu -EPCkKvbdCDpAvJmG -EObkKvbdZLrDtOLm -EPCkKvbdZnnJEdyj -EPCjjvbdZjSgpGbG -EOcKjvbdWSOYBdkc -EPDKjvbdwtleQyLn -DnbkKvbdmJDtQuSB -EObkKvbdkWXODbXw -DncKjvbdezuyEiTw -EObjjvbdnBjWwnmu -EPDKjvbdZxdJmcMS -EPDKjvbdrbGNMHLZ -EObkKvbdEYXlTssl -DnbjjvbdyTOJNRag -DnbkKvbdGZVVAdYC -EPCjjvbdTYLMNzkY -DncLKvbdJcJcRKDY -EOcLKvbdYpmEhldq -DoCkKvbdjKFgjNYS -EPDLKvbdJbibqKCx -EPCjjvbdyTNiNSCH -DoDLKvbdGGKRmhsq -EPDLKvbdLAkGmCYR -EPDLKvbdCEPaWKMf -DoCkKvbdZsiIyDsO -EPCjjvbdjbkkRGuH -DnbkKvbdqYoHgREY -DoDLKvbdZMRctNkm -EObjjvbdDjIJvYKA -DncKjvbdVqnXbEkc -EPCkKvbdiHKCyViu -EOcKjvbdkHflGFmk -DoDKjvbdOFDsiIjd -EOcLKvbdVrOYCEkc -EPCjjvbdhtydvrUb -DoDLKvbdrNZjYlHi -EPDKjvbdVwIxWDeH -EObkKvbdhyuFlRNf -EPDLKvbdSKyFuHKs -DoCkKvbdBhjajiFj -DoDKjvbdhanbeWpq -DncKjvbdGGJqnJTq -EPDKjvbdZtJIyETO -EOcLKvbdANIZSvzY -DnbkKvbdptUHSSLU -DoDLKvbdRDcBPpdS -DoDKjvbdBcpAujNG -DnbjjvbdaaVdeopX -DnbjjvbdhtydvrUb -DoCkKvbdkWXNcaxX -DncLKvbdrNZjYkgi -EPCjjvbdBiKajiGK -EObkKvbdwkWcgzzG -EPCkKvbdRDcApQcr -DncLKvbdfekzNgHA -DoDKjvbdiBoCdwRR -EOcLKvbdIBlZdzAD -DnbkKvbdZLqcsnMN -DoDKjvbdatbGwkUI -EObjjvbdmgFXlmfy -EPDLKvbdxUmEqYkn -EPDLKvbdauBfxKsh -EObjjvbdsPvOjDVf -DnbkKvbdkVwNdBww -EPCkKvbdzaAPGfbM -EOcLKvbdRotGjGDw -EPCkKvbdqceJPmua -EPDLKvbdZyDinCkr -EObkKvbdCDoaWKMf -EOcKjvbdjmCLzEgP -EPDKjvbdHlBznXRL -DncKjvbdeOeTLTtS -EPCjjvbdGZUuBEXb -DnbkKvbdqTtHRqjt -EOcLKvbdFyUuAdXb -EPDLKvbdEARiMzWw -EOcKjvbdFeirNiUR -DoCkKvbdzjUoocsU -EOcLKvbdEztQdlCi -DncLKvbdKCjCpibx -EPCjjvbdxZhGFxFS -EObjjvbdwWkaWAvV -DnbkKvbdaaWFFoow -EOcKjvbdBsBDUGXS -EPDLKvbdmIdUQuRa -DncKjvbdVAbRTRRy -DoCkKvbdHffyxxYH -EObjjvbdDGkfHAzc -DoCkKvbdiCPDFXRR -EPCkKvbdVrNwbEkc -EPCkKvbdiGjDYvKV -DnbkKvbdIMBzmvpk -EPCkKvbdKxqJrztf -DncLKvbdmIctQuSB -EOcKjvbdaSFbhUGL -DoCjjvbdmbKWwnmu -DoCkKvbdiUyeWrVC -DncKjvbdGGKRmhsq -DoCjjvbdehLVqnQg -DncLKvbdTkunaVoJ -DnbjjvbdGZUtaDxC -EPCjjvbdtSrSyZeD -DoDLKvbdjbkkQfuH -EOcLKvbdOFDtJJLE -DnbjjvbdBdQAvJlf -DoCkKvbduDDVWvPP -EOcKjvbdZtJIyDsO -DncLKvbdQccBPpdS -DncLKvbdiUzEvquC -EPCjjvbdvvkaWAuu -DoDLKvbdZoOIeEzK -DnbkKvbdkCkkRGuH -EOcKjvbdRkZGVHLT -EObkKvbdtcCuXVno -EPCjjvbdMpYRVnGs -DoDKjvbdFfJrNiTq -DnbkKvbdZnmiFFZj -EPDLKvbdbhmKKfWx -DoDLKvbdDjHivXjA -DoDLKvbdiLeDnVDZ -EOcLKvbdUQqOtthN -EPDKjvbdZHXEAOri -EObkKvbdvAdYrndh -EObkKvbdQlwaxnUz -DoCjjvbdQwOEDLhD -EPDLKvbdqrVKnLBN -EObjjvbdwtmFQxkn -EPDLKvbdTfznMWvF -DnbkKvbdaMjasVNH -EPCjjvbdcyyQXxpb -DncKjvbdMfcQMpUk -DnbjjvbdZnmheEzK -DncLKvbdbrbkUDia -DncLKvbdiCOcFXRR -DoCjjvbdZxcimblS -EPDLKvbdRkYfVHKs -DncKjvbdDoDKjvbd -EOcKjvbdGAnpxizm -EOcKjvbdYpldhldq -DnbkKvbdQwOEDMID -DnbjjvbdcyxoxYpb -DoCjjvbdakMGOnDA -EPCjjvbdLAkGlawq -DncKjvbdJJdAKPfd -EOcLKvbdxrnImSBg -DoDLKvbdNddUJIjd -DncLKvbdfIKvRmpg -DoCjjvbdiZuGLqOG -EOcLKvbdeAURMwif -DncLKvbdiCPCeWpq -DoCjjvbdGcjvKBij -EPDKjvbdRDcBQQdS -EPCjjvbdUtMtGLvK -EPDKjvbdyXhjBoyk -DoDKjvbdqZOgfpcx -EObjjvbdYTMAmUPY -DoDLKvbdiCObeXQq -DncKjvbdmJDtRUqa -EObkKvbdSCEElIyL -EObkKvbdNGbpMouL -DoCkKvbdEzsqElCi -EObjjvbdOStWHFVQ -EPCjjvbdjmBlZdfo -EPDKjvbdiUyeWqtb -DnbjjvbdYSkaNUPY -DoCkKvbdTAEhhCPE -DoCjjvbdmttyjjSG -EOcKjvbdrMyjZMIJ -EPDKjvbdUsmTelVj -EPCkKvbdNsTugFUp -DnbkKvbdWRnYBeMD -DncLKvbdHgGzZXxH -EPDLKvbdZLrDsmlN -DncLKvbdcSbkUDjB -EObkKvbdziuPpDrt -DoCjjvbdZyEJmblS -EObkKvbdjggMFenL -DnbkKvbdmfeXmNfy -EObkKvbdiBncFXRR -EPDKjvbdADSXiyiQ -EObjjvbdLFfHbApu -EOcLKvbdRMwbZOUz -EPCkKvbdFVxoomJe -EOcLKvbdZnmiEdyj -DncLKvbdULunaVoJ -DncLKvbddndsKtTr -EPDKjvbdEztQeMDJ -EObkKvbdcScKscjB -EOcKjvbdFkErbglu -DoCkKvbdsBfMlGkZ -EPDLKvbdCSaCsfWr -EPCjjvbdVAapsRSZ -EOcLKvbdgFkzNfgA -EPDLKvbdjhHLefNk -EObjjvbdyNsIXsIc -DoCjjvbdqcdiPmvB -EOcKjvbdeXyssrFz -DnbjjvbdEOcKjwCd -DoDLKvbdGKdrbgmV -DncLKvbdKQzEoFnF -DoCkKvbdqvpMDJZR -EObkKvbdZyEKODMS -DncKjvbdBhjbKiFj -DncKjvbdfHkVrNqH -DncLKvbdeXyssrFz -EObjjvbdxmsHwriD -EPDKjvbdRyigsCvA -DoCkKvbdZoNiEeZj -EPCkKvbdhzUfLpnG -DncKjvbdVUNUFkuj -EPDKjvbdRXNdDMID -EObkKvbdlBMnmALA -EPDKjvbdffMZnHHA -EPCjjvbdEARhlyvw -EOcKjvbdVTltGLvK -EOcKjvbdJqZdoFme -EObkKvbdyOTHwsIc -DoDLKvbdCfkegAzc -DnbkKvbdZMRdTmkm -DnbkKvbdhkeEOUcZ -DoDKjvbdZnnIeEyj -DnbjjvbdrafNMGkZ -DoDLKvbdZtJIyESn -EOcLKvbdaRecITek -EPCjjvbdZoOJEdyj -DoDLKvbdxsNhlrBg -EPCjjvbdZxdKNcMS -DoCjjvbdCWzdJEov -EObkKvbdTppnttgm -DnbkKvbdjmCLydfo -EObkKvbdBsAbsewS -EObjjvbdjgflFemk -DnbjjvbdpstGrSKt -EOcLKvbdOTTvHFUp -DoCkKvbdczYowyRC -EObkKvbdTvMPjUAq -EOcKjvbdezvYeJUX -EPCkKvbdzHYlANEw -EPCkKvbdqcdiQOVa -DoCkKvbdsrrSxyeD -EObkKvbdOTUWGeUp -DoDKjvbdbUbHYLTh -DoCkKvbdHakydzAD -DoDKjvbddjJrWUzn -EPDKjvbdmaiwYPOV -DoCjjvbdtbcUwVno -EPDLKvbdrMyjYkgi -DoCjjvbdUQpoUtgm -DncKjvbdddoSBwDK -EPCkKvbdatbGwkTh -DncKjvbdmbJvxPNu -DnbjjvbdwzHeewdr -DncLKvbdzitpPcrt -EOcLKvbdrMyjYkgi -EOcLKvbdrEFIomvB -DoDLKvbdiifIJlxS -EOcLKvbdtvOYKQsA -DoCkKvbdxsNhlqag -DnbjjvbdyTOIlqag -DncLKvbdIGgZyYXg -EOcKjvbdUsmUGMWK -EObkKvbdhzUfMQnG -EPDLKvbdZxdJnCkr -DncKjvbdKWUeceGi -EOcLKvbdmbJvwnnV -DoDLKvbdDncKjvbd -EPCkKvbdZoNheEyj -DncLKvbdVqnXadlD -DncLKvbdtunXipsA -DncLKvbdjAPgBPfj -DoCkKvbdyqPNJKXA -DncKjvbdrpWPJbuf -EOcKjvbdqvpMDJYq -DnbjjvbdcTDLUDia -DnbkKvbdiGjCxvKV -EPDKjvbdauBfxKtI -DoCkKvbdLFfHbApu -DoDLKvbdHffyyXwg -EOcKjvbdIxUCHkqQ -DoDKjvbdzQoMiJwA -DoDKjvbdyYIjBoyk -EObkKvbdxnSgwriD -EObkKvbdIMBznWpk -EPDKjvbdYlSDtOMN -DoDKjvbdijGHjMxS -EOcKjvbdYkqcsnMN -DoCjjvbdmaiwYOmu -EPDKjvbdHELWKBjK -DoCjjvbdwtmFRYlO -EOcLKvbdFeiqnJTq -EPDKjvbdiBncEvqR -DoCkKvbdJXsbILpp -EObjjvbdULunaVni -DncKjvbdDwxLstUM -DoDKjvbdrWpMChyR -EObkKvbdYzcFqivZ -DncKjvbdEzspdlDJ -EPDKjvbdfMfXGmKL -DoCkKvbdCTAbtGWr -DoDLKvbdRkZGUgKs -EPCkKvbdFWZQQMie -DnbjjvbdxVNEqYkn -DoCjjvbdeFPRbWbj -EPCkKvbdZshhyESn -EObjjvbdqrVKnLAm -EPCjjvbdptUGqqjt -EOcLKvbdrEEhpOVa -DncKjvbdzQoNIjXA -DncLKvbdmgFXlnGy -DoDKjvbdZjShQHBf -DnbjjvbdjKGHjNXr -DoDLKvbdqFcdsvAh -EPCkKvbdOEdUIiLE -EPDLKvbdNeEUJJKd -EPCjjvbdzHZMANEw -DnbkKvbdqlzJyMIJ -DnbjjvbdelfXHMjL -EPCkKvbdANHyTWzY -DnbjjvbdREDBPpcr -DncLKvbdQmYCZOUz -EOcKjvbduoTzpjoU -DoCjjvbdqrUjmkBN -DnbjjvbdyfxlANFX -EOcLKvbdJmADygUa -EPDLKvbdyNrhYTIc -DoCjjvbdCTAbtFwS -DncLKvbdSwkLmzkY -DnbjjvbdjhHMFfNk -DoCkKvbdZeXfzhIb -DnbjjvbdbrbjtEJa -DoCkKvbdxrmhmRbH -DoDLKvbdrXQLbhxq -EObjjvbdTulQKUBR -EPCkKvbdMpYQumgT -DncKjvbderBWzlDP -DoCjjvbdiGjCxvJu -DoCjjvbdlZSqsZGt -EOcLKvbdZisIPfaf -DnbkKvbdHEKvKBij -DncLKvbdjSziSjiz -EPDKjvbdCEQBWJmG -EObkKvbdGGKRmiUR -EPDKjvbdMuTRkNAX -DnbjjvbdrXQLbiYq -EPCjjvbdOTUWGduQ -EPCjjvbdnBjXXoNu -DoDLKvbdcarmSAUN -DoCjjvbdNPwqWOGs -EObkKvbdUslsekvK -DnbjjvbdzaAPGfbM -DoCkKvbdGdLVjCJj -DoDLKvbdRjyFtfkT -DoDLKvbdGLFTDHlu -DnbkKvbdGFirOJUR -EPDLKvbddoFTLUUS -EObkKvbdkxrrTZGt -DncKjvbdxrnJMqag -EOcLKvbdCDpBWJmG -DoCjjvbdlqyUysDi -EPDKjvbdTfzmlXVe -DncKjvbdEuxpQMie -EOcKjvbdbLLfPNcA -DncKjvbdVgxWXgYz -DoDKjvbdrbFmLgKy -DoCjjvbdzaAPGfbM -DncLKvbdYSlAlsoY -DoDLKvbdZyEJnClS -EPDLKvbdEvYopMjF -DncKjvbdmtuZjiqf -DoCjjvbdCJKbLIfK -EOcLKvbdcIljLFvx -EObkKvbdrJAKFNPF -DoDKjvbdBiKbKhfK -EPDKjvbdWIYWYGxz -DoCkKvbdjAQGaQHK -DnbjjvbdjblLQftg -DncLKvbdbhlikGXY -EPDKjvbdZLrDsmkm -DoDLKvbdVTlsfMWK -DoCjjvbdliDsptqa -DnbkKvbdjuvmcbXw -DoCjjvbdbVCHXjtI -DoCkKvbdQvmdClID -DnbjjvbdLAkHNCXq -EPDKjvbdZtIhyETO -DnbkKvbdYkqdTmlN -DoDKjvbdMtrrKmAX -DncLKvbdJXtCIMQp -EPCkKvbdlhdTqUqa -EObjjvbdnHFYNNfy -EPDKjvbdxrmhlrBg -DncLKvbdiLeDmtcZ -DncKjvbdNrsufdtp -EObkKvbdlhcsptqa -EObjjvbdNeETiIkE -DnbkKvbdxsNhmRbH -DnbkKvbdADRxKZhp -DnbjjvbdTqROuUgm -EOcKjvbdpxoIGqDx -EOcLKvbdqBIeAWhE -DnbjjvbdCIkBjiFj -DncLKvbdTlWPBWPJ -DoCjjvbdEKHjVxKA -DnbkKvbdZRNFImEq -EObkKvbdJbicQjCx -DoDKjvbdNsTufeVQ -EObjjvbdDxYMUTsl -DoDLKvbdaSFcITfL -EPDKjvbdcTDLTcia -DoCkKvbdlhdTpuRa -EObjjvbdCJKbKiFj -DncKjvbdqAiFAWhE -EPDKjvbdUslsfLuj -EObjjvbdWWiXuceH -EPCjjvbdOEcshiLE -EPDLKvbdEJhJuxKA -DoCkKvbdKyRKSzuG -DncKjvbdHffzZXxH -EOcLKvbdSLZGUfkT -EObkKvbdHgHZxwxH -DnbkKvbdcSbjtEJa -EPDKjvbdZGwEAPTJ -DoDLKvbdeAURNXif -EPDLKvbdMpYQunGs -EObkKvbdNeDshiKd -DoDLKvbdzoQQdbkx -EPDKjvbdWHxWXfxz -EPCjjvbdCEPaVjNG -DoCjjvbdbhlikFvx -EOcLKvbdBvzdIdpW -DoCkKvbdNPwqWNfs -EPCjjvbdbhlijfWx -DncKjvbdqwQLbiZR -EObjjvbdkClLRGuH -DncKjvbdNHDQNQVL -DncKjvbdhkdcmuDZ -EOcKjvbdKWVFdFHJ -EPDLKvbdYTMBMtOx -EObkKvbdSKxfVGjs -DncKjvbdZoOJEdzK -EObjjvbdMpXqVmgT -EPDKjvbdhaoDFXRR -EPCjjvbdrpWPJcVf -EOcKjvbdczYpYZRC -DoDLKvbdLLAhWAJy -DoDKjvbdEObkLXDE -EPDKjvbdnVUykKRf -DnbkKvbdBvzdIdov -EOcKjvbdGFirOJUR -DoCjjvbdGGJrNiTq -EPDKjvbdqAheAWgd -DncKjvbdxmsIXriD -EObkKvbdVAbQsRRy -EPDKjvbdRXODbkhD -EObjjvbdVZHtZjoO -EOcKjvbdffMZmfgA -EOcLKvbdbiMjLGXY -DoDKjvbdUQpoVUhN -EPCkKvbdhfjCxuiu -DoCkKvbdziuPocsU -EObjjvbdBhkBkJFj -DnbjjvbdeAURNXif -DncKjvbdQlxByOUz -EPDLKvbdRbEEkhxk -EPCjjvbdrbFlkgKy -DoCjjvbdaSFbhUGL -EOcKjvbdsCGMkfkZ -DoCkKvbdJbicRJcY -DnbkKvbdqlzKYlHi -DoCjjvbdZyDimblS -EOcLKvbdsrqsZZdc -DoDKjvbdjggMGGNk -DnbkKvbdADSXiyiQ -DoCkKvbdehKurORH -EOcLKvbdrylPsAgn -EPCjjvbdRWmdClID -EPCjjvbdbsCjsdKB -EObjjvbdUQpoVVHm -DnbkKvbdiCObeXQq -DncLKvbdUQpoVUhN -DoCkKvbdKCicRKDY -DncKjvbdjlakzFGo -DnbkKvbdMgDQMpVL -DoDLKvbdWSNxBeMD -DnbkKvbdvBEZTOdh -EPCjjvbdsQWPKCuf -EObjjvbdZeYGzghb -DnbkKvbdxsNhmSCH -EPDLKvbdkySrTZGt -EObkKvbdrDdiQNvB -DncLKvbdHDjuiajK -DoCjjvbdURROtuIN -DncKjvbdKyRJrztf -EObjjvbdIGfyyYXg -DncLKvbdXsMBMtPY -EPCkKvbdaaVdfPpX -DncKjvbdiHJbyWJu -EOcKjvbdSKxfVGjs -DoDKjvbdxZgfFwdr -DnbkKvbdRNYCZNtz -EPCkKvbdCDoaWKNG -DoDKjvbdDjHjWYKA -EPDKjvbdyNsHwsIc -DoDKjvbdUtNTfLuj -DoDLKvbdGGKRnJTq -EPCkKvbdsBemMGjy -EPDKjvbdSQUHKFcw -DnbjjvbdkClKpfuH -EObjjvbdRyjHrcWA -EOcLKvbdSPsfjGEX -DoCjjvbdGckWKBij -EPCkKvbdGdKujBij -DnbjjvbdcJMijewY -EPDKjvbdkIGkefOL -EPCkKvbdrSVLNkBN -DnbkKvbdrpWPJbvG -DoDLKvbdZirgpHBf -EPCkKvbdHDjujBij -EPCkKvbdvBDySoEh -DoDLKvbdePEsKssr -DoDLKvbdZRMdhldq -EObjjvbdUQqPUtgm -DoDLKvbdMSXNZtpz -EObjjvbdVYhTzKnn -EOcKjvbdrNZixlIJ -DoDLKvbdTpqPVVIN -DnbkKvbdkCkjqHVH -DnbkKvbdkWWmcaxX -EOcLKvbdJSyBSlwl -EObkKvbdmRxtzTEJ -DncKjvbdptTgRqjt -EOcLKvbdqYoHfqEY -DoDKjvbdGZUtaDxC -EOcKjvbdKQydoGNe -EPDLKvbdssSTZZeD -EObjjvbdhkddOUcZ -DoDKjvbdGdKvJbKK -EOcKjvbdULvPAuoJ -DoCkKvbdrEFJPnWB -DnbjjvbdfNGWfmJk -EPCkKvbdkWXODaww -EOcKjvbdMtrrKmAX -DnbjjvbdEuyPpMie -EObjjvbdrSVKmkAm -EPDLKvbdhanbdvqR -DoCkKvbdkWWmdBww -DnbjjvbdxUleQyLn -EOcLKvbdpyPHfpdY -DncKjvbdpfDeTvBI -DoCkKvbdnVVZjirG -DnbkKvbdzjVPocsU -EPDLKvbdmfdwlmfy -DnbkKvbdSKyFuGjs -EObkKvbdVAaprpqy -EPCjjvbdUaBqTRRy -EObkKvbdZoNhddzK -DncKjvbdrNZiyLhJ -DncKjvbdaMkBruNH -DoDKjvbdZyDjNcMS -EPCjjvbdZjTIQHCG -EObkKvbdjJegilwr -EPDKjvbdHffzYxYH -EPDKjvbdaSGChTfL -DoDLKvbdcJMjLGWx -EOcLKvbdtlXvaTaX -DoCjjvbdGYuVAcxC -EOcLKvbdUsltGLvK -EPDLKvbdRNXayOUz -DoDLKvbdRadFLiYk -EOcKjvbdCTAbsfXS -EPCjjvbdGZVVAdYC -EPDLKvbdypnliJwA -EPCjjvbdSBdFLhxk -EOcLKvbdGLFSbhNV -DncKjvbdTppnuUhN -EObkKvbdezvYdiTw -DoCkKvbdIsZBSlxM -DncLKvbdRNYBxmtz -EPCkKvbdeFOqawCj -DnbjjvbdtSrTYzEc -DncKjvbdkDLkQgUg -DnbjjvbdEARhlzXX -EOcKjvbdWRmxBeMD -DoDLKvbdzQnliKXA -EPDKjvbdpfDdtWAh -DncLKvbdMgCpMpVL -DnbkKvbdiZtfLpmf -EPDLKvbdzQoNJJwA -EPCkKvbdaNKasUmH -EPDLKvbdRbDeLhyL -DoDLKvbdKRZeOeme -EOcKjvbdZxdJmcMS -DncLKvbdeKKSVtzn -EPDLKvbdRjxeuHLT -EObkKvbdNGcPmPtk -DoCkKvbdtcDVWvPP -EPCjjvbdcTDKscjB -DoDLKvbdbrcLTcia -EObjjvbdvlvAMcdm -EObjjvbdFxuVBDwb -EPCjjvbdhkdcmtby -EOcKjvbdRotHKFcw -DncLKvbdelfWgNKL -EObkKvbduCbuXVno -EPDKjvbdEYXlUUUM -EOcKjvbdbUbHXjsh -EOcLKvbdmgEwmOHZ -DoCjjvbdEXxLsssl -EPDLKvbdZLqdTmlN -EOcLKvbdbsCkUEJa -EOcKjvbdqvpLbhxq -EOcKjvbdfIKvRmpg -DncLKvbdGBOpxizm -DoDLKvbdnBiwXnmu -DoCjjvbdKWVFceGi -EOcLKvbdRbEEkiZL -EObjjvbdffMZmgHA -DoCjjvbdUMWPBWPJ -EObkKvbdkClKpftg -DoDLKvbdBhkBkIej -DoDKjvbdhgJbyWJu -DoCjjvbdEASIlzXX -EPDKjvbdGZUtaDxC -DnbjjvbdlYsRryHU -EOcKjvbdhgKCyWJu -EPCkKvbdsQWOibuf -DoCjjvbdRMwbYmtz -DoDKjvbdZxdJnClS -EPCjjvbdJTZBTNYM -DnbjjvbdiLeEOUby -EOcLKvbdjEjgUoAO -EPCkKvbdzitopDrt -EPCjjvbdtcCuWvPP -DncKjvbdZMRdUNlN -DoDLKvbddZxoxZRC -DoDKjvbdFVxoomKF -DoCkKvbdSLYeuGkT -DncLKvbdYSlBNTnx -EObkKvbdeuzwoizs -EPDKjvbdUQpoUuIN -DoDKjvbdmpZxujyC -EPCjjvbdDGlFgAzc -EPCjjvbdkCkkRGuH -DnbkKvbdvlvAMdFN -DoDLKvbdatbHXkUI -EPCjjvbdFWYoolie -DnbjjvbdrEFJPnWB -EObkKvbdpyOggQcx -EOcKjvbdqwQMChxq -EOcKjvbdqrVLNkAm -EOcKjvbderBWzlCo -DoDLKvbdRWmdDMHc -EOcLKvbdZoNhdeZj -DnbkKvbdunszpkPU -EPDKjvbdGAnpxizm -DoCkKvbdKCjCqKCx -EOcKjvbdZshhyDrn -DoDKjvbdddoSBvcK -DncKjvbdcScKtEJa -EOcLKvbdZjShQGbG -DncLKvbdDncKkXDE -EPDLKvbdrzMQTBHn -EPDLKvbdIxUBglRQ -EPDKjvbdcyxpXxpb -EObkKvbdMSXMytpz -EObkKvbdijGIKMwr -EObkKvbdzdzOzdyp -DnbjjvbdeATplwjG -DnbkKvbdcIlikFwY -DoDLKvbdsPunicVf -EPDKjvbdmozYvLZC -DoCkKvbdkyTSSxgU -DncLKvbdRWnDcLhD -DncKjvbdHELWJaij -DncKjvbdZQmFIleR -EOcKjvbdiCOcEvpq -EOcKjvbdbrbkUEKB -EOcLKvbdOFEThhjd -EObkKvbdbBVdepPw -EObkKvbdUxhTzKnn -EObkKvbdzoPpdblY -EOcLKvbdrbFllHLZ -DoDKjvbdjggMGGOL -DncLKvbdqceJQNua -DoDKjvbdiHJbxvJu -DoDLKvbdySnImSBg -EPCkKvbdtTRrxzFD -EOcLKvbdkVvnEBxX -DnbjjvbdtcCtvvOo -EPCkKvbdyzdmrHiI -DoDKjvbdFjdrbhMu -DoDLKvbdZyEKODLr -DoDKjvbdURQnuVHm -EPCkKvbdZyDimcMS -EOcLKvbdNQXpunHT -DnbjjvbdQlxCYmtz -DnbjjvbdCDoaVimG -EObjjvbdsPvOibvG -DnbjjvbdgGLynGgA -DncLKvbdCDoaWJmG -EObkKvbdnCKXXnnV -EOcLKvbdUxgtZkPO -DnbkKvbdiMFDmuDZ -DncKjvbdiGicZWKV -DoDKjvbdcScKtEJa -DoDKjvbdpssgRqkU -DncKjvbdsBfNLgKy -DoDLKvbdGYttaDwb -DncKjvbdjvWnDaxX -EPCjjvbdhgJcYuiu -DnbjjvbdxUldpxlO -DoDKjvbdUaCRSqSZ -DnbkKvbdNwoVzdNt -DoCkKvbdZnnIeEzK -EPDKjvbdNeEUJIkE -DnbjjvbdJbjDQjDY -EPDLKvbdKVuFceGi -EPCkKvbdKkBIWAJy -EObjjvbdrafMlHLZ -EOcLKvbdZLqctNkm -EObjjvbdMgComPtk -DncKjvbdjhHMGGOL -DnbkKvbdJYUCIMQp -DoCjjvbdhlEcnVCy -DoDLKvbdxsOJNSBg -EOcLKvbdRMxBxmtz -EOcLKvbdHDjujCJj -EObjjvbdZRMdhmFR -EPDLKvbdUQpoUthN -EPCkKvbdvlvANEFN -EObkKvbdSCEEkhxk -EPCjjvbdLBKfmCXq -EPDKjvbdOStVfduQ -EPCjjvbdGcjvJbKK -DnbjjvbdVBBprpqy -DoCjjvbdirziTLJz -DncLKvbdFWYpQNKF -DoDLKvbdjKGHjNYS -DncKjvbdZnmiEdzK -DoDKjvbdySmiMrBg -DncLKvbdeAURNYKG -EPDLKvbdemGWflik -DoDKjvbdaMkBrtmH -DoDKjvbdIxUBglRQ -DoDKjvbdOEcshhjd -EPCjjvbdpxnhGqDx -DncKjvbdYSlBNToY -DnbjjvbdGGKSOJUR -EOcLKvbdZjTHpGbG -EPCjjvbdIHGzZYXg -DncKjvbddndsLTsr -DnbjjvbdqAheAXIE -EOcKjvbdVhXvXfxz -DncKjvbdFyVVAdYC -DnbjjvbdJvVFceGi -EPCkKvbdoznDjwoA -EPDKjvbdvPTzqLPU -EObjjvbdiifIKMwr -EOcLKvbdlZTSSxgU -EObjjvbdQvnECkgc -DncLKvbdjgfkfGNk -DnbkKvbdCDoaWJmG -DnbkKvbdxnTHwriD -DncKjvbdoAKzshDn -DoDKjvbdvAdZSndh -DnbjjvbdRpTgKFcw -EOcLKvbdiiegilwr -EOcKjvbdGdLVjBjK -EObkKvbdGFjRmhtR -EPCjjvbdZsiJYdTO -EPCjjvbdJJdAKPfd -EPDLKvbdKfGHbBRV -DncLKvbdjhHMFenL -EObkKvbdbLMFnnDA -DoCjjvbdUWMPisaR -DnbkKvbdZjTHpHCG -EObkKvbdbsCkTcjB -EPCkKvbdSLYfUfkT -DoDKjvbdZeYGzhIb -DncKjvbdrovPJcVf -EPCjjvbdePFSjtTr -DncKjvbdJbibqJbx -EPDLKvbdDxYMUUTl -DnbkKvbdZHXEAPSi -DncKjvbdVTmUFlVj -EPDKjvbdzoQREcLx -EPDKjvbdKfFhCAqV -DoDKjvbduDDUwVoP -DoDKjvbdgFlZmfgA -EObjjvbdTAEiHbOd -DoCkKvbdMowqVmgT -DncKjvbduMXwBTaX -DncKjvbdeYZssrFz -DncLKvbdmfdxNNgZ -DncLKvbdxLXDgzzG -DoCjjvbdNsTvGduQ -EPDLKvbdTpqOtuHm -EObkKvbdZMRctOMN -EPCjjvbdHEKuibJj -EPCjjvbdBiKbLJGK -DoCjjvbdUtNUFkvK -EOcKjvbdVTltFkuj -DnbjjvbdczYpXxqC -EPDLKvbduWNxKQsA -EOcKjvbddZyQYYqC -DnbkKvbdyfyMAMdw -DncLKvbdDihKWXjA -EPCjjvbdoAKztIDn -DoCjjvbdcTDLUDjB -EPDKjvbdJcJcRKCx -DncKjvbdIxTahLqQ -DoDLKvbdTqROttgm -DoDKjvbdjblLQgUg -EOcLKvbdTppnuUhN -EPCjjvbdrMyjZLgi -EObjjvbdypnmIjXA -DoCkKvbdczYoxZRC -EObkKvbdFjeTDHmV -EPCjjvbdZxcimbkr -DoDKjvbdatbHXkUI -EPDKjvbdvmWAMdEm -DoCjjvbdqwQMCiYq -DoDKjvbduWNwjQsA -DncKjvbdACqwjZiQ -DoCjjvbdOTTvGduQ -EObkKvbdirzhsKiz -EObjjvbdOTTugFUp -EOcLKvbdKDJbqJcY -DoCjjvbdiUyeXRtb -EObjjvbdfMfXHNKL -EOcKjvbdjhHMFfNk -DncKjvbdRpUGjFcw -EPCjjvbdfILVqnRH -EOcKjvbdiHKCyWJu -DoDLKvbdnPzYvLYb -DnbkKvbdnGeYNOHZ -DoDKjvbdtvOXjQsA -EPCjjvbdmIctRVRa -EOcKjvbdpyOhGpcx -DnbkKvbdKQydoFnF -DoDKjvbdkVvnDaww -EObjjvbdbUbHXjsh -EOcKjvbdCJLCLIfK -EPDKjvbdZeYGzhJC -DncKjvbdcScLUDia -DoCkKvbdQmXbZOUz -EOcLKvbdRadFMIxk -DnbkKvbdziuPodSt -EOcKjvbdEXxMUUTl -DnbjjvbdegjvSOQg -EObkKvbdZtJJYdTO -EPDKjvbdVAbQsQrZ -DnbkKvbdkHflFfOL -EObkKvbdtcCuXWOo -DnbjjvbdcTDLUEJa -EPCjjvbdZjTIQHBf -EObjjvbdTAEhhCPE -EOcLKvbdbhlikFwY -DoDLKvbdEPDKkWbd -EOcKjvbdZtJJZESn -EPDKjvbdZMRdUNlN -EPCkKvbdhgJcZWJu -DncKjvbdUaBqSprZ -EOcLKvbdEJgiuxKA -EObjjvbdSPtHKFcw -DoCjjvbdFfKSOJUR -EObjjvbdVrOXaeMD -DoCjjvbdrXPkcIxq -DoDKjvbdZjTHofaf -EOcLKvbdVYgszLOn -DncKjvbdIwsagkpp -DncLKvbdTkvPBVni -EOcLKvbdUtNUFkuj -EObjjvbdZnmheEyj -EPDKjvbdyYIjBoyk -EPCkKvbdqlyiyMIJ -EPCjjvbdYzbeqjVy -EOcLKvbdUQqOuVIN -EObkKvbdZMSDtOMN -DncKjvbdVvhxWDdg -EOcLKvbdiZuFlRNf -EObjjvbdZtJJYcrn -EPCjjvbdmuUzKirG -DoDLKvbdVUMtGMVj -EPDLKvbdhWyAzzAJ -DoDLKvbdfIKvRmqH -DnbjjvbdqdFIpOVa -DnbkKvbdIwtCHkpp -EOcKjvbdeEnrBvcK -DnbkKvbdJuuFdFGi -DoDKjvbdeOeTKtUS -EObjjvbdKWUfDeGi -EPCjjvbdiHJbyViu -EOcKjvbdBraCsfWr -DoCjjvbdGYuVBEYC -DoCkKvbdnHEwmOHZ -EPDKjvbdZisIQGaf -EPCkKvbdmpZxvKyC -DoDLKvbdmSYuZrdJ -EObkKvbdKDJbqKCx -EOcLKvbdZsiJZETO -EPDKjvbdnCJvxOmu -DoCkKvbdjgflGGOL -DnbkKvbdRosfjFdX -EPCjjvbdRECaQQcr -DnbkKvbdNHComQVL -EPCjjvbdrJAKEmOe -DoDLKvbdqBJFAXIE -DncLKvbdGLFTDINV -EOcLKvbdhgJbxujV -DnbkKvbdjSzhsKiz -EOcKjvbdKWVGDdfi -DoDKjvbdZnnIeFZj -DnbjjvbdxxIiaoyk -EObkKvbdczYpYZQb -EPCjjvbdZxcjODMS -EObkKvbdiHJbxvKV -DoCjjvbdJzoexEAN -DoCjjvbdaRfChTek -DoDLKvbdxwhjCPyk -DoDLKvbdVqnYBeLc -DnbkKvbdRDcBPpdS -EObkKvbdYqNFImFR -EPDKjvbdsrrTYzFD -EOcKjvbdqcdhpOWB -EOcKjvbdaNLCTUmH -DoDKjvbdnPzYukZC -DncLKvbdKCjDRKCx -EObjjvbdFkEsDINV -EPDKjvbdMgDQMouL -DncLKvbdOXnuzdNt -EPCjjvbdpstGqrLU -EPCkKvbdRbDdkhyL -DnbkKvbdaogGdLzd -DncKjvbdjlbLydgP -DnbjjvbdUMVoAvPJ -EPCjjvbdJqZeOfOF -DoDLKvbdUsmTekvK -DoCjjvbdpyOgfpcx -DnbkKvbdJYUCIMRQ -DncLKvbdjJfHjMwr -DoCjjvbdRosgKGDw -DoCkKvbddZxpYYqC -DncKjvbdddnrBwCj -EPDKjvbdijGIJlxS -DoCjjvbdkWWnECYX -EObkKvbdqlzJxlIJ -EOcLKvbdzaAPHHBl -DoDKjvbdlZTSSyGt -DnbjjvbdatbHXkUI -EOcLKvbdNdcshiKd -DncKjvbdGdKujBjK -DnbjjvbdRWnDcMID -DoCjjvbdSxKlNzkY -EPDKjvbdHDkWJbJj -EPDLKvbdZxcjNcLr -EOcKjvbdLYqKSzuG -EPDLKvbdjuvmcaww -EPDKjvbdxmrhYTJD -EOcKjvbdZirhPfaf -DnbjjvbdfIKurNqH -EPCkKvbdYTLaNTnx -DoDLKvbddtAUASlv -EPCkKvbdZLrDtOLm -DnbjjvbdnGdxMnHZ -DoCjjvbdeFPSCXCj -DncLKvbdYORAYUvU -EPCjjvbdrXQMDJZR -EPCkKvbdRpTfjGDw -DoCjjvbdpssfrSKt -EPCkKvbdKWUedFHJ -DnbjjvbdVvhwvDdg -DncKjvbdLrWlzUpz -DncKjvbdwtmFQxkn -EObkKvbdmIdTqUqa -DnbkKvbdJutedFHJ -EOcKjvbdVZITykPO -DoDLKvbdhbPDFXQq -DnbjjvbdmuVZjirG -DncLKvbdieKgVPAO -DncKjvbdEuyPpNJe -DoDKjvbdiHJcYuiu -EPDKjvbdmgFYNNfy -DnbkKvbdOTUWGeUp -DoCjjvbdZRNFJNFR -EPDLKvbdYpmFJNEq -EObkKvbdRMxBxnUz -DncKjvbdNQYQvOHT -EOcLKvbdMoxRVnHT -DoDKjvbdpyOhGpcx -EObjjvbdRyjITDWA -EObjjvbdrykosAhO -EOcLKvbdhaoDFXRR -DoDLKvbdIryBSmYM -DnbjjvbdlZSrTYft -DncLKvbdegjurORH -EOcKjvbdJYUCHlRQ -EOcLKvbdREDApRES -EObjjvbdmgFYMnHZ -EPCkKvbdZyDimblS -DoCkKvbdiCPCdwQq -EObkKvbdbVBgYKtI -DoDLKvbdNddUJJLE -DoCjjvbdrpVnibuf -EPDLKvbdKaLGlbYR -DnbjjvbdTpqPVUhN -DoCjjvbdcyxoxYpb -EPDKjvbdhfibxvJu -EPCjjvbdJpydnfNe -DncLKvbduWOXipsA -DoDKjvbdrRtkNkAm -EObkKvbdNQXqVmgT -EObkKvbdCIkBkJFj -EPDLKvbdqUUHSRjt -EOcLKvbdeYZtTqez -EPCjjvbdqUUHRqkU -DncKjvbdkWXODaxX -EPCkKvbdaNKbTVNH -EPCjjvbdvAcxroEh -EOcKjvbdlZTSTZGt -EOcLKvbdLAkHNCYR -DoDLKvbdUtMselWK -EPCjjvbdnVUzKjRf -DoDLKvbdypoMiJwA -EObjjvbdKDKCqKDY -DoCjjvbdrWolDIxq -DoDKjvbdwyhFfXeS -EOcKjvbdnGeYMmgZ -DoDLKvbdREDAopcr -EPCjjvbdiUzFXRuC -DoDLKvbdZQldhmEq -EPCjjvbdtvNwipsA -EPDKjvbdbrcLUDia -DoDLKvbdegkVqnQg -DoCjjvbdznopdcMY -DoCjjvbdmfeXlmgZ -DncLKvbdXrlBMsnx -DoCjjvbdmgEwmOGy -DoCkKvbdjmCLydgP -DncLKvbdmJEUQuSB -DnbjjvbdRbDeLiYk -DnbkKvbdQdDBPqDr -EObkKvbdjKGHjMxS -DoCkKvbdyOTHxSiD -EPCjjvbdQwNdCkhD -EObjjvbdfNFwGljL -EObjjvbdVqmxCElD -EOcKjvbdeOeTKtTr -DoDKjvbdUaBqSpqy -DnbjjvbdmIdURUqa -DoCkKvbdUWMQJtBR -DnbjjvbdxnSgxSiD -DncKjvbdwXMBVaVu -DnbjjvbdvvkaVaWV -EObkKvbdmaiwXnmu -DoCjjvbdgQBzwEYI -EOcKjvbdFVxpPmJe -EObjjvbdKDJcQjCx -DoCkKvbdYlRdUOMN -EOcLKvbdZoOIddzK -DoCjjvbdffMZnHHA -DncKjvbdnQZxujxb -EPDLKvbdwXMBWBVu -DoCjjvbdLFfIBaQu -DncKjvbdGQASwHFy -DnbkKvbdauBfxKsh -EOcLKvbdraelkgKy -EObkKvbdnVUzLKSG -DoDKjvbdANHxrwZx -DncLKvbdqZPHfqEY -EObjjvbdvPTzpjoU -EObjjvbdrWpMDIyR -DnbkKvbdCDpBWKNG -DnbkKvbdyOSgwrhc -DnbkKvbdeKKSVtzn -DncKjvbdMowpumgT -EOcLKvbdOFDtIhjd -EPDKjvbdkDMLRGtg -EPDKjvbdiiehJlwr -EPDLKvbdBdQAvJlf -DoDLKvbdZyEKODMS -EObjjvbdJqZePFme -DnbkKvbdKxqKSztf -EObkKvbdmJEUQuSB -DnbkKvbdREDAopdS -EPDKjvbdwzHefYEr -EPDKjvbdnHExMnGy -EOcKjvbdmozZVjyC -EPDKjvbdZHWdAPTJ -DoDKjvbdjgfkfFnL -DncKjvbdczZPxYqC -DoDKjvbdEXwlUUTl -DncKjvbdhuZdvrVC -DnbkKvbdxKwDgzzG -EPCkKvbdsZlQSaIO -EOcKjvbdzRPMiKXA -DoDKjvbdqvolDIxq -DoDKjvbdQdCaPpcr -EPCjjvbdJmADyfuB -DnbjjvbdsCGNLgLZ -DoDKjvbdKfGICAqV -DoCkKvbdbiNJkGXY -DncKjvbdiGicYvKV -EPCjjvbdSxLLmzjx -DncKjvbdLAjflaxR -EPCkKvbdUyHsyjoO -DnbjjvbdcyxoxYqC -EObkKvbdxZgfGYFS -EPDLKvbdZoNiEeZj -DncLKvbdZtIhxcrn -EPDLKvbdIwtCILqQ -DncLKvbdQmXbYmtz -EOcLKvbdmuUzKiqf -EPDKjvbdsQVnibuf -EObjjvbdOSsugEtp -EOcLKvbdYlSETnLm -EObkKvbdUtNUGMWK -DoDLKvbdzeZnzeZp -DoDKjvbdqTtHRqkU -EObjjvbdmbJvxPNu -DoDLKvbdliDsqUqa -EPCjjvbdhanbdvpq -DoDKjvbdiifHilxS -DoDKjvbdmJDsptqa -DnbkKvbdDncKkWcE -EPCkKvbdaofgELzd -DncKjvbdijGIJmXr -EPCkKvbdRkYfUgLT -EObkKvbdHEKuibKK -DnbjjvbdVhXuwfxz -DoDLKvbdiMEcmuCy -DnbkKvbdJcJcQibx -DnbkKvbdmfeYNOGy -DoDKjvbdqUTgSSKt -EPDLKvbdePErjtUS -EObkKvbdaNKasUmH -EObkKvbdiifIJmYS -EOcKjvbdsPunjCvG -EObkKvbdbrcKtDjB -EPDKjvbdbhlikFwY -EPCjjvbdrpVnjDWG -EPCjjvbdaMkCStlg -DncKjvbdMpXqVnGs -EPDLKvbdZjShPfbG -EPDLKvbdfHkVrOQg -DoCkKvbdDnbjjvbd -DoCkKvbdkySqsYft -DoDLKvbdZRMeImEq -DoDLKvbdYpleIleR -DncKjvbdiHJbyViu -EObkKvbdrMyixkgi -EPDKjvbdqvokbiYq -EOcKjvbdzitoodTU -DnbjjvbdVYhTyjnn -EPDLKvbdyYJJbPzL -EObkKvbdeFPSCWcK -EPDKjvbdIsZArlxM -DnbjjvbdkIHLfGNk -DoDLKvbdehLVqmqH -EOcLKvbdvBEZTPFI -DncKjvbdnUuZjirG -EPCjjvbdakLfOnDA -DnbkKvbdEzsqEkcJ -DnbjjvbdVhXvXgYz -DoCjjvbdIryBTNYM -DncKjvbdZirgpHBf -DoDKjvbdEYYLsstM -DnbjjvbdZshhyETO -DoCjjvbdOTUVgFVQ -EObjjvbdZisHpGbG -DoDLKvbdkDLkRGtg -EObkKvbdegjvSNpg -DncLKvbdfIKvRnQg -DncLKvbdJKEAJpGd -DncKjvbdrRtkNkBN -EPCkKvbdjvWnDaxX -DoCjjvbdmfdwmNgZ -DnbjjvbdbrcLUEJa -DncLKvbdnQZxujxb -DoDKjvbdNsTugEuQ -EOcKjvbdUVlPisaR -EObkKvbdHDjujBij -EPDLKvbdSBdFMJYk -EPCkKvbdVvhxVdFH -DncKjvbdIsYaTNXl -EPDLKvbdIrxaSlxM -EPDKjvbdfoazwDwh -EPCkKvbddeOqbXDK -DoCjjvbdJpzEnfNe -DncKjvbdqiAKFNOe -EPDLKvbduDCtwWOo -DnbjjvbdZjShQGbG -EObjjvbdVAbQsRSZ -DncLKvbdtcCuWuoP -DoDKjvbdTvLoitAq -EOcLKvbdZQleIleR -DoCkKvbduLxXAtAw -DnbjjvbdqYoHfqDx -DoDKjvbdJYTbHkqQ -DncLKvbdGZUtaDxC -EObjjvbdqFdEtWAh -EPCkKvbdILaznWqL -EObkKvbdQwNdCkhD -EPCkKvbdmJDsqUqa -EOcKjvbdvBEYrneI -DoDKjvbdapGgELzd -DoCjjvbdwWlAvAvV -DoDLKvbdJbicQicY -EPDKjvbdaaVdepPw -DoCkKvbdsZkosAhO -DoCkKvbdNeETiJKd -EObkKvbdEObkLXCd -EPCjjvbduCbuXVno -DoCkKvbdrykpTBHn -DnbkKvbdrEFIpNua -DoCjjvbdlYrrSxft -DoDLKvbdqdFIpOVa -EObjjvbdrbFmMGjy -DnbkKvbdRpUHKGDw -EOcLKvbdzoPpdcMY -DoDLKvbdfILVqnQg -DoCkKvbdlZSqsZHU -DncKjvbdrzMQSaIO -DoCkKvbdhuZeWrUb -EObjjvbdfSAvzkbo -DoCkKvbdVZIUZjnn -EOcLKvbdhlEdOUcZ -DoDKjvbdbUagXkUI -DoCjjvbdqUTgRqjt -DoDLKvbdqTsfrRjt -DnbkKvbdrouoKCuf -EPDKjvbdmbKXXoNu -DoDLKvbdhbPDEwRR -DncLKvbduVnYKRTA -DoCjjvbdcJNKKfXY -EPCjjvbdeFOrCXDK -EPCkKvbdczYoxYpb -DnbkKvbdKfGHaaRV -DoCjjvbdMuTRjmAX -DoDKjvbdkMalZeGo -DnbkKvbdbhmKLFvx -EPDLKvbdjuwODbXw -DoDLKvbdUMVoBVoJ -DoCkKvbdRpTgJfDw -EOcLKvbdajlFoNcA -EPCjjvbdRMwaxnUz -EOcLKvbdJcJbpjDY -DoCjjvbdjhHLefNk -EOcLKvbdcasNSATm -DoDKjvbdyOTHwriD -EObjjvbdKQydnenF -EObjjvbdZirhPgBf -EPCjjvbdBiKbLIfK -EOcKjvbdNeDtIiKd -EOcKjvbdkDLjqGtg -DoDKjvbduDDVWuoP -DncLKvbdePErjtTr -EOcKjvbdJbicQjDY -EPDKjvbdrylQTBHn -DnbjjvbdkMbMZeGo -DncLKvbdtlYWaUAw -DoCjjvbdDwxMUTtM -EObkKvbdjblKqGtg -DoDKjvbdRMxCZNtz -EObkKvbdqYoIGqDx -EPDKjvbdmfeYNNgZ -EObjjvbdTAFIhCPE -DoCjjvbdjKGIKMxS -EOcLKvbdMpYRWOHT -EOcLKvbdMoxRVnGs -DncKjvbdhaoDEwQq -DnbkKvbdEXxMTtTl -EPCkKvbdMgCpMpVL -EObjjvbdRzKITDWA -EOcLKvbdrzLosBHn -EPCkKvbdBraCsfWr -DoCkKvbdaaVeGPow -EOcLKvbdIGgZyXxH -EPDKjvbdliETptqa -EOcLKvbdbKlGPODA -DnbjjvbdRadElJZL -EPDLKvbdjFLHVPAO -DnbkKvbdiBnbdwRR -EObkKvbdvBDyTOeI -DnbjjvbdUyHtZjnn -DnbkKvbdmgFYNOGy -DnbkKvbdGKdsDHlu -EPDLKvbdZRNEiMeR -DoCkKvbdbLLeoODA -EObkKvbdANIZSvzY -DoCkKvbdziuPpDrt -DnbjjvbdWHwvXgYz -EPDKjvbdsBfNLgLZ -DoCkKvbdWWiXudFH -EPDLKvbdwzIGGYEr -EOcLKvbdVTmUGMWK -EObjjvbdMSXMytpz -DncKjvbdZirhQGaf -EObjjvbdCJLBjiGK -EPCjjvbdZLrETnLm -EObjjvbdelevfljL -DncKjvbdGYuVBEYC -EPCkKvbdkCkjpgUg -DoCkKvbdbhljLFwY -DnbjjvbdeEoSBvbj -DncLKvbdvAcyTPFI -DnbkKvbdjblLQgVH -EPCjjvbdeEoSBvbj -DnbkKvbdaMjbStlg -EObjjvbdrDdhpOWB -EOcKjvbdbKlFoODA -EPDLKvbdZjTIQGaf -EObjjvbdEzsqEkcJ -DnbjjvbdZRNEiNEq -EObjjvbdqlzJxlIJ -DnbkKvbdkIHLfFmk -EObkKvbdMtrrKmAX -EPCkKvbdNQXpvNgT -EPCkKvbdbrcKtEKB -EObjjvbdSPtGjGEX -DoDKjvbdxwiJaoyk -DnbjjvbdVYhUZkPO -DoDLKvbdXrlBNUPY -DoDKjvbdZnmiEdzK -DoCjjvbdWWiXvDeH -DoDLKvbdyNsHwsIc -DoDKjvbdwyhFfYEr -EPDLKvbdNeDshhkE -EPDKjvbdBiLBkJFj -EOcKjvbdJqZdoGNe -EOcKjvbdbAvEepQX -DoCjjvbdaNLBsUlg -EPDLKvbdvBDxsOdh -DncKjvbdGFirNiTq -EPDLKvbdZnmiEeZj -DncLKvbdePFSjtTr -EOcKjvbdnGdwlnHZ -EOcLKvbduDDUvuno -EObjjvbdZQmFIldq -DoCkKvbdcyxpYYqC -EOcLKvbdMRvlzVQz -DoCjjvbdtcDUwVoP -EPCkKvbdrXQLbhxq -DoDKjvbdkVwODbXw -DnbjjvbdnCJwYOmu -DnbkKvbdqvpLbhxq -DoDKjvbdKDJcQjDY -DnbkKvbdvwMAvAuu -EPDKjvbdtvNxKRTA -DoDKjvbdYkqctOMN -DoDKjvbdtcCuWvOo -DoCjjvbdEObkLXDE -DoCkKvbdbrbjtDia -EObkKvbdDncKkXDE -DnbjjvbdxxJKBozL -EPCjjvbdbhlikGWx -DncKjvbdJXtCIMRQ -EOcLKvbdkVvmcaxX -DoCjjvbdqwPkbhyR -EObjjvbdySnImRbH -EObjjvbdZQleImFR -EObkKvbdmpZxujyC -EPCjjvbdhbPDEvpq -EObkKvbdpyPHgREY -DoDLKvbdwzIGGXeS -EObjjvbdaSGChUGL -DoDKjvbdrbFmMGkZ -EPCkKvbdxKwEHzyf -DnbkKvbdJXtBgkpp -EPCkKvbdlZTRrxft -EOcKjvbdFVyPpNKF -DoCkKvbdaRecHsek -DoDKjvbdFfKRnJUR -DoCjjvbdyOTIXrhc -DoDLKvbdyOSgxShc -DoDKjvbdEOcKjwCd -DoCjjvbdzoPpeClY -DoCkKvbdURRPVUhN -DoDLKvbdVqmxCFMD -EOcKjvbdNVSrKmAX -EOcKjvbdTvLpKTaR -EPDLKvbdCTAbtFwS -EPDLKvbdZyEKNblS -EOcLKvbdsCFllHLZ -EObkKvbdjlbMZeHP -EPDKjvbdMpXpunGs -EObjjvbdaNLCSuNH -DoDLKvbdkCkjqHUg -EPCjjvbdTYKlNzjx -DnbjjvbdNxOuzdOU -DoCkKvbdegjvRmpg -DoCjjvbdhfjCyWKV -DncLKvbdjggMFfNk -EOcKjvbduVmwjRTA -DnbkKvbdDjHiuxKA -EOcLKvbddePRavcK -DnbkKvbdwkWcgzyf -DnbkKvbdHlBznXQk -EPCkKvbdatafxKsh -EPCjjvbdcJMjKfXY -DoDKjvbdrDdiQOWB -DoDLKvbdVvhwvEEg -EObjjvbdwjvdHzzG -DncLKvbduMYXAtAw -DoDLKvbdZQmFJNEq -EPCjjvbdyOTIXriD -DoCkKvbdbiNKLGWx -DncKjvbdHEKvKBij -EPDLKvbdYlSDtNkm -DoDKjvbdTqROuVIN -EPCkKvbddeOqbXCj -EOcLKvbdCTBCsewS -EPCjjvbdnUtykJrG -DnbjjvbdlZTSSyGt -EPCjjvbdjmBkyeGo -DnbkKvbdVhXuwfxz -DncLKvbdePFTLTsr -EOcKjvbdemGWgMik -EObkKvbdhuZeWquC -EPCjjvbdEvYpQNKF -EOcKjvbdpaJFAXHd -DoDKjvbdJSyBSmYM -EOcLKvbdSCDdlIxk -DncKjvbdSLZGVGkT -DnbkKvbdrbFlkgKy -EObjjvbdJSyAsMwl -EOcKjvbdEOcKkXDE -EPCjjvbdMoxQumfs -EPDKjvbdUQpnuUgm -DncKjvbdaaWFFoow -DnbkKvbdakMGPODA -EObkKvbdrEEhomua -EOcKjvbdmozZWLYb -EObjjvbdVgwuxGxz -EOcLKvbdCJLCKhej -EPDLKvbdVUNUGLvK -EOcLKvbdLGGHbBRV -DoCkKvbdlqxtysEJ -EOcLKvbdcScLTdKB -DncKjvbdhtydwRtb -DoCjjvbdcTCjscia -DncLKvbdUslsekuj -DoDKjvbdwuNFRYkn -EOcLKvbdijGHjNYS -DoCjjvbdJSyBSmYM -DoDKjvbdEYXlUTtM -EPDKjvbdUyITzKoO -DnbkKvbdvBDyTPFI -DoDKjvbdYlRcsmkm -DoDKjvbddePRbXCj -EPCkKvbdVZHtZjoO -EPDLKvbdWXIxVceH -EPCjjvbduDDUwVoP -DncKjvbdQlxBxnUz -DoDLKvbdfpBzvdYI -DoCjjvbdMJBlRYAS -EPCkKvbdZisHofaf -DnbkKvbdkWXNdCXw -EOcKjvbdEYXkstTl -EOcKjvbdfekymgHA -EPDKjvbdelfWflik -EPCjjvbddCTNSAUN -EPDKjvbdpfDeUVaI -DncLKvbdiBnbeWqR -EObjjvbdEuyPoljF -EPCkKvbdRDcBQRES -DncKjvbdhfibxujV -EObkKvbdVqnYBeMD -EPDKjvbdJKEAKQGd -EOcLKvbdsQVoJbuf -EOcKjvbdqcdhonVa -EObjjvbdJcKCqJcY -EOcKjvbdpfEEsuaI -EPDLKvbdxnTIYShc -EOcLKvbdxVMdqYlO -EObjjvbdZyDimcMS -DncKjvbdiGjCxvKV -DoCkKvbdRbEEkiYk -DoCjjvbdWIYVxHYz -EPDLKvbdYzcFqjVy -DncLKvbdTYLLmzjx -DoDLKvbdwXLaVaWV -DoDLKvbdMRvlyuQz -DoCjjvbdajkeoNcA -EPCjjvbdjEkHUoAO -DoCjjvbdZoNiFFZj -DncLKvbdlZTRryHU -DoCjjvbdcTDLTdJa -EOcLKvbdlhctRVSB -EObjjvbduaEYroFI -DncKjvbdzjUpQDsU -DoDLKvbdyqPNIiwA -DnbjjvbdhkdcnUby -EObjjvbdVYgtZjoO -DnbjjvbdCJLCLJFj -EPCjjvbdzeZnzdyp -DnbjjvbdqlyjZMIJ -EOcLKvbdGAnpyJzm -DoDLKvbdNGcQMpVL -DncKjvbdADSXiyiQ -DoCjjvbdLBLHNCYR -DoCkKvbduVnXjRTA -DncKjvbdtSqsZZeD -EPDKjvbdpyOhGqEY -EObjjvbdEuyPomKF -EPDKjvbdyOSgxTIc -EPDKjvbdGFiqnJTq -EOcKjvbdyYJJbPzL -DncLKvbdADRwjZiQ -DncLKvbdCSaDUFwS -DoDLKvbdEzsqEkbi -EOcLKvbdssSTYyeD -DnbkKvbdSBdEkiZL -EObjjvbdFWZQPlie -EObkKvbdbBVeFpPw -DoDLKvbdBdQBVjMf -EPDLKvbdptUHRqjt -EPCkKvbdQwODcMID -DoDLKvbdelevgMik -DnbjjvbdVTmUFkuj -DnbkKvbdLYqJrzuG -DoCkKvbdCTAbsevr -DoCjjvbdJpyeOfOF -EPCkKvbdOStWHEtp -EOcLKvbdKVtfEEfi -DoCkKvbdmuUykJqf -DnbjjvbdQZNAHSrK -DnbjjvbdMgDPlpUk -DnbkKvbdCIkBjhfK -EObjjvbdBsBCsewS -EOcLKvbdYzbfRivZ -EOcLKvbdrzMQSaHn -EOcKjvbdRosfjFcw -EPDKjvbdANHyTXZx -EPCkKvbdliDsptqa -EOcLKvbdACrXizIp -EPCjjvbdLFfICApu -DoCjjvbdbAvEepPw -EOcKjvbdTpqPVVHm -DoCjjvbdsBemMGjy -EPCkKvbduaEZTPEh -DoCkKvbdOStWHEtp -EPCjjvbdbBVeGQPw -EObjjvbdOSsufeUp -DoCkKvbdjAQHBPgK -EPCjjvbdbBWEfPow -EPDKjvbdtSqsZZdc -EPCkKvbdegjuqmpg -DoDLKvbdRotGifDw -DoDKjvbdmJEUQtrB -DoCjjvbdcIljKewY -EObkKvbdbiMjKewY -EObjjvbdcScKsdJa -EPDKjvbdtSqsYyeD -DnbkKvbdrpWOjCvG -EPDLKvbdBiKbLIej -EPCkKvbdBdPaWJmG -EObjjvbdZRNEhmEq -EOcLKvbdiUzFWrUb -EPCkKvbdmIdUQtrB -EPCkKvbdbUafxLTh -EOcKjvbdnCKWxOmu -DoCkKvbdsZkosBIO -DnbkKvbdHDjujCJj -DoCjjvbdWSOYCFLc -EPDKjvbdmJETqVSB -DnbjjvbdrXPkcJYq -EObkKvbdMgDPlpVL -DnbjjvbdZisHpGaf -DoCjjvbdGGJqmiTq -EObkKvbdIHGyyYXg -EObkKvbdqTsgRrKt -EObjjvbdmJDtRVSB -DnbjjvbdddoSBvbj -EPDKjvbddePSBvbj -DnbjjvbdBcpAvJlf -DncKjvbdezvYeItX -DoDKjvbdmgEwmNfy -EObjjvbdDigivXjA -EOcLKvbdmJEURUrB -EOcLKvbdePFTLTtS -EPDKjvbdVTmUGMVj -EPDKjvbdnBivwnnV -EPCjjvbdZnmhddzK -DncKjvbdZeXfzgiC -DoDLKvbdEuyPpNJe -DoDLKvbdqdEhpNua -DoDKjvbdFWYpQMie -DoCkKvbdMfcQMpVL -EOcKjvbdmttykKSG -DnbjjvbdlhcspuSB -EPCjjvbdWSNwbFMD -EPDKjvbdRbEElIyL -EOcKjvbdyNsHwsIc -EPCjjvbdrylQTAgn -DncLKvbdADSYJyiQ -EOcKjvbdZjTIPgBf -EObjjvbdKDKDQibx -EObkKvbdKDJcRJcY -DoCkKvbdmSZUzSdJ -EPCjjvbdaNKartlg -DoDKjvbdIGgZyXwg -EObjjvbdauCHXjsh -EObkKvbdxUmEpyLn -EPCjjvbdNsTugEtp -EPDLKvbdZyDimblS -DoDKjvbdbUagYKtI -DncKjvbdliETpuSB -EOcKjvbdDihKWXjA -DncKjvbdZtIiZETO -EObjjvbdygZMAMeX -DoDKjvbdfNGWgMik -DoCjjvbdZMSEUNkm -EOcKjvbdsrqsZZdc -EPCkKvbdACqxJzJQ -EPDLKvbdNdcshiKd -DoDKjvbdyqOmIiwA -EOcKjvbdRMwbYmtz -EOcKjvbdYpmEhleR -DoDKjvbdjJfHimYS -DoCjjvbdrbFmMHLZ -DoCkKvbdBcpBWKNG -DoDKjvbdIxTbHkqQ -DoDKjvbdhuZdwSUb -EPDLKvbdJYUBglQp -EPCkKvbduCcUwVno -DnbkKvbdwuNEpyMO -DncKjvbdssSSxzEc -DoDLKvbdGdLWJbKK -EObjjvbdFjdsDIMu -DncLKvbdfkGzbfAE -EOcLKvbdrRtkOLBN -EPDLKvbdajkfOmcA -EPCjjvbdrMzJxkhJ -DncLKvbdqZOhHREY -DoDKjvbdmJEUQuSB -DnbkKvbdRDbaQRES -EPCjjvbdpyPHgREY -DnbjjvbdMIalQxAS -DncLKvbdiZuGMROG -DoDKjvbdgFkymfgA -DncLKvbdsCGMkgLZ -EObkKvbdRotHJecw -EPDKjvbdkClKpftg -EPCkKvbdRjyGUgLT -EOcKjvbdhuZdvqtb -EOcLKvbdmttzKjSG -EObjjvbdhlEdOVDZ -DoDLKvbdZisHpGaf -DnbkKvbdTqQntuHm -EPDLKvbdNdctIiLE -EObkKvbdWRnXbFLc -EPDLKvbdKVtfDdgJ -EPCkKvbdJSyBTMwl -DnbkKvbduWNxKQsA -DoCkKvbdqGEFUVaI -EPDKjvbdhkdcnVDZ -EPCjjvbdySnIlrBg -EOcLKvbdYlRctNlN -EObkKvbdvBDxroFI -DoDLKvbdxwiJbPzL -EPCjjvbdyNsHxTJD -DoCjjvbdhfjDYujV -DoDLKvbdcImKLFwY -DnbjjvbdqwQMChxq -DncLKvbdaaWEfQPw -DnbkKvbdUQqOuUhN -EOcLKvbdUaCRSqSZ -DnbjjvbdRMxByOUz -EPDKjvbdKCjCpjCx -DncLKvbdrMzJyMIJ -EPCjjvbdOEdThhjd -EPDKjvbdrSUkOKaN -EObkKvbdMowpunGs -DoCjjvbdhzVGLpmf -EOcLKvbdaMkBsVMg -DoCjjvbdkIGkfFnL -DnbkKvbdYpldiNFR -EPDLKvbdZxcjNcMS -EPDKjvbdGGKRnJUR -EPCjjvbdbiNKKfWx -EObjjvbdmRyUyrci -DncKjvbdLrXNZtpz -DncKjvbdZjTIPgCG -DnbkKvbdypoNIiwA -EPCjjvbdDihKVxKA -DncKjvbdyfxlANFX -DoDKjvbdiMFEOVCy -EPCkKvbdtcDUvvPP -DoCkKvbdEvYpQMie -DnbjjvbdZLrDtOLm -EPCjjvbdKQzFPGNe -EPDKjvbdGdLVjCJj -DoDKjvbdqYoHfqDx -DoDLKvbdFVxoomJe -DnbkKvbdKRZePFnF -DoCjjvbdFVyQQMjF -DnbkKvbdTulQJsaR -EObkKvbdkHgMFenL -DoDKjvbdVUMselVj -EPDLKvbdrDdhonVa -DncKjvbdkVvmcaxX -DoDLKvbdrRuKnLAm -EOcKjvbdJbibpjDY -EPDKjvbdXrlAmToY -DnbkKvbdZirhQGbG -DnbjjvbdjgfkfFnL -EOcKjvbdGFjSOJTq -DoDKjvbdSCDeMJYk -DoCkKvbdpecdtWAh -EObjjvbdzeZnzdyp -DoCjjvbdMJBlQxAS -EPDKjvbdnBivwnmu -DoDKjvbdRadElIyL -DoDLKvbdsZlPsBHn -EObjjvbdznopeDLx -EOcLKvbdCJKbKiFj -DncLKvbdmgExNNfy -DnbkKvbdnPzYvKxb -DncKjvbdrDdiPnVa -DoCjjvbdAMgxrwZx -DncLKvbdTfzmkwWF -DncKjvbdqiAJdloF -EPCkKvbdwuMeRZLn -DoCjjvbdVUNUFkuj -DoDLKvbdKQyePGNe -DncKjvbdLqvlzVQz -DoDKjvbdmgFYNNgZ -DnbjjvbddxZtTrFz -EObkKvbdqTsgSSKt -DnbkKvbdZxcimcMS -DoCjjvbdANHySvyx -DoDLKvbdZQmFJMdq -DoCkKvbdHDjujBij -EPDLKvbdsPuoJbuf -EPCjjvbdYpmEhmFR -DncLKvbdZjTHpGaf -EPDKjvbdEuyQQNKF -DoCkKvbdmbKWxPNu -DoCkKvbdRjyFtfjs -DoCkKvbdiifHjNYS -EPDKjvbdpyOhGpdY -DoDKjvbdUVlPitBR -DoCjjvbdEKIJuwjA -EPCjjvbdFkFTDHmV -EOcLKvbdySnJNSCH -DncLKvbdRpUHJedX -EPDKjvbdtvOYJpsA -DoDKjvbdKDKDQjCx -DoDLKvbdaMkCTUmH -EOcKjvbdMpYRVnGs -EOcKjvbdtSqsYzFD -DncLKvbdKaKgNCXq -DoCkKvbdsCFllGkZ -EObkKvbdNrsvGeUp -DoDKjvbdmaivxOnV -EOcLKvbdOEctIhjd -DoCkKvbdemGXGljL -DoDLKvbdjvWmdBxX -EPCkKvbdCIjbLIej -EPCjjvbdkHfkfFmk -DoDLKvbdwzIGFwdr -EOcKjvbddBrlrAUN -EPCkKvbdJutecdgJ -DoCjjvbdWRmwaeLc -DnbkKvbdiVZdwRuC -DnbjjvbdGLEsDHmV -EPCkKvbdxsOJNSCH -EPCjjvbdIwtBgkqQ -DncKjvbdbrbjtDjB -EPCkKvbdjhGkeemk -DncKjvbdWWiXvDeH -EPCjjvbdnUtzKiqf -DncKjvbdTukoitAq -DncLKvbdCIkBjhfK -DoCkKvbdhgKDZWJu -EPDKjvbdBhkBjiFj -DnbjjvbdMfbpNPtk -DoDKjvbdnBjWxPOV -DoCjjvbdEJhKWYKA -EOcKjvbdTpqOtuHm -DoCjjvbdwzIFfXdr -EOcKjvbdrpVoKDVf -EOcLKvbdEYYLtTsl -DoCkKvbdLFfICBQu -EOcKjvbdeXzTsrFz -EOcLKvbdSQUHKFdX -EOcLKvbdraemMHLZ -EPDKjvbdkIGlFemk -DncKjvbdOYOuzcnU -DoCkKvbdIwtCILpp -DncLKvbdZoNiEdzK -DoDKjvbdsrqsZZeD -EPDLKvbdzGyMANEw -DncLKvbdBraCsewS -EObkKvbdpyOgfpcx -DnbjjvbdxmrgxTIc -EOcLKvbdZjSgpHCG -EPCjjvbdrWpMDIxq -DncKjvbdZtJIyESn -EPCjjvbdJSxaSmXl -DoCjjvbdiMFEOVCy -DoCjjvbdDwwlTstM -DncLKvbdJYUCHkpp -EPDLKvbdsrrSxzFD -EObjjvbdkHgMFfNk -EPDKjvbdOStVgFUp -DnbjjvbdjhHMGGOL -DnbjjvbdZyEJmcLr -EPDKjvbdDihKWYKA -DncLKvbdRosfiecw -DoCjjvbdyTNhmSCH -DnbkKvbdFeirNhsq -DoDKjvbdrDeIpNvB -EObkKvbdVAaqTRSZ -EPDLKvbdLAkGlbXq -EOcKjvbdVAaprqRy -EPDLKvbdfIKvRnQg -EPCjjvbdUQpoVUgm -EObjjvbdxVNEpyMO -EOcKjvbdsCFllGkZ -DncKjvbdsBelkgLZ -DoDLKvbdvlvANDeN -DoCjjvbdnBivwoNu -EObjjvbdsCGMkgLZ -EObjjvbdsPvPJbvG -EPDLKvbdxrnImRbH -EPDLKvbdNPxRVnHT -DoDLKvbdMtrqkNAX -DoDKjvbdiGicZWJu -EPDKjvbdOFEUJJLE -EPDLKvbdoAKzshDn -DoDKjvbdehKvRnQg -EObjjvbdLLBIWAKZ -EPDKjvbdeOdsLUUS -DncKjvbdjvWmdBxX -DncLKvbdezuyFJTw -EPCkKvbdNPwpumgT -EPCjjvbdkxsRrxgU -EPDLKvbdptUHSSLU -EPDKjvbdeATqNXif -EPCkKvbdjlakzEgP -EObjjvbdyXiKCPzL -DoCjjvbdhlFDmuDZ -DncKjvbdauCGxLUI -EObjjvbdySmiNSBg -EOcLKvbdfNGWfljL -DncLKvbdVviYWDdg -EPCkKvbdkIHLefOL -EPDLKvbdRNYCZNtz -DoDLKvbdmfdxNOGy -DoDLKvbdcScKtDjB -EOcLKvbdEPDLKvcE -EPCjjvbdUaBprqSZ -EObkKvbdddnqbXDK -EPCkKvbdaaVeGQQX -DoDLKvbduoTzqKnt -DnbjjvbdqwPkbhxq -EObkKvbduaEZTOdh -EOcLKvbdKfFhBaRV -EOcKjvbdVYgtZjoO -EOcLKvbdrSVKnKaN -DnbkKvbdsCFmMGjy -DnbkKvbdSLYeuGkT -DoCkKvbdwWlAvAuu -EPCjjvbdRXOEClID -EPCkKvbdCIkCKiFj -EOcKjvbdGckViajK -DoCkKvbdznpRFCkx -DnbjjvbdxKwDgzyf -DncKjvbdVAaprprZ -DoDKjvbdOEctIhjd -EObjjvbdmIdTptqa -DnbjjvbdvwMAuaWV -EObkKvbdEYXksssl -EPCkKvbdiZtelQnG -EOcKjvbdqdEhpOVa -DnbjjvbdidjfuPAO -DnbkKvbdnBivxPNu -EObkKvbdrSVKmkBN -DnbkKvbdiCPDFWqR -DncKjvbdZisHofaf -DoCjjvbdJvVFcdfi -DoDLKvbdcyxpYYpb -DoCjjvbdrykpTBHn -EPDLKvbdqrUkOKaN -DoCkKvbdGQATWgFy -DncKjvbduaDxsPFI -EPCkKvbdYkqdTnLm -EObjjvbdQYmAGsRj -DnbkKvbdZyEKOCkr -DnbkKvbdOEdThhjd -EPDKjvbdiCOcFWpq -EOcKjvbdMfcQNPtk -EPDLKvbdLGFhBaRV -EPDLKvbdssSSyZeD -EPCkKvbdTAFJIBoE -EObkKvbdeFPRavbj -DnbkKvbdjKFhKNYS -DncLKvbdCJLBjiGK -DncLKvbdqlzJyLhJ -EOcLKvbdRyigsCvA -DoDKjvbdYqMdhldq -DnbjjvbdehKvSOQg -EObjjvbdMgColouL -DoCkKvbdehKuqnRH -DoDKjvbdQvmdCkhD -DoDKjvbdMSWlzVQz -EObkKvbdbhlikGXY -DoCjjvbdeAUQmYJf -EPCjjvbdZyEJmcMS -DoDKjvbdIGfzYxYH -DoDLKvbdHDjvJbJj -EOcKjvbdQwNdCkgc -EPCkKvbdRWnDcMHc -DnbjjvbdrMzJyMIJ -DncKjvbdlhctQuSB -DoDKjvbdbPgGdLzd -EObkKvbdijFhJmXr -DoCjjvbdbQGgDkzd -EPDLKvbdDihJvXjA -EObjjvbdaNKasUmH -DncKjvbdZyEKOClS -DnbjjvbdSLYfVHLT -DoDLKvbdwzHfFweS -EPCjjvbdfNFwHNJk -DoDLKvbdelewHNJk -EPCjjvbduaDxroEh -DoDKjvbddwytURez -DncKjvbdwtmEpyLn -EOcLKvbdCIkBkIej -EOcLKvbdiLddOUcZ -EPDKjvbdiUydwSVC -DncKjvbdrEEiQOVa -DnbkKvbdYzbeqivZ -DoCjjvbdkVwOECYX -DoDLKvbdZLqcsmkm -EObjjvbdVYgtZkPO -EOcLKvbdHffyxwwg -EPDKjvbdcIljLGWx -DnbkKvbdMpXpvNfs -EOcLKvbdFeirOJTq -DncLKvbdWWhxWEFH -DoCjjvbdZRMdhmEq -DnbkKvbdULvPBWPJ -EPDLKvbdZRMdiMdq -DnbjjvbdTYLMNzkY -DoCkKvbdZxcjNblS -DoCkKvbdKCibpicY -EPDLKvbddoFTKtUS -DncLKvbdcImKLGXY -EOcKjvbdKaLGmBwq -EPCkKvbdnHFYMnGy -EPDKjvbdUQqPUuIN -EPDKjvbdeAURNYJf -DoCkKvbdxwiKCQZk -DnbkKvbdKVuGDeGi -EPDKjvbdrovOicVf -DoDLKvbdrylQSaHn -EOcLKvbdySmhlrBg -EOcLKvbdNrsufeVQ -EOcKjvbdzoQREblY -EPCkKvbdzaAOgHCM -DoCjjvbdZLqdTmkm -EObkKvbdNGbpNQUk -EOcKjvbdZshiYdSn -EPDLKvbdDncLKvbd -EOcKjvbdqlzJyMHi -DoCkKvbdBhkCKiFj -EOcLKvbdRaceLhyL -EPDLKvbdxsNiNRbH -DoDKjvbdtcCtwWOo -DnbjjvbdmfdwlnGy -DncKjvbdREDBQQdS -DncLKvbdnPzYvKxb -EPCjjvbdjgfkefNk -DnbkKvbdnUtykJrG -EPDKjvbdSCEFLiYk -EOcLKvbdGcjuiajK -EPCjjvbdJYUCHlRQ -EPDLKvbdYpleIldq -EObkKvbdfMfWflik -DncLKvbdwuMdpyLn -DoDLKvbdEPDLLWcE -DoDLKvbdZLrDtOLm -DoCkKvbddZxoxYqC -DncLKvbdTulQKUAq -DncKjvbdqrUjnKaN -DoCkKvbdGFjRmiTq -EPCjjvbdpssfrRkU -EPDKjvbdrXQLbiYq -DoCkKvbdNQYQunHT -DoCkKvbdNrtWHEuQ -DncLKvbdjgflGGNk -DncKjvbdBsBCsewS -DoCkKvbdMpYRVmfs -DnbkKvbdKfFhBaQu -EObkKvbdGcjuiaij -EObkKvbdakMGOnDA -DnbkKvbdFyUuAcxC -DnbkKvbdtSrTZZdc -EPCjjvbdatafxLTh -EPCkKvbdUGzmlXVe -EObkKvbdZyDinClS -DncKjvbdyzdnSIJI -DnbkKvbdnPyxukZC -DoDKjvbdkDMLQgVH -EObjjvbdbVBfwjtI -EPDLKvbdzRPMhiwA -EObkKvbdhkeDmuCy -DnbkKvbdZQleImEq -EObjjvbdrDeJPnVa -EPDLKvbdaNLBsVMg -DnbkKvbdOEctIhjd -EOcKjvbdatagXkUI -DncKjvbdMowpunGs -EObkKvbdtvNwiqTA -DnbjjvbdyzdnSHiI -EObkKvbdbhlikFvx -EOcKjvbdaNKaruNH -DnbkKvbdiVZdvqtb -EObkKvbdVYgszKoO -DoCkKvbdjJfIKMwr -DncLKvbdezvZFJTw -EObkKvbdcyxoxYqC -EPDLKvbdFejSNiTq -DncKjvbdIwsbIMQp -DnbjjvbdTukpJsaR -EPDLKvbdIsZArlxM -EPDKjvbdTAEhgand -EOcLKvbdfNGXHMik -DoDKjvbdjcMLQgUg -DncKjvbdSLYfVHKs -DoCjjvbdnBjWwoOV -EPCjjvbdnBjWwnnV -EObkKvbdQvmccLgc -EPDKjvbdwuMeRYlO -DoDKjvbdNddUJIjd -DoCkKvbdqUTgSRkU -DoDLKvbdehLVqmpg -DoDLKvbdrovOjCvG -EObjjvbdzoPpdcMY -EPDLKvbdZRNFIleR -DnbkKvbdSLZGVGjs -DoCkKvbdySmiMrBg -DnbkKvbdwyhFfXeS -DoDLKvbdWHwvYHYz -DoCjjvbdIHHZyYYH -EObjjvbdJSyArmXl -DncKjvbdACqxJyiQ -DncLKvbdmpZxujyC -DoCjjvbdFkFScINV -EPDLKvbdCDpAujNG -DnbkKvbdhkeDnUby -DncLKvbdFWYopNJe -DoCjjvbdLAjfmCYR -EPCjjvbdxrmiMrCH -EObjjvbdcImJkGWx -DoCjjvbdFejRnJTq -EObkKvbdYTMAlsnx -EPCjjvbdsPvOibuf -EObjjvbdNeDshhjd -EOcLKvbdBiKbLIej -EObkKvbdauCGxLTh -EPDKjvbdbBWEepQX -EPCkKvbdVrNxBdlD -EObjjvbdMIalRYAS -EOcKjvbdJcKCpjCx -EOcLKvbdLqwNZtpz -DoCkKvbdZisHogBf -DnbjjvbdEPDKjvbd -DoDLKvbdFWZQQNJe -EObkKvbdHgGzYwxH -EOcKjvbdjbkkQfuH -DnbjjvbdtkxXAtBX -EPDLKvbdLAkHNCXq -EOcLKvbdWWhxVdFH -DncLKvbdCWzdIeQW -DoDLKvbdVvhwvDdg -EObjjvbdpfDeUWAh -EOcLKvbdqmZixkhJ -DncKjvbdyzdmrIJI -DncLKvbdRpTgJecw -DoDLKvbdGFjSOIsq -EOcKjvbdwuNFQyLn -DnbjjvbdIsZAsMwl -DncKjvbdptTgRqkU -DncKjvbdZQmEiNEq -DnbkKvbdauCHYLTh -EPDLKvbdyzdmrHhh -EPCjjvbdZoOJFEyj -EOcLKvbdUQqOttgm -DoCjjvbdRNYCZNtz -EPDKjvbdrRtkOLBN -DncLKvbdmajWxOmu -EPDLKvbdLBLHMbXq -DoDLKvbdCIjajhfK -EObjjvbdYkrDtOMN -EOcLKvbdUtNUGMVj -EObjjvbdaSFcHsek -DnbkKvbdXrkaMtPY -DoCkKvbdZQmFImFR -EOcLKvbdcJMijewY -EPDLKvbdGLErbhNV -DnbkKvbdiUydwSVC -EPDLKvbddndsKssr -DoDLKvbdxwhjCPzL -DoCkKvbdxVMeQxkn -DncKjvbdiBoCdwRR -EPDLKvbdnPyyVkZC -EPCjjvbdmuUzLKRf -DoDLKvbdSQUGiecw -DoDKjvbdRbDdlJZL -DncKjvbdqrVKnLAm -DoDKjvbdVBCQsQrZ -DoDKjvbdmbKWxPNu -EObjjvbdFVyQPmKF -DnbjjvbdiiehJlxS -EOcKjvbdIrxaSmYM -EOcKjvbdsZkosAgn -EOcLKvbdnCKWxPOV -EPDLKvbdKWUecdfi -DncLKvbdhgKDZWKV -EPDLKvbdySnImSCH -EObkKvbdJKEAKQGd -EOcLKvbdZMSETmkm -DoCjjvbdhgJcYujV -EOcLKvbdehLVqmpg -DoCkKvbdezuyFItX -DncLKvbdvBDxsOeI -EObkKvbdTulPisaR -DnbkKvbdajkfPODA -DoDKjvbdYkrEUOLm -EPCkKvbdfIKvSNpg -EPCkKvbdiBncEwQq -EOcKjvbdKWUecdgJ -EObkKvbdYlRcsmkm -EPCjjvbddwzUTqez -DnbjjvbdeYZstRez -EPDLKvbdxVNEqZLn -DncLKvbdFjeScINV -EObjjvbdxUleQxkn -DncKjvbdKWUfDdfi -DoDLKvbdssRrxzEc -EObjjvbdRpUGiedX -EOcLKvbdZQleJMdq -DnbkKvbdqdFIpNua -EPCjjvbdYzberKWZ -DoDKjvbdxxIjBoyk -EOcLKvbdEObkKwDE -DoDLKvbdqquLNjaN -DncKjvbdwuNFRZLn -DoCjjvbdqUTgRrKt -EObkKvbdVwIwvDeH -DnbkKvbdVwJYWEEg -DnbjjvbdYlSETnMN -DnbkKvbdqTsgRqjt -DoDKjvbdiGicZVjV -DnbjjvbdxnTHxTJD -EObkKvbdqUTfrSKt -DoCkKvbdFyVVBEXb -EOcKjvbdqGDdsvAh -EPCkKvbdTkunaVni -EObkKvbdMRvlzVQz -EPDKjvbdDncKkWbd -EObjjvbdqqtkNkBN -DncLKvbdfHkWRnRH -DnbjjvbdiLdcnUby -EOcKjvbdVYgsyjnn -EPCjjvbdUtNTfMWK -EPDKjvbdqYoHgREY -DncKjvbdGZUuAdYC -DnbjjvbdDnbjjwDE -EOcKjvbdTqQntthN -EOcLKvbdUyITzLPO -EOcLKvbdjblLRHVH -DoCkKvbdLGFhCBQu -DncLKvbdliEUQuSB -EObkKvbdRacdkiZL -EOcLKvbdaSFcHtFk -DoDKjvbdJYTahLpp -EPDLKvbdUQqOuVIN -EPCjjvbdqmZjYkhJ -DoCkKvbdRjyGUgKs -EObjjvbdyNrhYSiD -EPCkKvbdBhkCKiFj -EObjjvbdYlSDtOLm -DoCjjvbdTAFIhBoE -DncKjvbdNdctJIjd -DoDLKvbdGdKvJaij -EObjjvbdJpydnfNe -EPDLKvbdCDpAvKNG -DoDLKvbdeEoRavbj -DoCkKvbddoFSjssr -EPCjjvbdqYoHfqEY -EPCkKvbdFkFScHmV -EObjjvbdcyyQYZRC -DoDKjvbdyzdmrHhh -DoDKjvbdUWLojUAq -EObkKvbdiCPCdwRR -DoCkKvbdCTBDTevr -EOcKjvbdLAkGlbXq -EPDKjvbdcyyQXyRC -EPDLKvbdyNsHxSiD -EPDKjvbdqUTgRrKt -DoDKjvbdJuuFdEfi -DoDLKvbdEXwktTtM -EObkKvbdeJirVtzn -EObjjvbdYTMBMsnx -DnbkKvbdNQXpumfs -EPDLKvbdzitopDrt -DncLKvbdDxXlUUUM -EOcKjvbdADSXiyhp -DoCjjvbdqTsgSSKt -DoCkKvbdZtIhxdTO -EOcKjvbdUyHtZjnn -EPDLKvbdcSbkTdKB -DncLKvbdxZgfGYEr -DncKjvbdeATplxJf -DoDLKvbdnCJwXnmu -DnbkKvbdbKlFnnDA -DoCkKvbdrDeIpNua -EPCjjvbdmttzKirG -DoDKjvbdbrbkUDjB -DnbkKvbddZxoxZRC -EObkKvbdhgKDZWKV -DnbjjvbdGFiqmhtR -EPDKjvbdULvOaWPJ -EOcLKvbdygYlANFX -DnbjjvbdIHGzZYYH -EOcKjvbdhkeENuCy -EOcLKvbdNddTiJLE -EObjjvbdGFiqnJUR -EOcLKvbdjvWnEBxX -EPCjjvbdVBCRTRSZ -DncKjvbdVBCRTRSZ -EObkKvbdBdQAvJlf -EObkKvbdJYUCHkpp -EOcKjvbdGckVjCJj -EObkKvbdBsAcUGWr -DoDLKvbdIxUBhMQp -DoDKjvbdMgDQNPtk -EOcLKvbdHEKujCKK -DoCjjvbdLhalQxAS -EObkKvbdULuoBVoJ -EPDKjvbdhfjDZVjV -DoCkKvbdKDJbqJbx -DoCkKvbdbKlGPNcA -DncKjvbdrpVnicWG -EPDKjvbdvAdZSneI -DnbkKvbdFyVUaEYC -EOcKjvbdHDjuibJj -DnbjjvbdbiMjLFvx -EPCjjvbdUsltGLvK -DoCjjvbdkNBkzEgP -DncLKvbdFxtuBEYC -EOcKjvbdnBjWxPNu -DnbkKvbdqUTfrRjt -EPCjjvbdZHXEAPSi -DoCjjvbdxxJJapZk -DncKjvbdZyDimcLr -DnbjjvbdiBnbeWpq -EObjjvbdjbkkQftg -EObjjvbdqvokbhyR -EOcLKvbdeYZtTrFz -EPCkKvbdLqvmZtpz -DoDKjvbdNeDsiIjd -EPCkKvbdeXystRez -EOcKjvbdAMhZSvzY -EPCjjvbdSwkMNzkY -DoDKjvbdtlYXAtBX -EPCjjvbdBvzdIdov -DoDLKvbdVBBqSqRy -EOcLKvbdTvMQKUAq -EOcLKvbdxVMeQyMO -EPDLKvbdBsAbtGWr -DoCkKvbdKefHaaRV -DncLKvbdCTBDTewS -EPCjjvbdTIyjRAAl -DoDKjvbdkxsSSxft -EObjjvbdjvXOECXw -EPDKjvbdVTlsfLvK -EOcKjvbdjJfHjNXr -EObjjvbdfMfWflik -DnbkKvbdYqNFImEq -DoDLKvbdcJMikFvx -DoCkKvbdrXPlDIyR -EObjjvbdeOdsLTtS -DncLKvbdJSyArmXl -EObjjvbdkNBlZeHP -EObkKvbdfHkVqnRH -DncLKvbdKCjCqKDY -DoDLKvbdUyHsykOn -DncKjvbdWWiYWEEg -EPCkKvbdKWVFdEfi -EObkKvbdFpATWgFy -EOcKjvbdrzLpTAgn -EPCjjvbdhuZeWrVC -EPCkKvbdraellGjy -DncLKvbdGKeTCgmV -DoDLKvbdCEQAvJlf -DoDLKvbdJvUfEFGi -EOcKjvbdHDkVjCJj -EPCjjvbdZxdJnClS -DoCjjvbdcImJjewY -DoDLKvbdkDMLRHUg -DoDLKvbdqZOggREY -DoCkKvbdkMakyeHP -DoCkKvbdEvYpPmJe -DncLKvbdJJdAJpHE -DoDKjvbdEPCjkXCd -DnbjjvbdlAmOmALA -DoDLKvbdsBfNLgLZ -DncLKvbdKyQjSzuG -EPDLKvbdeAURMxJf -EPCjjvbdkHflGGOL -EOcKjvbdEuxpPlie -DncKjvbdcyyPxYqC -DoCkKvbdRDbaPqES -DncLKvbdaaVeFpQX -EOcLKvbdMuTSLNAX -EPCkKvbdbiMjKfWx -EOcKjvbdSCEEkiZL -DncKjvbdbhmJkGWx -DncKjvbdWXJYVcdg -EOcLKvbdvBDxrndh -DoCkKvbdCEQBVjNG -EPDLKvbdxUmFQyMO -DnbkKvbdznpRFCkx -DoCjjvbdKDJbpjDY -EOcLKvbdREDBQRDr -DoDLKvbdZtIhyETO -EObjjvbdKfGHbBQu -DnbjjvbdnUtzKirG -EPDLKvbdyNsHwsIc -DoCjjvbdIrxaSlxM -DoCkKvbdRjyFuHLT -EPCkKvbdJvUfDdgJ -DnbkKvbdgQBzvcwh -DnbkKvbdpyOgfqEY -DnbkKvbdmRxuZsEJ -EObkKvbdmRyUysDi -DnbjjvbdrzMPraIO -EPDLKvbdDxXksssl -EPDLKvbdqUUGrSKt -EPCjjvbdZisIPfbG -EPDLKvbdiGicZVjV -DnbjjvbdqcdiPnVa -DoDLKvbdGKdsCglu -EPCkKvbdYSlBNUOx -DoCkKvbdjmBkyeHP -EObjjvbdKDJcRKDY -EPDKjvbdiLdcmuCy -DoCjjvbdbAvEfQQX -EPDKjvbdegjvRmqH -EOcLKvbdrounibvG -DoCkKvbdliEUQtrB -DoCkKvbdrXPlChyR -DnbkKvbdcyxoxZRC -DoCkKvbdWIYWYHYz -DnbkKvbdmJETptrB -EObjjvbdbBVeGPpX -DoCkKvbdypnliKXA -EOcLKvbdatagXkTh -EPDKjvbdrounjDWG -EPDKjvbdUyHsyjnn -EPDKjvbddZxoxZRC -DnbjjvbdKCjCpjDY -DoCjjvbdKkBHvAJy -DnbjjvbdjbkkRGuH -DoCjjvbdrafNMGjy -DncKjvbdxnTHwsJD -DncKjvbdemFvfmJk -DnbjjvbdIwsbILqQ -EObjjvbdUMWPAvOi -EOcLKvbdGKdsChMu -DoCjjvbdWXIxWEEg -DoCjjvbdvPTzqKnt -DoDKjvbdILazmwRL -EPCkKvbdjlakzFHP -EPDLKvbdKDJbqKCx -EOcLKvbdHELWKBjK -DoCkKvbdOFDshhkE -EPDKjvbdBhkCKhej -DoDKjvbdNddTiJKd -EPCkKvbdVqmwadkc -EPCkKvbdFfKSOItR -EPCjjvbdZshiYcrn -DncLKvbdvAcxsOeI -EObkKvbdKVtfEFHJ -DncLKvbdXsMBNUPY -DoDLKvbdCTAbtGXS -DoDKjvbdRyjHsDWA -DoCjjvbdJcKDRJcY -EOcKjvbdEuxpPljF -DncLKvbduWNxKQsA -EOcLKvbdhuZeXSUb -EObjjvbdjvWnDaxX -EObjjvbdwWlAvAuu -EObkKvbdqquKnLBN -DoDLKvbddCSmSATm -DoCjjvbdwtmEpxlO -DnbjjvbdDoCkLWcE -DncLKvbdwyhGFxEr -EOcKjvbdrykosAgn -DnbjjvbdNeEUJJLE -DoDKjvbdjuwNdCYX -EPDKjvbdiGibyVjV -DnbjjvbdYqNEhmEq -EPDLKvbdxVNEpyLn -DoCjjvbdZeYGzgiC -DoCjjvbdZjTIQGbG -DnbkKvbdSPsfjGEX -EObjjvbdBsBDUGXS -DoCkKvbdsBfNMGkZ -EOcLKvbdLBLGmCXq -EPDKjvbdJTZBTNYM -DnbjjvbdJTZBSmYM -DoDLKvbdjKFgjNYS -DoDKjvbdqlzKYkhJ -EPCkKvbdkWXOECYX -EObkKvbdFkEsDINV -EObjjvbddndsKstS -DoCjjvbdauBfwjsh -DnbjjvbdFjeTCglu -EOcLKvbdfMfWflik -EObjjvbdlYsRryGt -EPCjjvbdtbcVWuoP -DnbjjvbdMgDPmQVL -DoDLKvbdjhHLefNk -EOcLKvbdUsmTfMWK -DoCkKvbdptTfqqjt -EObkKvbdrRuKmjaN -EPCjjvbdzoQQdcMY -DoDKjvbdrpVoKDVf -DoCkKvbdlZSrTYft -DoCjjvbdBhjajiFj -EOcLKvbdzoQQdbkx -EObkKvbdOhAYZAYa -EOcKjvbdjvXNdBww -DnbjjvbdEXwlTtTl -DoCkKvbdzjVPocsU -DoDLKvbdZQldiMeR -DncKjvbdYNqAYVVt -DnbjjvbdtvNxKRTA -EPCjjvbdqceIonWB -EOcKjvbdyXiKCPzL -DoCkKvbdfIKurNpg -DoDKjvbdFxuVAdYC -EOcLKvbdeOdrjssr -DncLKvbdxnShYTIc -EPDLKvbdoznEKwoA -DoDLKvbdptTfrRkU -DncLKvbdkWWnDaxX -EPCjjvbdKWVGDeHJ -EPCjjvbdtumwipsA -DoCkKvbdZxcinDMS -EObjjvbdCWzdIeQW -EPDKjvbdHgGzYwwg -EOcKjvbduDCtvvOo -DnbjjvbdqvokbiZR -DnbjjvbdmIcsptqa -DncLKvbdrJAJdmPF -EPCkKvbdKjaHvAJy -DoCkKvbdhuZdwSUb -EOcKjvbdnPzZVjyC -DoDKjvbdYSlAmUPY -EOcKjvbdffLzNgHA -DncLKvbdptUHRqjt -EPCjjvbdyTNiMqag -DoCjjvbdauBgXkTh -EPCjjvbdbiMikGXY -EOcLKvbdIHGzZXwg -DncKjvbdrXPkcIxq -DnbjjvbdOTTugEuQ -DnbkKvbdjcMKqHUg -DoDKjvbdffMZnHHA -DoCjjvbddijSWUzn -DncKjvbdBhkCKiGK -DncKjvbdJYTbHkqQ -DnbkKvbdqwPlCiZR -DoCkKvbdxUmFRYkn -DoDKjvbdmSZUzTDi -EPDLKvbdkyTSSxft -DoCjjvbdmajXYPOV -EPCkKvbdMowqVnHT -DncLKvbdTppoUuHm -EPDLKvbdgFkymfgA -EObjjvbdhgJcYujV -DncKjvbdtAGqIABS -DoDLKvbdqZOhGpdY -EObkKvbdjbkkRGuH -DoCjjvbdGLEsChNV -DnbjjvbdZoOIeEyj -DncLKvbdbrbjsdJa -EPCjjvbdGGJqmiTq -EPCkKvbdNPxRWNgT -EPCjjvbdJpydnfOF -EOcKjvbdcyxoxYpb -EPDKjvbdmozZWLYb -EObjjvbdVTmUFlVj -DoCjjvbdNrtWGduQ -DncKjvbdqUTfqqkU -DoDKjvbdTfznMWue -EOcLKvbdNsTugEuQ -DoDLKvbdjhHLfGOL -EObjjvbdZtJJYdSn -DoDKjvbdZjTHofbG -DncKjvbduCbtwVno -EPCkKvbdZtIhxcsO -EOcLKvbdnUuZkJqf -EObkKvbdiCPCeXQq -EOcKjvbdZtJIxcsO -EOcLKvbdZRNEhmFR -DnbkKvbdFjdsDINV -DncKjvbdsZlQSaIO -EObjjvbduLxXAtAw -DncKjvbddoFSjtTr -DoCkKvbdmbKXXoOV -DoDKjvbdOAIsTirA -DncLKvbdMfcQMpVL -EPDKjvbdsrqrxzFD -EOcLKvbdZRMdiMdq -EObkKvbdCTAbsfXS -EPDLKvbdtunYJpsA -EObkKvbdYSkaNToY -DoCkKvbdZMRdUOMN -EPCkKvbdIsYaSmYM -DncLKvbdVYgtZkPO -EObjjvbdaNLBsUmH -EOcLKvbdZyEKOCkr -DoDLKvbdOSsufdtp -DoDKjvbdhbPCdvqR -DnbkKvbdiZuFkpnG -DoDKjvbdHDjujCJj -EPDKjvbdCDpBVjMf -EObkKvbdeFOrBwDK -DoDLKvbdhgJbxvJu -EObjjvbdiZuFlQmf -EPDKjvbdeuzwpJzs -EPDKjvbdezuyEhsw -EPCkKvbdJYTbIMQp -DnbkKvbdkIHLeenL -DoCkKvbdAMgyTXZx -DnbkKvbdfIKvRnQg -EPDLKvbdJqZePFnF -DoCjjvbdRjxfVGkT -EOcLKvbdySmhlqbH -DnbjjvbdEYYMUTtM -DoDLKvbdhtydvquC -EObjjvbdZRMdiMdq -EPCjjvbdVZITzLOn -DoCkKvbdmuVZjjRf -DoCjjvbdzoQREbkx -DnbkKvbdkyTSSxgU -DoCjjvbdzRPNIjXA -EPDKjvbdnPyxvLZC -EOcKjvbdSZjHrbvA -EPCkKvbdShyjRABM -EObjjvbdYpmEiMeR -DoCjjvbdFaOqYizm -DncLKvbdEvZQQMjF -DncKjvbdNrtWGeVQ -DoDKjvbdqdFJPmvB -DnbjjvbdRXODblID -DoDLKvbdyzdnRhIh -EPCkKvbdcTCjsdKB -DncLKvbdJcKCqKCx -EObjjvbdmfdwmNgZ -EPDLKvbdqUTgSSLU -EObjjvbdZyEKODLr -EPDKjvbdTppoVVIN -DnbjjvbdFVyPpNJe -EPDKjvbdJYUBhLqQ -EPDLKvbdqceIpOWB -EPDLKvbdiBnbeXQq -DnbkKvbdGZVVBEYC -DncKjvbdGLFTDINV -EObjjvbdUGzmlXWF -EOcLKvbdxrmiMqbH -DoDLKvbdJpzEnenF -EObjjvbdEvYoomJe -DoDKjvbdJqZdoFme -EObjjvbdEuyPpMie -EOcKjvbdmtuZjjRf -EPDKjvbdjKGHilwr -EPCkKvbdpaIeAWgd -DoDKjvbdGZVUaDxC -DoCjjvbdFkErcHlu -EOcKjvbdrbFllGjy -DnbkKvbdMRwMzUpz -DoCkKvbdDxYLtTsl -EOcLKvbdLBKfmBxR -DoCjjvbdVwJYWDeH -DoCkKvbdZoOIdeZj -EPDLKvbdpfEFUWAh -EOcLKvbdKWVGDdfi -EObkKvbdtvNwipsA -DoCjjvbdwuNEqZMO -EObkKvbdfSBWzkbo -EPDLKvbdFxuVAdXb -DnbkKvbdRWnEClHc -EOcKjvbdkCkjqHUg -DoCjjvbdbsDKscia -EPDLKvbdzQoMiKXA -DnbkKvbdRDcApQcr -DoDKjvbdZtIiYcrn -DoDLKvbdqZPHgQdY -EObjjvbdyfxlAMeX -EObjjvbddjJrWUzn -EPDKjvbdjcMLQgVH -EOcLKvbdozmckXoA -EPDKjvbdcJMjLGWx -EPCkKvbdbhlijewY -EObjjvbdrEFJPnWB -EOcKjvbdmuVZjirG -DncKjvbdnBjXYOmu -DncLKvbdjcLjqHUg -EPDLKvbdlhdUQuRa -DoDKjvbdVwIwvEFH -EObkKvbdZMSDsnLm -DoDLKvbdzHZMAMdw -EOcKjvbdZMSDsnLm -DncKjvbdZshhyDsO -DncKjvbdCEPaWJlf -EOcKjvbdxxJKCQZk -EPCkKvbdezvZEiTw -EPDLKvbdypoMiKXA -EPCkKvbdnUuZjjRf -DnbkKvbdFfJqnJUR -DoCjjvbdTpqPUthN -DncKjvbdcyxoxYpb -EObkKvbdCSaCsfXS -DnbkKvbdRacdlIyL -DoCjjvbdTIzKRABM -EPCkKvbdatbGwjsh -EObjjvbdUsltGMWK -DoDLKvbdtvOXjQsA -DnbjjvbdYSlAmUPY -EOcKjvbdwuNEpxkn -EObkKvbdYqMdiMdq -EOcKjvbdnGeXlmgZ -DnbkKvbdqwQLcJYq -EObkKvbduVmxJqTA -EObjjvbdmoyyVkYb -DoDKjvbdBdPaWKMf -DncKjvbdVvhwvEFH -EObkKvbdauBfxLUI -EOcLKvbdMgDQNQUk -EOcKjvbdsQVnjCuf -EObkKvbdjuvnEBww -DoCkKvbdkWXODbXw -EPCkKvbdZyDjNblS -DoDKjvbdZLqdUNlN -DoDKjvbdbLMFoNcA -DoCkKvbdFVyQPmJe -EOcKjvbdhkdcmuCy -EPCkKvbdmtuZjiqf -DnbjjvbdRbEFLiYk -EPCkKvbdySnJMqag -EPDLKvbdhlFDnVCy -DoCjjvbdzoQREblY -EPCjjvbdvBEYroFI -EPCjjvbdJbjCqJcY -DnbkKvbdliEURUrB -DoDKjvbdOTUWGdtp -EOcLKvbdZnmhddzK -EPDKjvbdSBcdkiZL -DoCjjvbdZMRctOLm -DoDLKvbduCcUwVno -DoDLKvbdEzspeMDJ -EPCjjvbdULunaWOi -DoDLKvbdIwsaglQp -EObkKvbdJuuFdFGi -EPCkKvbdQccBQRDr -EPDKjvbdNrsugEtp -EPDLKvbdEXxLtUUM -DoDKjvbdVBCQsRRy -DncKjvbdeFPSCWcK -DoDLKvbdhficYvJu -DncKjvbdkClLRHVH -EOcLKvbduWNxKRTA -EObjjvbdNPwpumgT -DoCjjvbdjmCLzFGo -DncKjvbdZtIhxdSn -EObkKvbdKQyePFme -EPCjjvbdEuxpPljF -DoCkKvbdZtIhyDrn -EPDLKvbdJpzFOfNe -EPDKjvbduaEZTPFI -EPDLKvbdSQTgKFcw -EOcLKvbdBcpAujMf -EPCjjvbdfHkVrOQg -EPCjjvbdKaKflaxR -EObkKvbdZjTIQGaf -EOcLKvbdijGIKMwr -EPDLKvbdvBEZTOdh -DnbkKvbdZRNEhleR -DnbkKvbdijFgimXr -EObjjvbdEASIlywX -DoCjjvbdKaKgNCXq -EPDLKvbdTppoUuHm -EPCkKvbdwzHefYEr -EPCkKvbdhtyeWrUb -DnbkKvbdPyNAGsRj -EPDKjvbdmttzKiqf -DnbjjvbdRacdkhyL -EOcLKvbdeJjRvUzn -EObjjvbdNHCpNQVL -EPCjjvbdgLGzcGAE -DoCkKvbdidkGtoAO -DnbkKvbdKDJcRKCx -DnbjjvbdSQTgKGEX -EPDLKvbdyqPMiJwA -DnbkKvbdLrWlytpz -DnbjjvbdmgExNNgZ -EPCkKvbdlYsRrxgU -DnbjjvbdTkuoAvPJ -EOcKjvbdgFkymgHA -EPDLKvbdmaivxOnV -DnbjjvbdEztQeMDJ -EObjjvbdWfYzUAPT -DnbkKvbdiMEdNuDZ -DoDKjvbdgQBzwEXh -EOcLKvbdSBcdlIyL -DnbjjvbdrMzJxkhJ -DnbjjvbdddnrCXDK -DncLKvbdmbKXXnnV -DnbjjvbdYzbfSKWZ -EPCjjvbdUMWPBVoJ -EPDKjvbdBraDUGWr -DoCkKvbdFkFTDINV -DncKjvbdYkqdTmkm -DncKjvbdmpZyVjyC -DoCjjvbdZisIQHCG -DncLKvbdYqMeJMeR -EPDKjvbdZjTHpHBf -EOcLKvbdcJMikFwY -DoCkKvbdFpATXHGZ -DnbjjvbdVBBqSpqy -DoCkKvbddZyQXxpb -EOcLKvbdqlyiyMHi -EPDLKvbdfMfWgNJk -DoCjjvbdrNZjZLgi -EPCkKvbdeOdsKtTr -EPDKjvbdLrXMytpz -DncLKvbdQvnDcMHc -DoDLKvbdyYJJbPyk -DnbjjvbdrylPsBIO -DnbkKvbdTqROuUgm -DoCjjvbdcyyQYZRC -EObjjvbdbLMFnmcA -EObjjvbdbVCGxKsh -EObjjvbdelfWgMjL -EPDLKvbdnGdwmOGy -EPCkKvbdcTDLTdKB -DncLKvbdUxhTyjoO -EPCjjvbdwzHfFxEr -EPCjjvbdkxrqryHU -DncLKvbdDihJvYKA -EPCkKvbdRzJhScWA -EObjjvbdZHWdAOri -DoDLKvbdjbkkRGuH -DncKjvbdNVSrLNAX -DncKjvbdVqnYCElD -DnbjjvbdFWZPpMjF -DoCjjvbdZMRctNkm -EPCjjvbdRNXaxmtz -EOcLKvbdLZQjSztf -EObjjvbdePFSjssr -EOcKjvbdjbkkRHUg -EPDKjvbdcSbjtEJa -EObkKvbdKQzFPFme -DoCkKvbdnUtzKjRf -DncLKvbdeOeTKtUS -DoCjjvbdpstGqqjt -EOcKjvbdrpWPJcWG -EPCkKvbdwkXDgzyf -DncKjvbdnPyxvLYb -DoCkKvbdpxoIHRDx -DnbjjvbdLFegaaRV -EPCjjvbdrXQLcJYq -DncKjvbdWXJXvDdg -DnbjjvbdQdCaQRDr -EOcLKvbdWWiXuceH -DoCjjvbdbiNJkGXY -EPDKjvbdijGHjMxS -DoDLKvbdTfzmkwVe -EObkKvbdmSZUzTEJ -DnbjjvbdKefHaaRV -DncLKvbddoFSjstS -DncLKvbdSLYfUgKs -EPCkKvbdCIjbLJGK -DncKjvbdKNADzGuB -DoDKjvbdBcpBVjMf -DnbjjvbdpxoHfqEY -DoCjjvbdANHyTWyx -DoDKjvbdFjeSbgmV -DnbkKvbdxwiKCPzL -DncKjvbdqceIpNvB -DnbjjvbdLFfHbAqV -EPDLKvbdtTSTYydc -EPCjjvbdezvYdiTw -EObjjvbdWWiYVdFH -EOcLKvbdZyDjNbkr -EObkKvbdwzIFeweS -EPCjjvbdjmBkzFGo -EObjjvbdGAoRYizm -EObjjvbdjcMLQgVH -DoCjjvbddePRavbj -EOcKjvbdlhcspuSB -EPCjjvbdSCEFMJZL -EObkKvbdEYYLsssl -EObkKvbdpstGrSLU -DoDLKvbdIGgZxwwg -EObkKvbdWIYWYGxz -EPCjjvbdfILWSNqH -DnbkKvbdFWYpPljF -DoCjjvbdVAbRSqRy -EOcKjvbdeEoSCWcK -EOcKjvbdSBceMIxk -DoCjjvbdgFkzOGgA -EObkKvbdbPfgELzd -DnbjjvbdmtuZkJqf -EPCkKvbdYgWdAPSi -EObkKvbdmaiwXoOV -EOcKjvbdjuvnDbXw -DncLKvbdiBoCdvpq -DnbkKvbdZxcjNbkr -EPDKjvbdKfFgaaRV -DoDKjvbdNGcPlouL -EOcKjvbdHlBznXQk -EPCjjvbdKQydoFme -EPCjjvbdDxYLsssl -DoCjjvbdHbLydzAD -DnbkKvbdZisHofbG -DnbkKvbdvvkaWBWV -DncLKvbddxZtUSFz -EPCjjvbdBcpBWJlf -EObkKvbdVBBprpqy -DoCkKvbdaSFcITfL -DoCkKvbdZLqctOMN -EPDKjvbdFWYpQMie -DncKjvbdOEctJIjd -DoCkKvbdEuyQPmJe -DncLKvbdZGwEAOsJ -DncKjvbdlqyUzSci -EOcKjvbdKCibqKCx -DnbjjvbdEOcLKvbd -DncKjvbddneTLUUS -EPCjjvbdhbPDFWpq -DoCjjvbdeAUQmXjG -EPDKjvbdVwJYWDeH -DncKjvbdePFTKstS -DoCjjvbdjggMFemk -EPCjjvbdcScLUDjB -DoDKjvbdZjTIQGbG -EObjjvbdehKurNpg -DncLKvbdbsDLUEJa -EOcLKvbdEJgjWXjA -EPCkKvbdqquKnKaN -DnbjjvbdZjShQHCG -DoCjjvbdCEPaVilf -EObjjvbdzjUpQDrt -EOcLKvbdUVlPjUBR -DnbjjvbdeFPSCWbj -DoCkKvbdKxpirzuG -DncLKvbdrykpTAgn -DoDKjvbdemGXGljL -DncLKvbdTYKlNzkY -DncKjvbduaDyTOeI -EObkKvbdnBjWwoOV -EPCkKvbdGdLWKCJj -EPDKjvbdKeegaaQu -EObkKvbdxnShXrhc -DoCkKvbdsBemLgKy -EPCjjvbdrzLoraHn -EPDLKvbdrRuKmjaN -DncLKvbdmajWxPOV -DncKjvbdKVuGDeGi -EObjjvbdziuQPdTU -DnbkKvbdZxcinCkr -EPCkKvbdlqxtzTDi -EPCkKvbdyzeOSHiI -DnbkKvbdqmZiyMIJ -EOcLKvbdIwtBgkqQ -DncLKvbdfekzOHHA -EPCkKvbdKNADzGuB -EOcLKvbdUaBqSqRy -EPDKjvbdddnrBvbj -DncLKvbdmuVZjirG -EOcKjvbdbBWEepPw -DncLKvbdwjvdHzyf -EPDKjvbdmgFXlmgZ -EPCkKvbdtSqryZeD -EObkKvbdOFEUIhkE -EOcKjvbdiBncFXRR -DncLKvbdxZgeeweS -EPDLKvbdxwiKCPyk -EPDKjvbdHEKvJajK -DncKjvbdrafMlGjy -EOcLKvbdwWlBWBWV -DncLKvbdegjvRmqH -EObkKvbdehKvRmqH -DoDLKvbdUaBpsQrZ -EPDKjvbdRaceMJYk -DnbkKvbdZRNEhldq -DnbjjvbdKCibpjDY -DoDLKvbdKaLGmCXq -DncLKvbdKaKflbYR -DoCjjvbdZQleJNFR -EPCjjvbdZHWdAOsJ -EObkKvbdpxnggRDx -EPDKjvbdiUzFXSVC -DncKjvbdhfjDZWJu -DoCjjvbdYkrDtNlN -EOcLKvbdkVvmdBxX -DnbjjvbdFkFScHlu -DoCjjvbdlrYuZrci -EOcKjvbdrDdiPnWB -DoCjjvbdfoazvcwh -EPCkKvbdtkxWaUAw -EObjjvbdVYgsyjoO -EPCjjvbdssSTZZeD -DoCjjvbdbVBfwjsh -EPCjjvbdVgwuxGxz -EOcKjvbdZoNhdeZj -EPCkKvbdGYttaDwb -DncLKvbdvAcySoEh -DoDKjvbdIGfzZYYH -DoDKjvbdtcCtvvPP -EObjjvbdkxsRryHU -DnbkKvbdJSyBTMwl -DoCjjvbdsPuoJbuf -DnbjjvbdZxcimcMS -DoDKjvbdNGbpMouL -DnbjjvbdSZjHrbvA -DoCkKvbdmRxtysDi -EOcLKvbdZQmEiMeR -EPCjjvbdpfEEtVaI -EPCjjvbdtTRrxzEc -DoCkKvbdZdxGzghb -DncKjvbdrykpTBIO -EPCkKvbdxxIjCPyk -DncLKvbdCEQAujNG -EOcLKvbdrWokbhyR -EPDKjvbdjJehKMwr -DncLKvbdSxLMNzjx -DnbjjvbdZyDinDMS -EObjjvbdZirhQGaf -DncLKvbdkClKqHVH -EObkKvbdfIKvRmqH -DoDLKvbdQvmcblID -EPDKjvbdNsTufdtp -EObkKvbdZRMeIleR -DnbkKvbddwytTrFz -EObjjvbdZxdKODMS -EPCkKvbdSLZFtgKs -EPDKjvbdrovPJbuf -EPCjjvbdHgHZxxYH -EPCjjvbdddoSBvbj -DoDKjvbdegkVqmpg -DoDKjvbdCfkfHAzc -EObjjvbdtvNxJqTA -EPDKjvbdhtyeXSVC -EPDLKvbdUtMtGLvK -EPCjjvbdFaPRYizm -EPCkKvbdVZIUZkOn -EPDKjvbdFeiqnIsq -EObkKvbdddoRbWcK -EOcLKvbdaNLCSuMg -EObjjvbdFpATXGfZ -DncLKvbdrXPkcJYq -EPCjjvbdFjdrcHlu -EObkKvbdUQqPVUhN -DoDLKvbdpxoHfqDx -DncLKvbdypoNIjXA -EPCjjvbdmRxuZrdJ -EPDKjvbdqZPHgREY -EOcLKvbdZGwEAPTJ -DncLKvbdjuwNcbXw -DoCkKvbdTlWPBVoJ -DoCjjvbdRzKIScWA -EPDLKvbdZnnJFEzK -EPDLKvbdqvokbhyR -DnbkKvbdAMhZTWyx -EPCkKvbdqYoHgRDx -EPDKjvbdZtJJZETO -EObkKvbdWRmxBdlD -DnbkKvbdwWkaWBWV -DncKjvbdgKfzcGAE -DncLKvbdtbcUwVno -EOcLKvbdcImJjfWx -DncLKvbdSwjlNzjx -EObkKvbdjblLQftg -DncLKvbdQmYByNtz -DnbjjvbdhlFDmtby -DnbjjvbdcTDKsdJa -EPCkKvbdqUTgSRkU -EOcKjvbdZQleImEq -EOcLKvbdtTRrxzFD -EPCkKvbdUVkpKUAq -DncLKvbdmbJvwoNu -EPDKjvbdrJAKFMne -DncKjvbdpyOhGqEY -EOcLKvbdLrWlzVQz -DnbjjvbdvAdYsPFI -EPCkKvbdDoDKjvbd -DoDLKvbdelfWgMjL -EObkKvbdaMjbTUlg -EObjjvbduVmwjRTA -EPCjjvbdHffyxwwg -DnbkKvbdXrkaNToY -DoCjjvbdZshhyDrn -DoDKjvbdunszqKoU -EPCkKvbdmJDtRVSB -DnbkKvbdcImKLFwY -DoCjjvbdpedEtVaI -DnbjjvbduMXwAtBX -EPDLKvbdhbPDFWpq -EPCjjvbdrDdiQNua -DnbkKvbdKxpirzuG -EObkKvbdcTCjtEJa -DncLKvbdZQmFIldq -DoCkKvbdqUUGrRkU -DnbkKvbddZyQXyRC -DncLKvbdIryBTNXl -EPDKjvbduaDxrneI -DoCkKvbdZMSDsmlN -DoDKjvbdrovOjCvG -EOcLKvbdhyuFkpmf -DoDLKvbdddnrBwDK -DncKjvbdDwxLstTl -EPDLKvbddZxpXxpb -DoDKjvbdCSaDTewS -EPCkKvbdVqmxBeLc -DoCkKvbdZMSEUNkm -DnbkKvbdznopdcMY -EPCjjvbdqYoHgQcx -EPCkKvbdlhdUQuRa -EObjjvbdauBgYLUI -EObjjvbdySnJMrCH -EObjjvbdkIGlGGOL -DoCkKvbdwXMAvBWV -DnbjjvbdiCOcFXRR -EPCkKvbdIHGzZYXg -EPDKjvbdiMFDmuCy -EOcKjvbdtlXvaUBX -DoDLKvbdhfibxuiu -EPCkKvbdqwQMChxq -EObkKvbdRkYeuGjs -DoDKjvbdYkrEUNlN -EPDKjvbdZshiYcsO -DnbkKvbdQlxBxnUz -DncKjvbdSPtGifEX -DoDLKvbdmajXXoNu -EObjjvbdHbMZdzAD -EPCkKvbdZyEKNblS -EObkKvbdKfFgbBRV -EOcLKvbdOTUVgFVQ -DoCkKvbdfMevgMik -EPDKjvbdptTfrSKt -DnbkKvbdxZhFexFS -DncLKvbdUaBqTQrZ -DoCjjvbduDDUwWPP -DoDKjvbdNsUVfduQ -EObkKvbdvOszpjoU -EObkKvbdNsTvGdtp -EPDKjvbdxwhiapZk -DoDKjvbdiGjCxvJu -DoDLKvbdxxIibPyk -DncKjvbdvAdYroFI -EOcLKvbdLAkGmBwq -DncLKvbdIsYaTMxM -EPDLKvbdFejRmiUR -DoCkKvbdbrbjscia -DoDLKvbdiHJbyWJu -EOcKjvbdIwtBhMQp -EObkKvbdpfDdtVaI -EObjjvbdfMevfmJk -EObjjvbdptUHRrLU -EPDLKvbdYgXEAOri -EObkKvbdZoOJEeZj -DoDKjvbdqUUGqqjt -DnbjjvbdxnTHwriD -EPDKjvbdfHkWRmpg -EPDLKvbdePEsLUUS -EPCjjvbdEPCkLXDE -DoCjjvbdgQBzvdYI -DoCkKvbdZjSgogBf -EObkKvbdtunYKQsA -EPDKjvbdezvYdiTw -EPDLKvbdLBLGmCYR -EObkKvbdSLYfVHKs -EPDKjvbdfILWSNqH -EObjjvbdqlyixkhJ -DoCkKvbdjKFgjNXr -DoDLKvbdyzdmrHhh -DoDLKvbdYpleImEq -DoDKjvbdUxgtZkPO -EPDLKvbdJKEAKPgE -DoDKjvbdRXODblHc -DoCkKvbdmozYujxb -EOcKjvbdMgCpMouL -DncKjvbdZsiJZESn -EPCkKvbdzROmIiwA -DnbkKvbdEOcLKvbd -EPCjjvbdpxoIHRDx -DnbkKvbdEJgivXjA -DoDKjvbdfHjurOQg -EObjjvbdyYIjCPzL -DoCjjvbdvlvANEEm -DncLKvbdOXoVzdOU -EObkKvbdatagYKtI -DnbkKvbdGYtuAcwb -EObkKvbdegjuqnRH -DnbkKvbdtumxKQsA -DnbkKvbdIxTbILqQ -DncKjvbdIsZBTMxM -EPCjjvbdRjyFuHLT -EOcKjvbdJXtCIMQp -DoDKjvbdYkqdUOLm -EObjjvbdZsiIyESn -DnbkKvbdhtyeWrUb -EPCjjvbdEuyQPmKF -EOcLKvbdeFOrCWcK -DoDLKvbdEvYpPlie -DoCjjvbdZtJIyETO -EPCjjvbdrWokcJYq -DoDLKvbduaDySneI -DncLKvbdsPunjCuf -EObkKvbdpyOhGpcx -EObkKvbdliDsqUqa -DoDLKvbdhaoCeXQq -DncLKvbdaRfChUFk -EOcKjvbdYTMAlsoY -EPCkKvbdfkGzbfAE -EOcKjvbdURQnttgm -DoDLKvbdDoCjjvcE -DncLKvbdCJKbLJGK -EPDKjvbdhlFEOVDZ -DnbkKvbduCcVWvOo -EPCjjvbdQdDBPpcr -EObkKvbdbBVdeopX -DnbkKvbdWHwuwfxz -DoDLKvbdsrqrxzFD -DoDKjvbdCSaCsfXS -DoCkKvbdNPxQunGs -EPDLKvbdyzeNrHhh -EObjjvbdWXIwudFH -EPCjjvbdKWVFceHJ -EOcLKvbdqwPlCiZR -DncLKvbdyOTHwsJD -DncLKvbdxUleRZMO -DnbjjvbdZHWdAPTJ -DoDLKvbdePEsKstS -EPDKjvbdHDkVjBij -EObjjvbdSPtHJecw -EObjjvbdyTOJNRag -EOcKjvbdhfibxuiu -EOcKjvbdRDbaPqES -DnbjjvbdemGWflik -DoDKjvbdwjwEHzzG -EObjjvbdsCGNMGjy -DnbjjvbdssRsYyeD -DoDKjvbdJvVFceGi -EPCkKvbdLZQjSzuG -DoDLKvbdqUUHSSLU -EPCjjvbdaaWEeoow -EPCjjvbdDjHiuxKA -EPDKjvbdZQmFIleR -DoDKjvbdRDbaPpdS -EPCjjvbdZoOJFFZj -EObjjvbdQmYBxnUz -EPDKjvbdKCibqKDY -DoDLKvbdsCFmMGjy -DncKjvbdKaKgMaxR -DoCjjvbdrMzJxkhJ -EObkKvbdeKKRutzn -EPCkKvbdcTCjscjB -EPCkKvbdZsiIyDrn -EObjjvbdnBjXXoOV -DoDKjvbdBiKakIfK -EOcKjvbdRpTfjGEX -DoCkKvbdtSqrxydc -EObkKvbdHDkVjBij -DncLKvbdqTsgSSLU -DncLKvbdzdzOzdzQ -DoDLKvbdVrNwadlD -DncLKvbdSQUGifEX -DncLKvbdxxJKBoyk -EPCjjvbdrzLpSaIO -DnbkKvbdhtyeXRuC -DoDKjvbdyTOImSBg -EPDLKvbddZxpXxqC -DoCkKvbdZMSDsnLm -DncLKvbdEARhlzXX -EPDKjvbdkWXOECYX -EObkKvbdSLYetgLT -EPDKjvbdTfznLvvF -DoCjjvbdSZjHrcWA -DncKjvbdmJDsptqa -EOcLKvbdZxdJmblS -DnbjjvbdKWUfDeHJ -EPCkKvbdLiBkpxAS -EObkKvbdePFSkTtS -DoDKjvbdYzbfSKWZ -EPCjjvbdvAdYsPFI -EObkKvbdTAFJIBnd -DnbkKvbdsZkpSaHn -DoDLKvbdczZQYZRC -EPDKjvbdTvMQKTaR -DnbkKvbdyYJKCQZk -EPCkKvbdVAaqTQqy -EOcLKvbdbPfgDkzd -EObkKvbdePErjssr -EPDLKvbdyTOJNRag -EPDLKvbdyTNiNSBg -DoCjjvbdqvpMCiYq -DoDKjvbdRpUHKGEX -DoCjjvbdDoCkLWbd -DncLKvbddCTNSATm -DoCkKvbdcSbkUEJa -EPDLKvbdzjVPocrt -DnbkKvbdxVNFQyLn -DnbkKvbdSKyFtfkT -DoCkKvbdmpZxukZC -DncLKvbdGFjSOJTq -EOcKjvbdhkdcmtcZ -DoCjjvbdyzeORghh -EPCkKvbdRbDeMJZL -DoDLKvbdZMRctOMN -EObjjvbdAMgySvyx -EOcLKvbdTYLMNzkY -DnbjjvbdmuVZjjSG -DnbkKvbdZsiIyDrn -EPDLKvbdjEjfuPAO -DoCjjvbdkxrrSxgU -DncKjvbdSLYfUfkT -DnbjjvbdBcpAvJmG -DoDLKvbdSPsgKFcw -DoCkKvbdrXQMDIyR -EObkKvbdKVuFdEfi -DnbkKvbdrSVLOLBN -DoDKjvbdZnmhdeZj -DoDKjvbdNHDQNPuL -DoDKjvbdpyOggREY -DoCkKvbdQvmcblID -EPCkKvbdMfbomQVL -EPCjjvbdNVTRjmAX -EOcKjvbdbhlijevx -EObkKvbdWWiXvEFH -DncKjvbdlqyVZrdJ -DnbjjvbdrSUkNjaN -DncLKvbdmSZUzTDi -EObjjvbdZQmEhmEq -EOcKjvbdiLdcnVDZ -EObkKvbdySmhlqag -DnbjjvbdbUagYLTh -DncKjvbdBdQAvKNG -DncLKvbdyzdnRghh -EObkKvbdLZRKSztf -DoDLKvbdRXOEDMHc -DncKjvbdFkFSbgmV -EPCjjvbdZQldiMeR -EPDLKvbdFfJqmiTq -EOcLKvbdpssgRrKt -DnbjjvbdKRZeOeme -DnbkKvbdnPzYvLZC -DoDLKvbdUVlQJsaR -EPCjjvbdqFceTvAh -EPDKjvbdEARhlyvw -EPCjjvbdNGbolotk -DoCjjvbdVhYWXgYz -DoCjjvbdUtMtFkvK -DncKjvbdZQldhleR -DnbjjvbdCEPaWKMf -EObjjvbduWOXjQsA -EOcKjvbdIjEAKPfd -DoCjjvbdURRPUuIN -EObkKvbdbhmKKfWx -DoDKjvbdxrnJMrCH -EObjjvbdGFirNiTq -DoDLKvbdtSqsZZeD -EPDLKvbdKkAhWAJy -EPCkKvbdbVBgYKsh -DoCjjvbdKWVFdFGi -EPDKjvbdwXMAuaWV -DoCkKvbdRXNdCkhD -EPCjjvbdZRMdhmEq -DncLKvbdcJMijfWx -DnbkKvbdZRNEiNFR -EObjjvbdAMhYrvyx -EPDLKvbdijGIJmXr -DoCkKvbdbhmJjfXY -EOcLKvbdrzMQTBHn -DnbkKvbdKVtfEEfi -EPCkKvbdxVNFRZMO -EPDLKvbdjcMLQgUg -EObjjvbdjuwODbXw -EObkKvbdZeXfzhJC -EPCkKvbdUyITyjoO -EPCkKvbdGFjRnIsq -DnbjjvbdIwsbHlRQ -DncKjvbdtTSTYzEc -EPDKjvbdhfjCyWKV -DoCjjvbdhytelQnG -DoDKjvbdxnTHxTIc -EOcKjvbdUQqPUtgm -EPDLKvbdkNCMZdgP -DnbkKvbdGKeTDINV -EOcLKvbdZMRcsmlN -DnbjjvbdRXNdCkgc -DoCjjvbdRXNccMHc -EObkKvbdRjyFuGjs -EPDLKvbdmJDtRUrB -DoDLKvbdpyPIGpdY -EPCjjvbdkNCLzEgP -DoDLKvbdZoNiFEzK -DoDKjvbdKVuFcdfi -DoDKjvbdqZOggQdY -EPCkKvbdSQTgJecw -EOcKjvbdrRuKnLAm -EObkKvbdbUbHYLUI -EOcLKvbdyNrgwsJD -DoDKjvbdegkVqnQg -DnbkKvbdGBOpxizm -EObkKvbdJbjDQicY -DncLKvbdSLZFuGjs -DoCkKvbdGckVibJj -DoCkKvbdzeZnzdyp -EObjjvbdxxJKCQZk -EObjjvbdJpzFPGNe -EPCkKvbdUsltGLvK -DoDLKvbdziuQQDsU -DncLKvbdRzKIScWA -DoCkKvbdSLYfVGjs -EPCjjvbdhgKDYujV -DoDKjvbdtunXjQsA -EPDKjvbdqceJPnWB -DncKjvbdUQqOuUhN -EOcKjvbdJvVFceHJ -EPCkKvbdMfcPmQVL -EObkKvbdNrsufdtp -DncLKvbdUQpnuUhN -DncKjvbdYkqdUOMN -EObkKvbdqceJQNvB -EPDLKvbdCWzdJFPv -DncKjvbdauBfxLTh -DncKjvbdZnnJEdyj -DncLKvbdEvYpPlie -DoDLKvbdhaoCdvpq -EObkKvbdCEQBVimG -EOcKjvbdBiKbKhfK -DnbkKvbdeuzwpJzs -DncLKvbdhlEcnVDZ -EObkKvbdkCkjpftg -DncKjvbdZQldhmEq -DoDKjvbdFyVVBEXb -DncKjvbdZirgogCG -EPCkKvbdWXJXvEFH -DnbkKvbdOStVfduQ -DnbkKvbdNGbpMouL -EObkKvbdcIljKfXY -DoDLKvbdXrlBMsnx -EOcLKvbdfNFwGmJk -EObjjvbdUQqPUuHm -DnbjjvbdEXxLtUTl -EPDKjvbdLGFhCBQu -DncKjvbdTYLLmzkY -DoCkKvbdkaNPNALA -DoCjjvbdFxtuBDwb -EPDLKvbdGGJrNhsq -DoCkKvbdZyEJnDLr -EObkKvbdDxXlTssl -EPCkKvbdGKdrbglu -EOcLKvbdmoyyVjxb -DnbkKvbdRNYByNtz -EObjjvbdGFirOItR -DoCjjvbdxUmFRZLn -EPCkKvbdsQWPJcWG -EPCjjvbdegkWSORH -DncLKvbdYzcGRjVy -DoCkKvbdRXNcblHc -EObkKvbdwtldqYkn -DnbkKvbdZisHpGaf -EPCkKvbdGQASvfey -DnbjjvbdeFPRavbj -EOcLKvbdGZVVBEYC -EPCkKvbdKDKDQicY -EPCkKvbdUsmUFkuj -DoCkKvbdatbHXjtI -EObkKvbdlrYtyrdJ -DnbjjvbdjKGHilwr -EOcKjvbdjlakyeGo -DoDLKvbdnPzZVkZC -DnbjjvbdCIjbLJFj -DoCkKvbdegkWSORH -DoDLKvbdjvXODbYX -EPDKjvbdaaVeFoow -DncKjvbdwtmFRZLn -EObkKvbdkNCLzEfo -DncLKvbdrbGMlGkZ -EObjjvbdczZQXxqC -DoCkKvbduaEZTOdh -EObjjvbdZxcjNbkr -EOcKjvbdCJKbKiFj -DnbjjvbdjEkGuPAO -DnbjjvbdZshhyDsO -DoDLKvbdbsCkUDjB -DoCkKvbdNddUIhkE -EPDLKvbduVnYJpsA -DnbjjvbdQvmccMHc -DoDKjvbdDjIKWXjA -DoDLKvbdxZhGGYEr -EObkKvbdqquKmkBN -EObjjvbdLBLHMawq -DoDLKvbdrbFmLgLZ -EPDLKvbdddnrBwCj -DoCkKvbdbrcLUEKB -DoDKjvbdqlyjYlHi -DncKjvbdQwNdDMID -EObkKvbdBiLCKhej -EPCkKvbdSZigsDWA -DnbkKvbdwuNFRYlO -EPDLKvbduCbtvvOo -DnbjjvbdaaWFFpPw -EObkKvbdRECaQQdS -DncKjvbdyOShXsJD -EPCkKvbdFVyPomJe -DoDLKvbdcJMijevx -EObkKvbdSZigsCvA -EObjjvbdrNZjYlHi -DnbkKvbdKfFhBaRV -EPDLKvbdSLZFtgKs -EPDLKvbdrbGNMGjy -EPCjjvbddwzTtSFz -DoDLKvbdnGdxNNgZ -DncLKvbdTfzmlWue -EOcKjvbdbLLfOmcA -DoDLKvbdNGcQNPuL -DncLKvbdUaCQsQqy -EPCjjvbdCfkfHAzc -EPDKjvbdlrYuZsDi -EPDLKvbdmajXYPOV -EObjjvbduCcUvvOo -DoDLKvbdJXsahLqQ -EPCkKvbdOSsugEuQ -DnbkKvbduaDyTOeI -DncLKvbdYqNEhldq -EOcLKvbdeOdsKtUS -EOcKjvbdkHgLefOL -EPCkKvbdrpVoKCuf -EObjjvbdShzJqAAl -DnbjjvbdgPazwDxI -EPDLKvbdEztQdlDJ -DoDKjvbdYpmFImFR -DncLKvbdsBellHLZ -DoCjjvbdatbHYKsh -DoCjjvbdptTgRrLU -EOcLKvbdznpRFCkx -EPCjjvbdWWiYWEFH -EPCjjvbdRosgJedX -DnbjjvbdkIGkefOL -DnbjjvbdiZuGLqNf -EPCkKvbdANIZTWyx -EObjjvbdZQmFJMdq -EObkKvbdjvWmcbYX -DncLKvbdRbEFMJYk -EOcKjvbdpfDdtVaI -EPDKjvbdJqZePFnF -DnbjjvbdeFOqavcK -DoCjjvbdnHFXlnHZ -EPCjjvbdTvLpKTaR -EPDLKvbdVgxVxHYz -EObkKvbdZRNFJMdq -EPDLKvbdbUafwkUI -EObjjvbdKCjDQibx -EPDLKvbdrXPlChyR -DoCjjvbdxsNhlqbH -DoDKjvbdNGbomPtk -EPDLKvbdLBLGmBwq -DncLKvbdIsZBTNYM -EPDLKvbdOXnuzcmt -EPDKjvbdKDJcRJcY -EObkKvbdiBncFWqR -DncLKvbdlhcsqUrB -DncKjvbdrylQTAgn -DoDLKvbdTlWOaWOi -EPCkKvbdegjurNpg -EObjjvbdyTNhmSBg -EPCjjvbdQccBPpcr -EPDKjvbdeOeSkTtS -DoCjjvbdGYuVAdXb -EObjjvbdrzMPsAhO -DncLKvbdrEFJQOVa -EPCjjvbdbhmKKfWx -EPCkKvbdeYZssqez -DnbkKvbdURQntuHm -EPDLKvbdkDLkRHVH -EOcKjvbdlZSrSxft -EObkKvbdijGHimXr -EOcLKvbdpxnggQdY -DncKjvbdJKEAJpGd -EPCjjvbdMowpumfs -DoCkKvbdmSYtysDi -DoDLKvbdBsBDTfWr -EPDLKvbdrMzKZMHi -DnbkKvbdBraDUGWr -DnbjjvbdDxYMTtTl -DncKjvbdFyUuBEYC -EPCkKvbdVZITzKnn -DnbkKvbdTkvPBWPJ -EObkKvbdSQTfjFdX -DoCjjvbdZisIPgBf -EPCkKvbdLGFhCAqV -DoCjjvbdNGcQNPuL -DoCkKvbdqlzJyMIJ -EObjjvbdZtIiZDrn -DnbjjvbdeEoRawCj -DoDKjvbdUaBqSqRy -EOcLKvbdmfdwmOGy -DoDKjvbdptTfqrKt -DoDLKvbdvAcxsPEh -DoCkKvbdySmhmRbH -EOcLKvbdhfjDZWKV -EOcKjvbdHffzZXxH -DoDKjvbdLFfHaaQu -EPCjjvbdgFlZmfgA -EOcKjvbdtcCuXVno -DoDLKvbdZirgpGbG -EObjjvbdNsUWHEuQ -DoDLKvbdsBfNLgKy -DoDKjvbdGGKRnJUR -DoDLKvbdKkAhWAKZ -DnbjjvbdOFDtJJKd -EPCjjvbdMuSrKmAX -DnbjjvbdyXiKBpZk -DncLKvbdOFDtIhjd -DoDKjvbdNPxQumgT -DnbjjvbdrSVLOKaN -EPCjjvbdmJDtRVRa -EPCkKvbdZeXfzgiC -DoDKjvbdhaoCdwRR -DncKjvbdiBncFXRR -EPDLKvbdvBEYrndh -DnbjjvbdBiLBkIfK -EPDLKvbdhgJbyVjV -DncKjvbdzRPNIiwA -DnbjjvbdegjvRmpg -DncLKvbdyYIibQZk -EPCkKvbdxnTIXrhc -EPCkKvbdhkeEOUby -DnbkKvbdjJehKMxS -DoDKjvbdkVwODbYX -EPCkKvbdFWYpQNKF -EPCjjvbdXrkaMsnx -EPDKjvbdRjxetgLT -DoDKjvbdEztRFLbi -DnbkKvbdqdFJQNua -EPDLKvbdTqQntthN -DoDLKvbdYORAXtvU -DnbjjvbdEYXksstM -EPDKjvbdkMbMZdfo -DncLKvbdJKEAKQGd -EOcKjvbdFejSOJUR -DoCjjvbdYlRdTmkm -DoDKjvbdlYrqrxgU -EPDKjvbdKVuFdFGi -EOcLKvbdJqZeOfNe -DnbkKvbdzoPpdcLx -DoDKjvbddePSCXCj -DoDKjvbdEASIlywX -DoCjjvbdrEEiPmua -EPCkKvbdidkGuPAO -EObjjvbdKRZdnfNe -DncKjvbdhgJcZWJu -EPDLKvbdZxcimbkr -EPDKjvbdNeEUIiKd -EOcKjvbdvAdZSndh -DncLKvbdjggMGGNk -EObkKvbdOStVgFUp -EPCkKvbdRaceMIxk -DncKjvbdDwxMUUUM -DncKjvbdWeyZtAPT -EPCjjvbdEYXkstTl -EOcKjvbdxsOJNSBg -EPCkKvbdKQzFPFnF -EOcLKvbdJXtCHkpp -DoCjjvbdtlYXBUBX -EPCjjvbdwuNFRYkn -DoDLKvbdkDLjpfuH -EPDKjvbdxrmhlqbH -EOcLKvbdjmCLzEgP -DoCjjvbduaEYsPFI -EPCkKvbdCEPaWJmG -DncKjvbdwtmEpxlO -EPCkKvbdJbjCpjCx -DnbjjvbdhzVGMRNf -EPCkKvbdZxcinDMS -DoCkKvbdrNZiyLgi -EOcLKvbdIHGyyYYH -EObkKvbdYNqAXuWU -EPDKjvbdtvNwjRTA -EPCkKvbdcJMjLFvx -EPCjjvbdNrsvHEuQ -DoCjjvbdnGeYMmgZ -DoDLKvbdSLZGUfjs -EPDKjvbdtvOYKRTA -DoDKjvbdziuPpESt -DoCkKvbdMgDPlotk -DoCkKvbdeFOrCXDK -DnbkKvbdMgColpUk -EPCkKvbdKVuFdFGi -DoDLKvbduCcUvuoP -DoCkKvbdRDcAopdS -EPDLKvbdehKvSNpg -EOcKjvbdDoCjjvbd -DoCjjvbdOSsufdtp -EObjjvbdGQASwGfZ -DncLKvbdiHJcYujV -DncKjvbdRadFMJZL -EPDLKvbdZxcinDLr -EPDLKvbdhaoDFXQq -DoDKjvbdcJNJkGXY -DoDLKvbduaDySoEh -EOcKjvbdUxhUZkPO -DncLKvbdVYhTzKoO -DnbjjvbdehKvRnQg -DnbkKvbdOhAXyAYa -DncLKvbdxsNiNRag -DoDLKvbdTppoVUgm -EObkKvbdURROuVIN -EOcLKvbdNsTugFVQ -DoCkKvbdrXPlChxq -EPDKjvbdHDkWJajK -DoCkKvbdxnTHxTIc -EPDKjvbdEvZPoljF -EPDKjvbdrzMQTBIO -EPCjjvbdqZPHgQcx -DoCkKvbdVqmxCFMD -DncLKvbdSPsgKGEX -DoCkKvbdzjVPodSt -DoDKjvbdnUtyjiqf -DnbjjvbdIBkydzAD -DoDKjvbdcTDKscjB -EOcKjvbdiHKDYuiu -DncKjvbdBraDUFvr -DoCjjvbdQmYCZOUz -EPCkKvbdySnIlqbH -DnbkKvbdkDLjqGuH -DnbjjvbdVqnYCFMD -DncLKvbdGKeTCglu -DncKjvbdlZSqrxft -DncLKvbdrEEhpNvB -EOcLKvbdrDeJQNvB -EPCkKvbdQmXbYmtz -DoCkKvbdQlxCYnUz -EPCjjvbdEObkLWbd -EPDLKvbdehKuqmqH -EPCkKvbdkCkjpfuH -DncKjvbdRXNcblHc -EPCjjvbdsrqrxydc -EPDKjvbdddoSBvcK -EPCjjvbdADRxJzIp -EPDLKvbdvAcxsPEh -EPDKjvbdSLYfUgLT -DoCkKvbdsrrTYyeD -DoCkKvbdLFegbApu -EPCjjvbdyqOliJwA -EPDKjvbdqTtGrRjt -EPCkKvbdhbObdvqR -EPCjjvbdcScLUEJa -DoDLKvbdRWnDblID -EObkKvbdZLrETnLm -DoDKjvbdiBoDEvpq -DoDKjvbdMpXqVmfs -EPCjjvbdpxngfpcx -DncKjvbdsCGNLfjy -DncKjvbdRjyGVHLT -EPDKjvbdkHflGFmk -DoDKjvbdlhdUQuSB -EPCjjvbdKaLGlbXq -EPCkKvbdVhXvXgYz -EOcLKvbdKyQirztf -EOcLKvbdliDsqVRa -DncKjvbdJutfDdfi -DoDKjvbdEXwksssl -DncLKvbdxxIjCPyk -EObkKvbdKaKgMaxR -EPDKjvbdkCkjpgUg -EOcLKvbdZLqctNlN -EPDKjvbdNddThhjd -EOcKjvbdYlSDsmlN -EPDLKvbdmgExNOGy -DoDKjvbdePErjstS -DnbkKvbdZQleIldq -DncKjvbdpssfrRkU -EOcKjvbdDxYMTtTl -EPCjjvbdySmhmSBg -EPDKjvbdiiehJlxS -EOcLKvbdFkFTDINV -EPCjjvbdVqmxCFMD -DncLKvbdIsZAsMwl -DncKjvbdBraDTfXS -EPDKjvbdmuUykJqf -DnbkKvbdFyVUaEXb -EObjjvbdzROmJJwA -DncKjvbdEYXlUUTl -EPDKjvbdBhjbKhfK -DoCjjvbdJpzEneme -DncLKvbdVwIwuceH -EPDKjvbdhfjDYuiu -EOcLKvbdFpASwHGZ -EPDKjvbdZoOJEdyj -DoDKjvbdqdEiPnWB -DoDKjvbdnBjXYPNu -DoCjjvbdiHKCxuiu -EOcKjvbdGLFTChMu -EOcKjvbdiMEdNtby -DnbkKvbdGdKujBij -DncKjvbdKQydneme -DnbkKvbdziuPocsU -DoDKjvbdmfdxNNgZ -EObjjvbdDxXlUTtM -EObjjvbddePSBwCj -EOcKjvbdNPxQvOHT -DnbkKvbdZHWdAOsJ -EPDLKvbdyqPNIiwA -DoCkKvbdpyPHfqDx -EPDLKvbdUslsekuj -EPCjjvbdiZtfLpnG -DoCkKvbdmSZVZsDi -EPCjjvbdpyOhGpcx -EPDLKvbdzitoodSt -DoDKjvbdVYhUZkOn -EObkKvbdBsAbtGWr -EPDKjvbdvBEYsOdh -EObkKvbdGcjuibKK -DncKjvbdeATqNYKG -DoCjjvbdKNAEZgVB -DncLKvbdqUUHSRjt -EOcLKvbdGcjuibJj -DoDLKvbdnBivxPOV -DnbkKvbdKCjDRKCx -DnbkKvbdrykosAgn -EOcKjvbdUaBqTRRy -EPCjjvbdcSbkTcjB -DoDLKvbdIxTbILpp -DoCjjvbdHDjuibJj -DncKjvbduaDxroFI -DoDKjvbdpedEtWBI -EOcKjvbdXsLaNTnx -EPCjjvbdYORAYVWU -DoCjjvbdYpleIleR -DoDKjvbdCDpAujMf -EPCkKvbdpxoHfpcx -DoCkKvbdUWMPisaR -EPCjjvbdmuUzKjSG -EPDKjvbdkxsRsYgU -EPCkKvbdZxcjNblS -DnbkKvbdbPffckzd -EPDKjvbdUVkpJtBR -DoCkKvbdvlvANEFN -EObkKvbdShyjRAAl -EPDKjvbdxrmhmSCH -DoDKjvbdjvXNcaww -EPDKjvbdkDLjqGuH -EObkKvbdhfibxuiu -EPCjjvbdlqyUyrci -EPDLKvbdFVxopMjF -EOcKjvbdqdEiPnWB -DncKjvbdrXPlChxq -DoCkKvbdxVMeRYkn -EPCjjvbdlhdUQtqa -EObjjvbdRotHKFcw -EObkKvbdwjvcgzzG -EPDLKvbdBhkBjiFj -EObjjvbdlZTSTZGt -DoCkKvbdkIHMFemk -EObjjvbddndrkTsr -DoDLKvbdFVxpQNKF -EPCjjvbdZsiJZETO -EObjjvbdiMFEOUby -DoCkKvbdhlFEOUby -EPCkKvbdrWolDIyR -EObjjvbdmajWwoOV -DoCkKvbdypoMiJwA -DoDKjvbdCDpAvKMf -EPDLKvbdzjVQQDrt -EObjjvbdjlakydfo -EObkKvbdJpyeOeme -DoDLKvbdiHJcYvJu -EOcLKvbdbsDKtEKB -EOcLKvbdrpWOjDVf -EObjjvbdelfWfmKL -EObjjvbdxnSgwriD -DnbkKvbdqlyjZLhJ -EPCkKvbdQdDBPqDr -EPCkKvbdRkYfUfjs -EObjjvbdhtydwSVC -DnbjjvbdWWhwvDdg -DoDLKvbdypnliKXA -DncLKvbdhfibxvKV -DncLKvbdxrmiNSCH -DncKjvbdUaBqSqRy -DoDKjvbdZMSDsmkm -DncLKvbdFjeScHmV -EPDLKvbdQYmAHSrK -DoCkKvbdUVlQJsaR -DoDKjvbdGKdsDHmV -EPCkKvbdkHgLfGNk -EPDKjvbdCIkCLJFj -DoCkKvbdrpWOicVf -DncLKvbdqmZiyMIJ -EObkKvbdNGcQMpUk -EOcLKvbdhfibxuiu -DoCjjvbdjcLjqHVH -EPDLKvbdZxdJnDMS -DncLKvbdHDkViajK -EPDKjvbdhytelRNf -EPDKjvbdZRNFIleR -EObjjvbdNQYRWNgT -EPCjjvbdNdcsiIkE -DoCkKvbdajkfOnDA -EPCjjvbdRNYCZOUz -EPCkKvbdBcpAvKNG -DncKjvbdqTsfqrLU -EPCjjvbdsZlQSaHn -EOcKjvbdqdFIpNvB -DoCjjvbdtbcUwWPP -EObjjvbdEYYMTtTl -EOcLKvbdgGLzNfgA -DoDLKvbdzdynzeZp -DnbjjvbdajlGPNcA -EPCjjvbdEJhJuxKA -EPCjjvbdLLBIWAJy -DnbkKvbdwzIFewdr -DoCkKvbdBvzciEpW -DoDKjvbdaNKasVNH -EPDLKvbdVviXudEg -EPDKjvbdcbSmSAUN -EPDKjvbdqcdiQNua -EPCkKvbdbBVdfPpX -EOcLKvbdrEFIpOVa -DoDKjvbdDigivXjA -DoDKjvbdYSlBMtPY -DoDKjvbdrRtjnLAm -DoDKjvbdKeegbApu -DnbkKvbdHgHZyXxH -EPCkKvbddwzUTrFz -DnbjjvbduDCtwWPP -EOcLKvbdaRfDHsfL -EPCjjvbddeOqbWbj -DncLKvbdOFDsiJLE -EObkKvbdSBceMIyL -EOcLKvbdrylQSaIO -DncLKvbdJcJcQjCx -EPCkKvbdaRfCgsek -EOcKjvbdzitoocsU -DoDKjvbdyzdnSIJI -EObkKvbddndsLTsr -DoDLKvbdcTDKtEKB -EPCkKvbddZyQYYpb -EPDLKvbdCIjakJFj -DncLKvbdLrWlzVQz -EOcKjvbdxrnIlqag -DncLKvbddeOrCWcK -DoCkKvbdRaceLiZL -EPCkKvbddePSCXCj -DoDKjvbdJpzFOeme -DoCkKvbdiMFEOUby -DncKjvbdUQqPVVHm -EOcLKvbdcSbjscjB -DnbjjvbdvPTzpjoU -EPDKjvbdEPDLKvbd -DncKjvbdvBEYsPEh -DnbjjvbdIxTbIMQp -DoDLKvbdZLrETnMN -EPCkKvbdZxdJmbkr -EPCjjvbdIidAKQHE -DncKjvbdrSUjmjaN -DnbkKvbdkaNOmALA -DnbkKvbdiGjCyViu -EPCjjvbdYkrDsmlN -EOcKjvbdypoMhjXA -DoCkKvbdiGjDZViu -DoDLKvbdZxcinClS -DoCjjvbdqUUGrSLU -DnbkKvbdYTLaNUPY -EObkKvbdehKurNpg -EOcKjvbdmRyVZrdJ -EObkKvbdZirhPgBf -EOcKjvbdpyOggQcx -DnbkKvbdfoazwEXh -DnbkKvbdmuUzLJqf -EPDLKvbdYlRdUOLm -DncKjvbdRjyFuGjs -DoDLKvbdQdDAopdS -DoCkKvbdmSYtysEJ -EObjjvbdQdDApRDr -DoDKjvbdyOTHxShc -EPDKjvbdptUHSRkU -EOcKjvbdLGGHaaRV -EOcLKvbdaaWFFopX -DoCjjvbdlBMnmALA -DnbjjvbdZnnIdeZj -DoCjjvbdZMRdUNkm -DoDLKvbdRMxByNtz -EPCkKvbdJYTahMRQ -DncLKvbdpyPIHQdY -DoCkKvbdVBCRTRRy -EOcLKvbdZyEKODLr -EObkKvbdRadEkiYk -EOcKjvbdcyyQXyRC -DnbkKvbdVqnXadkc -EPCkKvbdGKeTDIMu -DnbkKvbdrRtjnKaN -EObkKvbdFVxooljF -DoDKjvbdDoCjjvcE -DnbkKvbddneTLTsr -EPDKjvbdGcjvKCKK -EObjjvbdgPazvdYI -DoDKjvbdSLYfVHKs -DoCkKvbdEPCjkWbd -DnbjjvbdmaivxPOV -EObjjvbdJJdAJogE -DoDKjvbdhkddNtby -DoCkKvbdiCPDEwQq -EOcKjvbdmajXYOmu -DnbkKvbdqYngfqEY -EOcKjvbdTppoUuIN -EPDKjvbdNddThhkE -DncKjvbdDnbkKvbd -DnbjjvbdZRNEiNFR -EPCjjvbdaaWFFopX -EPDLKvbdBhjbKhej -DoCkKvbdfpBzvcwh -DoDKjvbdmSZVZrdJ -EObkKvbdbAueGQQX -EOcKjvbdNQXqWOGs -EPCjjvbdvAcySndh -EOcLKvbdySnImRag -EObkKvbdSxLLmzkY -DnbjjvbdcJMjLGXY -EObkKvbdBsBDUFwS -DoCjjvbdqlyjZLhJ -EPCjjvbdliEURVRa -DoDKjvbdptTgRrLU -DncKjvbdiBoCdwQq -EOcKjvbdEOcLLXDE -EObjjvbdEYYLtTsl -EPDKjvbdVTmTekuj -DncLKvbdLFegbBQu -EPCjjvbdmttzLKRf -EPDLKvbdpfEFTuaI -DncKjvbdiiegjMwr -EObkKvbdxVNEqYlO -DoCjjvbdRWnDblHc -EPCjjvbdaSFbgtGL -DnbkKvbdozmcjwoA -DoDKjvbdPyNAHSrK -DncLKvbdVqnXbEkc -EPCkKvbdFWYpQNJe -EOcLKvbdlYsRsZHU -EOcLKvbdQvmcblID -EObjjvbdRkYetfkT -DoCjjvbdFjdsDINV -EPCjjvbdrafNMGkZ -EPDKjvbdczZQXxqC -EPDLKvbdDwxLtTsl -DoCjjvbdFpASvffZ -DoCjjvbdiMEdOVCy -DoCkKvbdelevfljL -DnbjjvbdaSFcHtFk -DncKjvbdBhkBkIfK -EObjjvbdGKdsDHmV -DncLKvbdhzUekqOG -EOcLKvbdZshiZDrn -DncLKvbdDjIJuwjA -EPCjjvbdpxoHfqEY -EPCjjvbdOAIrsjSA -EPDLKvbdEuyPolie -EPDKjvbdssRrxydc -EPDKjvbdjlakzEgP -DncKjvbdiUydwRuC -DoCkKvbdZMSDtNkm -EPDLKvbdbBVeGQPw -EObkKvbdNHDPlpVL -DoDLKvbdDjHiuxKA -EPDKjvbdatbGwkUI -DnbjjvbdeqaWzkbo -DoDKjvbdvvlBWAuu -EObjjvbdZirhQHBf -EPCkKvbdDncLKvcE -DnbjjvbdehKvSNpg -DncKjvbdVwIwudFH -DoCjjvbdNQYRVmgT -EOcKjvbdNrtWGeUp -DncKjvbdvvlAvAuu -DnbkKvbdjKGHimXr -EObjjvbdhkddNuDZ -EPCkKvbdNddThhkE -EPCjjvbdsPunjDVf -EPDKjvbdxZgfFwdr -DncKjvbdZyDjNblS -EPDKjvbdjcMLQfuH -DncKjvbdwtmFRZMO -DncKjvbdVhXuwgYz -DoCkKvbdVZITyjnn -EPCkKvbdNrtWHEtp -EPCjjvbdMfbomQUk -EObkKvbddwyssqez -EPCkKvbdhfjCyVjV -DoDKjvbdtvOYJpsA -DoDKjvbdiLdcnVCy -EObkKvbdLrWlzUpz -DoCkKvbdSPsgKFdX -EPCjjvbdkNCLyeGo -DncKjvbdCSaCtGWr -DnbjjvbdRkZFtgLT -DoCkKvbdVAaprprZ -DnbjjvbdyXhibQZk -DoCkKvbdsQVnibvG -EPCjjvbduaDyTPFI -DncLKvbdUaCRSpqy -DoDLKvbdnPzYukZC -DoDKjvbdRWnDcMHc -EOcKjvbdxVNFRZLn -EOcKjvbdRkZGUfkT -DnbkKvbdvmWAMdEm -EOcKjvbdmbKXYOmu -EPCkKvbdyXiKCPyk -DnbkKvbdkHgMFfOL -DncKjvbdVYgtZkPO -EPCkKvbdDnbkKwCd -EObkKvbdKfGHaaRV -EPCkKvbdqZOggQdY -EOcLKvbdTlVnaVoJ -DoCkKvbdhanbeWqR -DnbkKvbdypoMiJwA -DnbkKvbduMXvaUBX -DoDKjvbddiirWUzn -EObkKvbdqYoHgQcx -DnbjjvbdFyUuBDwb -DoCkKvbdKCicQjDY -EPDLKvbdezvYeJTw -EPCjjvbdSxKlNzkY -DoDKjvbdQmYByOUz -DnbjjvbdIGgZxxXg -EPDKjvbdqmZjZLgi -DncKjvbdmfeYMmgZ -DncLKvbdGdLVibKK -DoCkKvbdZGvdAOsJ -EObkKvbdjSzhrkJz -EPDLKvbddePRbWcK -EObjjvbdDxXkstUM -DoCjjvbdvlvANDeN -EOcKjvbdrDdiQOWB -DoCkKvbdmajXXoOV -DncKjvbdUtMsekvK -EOcLKvbdxxJKBoyk -EPDKjvbdqYnhGpcx -EObjjvbdatafwkTh -DncLKvbdajkenmcA -DnbjjvbdZQleImEq -EPCjjvbdDncLKwCd -EObjjvbdHELWKBij -EPDLKvbdxrmhmRag -DoCjjvbdwXMBWBVu -EObjjvbdsPvOjCvG -EOcLKvbdssSTZZdc -EPCkKvbddndrkUUS -EOcLKvbdNGbolotk -EObjjvbdZMSDtNlN -EObkKvbdZshiYcsO -DncKjvbdDwxLsstM -EOcLKvbdqZPIGqEY -EOcKjvbdZRNFImFR -EOcKjvbdrDeIonVa -DnbjjvbdYzberKWZ -EObjjvbdegjvRnQg -DoCkKvbduDDUwWOo -EPDKjvbdRotGjGEX -EOcKjvbdKQyeOeme -EPCjjvbdDwxMTtUM -EObjjvbdpedFTvAh -EPDLKvbdFxtuBDxC -DoCjjvbdlqxtzSdJ -DncKjvbdZLrDtOMN -EPCkKvbdGdKujBjK -DoCkKvbdezvYdiTw -DnbjjvbdrEEiQOVa -DncKjvbdOYPVzdOU -DnbjjvbdxwiKCPzL -EObkKvbdRpTgJecw -DoCkKvbdwtmEpxlO -EPDKjvbdqFceTuaI -DncKjvbdsPuoJcWG -DncLKvbdRyjHsCvA -EPCkKvbdyXiJaoyk -EPDLKvbdJvVFcdgJ -DncLKvbdrXPlChxq -EObjjvbdvBEZTOdh -DoDKjvbdqvokcJYq -EOcKjvbdlqxtzSci -EPDKjvbdFkErbglu -DoDKjvbdEPDLKvcE -EObkKvbdijFhJlxS -DoCjjvbdOFDtJJKd -DnbkKvbdyXhiapZk -DncKjvbdEXwlTtTl -DncLKvbdZyEKOCkr -DnbkKvbdqlyjYlIJ -EObkKvbdIGfyxwxH -DnbjjvbdyNrgxTIc -DnbkKvbdeOeSkTsr -EPCjjvbddZyPxZRC -DncLKvbdkDMKpgUg -EPDKjvbdfIKuqnQg -EPCkKvbdhlFENuDZ -DoDLKvbdiBoCdvqR -EPCkKvbdySnImRag -DnbjjvbdIxTahLqQ -DoDKjvbdZnmhddyj -EOcKjvbdgQBzwEXh -EPDLKvbdfILWSNqH -DncKjvbdjcMKqGtg -EObkKvbdKQzEnfNe -EPDKjvbdUQqPVVHm -EObjjvbdREDBPpcr -EObjjvbdnHExMnGy -DnbkKvbdvBDxrndh -DncKjvbdCEPaVimG -DnbkKvbdGBPQxizm -EPDKjvbdLqwMzVQz -DnbkKvbdEPDLLXDE -EPDKjvbdwWkaWBVu -EObkKvbdxrnImSCH -DncKjvbdsrqrxzEc -DnbkKvbdpfDeUWAh -EPDKjvbdjAQHApGj -DoCkKvbdaSGChTfL -DoDKjvbdiHJbxvKV -EPDLKvbdlhdURUqa -EPCjjvbdIwsahMRQ -EObjjvbdGYtuBEYC -DncLKvbdNeEThhkE -EObkKvbdBvzdIePv -EPCjjvbdbAueFpQX -EOcLKvbdjAQGaQGj -EPCjjvbdNHDQNPuL -DncLKvbddoFSkUUS -DncKjvbdACqxJzIp -DnbkKvbdxLWcgzyf -EPCkKvbdTlVnaWPJ -DoCkKvbdCJKbLIfK -DoCkKvbdDwxMUTtM -EPCkKvbdEPDLKwDE -EOcLKvbdTvMQKTaR -EOcLKvbdeXytTrFz -EPDKjvbdNUrrLNAX -DnbkKvbdZjShPgBf -EObjjvbdjAPfaQGj -EPCkKvbdYlRdUNlN -EPDKjvbdzjUoocsU -DoDLKvbdKDKCqJbx -EPCjjvbdQvnECkhD -DnbkKvbdGckVjBij -EObjjvbdXmqAXuVt -EPCjjvbdeFPRavcK -DoDKjvbdEYXlUTsl -DoCjjvbdXrlBNToY -DoDLKvbdrRuLNkAm -DncLKvbdDxXlUTtM -EOcKjvbdwuNEqZLn -EPDKjvbdEOcLLWbd -DoCkKvbdpfDdtVaI -EOcKjvbdmpZyVjyC -EOcKjvbdtSrSxzFD -EObkKvbdsBemLfjy -DoCjjvbdUGznMWue -DncLKvbdbAvEfPpX -DnbjjvbduCcUwVno -DoDLKvbdTppoUuIN -DncKjvbdYqMeImEq -DoCkKvbdrDdhomvB -EObjjvbdgFkzOGgA -EPDKjvbdSwjkmzjx -DoCjjvbdREDBPpcr -EObjjvbdYkrDtNlN -EObjjvbdZisHogCG -DncKjvbdUtMselWK -DoDKjvbdkHfkeemk -DncLKvbdSLYeuHLT -EOcLKvbdeFOrBwCj -EObjjvbdHDjvKCJj -DnbkKvbdkIGkeemk -DoCkKvbdZQmFJMeR -DoCkKvbdqTtGrSKt -DncLKvbdcIljKfWx -DnbjjvbdRjxfUgKs -DnbkKvbdhyuFlROG -EObkKvbdpxoHfpdY -DoDKjvbdhuZdwRtb -DnbkKvbdBdQAvKMf -DoCkKvbdVTlsekuj -EObkKvbdCJLBkIfK -EOcKjvbdmgFYNNgZ -EPDLKvbdxrnImRag -DoCjjvbdbKlGPODA -DoCjjvbdMoxRVmgT -EPDLKvbdKfGIBaRV -DoDKjvbdSCEElJZL -EPCkKvbdmRxtzSdJ -EPDKjvbdjKGIKNXr -DnbkKvbdlhdTptrB -EPDKjvbdBcoaVilf -EPDKjvbdRzKIScWA -EOcKjvbdnHFXmOGy -EPCjjvbdFfJrNhtR -DnbkKvbdzaAPHHCM -DnbkKvbdwXLaWBWV -DoDKjvbdKeegaaQu -EPCjjvbdRotHKFcw -EOcKjvbdnGeXmOGy -DoCjjvbdmIdTqVRa -DncLKvbdfNGWgMik -EPCkKvbdrovPJbuf -EObkKvbdEvYpPljF -DncLKvbdOYPVzdOU -EObjjvbdrzLosAhO -DnbjjvbdyzdnSIJI -EOcLKvbdIsZArmYM -DoDLKvbdvAdZTPEh -DoCkKvbdQvnDcMHc -EObjjvbduMYWaUBX -DncKjvbdUyHszLOn -EPCkKvbdbrbjscia -EObjjvbdTkunaVni -EObkKvbdeATpmYKG -EOcKjvbdqUTfqrLU -EPDLKvbdGYttaDxC -EPDKjvbdRNYByNtz -DncLKvbdADRwizJQ -DncLKvbdKfFgaaQu -EPDKjvbdxZhGGYFS -DncLKvbdwtmFRYlO -EOcLKvbdehLVrNqH -DnbkKvbdKxpirztf -DoCjjvbdZxdKNcLr -DoDLKvbdrbFmMGjy -DoDLKvbdqYnhHQcx -EPCjjvbdGKeTDIMu -EPCjjvbdZRNEhleR -DnbkKvbdfMfXGmJk -DnbjjvbdRjyGVHKs -EPDKjvbdZHXEAOri -EObjjvbdxnTIYTIc -DnbjjvbdTpqOttgm -EOcLKvbdWXIwuceH -EOcLKvbdzROmJKXA -EPCkKvbduCbtwWOo -DncLKvbdJTZBTMwl -EObkKvbdlqyUysDi -DnbjjvbdrpVoJcWG -DoCjjvbdHDjvKCKK -EObkKvbdVwJXvDeH -EPDKjvbdZsiJZDrn -DoCkKvbdhfjDYvJu -DoDLKvbdZyEJmcLr -DnbjjvbdmajXXoOV -DoCkKvbdelewGmKL -DoDLKvbdUtMsfMVj -EOcKjvbdegjuqmpg -DnbkKvbdZMRctNkm -DncKjvbdhlEdOUcZ -DoDLKvbdqAiFAXIE -EObjjvbddBsMrAUN -EPDKjvbdaSGDHtGL -DnbjjvbdbVCGwjtI -DncLKvbdzdzOzeZp -EPDKjvbdKQyePFnF -EPDLKvbdauBgXjtI -EPDLKvbdCSaCtGWr -DnbkKvbdbsCjtEKB -DoDKjvbdCWzdIeQW -EPCkKvbdRbDeLhxk -EObjjvbdOEctJIkE -DoCkKvbdSPtGiedX -DncKjvbddZyPxZRC -DnbjjvbdTukpKUBR -DoCjjvbdpstHRqkU -DncKjvbdNdctIhjd -EOcKjvbdUWMPjTaR -DoCkKvbdLGGHbApu -EObjjvbdmozZWLZC -EObjjvbdULvPAvOi -EPDLKvbdcJMikFvx -DncLKvbdjJfHjMxS -EPCjjvbdqYoIHREY -DoCjjvbdiifHjNXr -EObkKvbdZLrETnMN -DnbkKvbdtSqsYydc -EPDLKvbdCIkCLJFj -DoCkKvbdliDsqUrB -DnbkKvbdNPxQumgT -EPDKjvbdACrYJyiQ -EOcLKvbdYTMBMtOx -DoDLKvbdNGcQNPtk -DncKjvbdtbbtvuno -DncKjvbdZLrEUNlN -DoCkKvbdaogHELzd -DoCjjvbdgFlZmfgA -EPCjjvbdvPTzpkOt -DoCjjvbdjKGHjMxS -EPDLKvbdauBgXjsh -EOcLKvbdiBoCeWpq -EObkKvbdSPsfjGEX -DnbkKvbdzGxlAMeX -DoDLKvbdqFcdtWAh -EPCkKvbdOYOuzcmt -DoCjjvbdDwxLtUTl -DnbkKvbdOTUVgFUp -DnbkKvbdiGibyWJu -EPCjjvbdUyITzLOn -DoCkKvbdbLMFnnDA -DoCjjvbdDwxLsssl -DncLKvbdBiLBjhfK -EPDKjvbdNPwpvOGs -EObkKvbdzQnliKXA -DoCjjvbdeYZssqez -DoCjjvbdeATplxKG -EOcLKvbdRyjIScWA -EPDKjvbddeOqbWcK -EPDLKvbdACrXjZhp -DnbjjvbdmuVZkKSG -EPDKjvbdVqmwbFLc -EPCkKvbdCSaCtFwS -DnbjjvbdVZHszLPO -DoDKjvbdVrNxCFLc -EOcKjvbdegjuqnQg -EPCjjvbdZMSETmlN -EOcKjvbdHDjvKBjK -EPCkKvbdyOTIXsJD -DoDKjvbdnQZyWKxb -DncLKvbdxwhiaozL -DncLKvbdNdcshhkE -EPCjjvbdXnRAYUut -DoDLKvbdNsUWGeUp -DncKjvbdWHwuwfxz -DnbkKvbdRpUGifEX -DnbjjvbdEOcLKwCd -EPDKjvbduaEYsOeI -DnbkKvbdjhHLfFnL -DncLKvbdZoOJEeZj -EPCkKvbdEPCjjvcE -EObjjvbdxUldqYkn -EObkKvbdOEdThiLE -DnbkKvbdjcMKpgVH -EObjjvbdkIGkeenL -DncKjvbdZsiJZDrn -EPCkKvbdxnShXsIc -DoDKjvbdZnmiEdzK -DoCkKvbdVTmUGLvK -EOcLKvbduCcVXVno -EObjjvbdZQleJNFR -EObjjvbdFejRmhsq -EPDLKvbdaMkBruNH -DoCkKvbdNQXqWNgT -DoDKjvbdjuwNcbXw -EPCjjvbdSBceLiYk -DoCjjvbdMgColpVL -DoDLKvbdVZHtZkPO -DoDKjvbduMYXBUAw -EPDKjvbdNeDshiKd -DoDKjvbdTAFJICPE -EObjjvbdJvVFceGi -EObjjvbdNHCpMpUk -DnbkKvbdijGIKNYS -DoDLKvbdDncKkXCd -DncKjvbdkMakyeGo -EObkKvbdjKFgilwr -DoCkKvbdOhAXyAZB -DoCkKvbdUGznMWvF -EOcKjvbdRosfifEX -EPDLKvbdfNFvgMjL -EObkKvbdxxJJbPzL -EPCjjvbdQlxCYmtz -EOcLKvbdgPazwEXh -DoDLKvbdkySrTYft -DoDLKvbdhgKDYuiu -DoDKjvbdYkrETmkm -EObjjvbdNPwpunHT -EOcLKvbdYlRdUNlN -DnbkKvbdZLrDtOLm -EObjjvbdxrnJMrCH -EObjjvbdZnnIeFZj -DoCjjvbdzRPMhiwA -DncKjvbdssSSxyeD -EOcLKvbdjAPgAofj -DncKjvbdRosfifEX -DoDKjvbdEXwktUTl -DnbjjvbdWRmwadkc -EPDLKvbdeEoRavbj -DoDKjvbdXsMBNToY -DnbkKvbdVqmxCFLc -EOcKjvbdkVwOEBww -DoCjjvbdfNGXGmJk -EOcLKvbdmtuZjiqf -DoCkKvbdnPyyWKyC -EObjjvbdJpydoGNe -DnbkKvbdjJfHimYS -DoCkKvbdyXhjBozL -DoCjjvbdkIHLeenL -EOcLKvbdTAEiIBoE -DnbkKvbdvBDxsPFI -DncKjvbdlhdTpuRa -EObjjvbdFfJqmiUR -EPCjjvbderAvzkbo -DncLKvbdwygeexEr -EObjjvbdSBdElJZL -EOcKjvbdySmiMrBg -EPDKjvbdatbGwkTh -DncKjvbdnBivwnmu -EPDKjvbdFxuVAdYC -EPDLKvbdqlzJyMHi -EPDKjvbdZRMdhldq -DoCjjvbdNeDtIhkE -DoCkKvbdfMewGlik -EOcLKvbdhaoDEwQq -DnbjjvbdIwsagkqQ -DncKjvbdkIHMGFnL -DoDLKvbdGdKuibKK -DnbjjvbdTAEiICOd -DncLKvbdNeEThiKd -EObkKvbdYpmEiNFR -EPDLKvbdFkFTDHlu -DoCkKvbdkDLkRHUg -DnbkKvbdyYIjCPyk -DncLKvbdFVyQPmKF -DnbjjvbdZQldhldq -DoDKjvbdVqnYBdkc -EPDKjvbdSKxeuGkT -EPCjjvbdiZuGLqNf -DnbjjvbdJTZArmXl -DnbkKvbdyNrgwrhc -EOcLKvbdrNZiyLgi -DncKjvbdSBdFMJZL -EPCkKvbdfMfWfmKL -EPDLKvbdfMevfljL -DoCjjvbdmIcsqVRa -DoDLKvbdrEEhpOVa -EPDLKvbdZRMeImEq -DoDLKvbdyTNiMrBg -EPCjjvbdsQVnibvG -EOcKjvbdvBDxsPFI -DoDKjvbdqquKnKaN -DncLKvbdqGDeTuaI -EPCkKvbdZdxGzgiC -DoDKjvbdkDLkQftg -DoDKjvbdePEsKtUS -DoDKjvbdUxgtZjoO -DncLKvbdxUmFRYlO -DnbjjvbdwuMeRYkn -DoCkKvbdRWmdClID -EPDLKvbdCDpBWJlf -DncKjvbduaEYrneI -DnbjjvbdfHkVqmpg -EPDKjvbdKxpirzuG -DoDLKvbdZLqdUNkm -DoDLKvbdDwxMTstM -EOcKjvbdrzLosAhO -DnbjjvbdqZPHgQdY -EObkKvbdjggMFfNk -EPCjjvbdZMRcsmkm -EObjjvbdEJgiuxKA -DncLKvbdZtJJZDsO -EObkKvbdRjxeuGkT -DncKjvbdqdFJPmua -DoCkKvbdGYtuAcxC -DoCjjvbdZnmheEzK -DoCkKvbdKWUfEFGi -DoCkKvbdfMfXGmKL -DnbjjvbdjvWmcbXw -DnbkKvbdyzeORhJI -EPDLKvbdpstHRqjt -DoDKjvbdTukpKUAq -DoDKjvbdSPtGjFcw -DncKjvbdWSNxCFMD -DnbkKvbdjlalZdgP -EOcLKvbdkxsRsYgU -EObjjvbdLFfICApu -DoDKjvbdCEQBWKMf -DoDKjvbdbAvFFpQX -DoCkKvbdhgKCxvKV -DncLKvbdjcMLQgVH -EPCkKvbdzitpQDrt -EOcKjvbdNVTRjmAX -EPDKjvbdkxsRsZHU -DoDKjvbdKDJcRKCx -EPDKjvbdFjeScHmV -EPCkKvbdZjTIQHBf -DnbkKvbdlqyUyrdJ -DoDKjvbdehKurORH -EObjjvbdbKlFoODA -DoCkKvbdwtmFQyMO -DoCjjvbdXnRAYUut -DoDKjvbdxsOIlqbH -DncLKvbdyNsIXrhc -DoDLKvbdCEQAvKNG -DncKjvbdRotHJedX -EPDLKvbdVZHsyjoO -DnbjjvbdkCkkRHVH -DoDKjvbdRWmcblHc -DncLKvbdqvokbiYq -DoDLKvbdRkZGVHLT -EObjjvbduCbuXVno -DoCkKvbdEJgivYKA -DoDKjvbdkWWnDbYX -EPDKjvbdnGdxMmfy -DoDLKvbdIHGzYxYH -DoDKjvbduCbtwVno -EObkKvbdqlyjYkgi -EObjjvbdVwIwudEg -DnbjjvbdfRaWzkcP -EPCkKvbdEARhlzXX -DnbkKvbdfMevfmJk -DncLKvbdZyDjNcLr -EOcKjvbdtAHQhABS -DncKjvbdkClKqGtg -DoCkKvbdEObkLXCd -EObjjvbdFkFTDINV -EOcKjvbdEztQdkcJ -DoCkKvbdKaLHNBxR -EPDLKvbdhaoCdvqR -EObkKvbdrJAJdmOe -EObjjvbdrpVnjCuf -EPCkKvbdFjeTCglu -DoCjjvbdqdEiPnWB -EPDKjvbdGFirOJUR -EPCkKvbdJmADzHUa -EPCjjvbdWWhwucdg -DncLKvbdBhkBjiFj -DoCkKvbdSZihSbvA -DncKjvbdZtIiZETO -EPDLKvbdCTAcUGXS -DoDKjvbdVqmxCFLc -DncLKvbdmajWwoOV -EPDKjvbdVhYVxHYz -DoDLKvbddoFSjtTr -DoDLKvbdrzMQTAgn -DoCjjvbdUVlPjUBR -EPDLKvbdtvOXipsA -DoCjjvbdrouoKCvG -EObkKvbdOSsufdtp -EPDLKvbdIGfzZXxH -EObkKvbdbQGgDkzd -DoCkKvbdOFDtJIkE -EPCjjvbdiHJbyWJu -DnbjjvbdLAkHMaxR -EPCkKvbdJTZBTMwl -DncLKvbdSQTfjGEX -EOcLKvbdlrZVZrci -EObjjvbdkyTSTZHU -EPCjjvbdxUleQxkn -EPDLKvbdEKIKWYKA -DoCkKvbdZHWdAPSi -EPDLKvbdxVNFRZMO -EPDLKvbdcSbkTcjB -DoCkKvbdlYsSTZGt -EPDKjvbduaDxroFI -EObkKvbdNHDQMouL -DoDLKvbdxrnJMqbH -DnbjjvbdmfeXmOGy -DoDKjvbdidkGtoAO -DnbjjvbdGYtuBEXb -DnbjjvbdRECaQQdS -DoCkKvbdmajXXnnV -DncKjvbdZMSEUNlN -EPCkKvbdZtJIxcrn -DncLKvbdJpydneme -DncKjvbdVviYWEEg -DoDLKvbdyXhjBoyk -DoCjjvbdbhlikGXY -DnbkKvbdVviXudFH -EPCkKvbdYTMAlsnx -EPCjjvbdxZhFeweS -DoCjjvbdyNsIXriD -DoDKjvbdznoqEcMY -DnbjjvbdauCHXjtI -DncKjvbdIsZAsMwl -EPCkKvbdZMSDtOLm -DnbkKvbdJqZePFme -EPDKjvbdkHfkeenL -DoDLKvbdaNLCStmH -DncLKvbdIwsbHkqQ -EObkKvbdfHjvRnRH -EPCjjvbdlqyVZsDi -EObkKvbdEuxoolie -DoDKjvbdjAPgAofj -EOcLKvbdjcMLRHVH -DncKjvbdjKFgjNXr -EPCkKvbdmIctQuRa -DncLKvbdJpyePGOF -DncLKvbdNGbpMouL -EObkKvbdpfDdsuaI -EPCjjvbdyzeORhIh -DoDKjvbdrDdhpNua -DoCjjvbdFfKRmhtR -EPDLKvbdpfEEsuaI -EPDLKvbdqcdhpOVa -EPCjjvbdVYgsykPO -DoDLKvbdDncLLXCd -EObkKvbduaEYroEh -EOcLKvbdkNBlZeHP -EObjjvbdGcjvJajK -DncLKvbdrpVoJbuf -EObjjvbdEKIJuxKA -DncKjvbdZxcjODMS -DncLKvbdmgFXmOGy -DoCkKvbdUMVoAuoJ -DoDKjvbdqcdiQNua -DnbkKvbdbrcKtDia -DnbkKvbdKfFgbApu -DncKjvbdezvZEiTw -DnbkKvbdlqxtzSdJ -DoCjjvbdOTUWGeUp -EPCkKvbdJXtBhMQp -EOcLKvbdOAJTTjSA -EOcKjvbdfILVrNpg -EOcLKvbdnQZxvLZC -EPDKjvbdyYJJaoyk -DnbjjvbdkMakzFHP -DnbjjvbdjbkjpfuH -DoCkKvbdgGLymfgA -DoDLKvbdJYUBhLpp -EPCjjvbdJSyBTMxM -DnbjjvbdyTNiMrBg -DnbkKvbdqYoHfpdY -EOcKjvbdZyEKNcLr -DoCkKvbdZtIiYcsO -EPCkKvbdZQmFJNFR -DncKjvbdSPsgKFdX -DoCjjvbdvwMAuaWV -EPDKjvbdHfgZxxYH -EObkKvbdrSUjnKaN -DnbjjvbdKWVGEFGi -DncKjvbdsPvOjDWG -EPDKjvbdhzVFkqOG -DoDKjvbdssSSyZdc -DoDKjvbdYkqcsmlN -EPCjjvbdYpldiNFR -DncLKvbdemFwGlik -DoDLKvbdjuvmdBxX -DoDKjvbdCTBDTewS -DoCkKvbdKeehBaQu -EObkKvbdwyhFexEr -DoDKjvbdQvmccMID -DoDKjvbdVviYVceH -EPCkKvbdmRxtyrdJ -EPDLKvbdYqMeJNFR -EPCkKvbdRbDeMIxk -EPCkKvbdcJMjKfXY -DnbkKvbdVwIwvDdg -DnbjjvbdIwtCHkpp -DncLKvbdczYpYYqC -EPCkKvbdKaLGmBxR -DncKjvbduLwwAsaX -DncLKvbdssRrxzEc -EObjjvbdrXQMCiZR -DnbkKvbdZRNFImFR -EOcKjvbdACqwjZhp -DnbjjvbdbKlGOmcA -EObjjvbdGFirOJUR -EPDLKvbdqvokbiYq -EOcKjvbdJmAEZgUa -DoCkKvbdbhljKevx -EPCjjvbdbKlGPNcA -EOcKjvbdRMxByOUz -EOcKjvbdbsDLUEJa -EPCkKvbdRacdlJZL -EObkKvbdmuUyjjSG -EObkKvbdjKFgjNXr -DoDLKvbdlhctQuRa -DoCkKvbdjKFhKMxS -EObjjvbdpedEtVaI -EOcKjvbdIwtBhLpp -DnbjjvbdZHWdAPSi -EOcLKvbdiLdcmuCy -EOcLKvbdjcMLRGuH -EPCjjvbdRbDdkiZL -EOcKjvbdiHJbxvKV -EOcLKvbdaSGDHsfL -DoCkKvbdjKFhJlwr -DncKjvbdiBoCeWqR -EOcLKvbdegjvSNpg -EOcLKvbdrbGMlHLZ -DnbjjvbdBraDUGXS -DncLKvbdFeirOIsq -EPDLKvbdhytekpmf -EOcKjvbdIsYaTMwl -DnbkKvbdrSVLOKaN -DoCkKvbdTIyjRABM -EOcLKvbdsBfNMGkZ -EPDLKvbdUtNTfMWK -EObkKvbdRjxeuGjs -EObkKvbdTqQnuVIN -EObjjvbdhuZdwRuC -EOcLKvbdqTtHSSKt -DncKjvbdmpZxvLZC -DoDLKvbdlAloNALA -EPDKjvbdiLddOUby -EPDLKvbdwuMdpxlO -DncKjvbdNrsvHEuQ -EPCkKvbdyOSgxTJD -EOcLKvbdIryArlxM -EPDLKvbdZHXEAPSi -EPCjjvbdSCDdlIxk -EOcKjvbdySnJNSCH -DnbjjvbdijGIKNXr -EPDKjvbdVAaqTRSZ -EObjjvbdkxsSSxft -EPCkKvbdnUtzKiqf -EPCkKvbdlqxuZsEJ -EObjjvbdEXxMUUUM -EPCkKvbdLFfIBaQu -DnbjjvbdrRtkNjaN -DoCjjvbdNHCpMpUk -EPDKjvbdZjTIQGaf -EPCkKvbdHELWJbKK -DoDKjvbdJbibpjCx -DnbjjvbdJSyArmYM -EPCjjvbdfNFwGmJk -EOcLKvbdYTMBMsnx -DoDLKvbdyTOJMqbH -EObjjvbdEPDLLXDE -DncLKvbdkyTSTZGt -EObjjvbdGBPRYizm -DoCkKvbdVviXvDeH -DncKjvbdsQWOicVf -DoCkKvbdfHjvSNqH -DncKjvbdlZTSSxft -DncKjvbdFVyPolie -EPCjjvbdRXODblID -DoCjjvbdlhcsqVSB -DncLKvbdqYnhGqDx -EObjjvbdFeiqmiUR -DnbjjvbdKefHaaQu -DoDKjvbdRNXbYmtz -EOcKjvbdNwnuzcmt -DoDLKvbdXFxytAPT -EPDLKvbdOTUVfdtp -DoCjjvbdraelkfkZ -DncKjvbdXsMAltPY -DoDKjvbdVUMsfLuj -EPDLKvbdZisIPfbG -EPDKjvbddZxpYYqC -DnbkKvbdzjUopESt -DnbkKvbdVUMtGMVj -DncLKvbduCbtwWOo -EObkKvbdaaVeFpPw -DncKjvbdKNADzGta -DncKjvbdeEoSCXCj -EObjjvbdhancEvqR -EObkKvbdKCicQibx -DncLKvbdijGHjMwr -DoCkKvbdziuPpETU -DoCjjvbdiBnbeXRR -DoCkKvbdZQmEiMdq -EObkKvbdrMyjZMHi -EOcKjvbddoErkTtS -DoCkKvbdtkwvaUAw -EPDLKvbdTlVnaVoJ -DncKjvbdfHjurOQg -DoDLKvbdWWiXvEEg -EPCkKvbdqdEhpNua -EOcLKvbdYSkaMtPY -EPCkKvbdxmsHxTIc -DnbjjvbdJqZdnenF -EPDKjvbdWexzUAOs -EOcLKvbdrovPKCuf -DoDKjvbdkxsSSyGt -Dnbjjvbdzdynzdyp -EOcLKvbdHEKvJbJj -EObjjvbdOStWHEuQ -DnbjjvbdkyTRsZGt -DoCkKvbdcJNKKevx -DoDKjvbdSPtGifDw -EObkKvbdGdLVibKK -DnbjjvbdbBVdfPow -DncKjvbdhtyeXSVC -EPDLKvbdptTfrSLU -DncKjvbdjvXODaww -DncKjvbdqZOgfqDx -DncLKvbdTJZjRABM -EOcLKvbdTpqPVUhN -EOcKjvbdRWmdClID -DoCjjvbdqquLOLAm -DoCjjvbdFfJqmiUR -EOcKjvbddBsMrATm -EOcKjvbdYzcFrKVy -EPCjjvbdsZlQSaIO -EPCkKvbdkHfkeenL -EOcKjvbdiHJcYuiu -DoDKjvbdCEPaVilf -DoCjjvbddBrmSAUN -EPDLKvbdSPtGifDw -EOcLKvbdAMhYrvyx -DncLKvbdTIyjRAAl -EOcLKvbdZtIhyESn -DnbjjvbdVUNUFlWK -EOcKjvbdyXiJaoyk -EPCkKvbdDncLKvbd -EOcLKvbdKWVFcdgJ -EPDKjvbdnQZxvKyC -DncKjvbdjJehJlxS -DoDKjvbdRkYfVHKs -EPDLKvbdirzhsLJz -EObkKvbdVUMtFkuj -DnbjjvbdqwPkbiYq -EPCjjvbdIGfzZYXg -DoCkKvbdlYsRryGt -EObjjvbdpfDeUWBI -EOcKjvbdwtldpxkn -DoCkKvbdzitopETU -DoDKjvbdJuuGEEfi -DnbkKvbdnPzZVkZC -EOcKjvbdmfeYMnGy -EPDKjvbdkIGlGGNk -DncKjvbdezvZEhtX -EPDKjvbdqqtjmkAm -EPDLKvbdzRPNIiwA -DoCkKvbdGKeSbgmV -EPDLKvbdmJETqVSB -EPDKjvbdbVCGwkTh -DoCjjvbdBhkBkIej -EOcLKvbdbBWFFopX -DncLKvbdjggLfGOL -EPCkKvbdzQnmIiwA -EOcLKvbdhbPDFWpq -EPDLKvbdkClLQgVH -EObkKvbdrWpMChyR -DncKjvbdMfbpNPuL -DnbjjvbdNsUVfeVQ -EOcKjvbdaRfDHtFk -DoDKjvbdRbEFLhyL -EOcKjvbdmIcsqUqa -DncKjvbdFVyPpNJe -DoCjjvbdLAjgMaxR -EOcLKvbdypoNJKXA -DncLKvbdEztRFMCi -DoCkKvbduVmwiqTA -EObkKvbdUyHsykPO -DoCkKvbdhzUfLqNf -EPCjjvbdiUzEvqtb -EPDKjvbdpfDeTuaI -EPCkKvbdSwjkmzjx -DncLKvbdjKFgjMwr -EOcLKvbdRWnECkhD -EOcKjvbdZoOJFEyj -DnbkKvbdvvlAvAvV -DncKjvbdZLqcsmlN -DncKjvbdyqOliJwA -EPCkKvbdKWUedEfi -DoCkKvbdePEsLTtS -DnbkKvbdtcDVXVoP -EPCjjvbdKCjCpicY -EObkKvbdZdwfzhJC -EPDLKvbdBhjajiGK -EOcKjvbdJXsahMRQ -DoCkKvbdZxdKNcLr -EPDKjvbdnBjWwoOV -DncLKvbdapGgDkzd -EPDKjvbdjmCLzEgP -EPCkKvbdWRmwbFMD -DnbjjvbdBdQAujMf -EObkKvbdzjUpPcsU -DoDLKvbdwtmFQyMO -DoCkKvbdiMEcmtby -DncKjvbdSBcdkiYk -EPCkKvbdfSBWzkbo -EOcLKvbdxVMeRZLn -DnbjjvbdCSaDUGXS -DncKjvbdZtJIyETO -EPCkKvbdTkvOaVni -DnbkKvbdkySqsYft -EPCjjvbdxsOJMrCH -EPCjjvbdCWzdJEov -EPCjjvbdEARiMywX -EObkKvbdxsNiNSCH -DncLKvbdhbPDFWqR -EObkKvbdVUNUFlVj -EObjjvbdXrlBNToY -EOcLKvbdfHjvSOQg -EPCjjvbdwWkaWAuu -DncKjvbdbKlFnnDA -EPCkKvbdRkZFuGkT -EPCjjvbdMowpvNfs -DncLKvbdmtuZjjSG -DnbkKvbdiCPDEvqR -DncLKvbdbAudfPow -DnbjjvbdFjeSbhMu -DncKjvbdSQTfjGEX -EPDKjvbdbAueGQQX -DnbkKvbdjKGIJmXr -EOcKjvbdIryBTNYM -EPDLKvbdmgEwlnGy -EObjjvbdSBdEkhxk -DoCjjvbdfMfWgMjL -EPDLKvbdEObjjwCd -EObjjvbdhzUekqOG -EObjjvbdWSNwbElD -DoDKjvbdrNZjYkhJ -DoCkKvbdRkYfUgKs -EObjjvbdczYpYZRC -DoCkKvbdzoQQeDMY -DncKjvbdFxuVBEXb -DoDKjvbdSiZjRABM -DoDLKvbdYzbfRivZ -EPDLKvbdlqyUyrdJ -EOcLKvbdtbbuWvOo -DncKjvbdSKxfVGkT -DoCjjvbdEXxLtUTl -EOcLKvbdEPCjkWbd -EPDLKvbdEObkLXDE -EPCkKvbdxKvdHzzG -EPDKjvbdpfDdtVaI -DoCjjvbdbAueGPpX -DoCjjvbdZMRdUOLm -DoDLKvbdwtmFRYkn -DoCjjvbdNPwpumgT -DoCkKvbddijSWUzn -DoDKjvbdJXsbHkqQ -DnbjjvbdxZhFexEr -DoCjjvbdSQUHJedX -EPDLKvbdjmCMZdgP -DncLKvbdMfbomPtk -EOcLKvbdqTtHRqjt -EPCkKvbdqceIpNvB -DncLKvbdFxtuBDxC -EPCkKvbdxVNEpyLn -EOcKjvbdYzbeqivZ -DoCjjvbdNdcsiJLE -DoDKjvbdzjVQQDsU -EObjjvbdvBDySneI -DoDKjvbdBhjbKhej -EPDLKvbdWSOYBdlD -EOcKjvbdOYOuzcnU -EPCkKvbdkCkkQgVH -DnbkKvbdtlXwBTaX -DnbkKvbdTppoVUgm -DoCjjvbdQmXaxnUz -DncKjvbdkHfkfFmk -EPCjjvbdmgEwlnHZ -EPDLKvbdZdxGzhJC -EPCkKvbdmIdTqUqa -DoDKjvbdzGyMAMeX -DnbkKvbdTppnuUhN -DoCjjvbdSLYfUgLT -DnbkKvbdZsiJZETO -EObkKvbdNUrqjmAX -EObjjvbdZyDimcLr -DoCkKvbdRDbaQRDr -DnbjjvbdbAudfPow -EPDKjvbdZjTHpGaf -DoDKjvbdqwQLcIxq -DnbjjvbdZLqdTmkm -DoDKjvbdyXiKCPzL -EObjjvbdssSTYyeD -DoCjjvbdddoRawCj -DoCjjvbdkMbLydfo -DoCjjvbdVTmUFkvK -DoCjjvbdhyuFkpmf -EObkKvbdlYsSSyGt -EPCjjvbdtvNxKQsA -DoDKjvbdRpTgKFdX -EObjjvbdjbkkQgVH -DnbjjvbdaNLCStlg -EOcKjvbdDxYLsssl -DoCjjvbdfNFvgMjL -DncLKvbdrovPJcWG -DnbkKvbddoFSjssr -DnbjjvbdSQTgKGDw -DoCjjvbdQvnEDLhD -EOcKjvbdUxhUZkOn -EPCjjvbdEzsqFMDJ -DoDKjvbdGdKuiaij -EOcKjvbdxrnJMrCH -DnbjjvbdUWMQJtBR -EObkKvbdEKHivYKA -EPDLKvbdYSlAltOx -DnbjjvbdbVCHXjtI -DnbkKvbdtkwwAtBX -DoCjjvbdZQleJNEq -EPDKjvbdEPCjjvcE -EPCjjvbdCSaDUFwS -EPDKjvbdHELViajK -DoDLKvbdijFgjNXr -DncLKvbdjmCLydfo -EObkKvbddZyQXxqC -DnbkKvbdySnImSCH -EPCjjvbdqmZjYkgi -EPCjjvbdGFirNiTq -DoDKjvbdRXNdDMID -DncLKvbdMfcQNQUk -EOcLKvbdZdwfzghb -EPDLKvbdULuoBWOi -EObjjvbdFyVUaDwb -DoCjjvbdNQXpumfs -DnbkKvbdrWolDIxq -EPCkKvbdBvzdIeQW -DnbkKvbdfIKuqmpg -EOcKjvbdnBiwXoNu -EObjjvbdiHKDZWKV -EPCjjvbdZLqdTnLm -DoCjjvbdlYsSTYgU -EPDLKvbdsBfNMHKy -DnbkKvbdjuvmdCXw -EPDLKvbdRDcBQQdS -EOcKjvbdySmhmRbH -EPDLKvbdbrbjscia -EPDLKvbdkxrrTZGt -DoDKjvbdcJMjLGWx -EPDKjvbdKeegbBQu -DnbjjvbdvPTzqKoU -EOcLKvbdIidAKPgE -DoDLKvbdVrOYBdkc -EObjjvbdeFOqawDK -EOcLKvbdZRNEhmFR -EObjjvbdKfFgbBRV -DoCjjvbdiLeEOVCy -EPCkKvbdqmZjYkgi -EPDKjvbdHffyxxXg -EPDKjvbdZLrDsmlN -DnbjjvbdTkuoBVoJ -EOcKjvbduDDUvvOo -DoDKjvbdZdwfzhJC -EPCkKvbdfMfWgNKL -EPCjjvbdRXOECkgc -EOcKjvbdMowpvNfs -DoDLKvbdiBoCeWpq -EObkKvbdNwoVzdOU -EPDLKvbdDoDKjvbd -EObjjvbdLFehCBRV -EOcLKvbduCcVWuno -EOcKjvbdXsMBMtOx -DnbkKvbdcIljKewY -DoDLKvbdEzspdkcJ -DncKjvbdqcdhomua -EPDKjvbdiifHjNXr -EObkKvbdVqnXbFLc -EPCkKvbddwyssrFz -DncKjvbdrSVKmkAm -EPCjjvbdTlVoBVni -EObjjvbdOhAYZAYa -EPCjjvbdRadEkiZL -DoCkKvbdSCEEkiYk -EObjjvbdGZVVAcxC -DnbjjvbdZyEJnDMS -EOcKjvbdzitoodSt -EPDKjvbdXFxzUAPT -DnbjjvbdziuQQESt -EPCjjvbdEARhmZvw -DncLKvbdatbHXkTh -DncKjvbdbsCjtDjB -EPCjjvbdKWVGDdgJ -EPDKjvbdrafNLfkZ -EObkKvbdFkEsChMu -DnbkKvbdVgxWXfxz -EObjjvbdJbjDRJbx -EObkKvbdwyhFfYFS -EPCjjvbdMfbpNPtk -EObkKvbdbsDKtDia -EPCkKvbdkxsRsZHU -DnbkKvbdvAdZTOdh -DncKjvbdptUHRrLU -DncKjvbdvPTzqKnt -DncLKvbdTppoUthN -DnbkKvbdrbFlkgLZ -EPCjjvbdGdKvJajK -EPDLKvbdACqxKZiQ -DoCkKvbdbPffckzd -DoCkKvbdhbOcEvqR -DnbjjvbduCcVWvOo -DoCkKvbdmuUzLKRf -EPCjjvbdbUbHYLUI -DoDKjvbdbKkeoNcA -DoCjjvbdcScKtEJa -DoCjjvbdyzdnRgiI -EPCjjvbdkIGlFfOL -EOcLKvbdzjUpPcsU -DoDLKvbdJuuGEEgJ -DncLKvbdTqROtthN -EOcLKvbdpstGqqkU -EPCkKvbdtSrTYzEc -EPDKjvbdezvYdiUX -DoDKjvbdtTRrxzFD -DoCjjvbdrovOjDWG -DoDKjvbdUQpoUthN -EOcKjvbdKDJbpicY -DnbjjvbdaSGCgtFk -DoDKjvbdGZVVAcwb -DnbjjvbdEvYopNJe -EObjjvbdSQTgKFdX -EPDLKvbdrXPkbhyR -DoDLKvbdhyuGMROG -DoDKjvbdzoQRFClY -EPCkKvbdKWUeceHJ -EObkKvbdZnmiFFZj -DnbjjvbdtcDUwVoP -DoCkKvbdjlakyeHP -EPCkKvbdBvzdIdpW -EPCjjvbddePRawCj -DoDKjvbdmfeYNNfy -DnbkKvbdSLYetgKs -DncKjvbdFejRnJTq -EPDLKvbdIGfzZXwg -DncKjvbdJvVFdFHJ -EOcLKvbdIHHZyYYH -EPDLKvbdyXhiaoyk -DoCjjvbdADSYJzIp -EObjjvbdNPxQunHT -EPCkKvbdxnTHwrhc -DncKjvbdTppnuVHm -EObkKvbdjlbLydfo -DoDLKvbdVBBpsRRy -DnbjjvbdACqwiyhp -DoCkKvbdZRNFJNEq -EOcLKvbdaRfDHtFk -DoCkKvbdKfFgbBQu -DnbjjvbddCTNSAUN -EPDLKvbdTfznMXVe -EOcKjvbdeOeSkUTr -DnbkKvbdqdEiPnVa -EOcLKvbdsBemMHLZ -DoCkKvbdNPxQvOGs -EPDLKvbdOTTufeUp -DncKjvbdraelkfjy -DoDLKvbdZoOIeFZj -DnbkKvbdptTgRrLU -DncKjvbdACrXiyhp -EPDLKvbdIGgZxwxH -DnbjjvbdZnmiEeZj -DnbkKvbdWRmxCFLc -DoDLKvbdyYIiaozL -EPCjjvbdOTTvGeUp -EPCkKvbdNUsSKmAX -EPCjjvbdDigiuwjA -DoDKjvbdIrxaTMxM -DoDKjvbdZyDimcLr -EPCjjvbdjbkkRHVH -DoCjjvbdWXJYVceH -EOcLKvbdlZTSSyHU -DncLKvbdwuNEqYlO -EPCkKvbdrpWPJbuf -DncKjvbdtbcUwWPP -EOcKjvbdGKeScINV -DncKjvbdZeXfzhJC -DncKjvbdUQqPVVIN -DoDKjvbdxsNhmSBg -DoDKjvbdURROuVHm -DncKjvbdRMwbYmtz -DoDKjvbdZRMeImEq -EOcLKvbdWHwvXgYz -EPDLKvbdIwsahMQp -EOcKjvbdfHkVrNqH -EObjjvbddjKSWUzn -DncKjvbdxwiJbQZk -EPCkKvbdMSWlzVQz -DoDLKvbdUQpnuUhN -DncLKvbdiCPCdvqR -DoCjjvbdapHHELzd -DncKjvbdyOSgwrhc -DoCkKvbdDxYLtUTl -EObjjvbdyfyMAMdw -EObjjvbdHffzYxYH -DoDKjvbdYzcFrKWZ -EPDLKvbddZyPwyRC -EPCkKvbdLhalRYAS -DoCkKvbdGYtuBEXb -DoCjjvbdrylQTAgn -DoCjjvbdbBVeGPpX -EPDLKvbdYpmFImFR -DnbkKvbdJcKCpjDY -DncLKvbdYTLaNUPY -DnbkKvbdeOeSjtTr -DoCkKvbdEYYLtTtM -EPCkKvbdrzLoraIO -DoCjjvbdKWVGDdfi -DoDKjvbdBhjbLIfK -EPCkKvbdNQYQvOGs -EOcLKvbduLxXBTaX -EPDKjvbdANHySwZx -DnbkKvbdeOdsLTtS -DnbkKvbdUsmTfMWK -DoDLKvbdcImJkGXY -DncKjvbdsPunibuf -DnbjjvbdIGfyxxYH -DoDLKvbdvBDyTOeI -EPDLKvbdGKeScHmV -EOcLKvbdqFceUVaI -DncLKvbdqdEhpOWB -DoDLKvbdTulPitAq -DnbjjvbdWXIwudEg -EPDLKvbdcTDKtDjB -DoCjjvbdgFlZnHHA -DnbkKvbdwuNEqZLn -EObkKvbdmRxtzSci -EObjjvbdjvXNdCYX -DnbkKvbdqGDdsvBI -DncKjvbdqdEhomvB -DoCjjvbdrpVoKCvG -EObkKvbdWHwvYHYz -EOcKjvbdrykoraHn -EPCkKvbdsPuoKCuf -DncKjvbdZjSgofaf -DncKjvbdNeETiIjd -DoDLKvbddoFSkTsr -EPCkKvbdkWWnECXw -DnbkKvbdZRNFIldq -EObjjvbdzjVQPdTU -DnbjjvbdhytelRNf -EOcKjvbdNPxQunHT -DoCkKvbdmuVZkJrG -EPCjjvbdUVlQJtBR -DoDKjvbdzitpQESt -DoCjjvbdraemLfkZ -DoDLKvbdkNBlZeHP -EObkKvbdrbGNMHLZ -EPDLKvbdkIHLeemk -DoDKjvbdbAvEeopX -DoDKjvbdiGjCxujV -EPCkKvbdqlzJxkgi -DncLKvbdVZITzLPO -EOcLKvbdVZITykOn -EPCjjvbdjuvnDaww -DoDKjvbdkVwOECYX -EObjjvbdcyxpXyRC -DnbjjvbdULvPAuni -DnbkKvbdOTUWGdtp -EOcLKvbdKDJcRKCx -EPCkKvbdBsBDUFwS -DncLKvbdQdDAopcr -EObjjvbdcSbjtEKB -DnbjjvbdlAloNALA -DoCjjvbdADSXizJQ -EOcKjvbdrpWOibvG -EObjjvbdIGfzZXwg -EPDKjvbdptUHRrKt -DncLKvbdZdwfzhIb -DoCkKvbdQZNAGrrK -DoDKjvbduCbtvuoP -EPCjjvbdJuuFceGi -EPCkKvbdgGLymgHA -DnbjjvbdcyyPxYpb -EPCkKvbdhuZeWquC -EObkKvbdyTNiNRbH -DoCjjvbdVAaqSprZ -DncLKvbdoznDkYPA -EPCkKvbdiUydvquC -DncLKvbdhytfMROG -DoCkKvbdmbKXYPNu -DnbkKvbdMpYQunHT -EOcLKvbdHkaznXQk -DoDLKvbdTvMPisaR -DoCkKvbdIryBTNXl -DoDLKvbdZLrDsmkm -DncLKvbdlhctRVRa -EPCjjvbdYkqcsmkm -EPCjjvbdEXwlUTtM -EObkKvbdEvZPoljF -EPDLKvbdZRNEiNFR -DoCkKvbdANIZTXZx -DncKjvbdZoOIeFZj -DoDLKvbdeJirWUzn -DoCjjvbdRWmdDLgc -DoDKjvbdACrYKZhp -EPDKjvbdMowpunHT -EOcKjvbdYTLaNTnx -DnbjjvbdQvnEClHc -DnbkKvbdSBceLhyL -DoDKjvbdjgflGGOL -EOcKjvbdYpldiMdq -DoCjjvbdrovPKDWG -DoDKjvbdZisHofbG -DoDKjvbdEOcLKwDE -EPCjjvbdhfjDZWJu -DncKjvbdhfjCyWJu -EOcLKvbdtSqsYzEc -DoDLKvbdbQHHELzd -DoDKjvbdySnImRbH -EOcLKvbdVqmxCElD -DnbjjvbdNdcsiJKd -EPCkKvbdkNBkzEfo -DnbkKvbdJKEAKPfd -DncLKvbdiifIJlwr -DnbjjvbdhtzEvqtb -EObjjvbdwWlAvBWV -EPDLKvbdlhctQuSB -EOcLKvbdNddUIiKd -EPDKjvbdJSxaTMxM -EPDLKvbdVrOXaeMD -DoDLKvbdGcjvKBjK -DncLKvbdqvpLbiZR -EPCkKvbdjKFgilxS -DncLKvbdDoCjjvbd -DoCjjvbdqqtjnKaN -EOcKjvbdBvzdJEpW -DoCkKvbdcarlrATm -DoDLKvbdQdCaQQdS -DncKjvbdVqnXadkc -DoCjjvbdJvUecdgJ -DnbkKvbdVYhUZkPO -EPDKjvbdxZgfFxEr -EPCjjvbdsPunicWG -DnbkKvbdmSYtyrdJ -DnbjjvbdTulQJsaR -DncKjvbdsrrSxyeD -DnbkKvbdzQnmJJwA -DncKjvbdatafxLTh -EOcLKvbdmfeYNNgZ -EObkKvbdNxOuzcnU -EPDLKvbdDwwksstM -EPDLKvbdxnTIYTIc -EPDKjvbdHgGyyXxH -EOcKjvbdGAnpyJzm -DoCkKvbdUQqPVUhN -DncLKvbdYgWdAOri -DoDLKvbdygZMANFX -EPCkKvbdrJAJdlne -EPDLKvbdZnmheEyj -DnbjjvbdIxUCHkpp -DnbkKvbdjJehJlwr -DoDKjvbdhlEdNuDZ -EOcKjvbdeOeSkTsr -EOcLKvbdVqnYBdlD -DoDKjvbdeATqMwif -EPCjjvbdrXQLbhyR -DnbjjvbdFkErbhMu -DoCjjvbdpxnhHQcx -EOcLKvbdrWpMDIxq -EPDKjvbdVhYWYGxz -DoCkKvbdwzIGFxFS -DoCjjvbdEztQeLbi -DnbjjvbdlZTRrxgU -DncLKvbdSZihSbvA -DnbjjvbdrzLpTAgn -EPCjjvbdNrsugFVQ -DnbjjvbdxUleQxlO -DncKjvbdtkwwBUAw -DoCjjvbdbBVdeoow -EPDKjvbdEObjkXDE -DnbjjvbdhgJbxvKV -EPCkKvbdIwtCHlQp -DoCkKvbdxmsIXrhc -EObkKvbddePSCXDK -EOcKjvbdVrOXbEkc -EOcLKvbdFVyPomJe -DoDLKvbdREDBPqDr -DncLKvbdaNLCStmH -DncLKvbdbAudfQPw -DoDKjvbdRaceLiZL -DoCkKvbdJYUCIMRQ -DnbkKvbdYkrDtOMN -DnbjjvbdFkFTChNV -EOcLKvbdZRMeImFR -EObkKvbdUxgszLOn -EOcKjvbdFjdsChMu -EObkKvbdrafNLgLZ -EPDKjvbdelewGmJk -EOcKjvbdZMRctNlN -DoDLKvbdliEUQtqa -DncKjvbdqUUHSRjt -EPDKjvbduCbtwVno -DoCkKvbdaaVeFoow -EPDLKvbdkClKqGuH -DoDLKvbdCflFgAzc -DoDLKvbdTAEhgbPE -EObkKvbdmtuZjjRf -EObjjvbdKDKCqJbx -DncKjvbdrovOjDVf -DoCkKvbdhtzFWqtb -DncLKvbdEvYpQNKF -EOcLKvbdeFPRavcK -DoDLKvbdhlEcnUby -DoCkKvbdegjvSOQg -DncKjvbdhbPCeWpq -DnbjjvbdsrrTYyeD -DncLKvbdTlWPAvOi -EPCjjvbdwzHeexEr -DncLKvbdmJEUQuRa -DnbkKvbdkIHLeemk -EObkKvbdhtyeXSUb -EOcLKvbdHDkWKCJj -EOcLKvbdRbDdkhyL -EObkKvbdRosfifDw -EPCjjvbdOStVfduQ -DnbkKvbdiHJbxujV -DoCjjvbdsPuoJcWG -EPCkKvbdDxXktTtM -DoCjjvbdHDjujCJj -EObjjvbdUWLoisaR -EPDKjvbdqiAKEmOe -DoDLKvbdxmsIYShc -EPCkKvbdCJKbKiGK -DoDLKvbdRECaQRDr -EPDLKvbdYqNEiNEq -DnbkKvbdiMEcnVCy -DoCkKvbduCbtwVno -DoDKjvbdHbMZdzAD -DnbkKvbdemGXGmKL -DoDLKvbdgQBzwDwh -DoDKjvbdKQzEoGOF -DoDKjvbdWSNwaeMD -EPDKjvbdySmhlqbH -EObkKvbdDxYLtTtM -DnbjjvbdFxuVBEXb -EObjjvbdiBoCdwRR -EPCjjvbdGQATWgGZ -EPCkKvbdYpleJNEq -EOcLKvbdvPTzqKoU -DnbkKvbdZQmEhldq -DncKjvbdLBKgMawq -EPCkKvbdqFceTvAh -EPCjjvbdkIHMFenL -DoDKjvbdehLVqnRH -DoDKjvbdxwhibPyk -DnbkKvbdkMbMZeHP -EOcKjvbdsrrSyZeD -EOcLKvbdMowpunHT -EObjjvbdJqZdnfOF -DoCkKvbdezuxdhtX -DnbjjvbdaaWFFopX -DoCjjvbdqdFJQOVa -EPCjjvbdWWhwudFH -EPDKjvbdhtzFWrUb -EPCkKvbdWSNwaeMD -EObkKvbdcIlikFvx -EPCkKvbdauCGwkTh -EPCkKvbdbhmJkGWx -EPDKjvbdRosgJfEX -DnbkKvbdTvMQJtAq -DnbkKvbdsBfMlGkZ -DnbkKvbdVrNxCElD -DoDLKvbdmpZxukZC -EObkKvbdhlEcnVCy -EOcLKvbdwzIFfYFS -DnbkKvbdZtIhxdSn -DoDLKvbdjgfkfFmk -DoDLKvbdqTtHSRkU -EObjjvbdSCDeLiZL -DoDKjvbdeATplxJf -DnbkKvbdIBkzEzAD -EOcKjvbdFWZQPljF -DoCjjvbdRbDeMJYk -EPDLKvbdDoCkKvcE -DoCkKvbdZjShPfbG -DnbjjvbdNPxQvOGs -EPDLKvbdKyQirztf -DoDLKvbdJutecdfi -DoCjjvbdTppoUuHm -EPDLKvbdjEkGuPAO -DnbkKvbdVTmTekuj -DnbkKvbdZyEJmcMS -EOcKjvbdNddThhjd -DncLKvbdrDdhpNua -EOcKjvbdBiLBkJGK -DoCkKvbdrXPkbhxq -DnbjjvbdZQmEiMdq -DncLKvbdhzUfMROG -EPDKjvbduaEYroEh -DoCjjvbdJYUCHkqQ -DoCjjvbdwzHfFxEr -EPCjjvbdLiBkqYAS -DoDLKvbdxZgfFxEr -DoCkKvbdraemLgLZ -DoDLKvbdxxJJaozL -EPDLKvbdKeehBaRV -DoCkKvbdPIAYZAZB -EObjjvbdBvzdIdov -DoDKjvbdjblKqGuH -DoDKjvbdlhdURVSB -EPDKjvbdqvpMDJZR -DncKjvbdajkeoODA -EOcKjvbdkySqsZHU -DnbjjvbdJqZdnfOF -DncKjvbdZHWdAOsJ -DoCkKvbdaNLCStlg -DoDLKvbdVZHszKnn -DoCjjvbdtvOYJpsA -DoCjjvbdNPxQvNfs -DoDLKvbdZLqctOMN -EObjjvbdvwMAvAvV -DnbkKvbdEuxpPlie -DnbkKvbdAMhYsWyx -DoCkKvbdtumwjQsA -EPCjjvbdVAaprqRy -EObkKvbdlZSqsYgU -EObkKvbdBvzdIdov -DnbjjvbdyOShYTJD -EOcLKvbdZshhxdSn -EPDKjvbdUtMselWK -DoDLKvbdYqNEiMeR -DncLKvbddePSBwDK -DncLKvbdqYnggQcx -DnbkKvbdqceJQOVa -DoDLKvbdtSrTZZeD -EPCjjvbdANHyTWzY -DoDLKvbdcIlikFvx -DoDKjvbdxmsHwsIc -EObkKvbdYzbfRiuy -EPDKjvbdWHwuwfxz -EOcLKvbddndsLTsr -EObkKvbdwXMAuaVu -EPDLKvbdbVBfwjtI -EObjjvbdfMfXHMik -DoCkKvbdOXoVzdOU -DnbkKvbdnGeXlnHZ -EPCjjvbdGGJrOJTq -EPCkKvbdhanbeWqR -EOcLKvbdLhbLpxAS -EPDLKvbdbBVdepPw -EOcKjvbdWSNwadlD -DoCkKvbdaRfChTek -EPCkKvbdmbJvxOmu -DoCkKvbdCSaCsfXS -EObkKvbdbhljKewY -DncLKvbddZxowxpb -DnbjjvbdRDcBQQdS -DnbjjvbdKDJbqKDY -EObkKvbdWRmxCFLc -EPDLKvbdYlSETmkm -EOcLKvbdMIalRYAS -DoDKjvbdCEQAuimG -EPDKjvbdCTAcTewS -EPCjjvbdrRtkOKaN -DnbkKvbdtTRryZeD -DnbjjvbdMgColpVL -EOcKjvbdrDdhomua -EPDKjvbdRbDeMJZL -DnbkKvbdxnSgwrhc -DoDKjvbdVvhxVdFH -DncKjvbdLYqJrzuG -DncLKvbdZsiIyETO -EPDLKvbdieLHUoAO -EPDLKvbdNsUVgEuQ -EPDLKvbdoAKztHcn -DncKjvbdfNFvgNJk -DoCkKvbdqYoHgQcx -DncLKvbddwzUUSFz -DoCkKvbdIHGzZYXg -DncLKvbddZxpXxpb -DnbjjvbdhlFDnUcZ -EPCjjvbdSKxfUfjs -DoCkKvbdbAvFGPpX -EOcLKvbdVhXuwfxz -EPCkKvbddoEsKtTr -DncKjvbdhkeEOVDZ -EObjjvbdNUrqjmAX -EPDLKvbdUWLojTaR -DoDLKvbdWIYVwfxz -DnbkKvbdUtMsekvK -EOcKjvbdRpUHJecw -DoDKjvbdCJKbKiFj -EObjjvbdEuxoomJe -EPCjjvbdLrWlytpz -EObjjvbdMgDPlotk -DncLKvbdNrtWHFVQ -DoCjjvbdZeYGzgiC -EPCkKvbdKaKfmCYR -DoCjjvbdjlakzEfo -EPDKjvbdpeceTvBI -DnbkKvbdKDKCqJcY -DoDKjvbdMowqWNgT -EPDKjvbdRMxCYmtz -EObjjvbdrXQLbiYq -DncLKvbdZnmheFZj -EOcLKvbdiLeENtcZ -DncKjvbdzaAPGfal -EPCkKvbdeATqNYKG -EObjjvbdSCDdlIyL -DoCkKvbdVZHtZjnn -EPCjjvbdZtIhxdTO -EPDKjvbdTlVoAuoJ -EObjjvbdZRNFIleR -DoDLKvbdEPDLKwCd -DnbjjvbdfRaWzkbo -EPDLKvbddneSjstS -EObkKvbduCbtwWOo -EPCkKvbdmoyyWKyC -EPCjjvbdehLVrORH -DoDLKvbduCcUvuno -EObkKvbddZxowxqC -EObkKvbdKQydoFme -EPCkKvbdqqtkOKaN -DoDKjvbduaEYsOeI -EObkKvbdePEsLUTr -DoDLKvbdbsDLTcia -DncLKvbdDwwlTtUM -EOcKjvbdOEdUIhkE -DoDLKvbdtvOXjRTA -EObkKvbdeFPSCXCj -EPCkKvbdqlzJxlIJ -EOcKjvbdUMVoBVni -EPCkKvbdqqtkNkBN -DoDLKvbdiVZeWquC -DncKjvbdZLrDsmlN -EPCkKvbdzitopESt -EOcKjvbdnBjXYPOV -EObkKvbdehKurOQg -DoCjjvbdmJDsptrB -DnbkKvbdaNKbTVNH -DncLKvbdGQASvfey -EOcLKvbdtbcUwVno -EOcKjvbdqUUHSSLU -EOcLKvbdvwLaWBWV -EPCkKvbdRacdlIxk -DnbkKvbdxZgfGXeS -EOcLKvbdVAapsQqy -EOcLKvbdQvnECkhD -EPDKjvbdCWzchdpW -DoCjjvbdpedFUWBI -EPDKjvbdqvpMCiYq -EPDLKvbdEPDKjwCd -DncLKvbdGckWJaij -EObjjvbdgPazwEXh -DoCkKvbdUVlPitBR -DoCjjvbdMSXMzVQz -DnbkKvbdliEUQuRa -DoCkKvbdOStVgFUp -EPCjjvbdUtMtGMVj -DoCkKvbdKWVFdFHJ -EPCkKvbdUxhUZkOn -DnbkKvbdLBKflbYR -EPCkKvbdFkEsCglu -DnbkKvbdKCibpjCx -DnbkKvbdGLEsChNV -DoCjjvbdLGFhCApu -DncLKvbdeXzTsqez -DoCkKvbdxrmhlqbH -EPDLKvbdYlRdTmlN -EPCjjvbdqYnhHRDx -EPDKjvbdWfYzUAOs -EPCkKvbdMJCLpxAS -EObkKvbduCbtwVoP -DoCkKvbdmfdwlmfy -EPCjjvbdVBBprpqy -DoDLKvbdEKHivXjA -DoDLKvbdkWWnECYX -EOcKjvbdqUUHSRkU -DncKjvbdYlRcsnLm -EOcKjvbdelfWfmJk -EPDLKvbdZtIhxcsO -EOcLKvbdGKdrcINV -EPDLKvbdOAIsUKSA -DoCjjvbdXFxytAOs -EPCjjvbdUQpntuIN -EPDLKvbdTvLpJtBR -EPDKjvbdRyihSbvA -DnbjjvbdhyuFlROG -EObkKvbdZxcinClS -EOcKjvbdptTfqrKt -DoDLKvbdURRPUtgm -EObkKvbdaNKbTVNH -EOcLKvbdiZuFlQmf -EPDKjvbdePEsLUTr -EPCjjvbdFxuUaEYC -EPDLKvbdliETpuRa -EObjjvbdjKFhKNYS -DoCkKvbdwzHefXeS -DoDLKvbdFfJqmiUR -EObjjvbdcJMjKewY -EObjjvbdqdFIomua -DnbkKvbdFejRnJTq -DnbjjvbdEzsqFMCi -EPDLKvbdhzUelROG -EPDKjvbdLKaIWAKZ -DoCkKvbdGGJrOIsq -EOcKjvbdVUMtGMWK -EObkKvbdmpZyVkZC -DoDLKvbdJTYaSmXl -EObjjvbdmSZUyrci -EObkKvbdxnSgwsIc -EOcLKvbdhgJcYujV -DoDKjvbdUQpoVVHm -EPDKjvbdKWVFdEgJ -DoCkKvbdWXJXudEg -EObkKvbddxZtURez -DnbkKvbdZRMeJNEq -EOcKjvbdpxoIHRDx -EObkKvbdGGKSOJTq -EOcKjvbdkIHMFenL -EPDLKvbdTqQoUtgm -DnbjjvbdtvNxJpsA -DnbkKvbdFyUtaDxC -DnbkKvbdSLYeuHKs -DncLKvbdxrmhlrBg -DncLKvbdGdLWJajK -EPCkKvbdSPtHJfEX -EPCkKvbdeKJrVtzn -DoCjjvbdWRnXadlD -DncKjvbdhkdcmtby -DoDLKvbdVviYWEFH -EOcKjvbdTAFJICPE -EPCjjvbdCJKbLIej -DoDLKvbdyYJJaoyk -EPDKjvbdNsUVgFUp -EPCjjvbdrDdhomua -DoDKjvbdySnJNRag -EPCjjvbdyNrgxShc -DnbjjvbdADRxKZhp -DnbkKvbdaMkCStmH -EPDKjvbdfIKvRnRH -DnbkKvbdoAKztIEO -DnbjjvbdDjHjVwjA -EObkKvbdjuwODbYX -DoDLKvbdbhmKKfWx -EPDLKvbdKaLGlaxR -DoDLKvbdwzIGFxFS -EPCkKvbdGBOpxizm -EPDKjvbdRXODcMHc -EOcLKvbdYqNFJMdq -EOcKjvbdxUleQxkn -EPDKjvbdZirgpHCG -DncLKvbderAvzkbo -EPCkKvbdTvMPisaR -EPCkKvbdZtJIxdTO -EOcKjvbddePRavcK -DncLKvbdCDpAuimG -EPDLKvbdQdCaPqES -EObjjvbdZyEJmbkr -DoDLKvbdOEcsiIkE -EOcKjvbdrbFlkgLZ -EOcKjvbdRacdlJZL -EPCkKvbdKDKCqKCx -EPDKjvbdrDeIonVa -DncKjvbdOFEThhjd -DncLKvbdLAkHMbXq -EObkKvbdhytekpnG -DncLKvbdrSUkOLAm -DncLKvbdiCOcFWpq -DoCjjvbdrylPsAhO -EOcKjvbdxVNEpyLn -DnbkKvbdmbJvwnnV -DnbkKvbdVAbQsQrZ -EPCkKvbdCTBCtGXS -DncKjvbdTAEiHbPE -EObjjvbdFeiqnJTq -EPDLKvbdDxYMTtTl -DncLKvbdHDkVibKK -DnbkKvbddePSBvcK -DoCjjvbdauCGwkTh -EPDLKvbdWIYWYGxz -DoDLKvbdjcLjqHVH -DoDLKvbdTfznMXWF -DnbkKvbdkVwNcaww -EObjjvbdlYrrSxgU -DncKjvbdaNLCTUmH -EOcKjvbdznoqEblY -DncLKvbdjuwOEBww -DncKjvbdGQATXHGZ -EOcKjvbdiZuFkpmf -EPCjjvbdajlGOnDA -EPDKjvbdJcJbpjCx -DncKjvbdauBgXjtI -EPCkKvbdsZkpTAhO -EPCkKvbdOEdUIhjd -EOcKjvbdNsUWGduQ -DnbkKvbdVTltFlVj -EObjjvbdaNKasVNH -DnbjjvbdhancEvpq -EPDLKvbdZtIiZETO -DoDKjvbdFxuUaEYC -DoDLKvbdLGGHbAqV -DoDKjvbdqceIpOWB -DoDKjvbdvBEZTPEh -DoDKjvbdKefHbBQu -EPDLKvbdlZTSSyHU -DncKjvbdnPyyWKyC -EObjjvbdsZkpTBHn -DoCjjvbdaaVdepPw -EPDKjvbdtkwvaUAw -EObjjvbdEPCkKvbd -EPCjjvbdtkwvaUBX -DncKjvbdRbDeMIyL -EOcKjvbdxwhjBoyk -DoDLKvbdFxuVAcxC -DnbkKvbdxZgfFxFS -EOcKjvbdjhGkefNk -EOcKjvbdEPDKkWcE -EPDLKvbdQvnEDMID -EOcLKvbdqquKmjaN -DoCkKvbdZtJJZESn -EPDLKvbdTkvOaWPJ -DnbjjvbdcSbkUEJa -EObjjvbdQlxBxmtz -EOcLKvbdehKuqmpg -EObjjvbdpyOggQcx -DncLKvbdnVVZjjSG -EPCjjvbdyqOmIiwA -EPDLKvbddZxpXyRC -EObkKvbdRXODcMID -EOcKjvbdnHFXlmfy -EPDKjvbdznpQdcLx -EOcLKvbdqGDdtWBI -EPCjjvbdZoNhddzK -EOcKjvbdqTsgSSLU -EOcLKvbdRzJhTCvA -EOcKjvbdCIjbLIfK -DncKjvbdKQzEoGNe -EOcKjvbdACrXizJQ -EObjjvbdEzspdkcJ -EObkKvbdsZlQTAhO -EPDKjvbdfoazwEYI -DoDLKvbdjAQGaQGj -DoDLKvbdEzsqFMCi -EPDKjvbdyYJJapZk -DnbkKvbdIxUBglRQ -DoCjjvbdtTRsYyeD -EPDKjvbdGKdsDIMu -EOcLKvbdFyVVAcxC -DnbkKvbdZLrDtNkm -EPDLKvbdsrqrxydc -EPDKjvbdrpVnjCvG -DoDLKvbdmSYtzTEJ -EPDKjvbdajkfOmcA -EPDLKvbdssSSxzEc -EObjjvbdDxYMTssl -DnbkKvbdiMFEOVDZ -EOcLKvbdULvOaVni -EPDLKvbdlqyUzSdJ -EObjjvbdZoNheFZj -DncKjvbdcScLTdKB -EObkKvbdGLFTDINV -DncKjvbdcyyQYZRC -EOcKjvbdYqMeIldq -DoCkKvbdOEcshhkE -EObkKvbdirzhrjiz -EOcLKvbdxUmFRYlO -DoDKjvbdkyTRsZGt -DncKjvbdIryAsNYM -EObkKvbduWNxJpsA -DncKjvbdYkqcsnLm -DoDLKvbddZxpXyQb -DncKjvbdRotGiedX -DnbkKvbdKVtedEgJ -EOcKjvbdjvWnEBww -EObkKvbdFyVVAdXb -DoCkKvbdYlSEUNkm -EOcKjvbdcTDLTcia -EPCkKvbdzjUpQESt -DnbkKvbdqUTfqrLU -EPDKjvbdSQUHJfEX -DnbjjvbdiGjDYvKV -EObkKvbdhkdcnVCy -EPCjjvbdJuuFdFHJ -EObjjvbdYkqdTnMN -DoCkKvbdpssgSRkU -EObkKvbdUWLpKUBR -DoDKjvbdZsiJZESn -DnbkKvbdYqMdhmEq -DoCkKvbdjcLkRHVH -DnbkKvbdSPsgKGDw -DoDLKvbdKVtfEEfi -EPCjjvbdiGibyWKV -EPCjjvbdEYYLtUTl -EPCjjvbdFejSOIsq -DncLKvbdRECaQRES -EPCkKvbdEuyQQNKF -EObkKvbdxwhjCPzL -DncLKvbdiLeDnUby -EOcKjvbdEuxpQMie -EOcKjvbdIidAJogE -DoDKjvbdxsNhlqag -EOcKjvbdEzsqFLcJ -EObjjvbdYTMAmToY -DoDLKvbdwuNFQyLn -DoCkKvbdzitpQDrt -EOcLKvbdZtJIxdSn -DncLKvbdqZPHgRDx -EPDLKvbdMoxQvNfs -DncKjvbdmIctQuSB -DoCkKvbdFfKSNiUR -EPDLKvbdhtydvqtb -EObjjvbdxrnJNRag -DnbjjvbddoFTKssr -EPDKjvbdqlyjZLgi -DnbkKvbdyNsHwsJD -EOcLKvbdxnTHwsJD -EObjjvbdUQqOtuIN -DnbkKvbdwtleQyMO -DoDLKvbdrovPKDVf -EOcLKvbdFaPQxizm -EObjjvbdVAapsQqy -EOcKjvbdJvVFdFGi -DnbkKvbduDDVXVno -EObkKvbdZjTHpGbG -EObjjvbdZirgofaf -DncKjvbdAMgySvzY -DoDKjvbdGdLVibKK -DoDKjvbdWRmwbEkc -DncKjvbdXsMAlsnx -DoDLKvbdtcCuXVoP -DoDLKvbdqlyjYlIJ -EPCjjvbdHELVjCKK -DncLKvbdBdQAuilf -DoCjjvbdeFOrCXDK -DoCjjvbdRpTgJfDw -DoCkKvbdLAkHMbXq -EOcLKvbdaRebhUGL -DncLKvbdnQZyWLYb -EObjjvbdXsMBNUOx -DncKjvbdrSVKnKaN -EPCjjvbdAMhZSwZx -EOcLKvbdcScKtEKB -DncKjvbdKaLGlaxR -EOcKjvbdZRMeJNFR -EPCkKvbdwygeewdr -DnbkKvbdhancFXRR -EOcKjvbdOTUVfdtp -EPDLKvbdmbKXYOnV -DoDKjvbdGLFSbhNV -EPDLKvbdMfbomPtk -DnbkKvbdmIcsqVRa -DoDKjvbdwtmFRZLn -DoCkKvbddtAUATMv -DncKjvbdiBoDEvqR -EObkKvbdiHJcYujV -DnbjjvbdiCPDFWqR -EOcKjvbdyTNhlrCH -DoDKjvbdNQYRVmfs -EOcLKvbdFjdrbhMu -DoCjjvbdsrrSyZeD -EPCkKvbdXsMBMsoY -DoDKjvbdjhHLfFmk -EPCkKvbdyOTIYTIc -EOcLKvbdbhmKLGWx -DnbjjvbdxnTHwsIc -EOcLKvbdZoOJEeZj -EOcKjvbdjmBkzEfo -EPDKjvbdYORAXuWU -EPDKjvbdtkxXAsaX -DoDLKvbduaEYsPFI -EPCjjvbdypoNIiwA -DoDKjvbdVBCRTQrZ -DnbjjvbdlrYtyrdJ -DoCjjvbdhzUekpnG -EOcKjvbdcTCjsdJa -EObkKvbdbhlijfWx -EOcLKvbdYTLaMsoY -DnbjjvbdKVtedFGi -EOcLKvbdsPvPJbuf -DncLKvbdNrsvHEuQ -EObkKvbdmfeYMmfy -EPCjjvbdZjTHpHCG -DoDLKvbdpyOhGqDx -DoDKjvbdRkZGVGjs -DnbjjvbdRWnEDMHc -EPCkKvbdjlbMZdfo -DoCkKvbdyqOmIiwA -DoCkKvbddxZstSFz -DnbjjvbdKCibqJbx -DoCjjvbdqqtjnLBN -DnbjjvbdBhjbLJGK -DoDLKvbdrWokbhxq -EOcLKvbdJzpGXdAN -EPDKjvbdRMxCZNtz -DncKjvbdkClLRGuH -DncLKvbdIHHZxxXg -EPDKjvbdZshiYdSn -EPCkKvbdqcdhomvB -DoDKjvbdVTmUFkvK -EObkKvbdZisHogBf -DoCjjvbdRbDdkiYk -DnbkKvbdGGJrOJTq -DncLKvbdeFPRavcK -DnbjjvbdSPtHKGDw -DoDLKvbdJmADyfuB -EPCjjvbdKCibpicY -DoDLKvbdiGicZVjV -DoCkKvbdZLqdUNkm -EPDKjvbdVUNUFkvK -EPCjjvbdemFvflik -EPCkKvbdkxrqrxft -DnbkKvbdRbEElIxk -EPCjjvbdaaVdfQQX -DoDLKvbdySmhlqag -EPCjjvbdrRuKnKaN -DncLKvbdezuyEhtX -DnbkKvbdtbbuWuoP -DnbkKvbdZtIhxcrn -EObkKvbdcyxoxZQb -EOcKjvbdDxYLtTtM -EObjjvbdjggMFfOL -EPCkKvbdGckWJbKK -DnbjjvbdddnqavcK -EPDKjvbdYgWdAPTJ -DnbjjvbdbhlikGXY -DncKjvbdNPxRVmgT -EObkKvbdRpUHKGDw -EObkKvbdmfdwlmgZ -DoDLKvbdBvzdJFPv -DnbjjvbdZHXEAPSi -EPDKjvbdbQHGdLzd -EOcKjvbdCIjbLIej -DnbjjvbdOXnuzdNt -EObkKvbdrSUkNkBN -DoDLKvbdNeDsiJLE -EPCkKvbdiUyeXRtb -EObkKvbdbsDKsdJa -DncLKvbdbrcLTdJa -DncLKvbdSPsgJecw -EObjjvbdKNADzGta -EPDLKvbdFWZPomKF -EPCjjvbdRzKISbvA -EOcKjvbdvmWAMcdm -DncKjvbdwyhGGYEr -EPDLKvbdfHjuqnRH -EPCjjvbdRXOEDLhD -EPCkKvbdyOSgwsJD -DoDLKvbdnCKXYOmu -DnbjjvbdjmCLyeGo -DnbjjvbdTYKlNzjx -DoCjjvbdZisHpGbG -EObjjvbdUWMPisaR -EObjjvbdqFcdtWAh -EOcLKvbdYqNEhleR -DnbjjvbdlZSrSyGt -EPDLKvbdePEsLTsr -DncKjvbdSBcdlJYk -EPDKjvbdePEsLTsr -EPDKjvbdypnmIjXA -DnbjjvbdsQWPKCuf -EOcKjvbdZRNEhldq -EPCjjvbdYpmFImEq -EPCkKvbdKfFhBaRV -DncLKvbdezvZEhtX -DncKjvbdiCObdvpq -DnbjjvbdmJETqUrB -EOcLKvbdfpBzvcxI -DncKjvbdRbDdkhxk -EPCkKvbdmpZyVkZC -EPDLKvbdyNsIXrhc -DnbkKvbdyYJJaoyk -DncKjvbdwWlBVaWV -DoDKjvbdqwPlCiYq -DncLKvbdvvkaVaWV -DncKjvbdcJMjKewY -EObkKvbdbBWFFpPw -EPCjjvbdpyOhGqEY -EPDKjvbdCDpAujNG -EPDLKvbdCSaCtFvr -DoCjjvbdwygfFxEr -EOcLKvbdLFehBaQu -EPCjjvbdssSSxydc -EPCjjvbdHfgZyYYH -DnbkKvbdnBjWxOmu -DnbkKvbdcJNJjewY -EObjjvbdrzLoraIO -EOcKjvbdADRwjZiQ -EPCkKvbdOAJStJrA -DncLKvbdajkennDA -DoCjjvbdmbKWxPNu -EObkKvbdmbKXYPOV -DoCkKvbdKCjCpjDY -EPCkKvbdIjEAJogE -DoCkKvbdkHgLfGOL -DoCkKvbdJcJbqKCx -EPCkKvbdVUMtGMWK -DoDKjvbdNxOuzcmt -EPDLKvbdNQYRVnGs -DnbkKvbdzjUoocrt -DoDKjvbdDnbjjvcE -DoCkKvbdGBPRZJzm -DoCjjvbdtvNwjRTA -EPDLKvbdZQldhleR -DoDLKvbdUtMsfMWK -DnbkKvbdDxYLtTsl -DoCjjvbdmbJwYPOV -DoCjjvbdaNLCTVMg -DoCjjvbdWXIwvEFH -DoDKjvbddZxoxYpb -DncLKvbdijGHimXr -EPDKjvbdZQmEiMdq -DncKjvbdTulPisaR -DncLKvbdnGdxMnGy -EPCkKvbdlYsSSyHU -DoDKjvbdKRZePFme -DoCkKvbdZRNFJNEq -DncLKvbdkMbMZeGo -DoCkKvbdBiLBkIej -EObjjvbdWXIwvEFH -EOcLKvbdGGJqnJTq -DoDLKvbdRWmcblID -EObjjvbdxUleQxlO -DnbkKvbdREDBPpdS -DnbjjvbdiifHjMwr -EObjjvbdZLqctOMN -EPCjjvbdmRxtyrci -DoDLKvbdDxXlTtUM -DoDKjvbdxrmiNSBg -DoDKjvbdTppntthN -EObjjvbdnUtykKRf -DoCkKvbdRNYBxmtz -EOcLKvbdQYmAHTSK -EPCjjvbdZtIhxcsO -DoCjjvbdbsCjsdJa -EPDKjvbdsZkoraIO -DoDKjvbdEJhJvYKA -EOcLKvbdJSxaTMwl -DoDLKvbdANHxrvzY -EObkKvbdcTDKtDia -EPDKjvbdrWolDJZR -DoDKjvbdsQVnicVf -EPCjjvbdYSlAlsoY -EPCkKvbdJYUBhMRQ -DncLKvbdtlXwBUBX -EObjjvbdVrOYBeMD -EPCjjvbdcJNJkGWx -DncLKvbdjKGHjNXr -DncKjvbdRMwayOUz -EObjjvbdzdzOzdyp -DnbjjvbdNHColpVL -DoDLKvbdNddThiLE -EPDKjvbdFjdsCgmV -DnbjjvbdTJZjRABM -DncKjvbdOTTugFVQ -DncLKvbdVYgszLPO -DncKjvbdEARhlzWw -EPDLKvbdUGzmkvvF -DoDLKvbdmRyVZsEJ -EObjjvbdptUHRqjt -EOcKjvbdJpzFOeme -DnbkKvbdMgDPmPtk -EOcKjvbdhzUfMRNf -DoDLKvbdpyPHgQdY -DoCjjvbdZjShQHCG -EOcKjvbdOTTvGeVQ -EPCjjvbdRacdkiZL -DnbjjvbdzitoodTU -EOcKjvbdxxIjCPyk -EObjjvbdunszqLPU -EObjjvbdwjwDgzzG -DnbkKvbdUyHtZkOn -DnbjjvbdqvpMChyR -DnbjjvbdmIctRUrB -EObkKvbdNHCpMpUk -DoDKjvbdeFPSCXCj -EOcKjvbdtvOXjRTA -DncLKvbdZGvdAPSi -DoCjjvbdQcbaPpcr -DoDLKvbdVUMselVj -DnbjjvbdVgxWXgYz -DoDLKvbdjAQHBQHK -EOcKjvbdxxJKCPyk -DnbkKvbdQdDApQcr -DnbjjvbdqrUjmjaN -EOcKjvbdJzofYEAN -DoDLKvbdJvVGEFHJ -EObkKvbdJcJbpjDY -EPDLKvbdhanbdwRR -EObkKvbdiZtfLqOG -DoCjjvbdeOdsLTsr -DoCjjvbdSLZFuGjs -DoCjjvbdqTsfrRjt -EObjjvbdACqxKZhp -EPCjjvbdxZhFexEr -EPDKjvbdiBoCeXRR -DoDKjvbdqFcdtVaI -DnbkKvbdkClLQgVH -DnbkKvbdZQmEhldq -DnbjjvbdQYmAGrqj -DnbjjvbdiLddNuDZ -DoDLKvbdsQWOjDWG -EPDKjvbdVqnXaeLc -DnbjjvbdwNWANEFN -EPCkKvbdsBfNMHKy -EOcLKvbdKQzFOfOF -DoDKjvbdHELVibJj -EPDKjvbdcImJkFwY -DncKjvbdIwtBgkqQ -EObkKvbdANHySvyx -DoDLKvbdpxnhGqEY -EPCjjvbdrafNMHKy -DoDLKvbdSQTfiecw -DnbkKvbdiMEdOUcZ -EObjjvbdQmYCYnUz -EPDLKvbdWIYWXfxz -EPCjjvbdNeEThiLE -EObjjvbdHDkWJaij -DncKjvbdMgDQNPuL -DncKjvbdKWUedFGi -EPDLKvbdJYUCIMRQ -EOcLKvbdRacdkhyL -EPCkKvbdSBdEkhyL -EPCkKvbdMRwMzUpz -EPDLKvbdkxrqsYft -EObkKvbdRkYetgLT -EPCkKvbdNrsvHFVQ -DoCjjvbdqiAKFNOe -DoDKjvbddwystRez -EOcKjvbdrylQTBHn -EPDKjvbdDjHjWXjA -EObjjvbdCIkCLJGK -DnbjjvbdqwPlDJYq -EPCjjvbdnVUzLKRf -EOcLKvbdUxhUZjnn -DnbjjvbdRpUHJecw -DnbjjvbdjhGlFfNk -EObkKvbdJKEAKPgE -DoDLKvbdIidAKPgE -DncKjvbdCSaCtGXS -DoCjjvbdIidAKQHE -DnbkKvbdFjdsCgmV -DoCkKvbdGKeTCglu -EOcKjvbdEzspeMDJ -EOcLKvbdqUTgSSKt -DoCkKvbdnBivwnmu -DncLKvbdJcJcRKCx -EPCjjvbdVwJXucdg -DnbjjvbdKVuGEFHJ -DncLKvbdnVUzKjSG -DoCkKvbdqGDeTuaI -DnbkKvbdLFfICBQu -DnbkKvbdZjTIQGbG -DoDLKvbddBrlrATm -DncKjvbdYNqAXtut -DnbjjvbdURROtuHm -EObjjvbdxmrgxSiD -DoCkKvbdjJfHjMwr -DncLKvbdNwoVzdOU -EPDLKvbdyTNhlqbH -EObkKvbdiMEcnUby -DoDKjvbdJcKCqJbx -EPDLKvbdNrtVgEtp -DncKjvbdjEkGtoAO -DoDKjvbdNVSrKmAX -EOcLKvbdxmsIYTIc -EObkKvbdcTDKtDjB -EPDLKvbdxsOIlrCH -DnbkKvbdbrbjsdKB -DoCjjvbdpfEEtWAh -DoCkKvbdMowqVmfs -EPCkKvbdeATqMxJf -EObkKvbdjJehJmYS -EPDKjvbdxmrhYSiD -EObjjvbdjbkkQgUg -DoCjjvbdYlRdUNlN -DoDLKvbdiHKDZWJu -DoDKjvbdpedEsvAh -DoCkKvbdEuyPomJe -EPCkKvbdhtyeWrVC -DncLKvbdbAvEfQQX -DnbjjvbdTkvPBWPJ -DncKjvbdYlRdUOLm -DncLKvbdCIjajiGK -EPDKjvbdUtNTfLuj -DnbkKvbdKVuFdEgJ -DoDKjvbdfVzwoizs -EPCjjvbdySmiMrBg -EPCkKvbdrpWPJcVf -DoDKjvbdcImJjewY -DoCkKvbdkVvnECYX -DncKjvbdWRnYCEkc -DoDKjvbdCIkBjhfK -EObkKvbdmIdURVSB -DoCkKvbdTppoUuHm -EPDLKvbdUQqOtuHm -DnbkKvbdhgKDYvJu -DnbkKvbdkHgLfFmk -EPDLKvbdCDoaVjMf -EPCkKvbdehKvSNqH -DncKjvbdNeEUJJLE -DncKjvbdlhdTqVSB -EOcKjvbdEuxpPmJe -DncLKvbdqceIpNua -DnbjjvbdnVVZjjRf -DnbkKvbdKDJcRJbx -EObkKvbdnHEwlmgZ -EOcLKvbdFWZQQMjF -DoDKjvbdKWUedEgJ -DoDLKvbdmozZVkZC -DoCkKvbdZdxGzhJC -EObkKvbdGQATWffZ -EPCkKvbdJuuGDeHJ -DoCkKvbdiGibxvJu -DnbkKvbdBraDUGXS -EPDLKvbdiHKDYvKV -DnbjjvbdZxcjODMS -DnbkKvbdnGdwlmgZ -DoDKjvbdkxsRrxgU -EOcKjvbdrzMQTAgn -DncLKvbdjhHLfGOL -DnbjjvbdQvnEClID -DoDKjvbdqdEhomvB -DoDLKvbdGdKvKCJj -DnbjjvbdqvpLbiYq -EObjjvbdsPvOjCuf -DoDLKvbdVqnXbElD -EPDLKvbdeEoRbXCj -DoCkKvbdyYJKBoyk -DoDLKvbdlhdURUqa -EPDLKvbdYkqdTnMN -DoCkKvbdnGdwmNgZ -EObkKvbdGGKSOIsq -EObjjvbdLLAgvAJy -DnbjjvbdajlFnmcA -DoDLKvbdiifHimYS -EPCjjvbdnPzYukYb -EPDLKvbdVYhTyjnn -EOcLKvbdfNFwHNJk -DoCjjvbdbrbkTcia -DncLKvbdRkZGVHLT -EObkKvbdSQUHKFdX -EOcKjvbdSKxeuHKs -DncKjvbdFxuUaDwb -DoCkKvbdaSGDHtFk -EPDKjvbdZyDimcLr -EObjjvbdiGibxvJu -EPCkKvbdDwwktTsl -EPDKjvbdRadEkiZL -EPDKjvbdmgEwlmfy -DncLKvbdaogHDkzd -EOcLKvbdjuvmdCXw -EPDKjvbdqwPlCiYq -DoDKjvbdLBLHNBxR -EObjjvbdeFOrBvbj -EPDKjvbdFyVVAdYC -EPDLKvbdKNADygUa -DncKjvbdbVCGxLUI -DoCkKvbdJSyArmXl -EObkKvbdQvnDbkgc -EObjjvbdrEEiQOWB -EOcKjvbdZMSDtOLm -DoDKjvbdQvmccLhD -EPCkKvbdrzMQTBHn -EPDKjvbdMgCpNQUk -DoDKjvbdmbJwYPOV -EOcKjvbdgGLymgHA -EObjjvbdsrqsYzFD -EPDLKvbdrNZiyLgi -DnbkKvbdiiegimYS -DoDKjvbdqwQLcJYq -EObkKvbdaNLCSuNH -EPCkKvbdnUuZkJqf -EPCjjvbdSCEEkiZL -DncLKvbdVZHszKnn -DnbjjvbdUtMsfLuj -DoDKjvbdxmrgwriD -DoCkKvbdxxJKBpZk -EObkKvbdZMRdUNlN -EObkKvbdbPgHDkzd -EObkKvbdqqtjnLAm -EPDKjvbdURROuUhN -DoDKjvbdCWzdJFPv -DoDLKvbdMSXMytpz -DnbjjvbdqlyjZMHi -DoDKjvbdbsDLUDia -EOcLKvbduVnXiqTA -DoCjjvbdDxYLsssl -DoDLKvbdyqPMiJwA -EObkKvbdeOdsLUUS -EOcKjvbdEuyQQMjF -DoDKjvbdEztQeMDJ -EPCkKvbdGZVVBDxC -DnbkKvbdnGdxNNgZ -DoCkKvbdcIljLFvx -DoCjjvbdYqMdhmEq -EPDLKvbdgKfzbfAE -EPCjjvbdJcKDRJcY -EOcKjvbdOFDtJJLE -DncKjvbdiLdcmuDZ -EObkKvbdrWpLcJZR -DnbkKvbdVAaqTQrZ -DnbjjvbdFkFTChMu -DncKjvbdaaWEepQX -EPCkKvbdpedEsvAh -DncKjvbdjAQGaPfj -DoDKjvbdbUbHXkTh -DoDKjvbdRjyFtfkT -EOcLKvbdOTTvHEtp -DoCjjvbdRkYfVGjs -DncLKvbdzoQRFCkx -DncKjvbdrMzJyMHi -EOcKjvbdULvPBWOi -EOcLKvbdzdynzdzQ -EPCjjvbdtumxJpsA -DoDLKvbdwMvAMcdm -EOcLKvbdqceIonVa -EObjjvbdOEdUIiKd -EObjjvbdHELVjBij -EObjjvbdqcdiPmvB -DoCjjvbdJvVFdFGi -EPDKjvbdWRmwaeLc -EPDKjvbdZxdJnDMS -DoDKjvbdZxdJnDMS -EObjjvbdxUldpxkn -DnbkKvbdSLYetfjs -EPDLKvbdYqMeIldq -DoCjjvbdrMyjYlIJ -EObkKvbddxZtTqez -EPCkKvbdWSNxCElD -DoDKjvbdWWiYVcdg -DoDLKvbdqGDdsvAh -EOcLKvbdhzVFlRNf -EOcKjvbdaNLCSuNH -DnbkKvbdkHgMFfNk -DnbkKvbddePRbXDK -DncKjvbdNVTSKmAX -EObkKvbdhzUfLpmf -EOcKjvbdZMSDtNkm -EPDKjvbdTqROtuHm -DoCkKvbdddnqbXCj -DoDKjvbdliEURVSB -DncKjvbdtvNxKQsA -DnbjjvbdqceJQOVa -EPDKjvbdpyOggQcx -EOcKjvbdtcDUvuoP -EObjjvbdrWpMChxq -EPDKjvbdGYttaEYC -EObjjvbdiifIKNYS -DoCjjvbdZyEJmcMS -EPDLKvbdKQzFOfNe -DoCkKvbdqYoIGpdY -EPDLKvbdxwhibPzL -EPDKjvbdRadElJYk -DoDLKvbdtkwwAtAw -EPCjjvbdDjHjVxKA -EPDKjvbdrzLosBIO -EPCkKvbdBdPaVimG -DoCjjvbdrafMkfjy -EPDKjvbdNGcPmQVL -DoDLKvbdVviYVdFH -EPCjjvbdkVwODaxX -DncKjvbdkMbMZeGo -EOcLKvbdfkGzbfAE -DnbkKvbdpyOhHQdY -DoDKjvbdQdCaPqES -EObjjvbdEKHiuxKA -DnbjjvbdpxnhGpcx -DnbkKvbdkxsSSxgU -DnbjjvbdURQnuUgm -DoDLKvbdTukpJtBR -EPCkKvbdqAiFAWgd -DnbjjvbdgGLymfgA -EOcLKvbdyYIibQZk -DoDLKvbdWHxVxGxz -EPDLKvbdFyVVAdXb -DnbkKvbdrRuKnKaN -DoDLKvbdTpqOttgm -EPDKjvbdLhbLqYAS -DoCjjvbdHELVjCKK -DncLKvbdfSBWzlDP -DoCkKvbdRDcBPpdS -DoDLKvbdsQWPJcVf -EPCkKvbdySmiMrCH -EPCkKvbdbUbHXjtI -DoDLKvbdUtMsfLuj -EPCjjvbdEvZQPmKF -EObjjvbddeOqbXDK -EPDKjvbdkClKqGtg -DncKjvbdqiAJdmPF -EOcLKvbdlrZUyrci -EOcKjvbdbBVeFpPw -EOcLKvbdULvPBWOi -EPCkKvbdcJMjLFwY -DnbjjvbdZtIhxcsO -EPDLKvbdSPtHJfDw -EObkKvbdaNLBsUlg -DoDLKvbdqvpLcIxq -DoCkKvbdpxoIHQcx -EPCkKvbdlZTRsZGt -DoCjjvbderBWzkcP -EPDLKvbdZtJIxdSn -EOcLKvbdmoyyWKxb -DoDLKvbduaDxroEh -EPDLKvbddoErkTtS -DncKjvbdnPzYvKxb -EObjjvbdsZlPsAhO -EPDLKvbdjJfHjMxS -EOcLKvbdbsDLUDia -DncLKvbdMuTSLNAX -EPDLKvbdemGWfmKL -EObkKvbdKefHbBQu -EOcLKvbduVnXjRTA -DnbjjvbdGZVUaEYC -EOcKjvbdkNCMZeGo -EPCkKvbdGKeSbgmV -DoDKjvbdqrVLNjaN -DnbjjvbdEASIlzWw -DnbjjvbdeOdrkUUS -DncKjvbdDjIJvXjA -DoCjjvbdqGEFUWAh -EPCjjvbdQcbaQRES -DnbkKvbdhtydwSUb -DoCkKvbdMuTRjmAX -DnbjjvbdJutfEEfi -EPCjjvbdzGxlAMeX -DncLKvbdIHGyyYYH -DoDLKvbdxUmEqZLn -DnbkKvbdNHCpMotk -DnbjjvbdFyVVAcwb -EPCjjvbdShzJqABM -DnbjjvbdcyxoxZRC -EPCjjvbdqquKnLBN -DncLKvbdcIlikFwY -DoCkKvbdeOeSkTsr -EOcLKvbdYpldhldq -EPDLKvbdQYmAGsRj -DoCkKvbdzGyMAMeX -EPCkKvbdqrVKnLBN -EObkKvbdxUldpxlO -EPCjjvbdfIKuqnRH -EPDKjvbdFWYpQMjF -EPDLKvbdOFEUJJKd -EOcLKvbdHEKvKBij -DoDKjvbdjcMLRHUg -EPCkKvbdWXIwudEg -DncLKvbdgPazvcwh -DnbjjvbdnVUykJrG -EPCjjvbdxxJJbPyk -DncLKvbdjJehKMxS -DncKjvbdEzspdkbi -EPDKjvbdrpVnjDWG -DnbjjvbdVrOYCFLc -DoDLKvbdMfbpMotk -DncKjvbdbhljLGWx -DncKjvbdxrmhlrBg -EOcKjvbdbKlGPODA -DoDKjvbdJvUfEFHJ -EPCkKvbdySnIlqag -EPDKjvbdVAbQrpqy -DnbjjvbdrykosAhO -DnbkKvbdKfFhCBQu -DnbjjvbdEXwktTsl -DoDKjvbdDoDLLXCd -EObkKvbdvwMAvAvV -EObkKvbdXsLaNUOx -DnbkKvbdRDcBQRES -EOcLKvbdZisIPgCG -DoDKjvbdpfEEtWBI -DoDKjvbdfoazwDwh -EPCkKvbdFpASvffZ -EObjjvbdRWnDblHc -DoCkKvbdNxOuzdOU -DncLKvbdYlSDtOLm -EPCjjvbdjbkjqHVH -EPCkKvbdrMzJxkgi -EPDKjvbdCIkBjhfK -EPCkKvbdUslsekvK -EOcKjvbdFejRnJUR -EPDLKvbdNHColotk -EPCjjvbdUxgtZjnn -DoDKjvbdEOcLLXCd -EPCkKvbdkHflGFnL -EPCjjvbdwygfFxEr -DncKjvbdeOdrjtTr -DoDLKvbdqTtHRqjt -EPDLKvbdQwNdCkgc -EPCkKvbdhzVGLpnG -DoDKjvbdxwiKCPzL -EPCkKvbdZirhQGbG -DoCjjvbdqrUkOKaN -DoDLKvbdlrZUysEJ -DoCjjvbdqFdFUWAh -DnbjjvbdyYJKCPzL -DncKjvbdxUldpyMO -EPCjjvbdvAcyTOeI -EObjjvbdLFegaaRV -DncKjvbdemFvgNKL -EOcLKvbdjcLjqHVH -DoDKjvbdRMxCYnUz -EPDLKvbdRjxfUfkT -DoDLKvbdiMEdNuDZ -DoDLKvbdZRMdhmEq -DoDLKvbdqlyiyLgi -EObjjvbdiiehJmYS -DoCjjvbdwuMeRYlO -EPDKjvbdqquKmkAm -EOcKjvbdlrYtysDi -EPDLKvbdliETqUrB -EObjjvbdePErkTsr -DoDLKvbdfHjvRnQg -EObjjvbdRXOECkgc -EObkKvbdMpXqWOGs -DncKjvbdEJhJvYKA -DoCkKvbdVrOYBeMD -EPDKjvbdTkvPBWOi -EOcLKvbdjuvmcbYX -DncKjvbdMfcQMouL -EOcLKvbdMpXpvOHT -DoCjjvbdiLdcmtcZ -DnbkKvbdiHJcZWJu -EPDLKvbdTqQnuUgm -DncKjvbdLGFgbBQu -EPDKjvbdNdctIiLE -EPDKjvbdZxdKODLr -DoDKjvbdSZjITCvA -EPCjjvbdDwxMUTsl -EPCkKvbdySmhmRag -EOcLKvbdSPtHKGDw -DoDKjvbdmIctRUqa -DoDKjvbdaRfChTek -DncLKvbdyNrhXsIc -DncLKvbdJTZBSlxM -DoDKjvbdFeirOIsq -DnbjjvbdJutedFHJ -DnbkKvbdUsltGMWK -DnbkKvbdbhljLGWx -EPCjjvbdirziTLJz -EOcKjvbdnPzYvKyC -DoDKjvbdkDMLRGtg -DncLKvbdyzeNqhIh -EPCjjvbdYTMAmUPY -DoCkKvbdgGMZnHHA -DncLKvbdlZSqsYft -EOcLKvbdZjShQHCG -DnbjjvbdjhGlGGNk -DoDLKvbdkxsRryGt -DoCjjvbdZyDjNbkr -DnbkKvbdNeEUJIjd -EOcKjvbdxxJJbPyk -DoDLKvbdRbDeMIxk -EObjjvbdrDeJPnWB -EPCkKvbdrXPkbiYq -EPCjjvbdeFPRbWbj -DncLKvbdHffyxxYH -EPDKjvbdcyyQYZQb -DoCkKvbdNsTvGeUp -EPCkKvbdfpBzwDxI -EPCjjvbdqTtHRrLU -EPCkKvbdhgJbxvJu -EOcKjvbdkxsRryGt -EPCkKvbdZshhyETO -DnbkKvbdrWpLbiZR -EObkKvbdnHExMmfy -DnbkKvbdbUbGwkTh -DnbkKvbdnHExMnHZ -EObjjvbdZnmiFEyj -EObkKvbdSQUGjGDw -EPCkKvbdqTtGrRkU -EObjjvbdcImKLGXY -EObkKvbdShzJqAAl -DncLKvbdGGJqnIsq -DnbkKvbdehKuqmpg -DncLKvbddeOrCXDK -EOcLKvbdRMwbYmtz -DnbjjvbdgFlZmgHA -DnbkKvbdyOSgxTJD -EOcLKvbdQZNAGsSK -DoCkKvbdRMwayNtz -DncLKvbdezvYeItX -EOcLKvbdVAapsQrZ -DoCjjvbdcImKLFwY -DoDKjvbdTqQnttgm -DnbjjvbdOEdUJIkE -DoDKjvbdeYZssqez -DnbjjvbdZjSgpHCG -DoCkKvbdTvMPisaR -EOcKjvbdZjSgofaf -EPDLKvbdfVzwoizs -DnbjjvbdCSaCsewS -EPDLKvbdFVyPpMjF -EObkKvbddjJrVtzn -DnbjjvbdyOSgxTIc -EOcLKvbdrovPKDVf -DnbjjvbdxZhGGXeS -DncLKvbdbLLeoNcA -EOcKjvbdMfbomQUk -EPDLKvbdaRebhTfL -DoDLKvbdoAKztHcn -EOcLKvbdGckWJbJj -DncLKvbdqmZjYlHi -DncKjvbdZyDinDLr -DoCkKvbdxwhibPzL -DnbkKvbdZoOJFFZj -EPDLKvbdYpmEiMdq -DoCkKvbdiUzFWquC -DnbjjvbdsPvPJcVf -DncKjvbdDwxMTssl -EObkKvbdZQleJNEq -DoDLKvbdWSNxBdkc -DoCjjvbdcSbkTcia -EOcKjvbdqvolChyR -DnbjjvbdqlzJxlHi -DoCjjvbdlrZUzTEJ -EPCkKvbdGdLWJbJj -EObkKvbdzoPqFDLx -DncLKvbdANIYrwZx -EObjjvbdSPsgJfEX -DoCjjvbdbiNJjfWx -DnbkKvbdMfbpNQVL -EObkKvbddePRbXCj -EPDKjvbdShzKRAAl -DoDKjvbdnPyxukYb -EObjjvbdVZITzKoO -EPDLKvbdZyDinDMS -EPCjjvbdYpldhmFR -DoCkKvbdZjTIPfaf -EObjjvbdqdEiPmua -DnbkKvbdRadEkhxk -EPDLKvbdzjVPpDrt -DnbkKvbdaMkBsUlg -DncLKvbdMpXpunGs -DoDKjvbdUxgszLPO -EPCkKvbdiiegilxS -DoCjjvbdEOcKkWbd -EOcLKvbdcTDLUEJa -EPDLKvbdZtIiYcrn -DoDLKvbdmttyjirG -EPDLKvbdGdLVjBjK -DncLKvbdDigjVxKA -EPCkKvbdelfWflik -DoDKjvbdOTUVfdtp -DncKjvbdTlWOaVni -EPDKjvbdrpWOibvG -EPDKjvbdfRaWzlCo -DncKjvbdlrYuZrdJ -DoDKjvbdIsZBSlwl -EPDLKvbdqquLOKaN -DnbjjvbdJmAEZgUa -EPCkKvbdcImJkFvx -DncLKvbdkxrqsYft -EPCkKvbdUWLojTaR -DoDKjvbdnGeXlmfy -DoCkKvbdiMFDmuCy -EPDKjvbdauCHXjtI -DoCjjvbdBsAcUGXS -DoDKjvbdACrYJyhp -DoDKjvbdsZlPsBHn -DoDLKvbdjJegimXr -DoDKjvbdWXIwvDdg -DncKjvbdelewHNJk -EObkKvbdyTOJMrCH -DoCkKvbdNddUIiKd -DoCkKvbdRyjHrbvA -DoCjjvbdiGjCyWKV -DoDLKvbdhlFEOVDZ -EPCkKvbdQdDAoqDr -DoDKjvbdBiLBjhej -EOcKjvbdqlyjZLgi -DncLKvbdtSrTYzFD -DoCkKvbdrMyjYlHi -EObjjvbdhficYuiu -DoDKjvbdfekymgHA -EOcLKvbdiifHjNXr -EObjjvbdIwsaglQp -DoCjjvbdCIkBkIfK -EPDKjvbdaSFcHsfL -DoDLKvbdMgDPlpUk -EPDKjvbdqYnggQdY -DoDKjvbdaSFbgsek -DoCjjvbdiZtekqNf -EPDLKvbdkClKpftg -DoCkKvbduMYWaUAw -EObkKvbdtTSTYydc -DnbjjvbdptUGqrKt -EObjjvbdYlRctNlN -DncKjvbdMgDQNPtk -DncLKvbdILaznXQk -DoDLKvbdiCPDFWpq -DoCkKvbdiGicZWKV -DncKjvbdFjdrbglu -DncLKvbdKWUfDeGi -DoCjjvbdVhXuwgYz -DoDKjvbdhtzFWquC -EPCjjvbdRpTfiedX -DoCkKvbdKVuFdEfi -DoDLKvbdbBWEfPow -DoCkKvbdZyDjODLr -DncLKvbdeAUQmXif -DoCkKvbdIidAKQHE -EPCkKvbdTqROuVIN -DncKjvbdRXODcMID -DoDKjvbdkyTRsZHU -EPCjjvbdxnTIXrhc -EObjjvbdJzofXdAN -EOcKjvbdiBncFWpq -EObkKvbdYORAXuVt -DnbjjvbdiMEdNtby -EPDKjvbdVrOXbFMD -EPCkKvbdAMgxrwZx -DoCkKvbdtbbuXVoP -EPCjjvbdDoCkKwCd -DncLKvbdVBBpsRRy -DoDKjvbdemGWgMik -EObkKvbdeEnqbXDK -EPCjjvbdhanbdvqR -DnbkKvbdmaiwYOnV -DoCjjvbdcJMjLGXY -DnbkKvbdIryArlxM -EPCjjvbdtkwvaUAw -DnbkKvbdxZgefYFS -EPCkKvbderBWzlDP -EPCjjvbdNxPVzdOU -EPDKjvbdaSGDHsek -EOcKjvbdqcdhpOVa -EPCkKvbdxmsHxShc -DoDKjvbdDncKjwDE -DoCjjvbdYpmEhmFR -DncKjvbdaRfCgsfL -EObjjvbdegjurNpg -DnbkKvbdjhHMFenL -EPCjjvbdMfcPmQUk -EOcLKvbdACrYKZhp -DoDKjvbdffMZmgHA -DoCjjvbdaaVeGQQX -EOcKjvbdSCDdkiZL -EOcKjvbdqwPlCiYq -DoDKjvbdajlGPODA -DncLKvbdJYTbHkpp -DncLKvbdtcDVXWOo -EPCjjvbdEXxLtTsl -EPCjjvbdJuteceGi -DnbjjvbdDoCkLWbd -DoCkKvbduCbtwWOo -EPDLKvbdauBgYLTh -EPCjjvbdOXoVzcmt -DoCkKvbdRMxByOUz -DoCjjvbdqYoIGqDx -EPCjjvbdNGbpMpVL -DoCjjvbdJpzFOfNe -EOcKjvbdVAapsQrZ -DncKjvbdpxoIHQcx -EOcKjvbdRaceLiZL -DncLKvbdtcCuWvOo -EObjjvbdbBVeGPow -DnbjjvbdKyRKSzuG -EOcLKvbdFyVUaEYC -EPDKjvbdkCkkRHUg -EObkKvbdKaKfmBxR -DoDLKvbdbUbGwjsh -DnbjjvbdrovOjDVf -EPCjjvbdZsiIyDsO -EObjjvbdRDbaPqDr -EOcKjvbdnBivwnmu -EPCjjvbdYTMBMsoY -DoDLKvbdxKwEHzzG -EPCkKvbdqTsgRqkU -EPDKjvbdfMfWgNKL -DnbkKvbdznpREbkx -DncKjvbdJXtCHlRQ -EPDLKvbdGYuVBEXb -EPDKjvbdZLrEUOMN -EPDKjvbdtcCtvuoP -EObjjvbdXsLaNUPY -EPDLKvbdyOTIYSiD -EObjjvbdsrrTYyeD -EObjjvbdZisHpGaf -DoDLKvbdvOszqLOt -DncLKvbdaMjbSuNH -DncLKvbdYTMBMsoY -EPDKjvbdwzIGFxFS -EPDLKvbdmRyUyrci -DncLKvbdTkvPBWOi -EPCjjvbdNdcsiIjd -EPCkKvbdEzspdkbi -EObkKvbdrovOicVf -DoDKjvbdhbObeXQq -DncKjvbdZnnIeFZj -EObkKvbdRECaPpdS -EOcKjvbdnGeXlnHZ -EPCjjvbdauCGwjsh -EPCjjvbdczYpXyRC -EOcLKvbdDihJuxKA -EOcKjvbdkVwNcbXw -EObjjvbdbsCkTcia -DoCkKvbdfMewHNKL -DoCjjvbdxZgeexEr -EOcLKvbdiBoDEwQq -DnbkKvbdpstHSSKt -EOcKjvbdQvmdClHc -EPDKjvbdIxUBhLqQ -EObkKvbdZtJIyESn -EPCjjvbdtumwjQsA -DoCjjvbdNPxQunHT -EOcLKvbddndrkUTr -EObjjvbdCTBCsevr -EOcKjvbdiUzEwRuC -EPDKjvbdRyigrbvA -DoCjjvbdezvYeJTw -EOcLKvbdVgxVxGxz -DnbjjvbdZeXfzhIb -DncKjvbdxZgfFweS -DoCkKvbdKxqKSztf -DncLKvbdpyOggREY -EPDLKvbdXrlBNUOx -EPCkKvbdqwPkbiZR -EPDLKvbdbsCjscia -DoDKjvbdnGeYMmgZ -EOcLKvbdUsmTfLvK -DnbkKvbdjuwOEBxX -DnbjjvbdTAFJICPE -DncKjvbdEuxoomKF -EPDKjvbdeOdsLTsr -EObkKvbdZshiYdSn -DncKjvbdcTDKscjB -DncLKvbdvwMBWAvV -EOcKjvbdVwIwudFH -EPDLKvbdlZTSSxgU -EOcKjvbdMgColotk -EOcLKvbdZdxGzgiC -DnbjjvbdULuoBWOi -EObjjvbdiCObeXQq -EPDKjvbdNUsRkNAX -DoCjjvbdZxcjOClS -DncLKvbdiUzEwSVC -DoDLKvbdvlvAMceN -DoDLKvbdqcdhpOWB -EObkKvbdCSaDUGWr -DoCkKvbdssSTYydc -DoCkKvbdnGdxMmgZ -DoCkKvbdHELWJbKK -DoDKjvbdKefHbApu -EObkKvbdVqmwbFLc -DoCkKvbdUtNTekuj -EPDLKvbdTlWOaVni -DoCjjvbdDxXkstUM -EPCkKvbdpxoHfqEY -EPDKjvbdmSYtzTEJ -DoCjjvbdddnrCXDK -EPCkKvbdZjTHpGbG -DncLKvbdhzVGLqOG -EPCjjvbdZjSgogBf -EPDLKvbdkDLjqGuH -DncLKvbdxUmFRZLn -EPDLKvbdjhHMFfNk -EPCkKvbdZjTHpHBf -EObkKvbdegkVqnQg -EPDLKvbdGYttaEXb -EObjjvbdZdwfzhJC -DoCkKvbdGQASwHFy -EPDKjvbdkVvnDbXw -EObkKvbdJYTagkqQ -DoCjjvbdMSWlzVQz -DoCjjvbdnGeYMmfy -DoDLKvbdADRxKZiQ -EObkKvbdZLqdTmkm -EPCkKvbdFeirOItR -EPCkKvbdRjyGVGjs -DncLKvbdiMFDnUcZ -EObkKvbdVAaqSpqy -EPCkKvbdULunaVni -DnbkKvbdcImKKevx -DoCjjvbduaDyTPFI -EPDKjvbdKQydoFnF -EPCjjvbdozmcjwoA -DoDLKvbdZLqdUNlN -DoDKjvbdJXsbHkpp -DoCkKvbdelfXHNJk -EObjjvbdeFOqavcK -EPDLKvbdqlyjZMIJ -DoCjjvbdUtMsekvK -DoCkKvbdIxUBhMQp -EOcKjvbdemGWgMjL -DoCkKvbdwuMeQyLn -DncKjvbdkClKpgVH -DoDKjvbdfNFvflik -DncKjvbdhkdcmuCy -DoDLKvbdCJKakIfK -DnbkKvbdSQTgJfEX -DnbkKvbdkIGlGFmk -DoDKjvbdySmhlqbH -DoCjjvbdGdLVibJj -EPCjjvbdSLZGUfkT -EPDLKvbdSKxfVHKs -DoDKjvbdGLFSbhMu -DoCkKvbdqFcdtWAh -EOcLKvbdbVBfxLUI -DoDKjvbdcScKsdKB -DnbkKvbdVwJYWEFH -EPCjjvbdGQASwHFy -DnbjjvbdqUTfrRjt -EPDLKvbdEYYMTtUM -DoDLKvbdfNFwHNKL -EObkKvbdsQWPJbvG -EOcKjvbdIsYaSmYM -EPDKjvbdBdQAuilf -DnbkKvbdrounibvG -EObkKvbdiCPCdvqR -EOcLKvbdBsAbsfXS -DoCjjvbduDDVWuoP -EPCkKvbdbsCjtEJa -EOcKjvbdcTDLTdKB -DoCjjvbdXGYytAPT -DnbjjvbdePFTLTsr -EObkKvbddoErjssr -EPCkKvbdcTDKsdJa -EPDKjvbdjgflGFnL -EObjjvbddeOqbWcK -EObkKvbdACqwizJQ -EObjjvbdHgGyyXxH -DoCjjvbdqlzKZMHi -DnbjjvbdhfibxvJu -DoDKjvbdSCEFLiZL -EPCjjvbdSCEFLiYk -EObkKvbdiLdcmuDZ -EObkKvbdzGyMAMeX -EPDKjvbdVYhTzKoO -EPCkKvbdxrmiNRag -DoDLKvbdjKGHilxS -EOcKjvbdhWyAzzAJ -EPDLKvbdMfcQNQVL -DncKjvbdYkqdTmlN -DoDLKvbdjJfIJlwr -EOcLKvbdZeYGzghb -DncLKvbdJuuFceGi -EPCkKvbdhzUelRNf -DnbkKvbdBhkCKhej -DoDLKvbdhbObeXRR -DnbkKvbdzHZMAMdw -DoDKjvbdZxcjNblS -DoCjjvbdDwwksstM -DoCkKvbdUVkpJtAq -DoDLKvbdaaWEepPw -DncLKvbdGdKvJbKK -DoDLKvbdTulQJtBR -DoDKjvbdqceJPnVa -DnbkKvbdvAdZTOeI -EOcKjvbdVAbRSqRy -EPCkKvbdTqQnuVHm -DoCjjvbdwNWANDeN -DnbkKvbdZtIiYdSn -EPCjjvbdPIAXyAZB -EPCjjvbdZoOIeEzK -DoDLKvbdmJETqUrB -DoCjjvbdOFDtIiKd -DnbkKvbdqvolDIxq -DnbjjvbdmgFYNNfy -DncLKvbdieLHUoAO -EPCkKvbdDnbkLWcE -DoCjjvbdmJETpuSB -DncLKvbdiiegjNXr -EPDKjvbdZQldiMeR -EOcKjvbdZHXEAPTJ -EObkKvbdWHwvXfxz -DnbkKvbdxUleRZLn -DnbkKvbdtvNxKQsA -DoDKjvbdOStWHEuQ -DnbkKvbdsBellHLZ -DoDKjvbdsCFllGkZ -EPDKjvbdjhGlGGOL -DncKjvbdxxJKBoyk -DncKjvbdrXPkcJYq -DoCkKvbduVnXipsA -DoDKjvbdjKGHjMwr -DoDKjvbdbBWEfPpX -EOcKjvbdznoqEcMY -DoCkKvbdySnJMqbH -DoCjjvbdlrZVZsDi -EPDLKvbdKfFgbApu -DoDLKvbdZRMdiNFR -EObjjvbdpeceUWAh -EObkKvbdRotHKFcw -DncKjvbdiZuFkpmf -DoDKjvbdnGdwmNgZ -DoDKjvbdMoxRVnGs -DoDLKvbdiVZeXRtb -EOcKjvbdGAoRYizm -DoDKjvbdJJdAJpGd -DoDKjvbdwMvANEFN -DnbjjvbdaaWFFpQX -DnbjjvbdqlzKZMIJ -EPDLKvbdxnShXsJD -DncLKvbdMfcPlotk -DncLKvbdURRPVUhN -DnbkKvbdHgGzZXxH -EOcLKvbdYlRctOMN -DncKjvbdnHEwlnGy -DoDKjvbdlYsSTZGt -EOcKjvbdZxcjNcLr -EObjjvbdmttyjjSG -EObkKvbdffLynHHA -DnbkKvbdmpZxvLZC -DncLKvbdBhjakJGK -DoCkKvbdpstHSRkU -EPDLKvbdiLddOVCy -EOcKjvbdxUleQyLn -EPCkKvbdTukpKTaR -EOcLKvbdjvXOECYX -EObjjvbdRWnEDLgc -EObkKvbdbhljLGWx -EPCkKvbdZoOJEdyj -DnbkKvbdqrVKnLAm -DoDKjvbdVAbRTRRy -DnbkKvbdhfjDZWKV -EOcLKvbdkWXOECYX -DnbkKvbdYTLaMsnx -EObjjvbdZRNFImFR -DncLKvbdCWzdIdpW -EOcLKvbdpyPIGqDx -DoDLKvbdiCOcFWpq -EPCjjvbdhtzFXSUb -Dnbjjvbdlqxtyrci -DoCkKvbdiZtelROG -EPCkKvbdVUNUFkvK -DnbkKvbdNddUJJLE -DoCkKvbdNdctIhjd -DnbkKvbdcyyQYZQb -EObkKvbdQmYByNtz -DoDLKvbdVrNxBeMD -EPCjjvbdCTBCsevr -DncLKvbdtSrTYyeD -DnbjjvbdRyigsDWA -DncLKvbdJYUBglQp -DoDKjvbdSPsfiedX -DoCkKvbdADRxKZiQ -EPDLKvbdrEFJPmvB -DnbjjvbdvAcyTOdh -EOcKjvbdaMjasUmH -DoDKjvbdZjSgogBf -DnbkKvbdnGeXmOGy -DnbjjvbdMgComPuL -EPCkKvbdxKvcgzzG -DncKjvbdwtldpyMO -DoDKjvbdbhlikGXY -EPCkKvbdpyPIHREY -DoDLKvbdkClLRHUg -EPDKjvbdqFdFUWBI -EOcLKvbdkxrqrxgU -DoDLKvbdTvLoitAq -DoCjjvbdJuuFcdfi -EPCjjvbdrykpTAhO -EPCjjvbdiZuFkqNf -EObjjvbdEuxpQNKF -EPCjjvbdGGKSOJUR -EPCkKvbdcyxowxqC -DnbjjvbdjhGkeemk -EPDKjvbdijGIJmYS -DnbkKvbdypnliKXA -EOcKjvbdRadFLhyL -EPCjjvbdxwiKCPyk -DoCkKvbdfILVqnQg -DoDLKvbdkNCLzEgP -DoCkKvbdGKdrbglu -DnbkKvbdJcJcRJcY -DoDLKvbdIwsahMRQ -DnbkKvbdNddUIhjd -EPCkKvbdJuuGDdgJ -EPDLKvbdjKGHjMwr -EObkKvbdGdKvKCJj -DncKjvbdNUrqkNAX -DoDLKvbdTqQoVVHm -DoDKjvbdNddTiIkE -EPCkKvbduaEZTPFI -DnbjjvbdFWYopMie -EObjjvbdyXhiaozL -EPCjjvbdhaoDFWpq -DncKjvbdJJdAKQHE -DoDKjvbdegkVrOQg -DnbjjvbdwuMdqYlO -EPCkKvbdLKaHvAJy -DoDKjvbdRbEFLiYk -DoDKjvbdSxLMNzjx -DnbkKvbdGKdsChMu -DncKjvbdACrYJzJQ -DoCjjvbdbUafwkUI -DncKjvbdzjVPpDrt -DnbjjvbdFfKSOJTq -EPDKjvbdHffyyXxH -EOcLKvbdRkZFtgLT -EOcKjvbdXsMAmToY -EOcLKvbdNPwqWNfs -DoCjjvbdEuxpPljF -DncLKvbdjJfIJlxS -DoCjjvbdhgJbxuiu -EPCkKvbdrDdhpOWB -DnbkKvbdwWlBWAuu -EObjjvbdySmiMrCH -EPCjjvbduWOXjRTA -DncLKvbdRDbaPqES -EPCkKvbdjEkHVPAO -EPDLKvbddiiqvUzn -EPDKjvbdyYJKCPyk -DncKjvbdNeEThiKd -DncKjvbdrbGMlGkZ -EOcKjvbdOTTvHEuQ -EObjjvbdFyVUaEYC -EPCkKvbdbiMikFwY -EPDKjvbduaDxsPFI -DncLKvbdozmckYPA -DoDLKvbdVYgsykPO -DoCjjvbdQvnDbkgc -DncKjvbdZLrDtNkm -DoDKjvbdHfgZyYXg -DoDKjvbdauCGwkUI -DoDKjvbdmJDsqVSB -EOcKjvbdhgJbyWKV -EPCjjvbdrouoKDWG -DoDKjvbdQmYCYnUz -DoDLKvbdfHkVqmpg -DoCjjvbdZjShPfaf -DoCkKvbdIGfzYxYH -EPDKjvbdZRMeJNFR -EPCjjvbdRpTgKFdX -EPCkKvbdEYYMUUUM -DncLKvbdwuMdqZLn -EOcKjvbdmuVZkJqf -DncKjvbdhgJbyWJu -DnbjjvbdKVuFcdfi -EPCkKvbdRadElIxk -EPCkKvbdYlSDsmkm -DoDKjvbdhlFEOVDZ -DoCjjvbdIsZBSlwl -DoDKjvbdLAkGmCXq -DoDLKvbdqwQMCiYq -EPDKjvbdURROtuIN -DoCjjvbdpxoHgREY -DncKjvbdwXLaWAuu -EObjjvbdrpWPJcWG -EPDLKvbdmozYvLYb -EPCkKvbdMowpunGs -DnbkKvbdANHySvzY -DncLKvbdZyDinDLr -DoCjjvbdziuPpESt -EPDKjvbdiVZeXRuC -EPDLKvbdDncKkWbd -EOcLKvbdFVxopNJe -DncLKvbdACqxJzIp -DncKjvbdaMkCTUlg -DoCkKvbdhyuGMQnG -EObjjvbdbBWFFpPw -EObkKvbdTAEiICPE -DoDKjvbdbUagXjtI -DoDLKvbdGZUuAcwb -DoDKjvbdnGdwlmgZ -DoDLKvbdVBCRSpqy -DnbjjvbdfIKvRnRH -EObkKvbdaRebgsek -DnbjjvbdNVSrLNAX -EPDKjvbdrJAKEmPF -DnbkKvbdBdQBWKNG -DoCjjvbdePFTLUUS -EPCkKvbdRDcAoqDr -DncLKvbdrNZiyLhJ -DoCkKvbdLqwNZtpz -EPDLKvbdlqxtzTEJ -DnbkKvbdrRtjmkBN -EPCkKvbdZRMeJNEq -DnbkKvbdZsiJYdTO -EObjjvbdUtMtGLvK -EOcLKvbdnCJwYOnV -DncLKvbdUMWPAuni -EOcKjvbdJcJbpjDY -DoCkKvbdcImKLGXY -EObkKvbdYSlAmTnx -DncLKvbdCTBCtFvr -EObjjvbdqlyjYlIJ -DoCkKvbdmSZUzSci -DoDKjvbdjEjfuPAO -EPCjjvbdWfYzUAPT -DnbjjvbdzROmJJwA -EObjjvbdnQZyVjyC -DncKjvbdjAQGaPgK -EObkKvbdtTSTZZeD -DoDLKvbdZLrETnLm -DncKjvbdCDpAujNG -DncKjvbdUyHsykOn -EPDLKvbdeXystRez -EPCjjvbdlrZUyrci -EPDKjvbdwjvcgzzG -EPDKjvbdnHExNOGy -EOcKjvbdZLqdTmlN -EPCkKvbdEuxopMjF -EObjjvbdJYTaglRQ -EPCjjvbdrWpLbiZR -EPCjjvbdNxOuzcnU -DoDLKvbdijFhKNXr -DnbkKvbdKWVGEFHJ -DnbkKvbdKCicQjCx -DoCkKvbdcScLTdKB -EOcKjvbdKWUecdfi -DoCjjvbdiLeDmuDZ -DncKjvbdySnJNSCH -EPDLKvbdZshhyDrn -DnbkKvbdssSSxydc -EOcLKvbdqrUjnLBN -EPDKjvbdGdLWKCKK -EObjjvbdsQWPJbuf -DoDLKvbdJcKDRJcY -DoCjjvbdZoNiEeZj -DnbkKvbdGFjSOJTq -EPDLKvbdxxJKBozL -DoDKjvbdBraDUGXS -EPDKjvbdJbjCpicY -DoCjjvbdVqmwbEkc -EPDKjvbdijFhKMwr -EPDLKvbdrSVLNkBN -DoCkKvbdiUzEvquC -EPCjjvbdWIYVxGxz -DnbkKvbdZoOIdeZj -DncLKvbdZRMeJNEq -EObjjvbdZMSDtOMN -DnbjjvbdRWnDcLgc -DoDLKvbdmRxtzTDi -EOcKjvbdJmADygUa -EOcKjvbdxUmFQyMO -EOcLKvbdOTUWHEtp -DoDLKvbdZRNFJMeR -EOcLKvbdxmsHxShc -EPCkKvbdUxhTykPO -DoCkKvbdelfWfljL -EPDLKvbdFejSOJTq -EPCkKvbdKefIBaRV -DncKjvbddeOqbXDK -EOcKjvbdhlEcnUcZ -DoCkKvbdZtJJZETO -DnbjjvbdSPtHJfDw -DncLKvbdOFDtIhkE -EPDLKvbdFyVVAcwb -DoCjjvbdqTtGqqjt -EOcLKvbdyTOIlrCH -DnbjjvbdACrYKZiQ -DoDLKvbdvmWAMceN -DoDKjvbdLBLHNCYR -EPCkKvbdIxUCHlQp -EPDLKvbdQmXayNtz -DoCjjvbdKRZdoFme -DncLKvbdZoNiEdyj -DoDKjvbdqqtkOLBN -EPCkKvbdiZuFkpmf -DncKjvbdEPCjkXCd -DoDKjvbdbVBgXjsh -DoCjjvbdmRyUzSdJ -EObjjvbdMJCLpxAS -DoCjjvbdwWlBWAvV -EPDKjvbdNHCpMouL -DncKjvbdEOcLKwDE -DoCjjvbdwjvcgzzG -DnbkKvbdNGbpNPtk -DoDLKvbdZGwEAOri -EObjjvbdaRfDITfL -DoDKjvbdVvhwudEg -EPCjjvbdHgGyxwwg -DncKjvbdcJMikFwY -EObjjvbdwMvAMdEm -EOcKjvbduMYXBUAw -EPDLKvbdpfDeTuaI -DoDKjvbdssSSxzEc -DnbjjvbdjblLRHUg -EOcLKvbdVwIxWDeH -EPCkKvbdLGFgaaQu -EPDKjvbdBiKakIfK -DoDLKvbdEOcKjwDE -EOcKjvbddijRvUzn -DoCjjvbdmaivxPOV -DnbkKvbdMfcQNPuL -DncLKvbdZtIiZDsO -DoDLKvbdhlEcmuDZ -EOcKjvbdIGfzYxYH -DncLKvbdICLydzAD -EPDLKvbdMfcPmPuL -DnbjjvbdrRuKmjaN -DnbkKvbdbsDKscjB -DoCkKvbdhkddNtcZ -EOcLKvbdNQXqVnGs -DoDLKvbdrEFIonVa -DoCjjvbdQvnDcMID -EPCjjvbdjlalZeGo -EPCkKvbdjJfIKNYS -EObjjvbdREDBPqES -EPCjjvbdiZtfMRNf -DoDKjvbdADRxJyiQ -DncLKvbdYkqcsnMN -DncLKvbdZshiZDsO -DoDLKvbdRNXayNtz -DncLKvbdqcdiPmvB -EPCkKvbdrNZixlHi -EPCjjvbdwtmFRYlO -EObkKvbdJTZBTNXl -EOcLKvbdWRnXadkc -DoDLKvbdvwMBVaVu -DoDKjvbdlZSrTYgU -EPDLKvbdQcbaQRDr -DoCjjvbdhuZdvrUb -DnbkKvbdZxdKOClS -DncKjvbdJzoexEAN -EOcLKvbdQvmdDLhD -DncLKvbdunszpkPU -EOcKjvbdiZuGMQnG -DncKjvbdVZIUZkOn -DoDLKvbdkxsRsYgU -EPCjjvbdGQASwGey -DncKjvbdnBivwoNu -EPDLKvbdsBelkfjy -DoDLKvbdddoRbWbj -EPCjjvbdhancFXQq -EObkKvbdJvUfEEfi -EPDLKvbdIidAKPfd -DoDLKvbdxVMdpxkn -DoCjjvbdaNLCTVNH -DnbkKvbdZyDinDMS -DoDLKvbdrMzJyLhJ -EPDLKvbdyXhiaozL -DoCjjvbdGKeTDHlu -DncKjvbdwzIGFxFS -EObjjvbdJvUedEfi -DncLKvbdIjEAJpGd -DncKjvbdyTNiNRbH -EOcKjvbdidkGuPAO -DoDLKvbdkVvmcbXw -DoCjjvbdJYTbHkpp -DoDLKvbdFyVVBEYC -EPDLKvbdmoyyVjyC -EOcKjvbdcTDKtDjB -EPCjjvbdEvYpPmJe -DoCjjvbdCJLCKhej -DoCjjvbdSKxfUgLT -DoDLKvbdFjeTDINV -DncLKvbdEXxMUTtM -EOcKjvbdWRnXaeMD -DoCjjvbdrMzJyLgi -DoCkKvbdcSbkUEKB -DnbkKvbdyzeOSIIh -DncLKvbdpstGqrKt -EPDKjvbdCJLBkJGK -EOcLKvbdJcJcQjDY -EPDLKvbdbLLfPNcA -DnbjjvbdEASImZwX -DnbjjvbdtumwiqTA -DnbkKvbdxKvdHzyf -DoCjjvbdVwIxWDeH -DncLKvbdYzcFqjVy -EPDKjvbdqiAJeMoF -DoDLKvbdNQXqVmfs -EPDLKvbdFjdsChNV -DoCkKvbdOTUWGdtp -EOcKjvbdOEdUIiKd -EOcLKvbduaEZSoFI -EOcLKvbdxsNhlrBg -EObkKvbdcIlijfXY -DoDLKvbdLqvlytpz -DoDKjvbdIryBTNXl -EObjjvbdQwOECkhD -DoCjjvbdLFegaaQu -EObkKvbdFkFTChNV -DnbjjvbdyzeOSHiI -EObjjvbdLAkHNCYR -DnbkKvbdZyDimcMS -DncKjvbdkMbLzEgP -DnbjjvbdRbEEkhyL -EOcKjvbdLrXMzVQz -EOcKjvbdVBBqTRRy -EObjjvbdyNsHxTIc -EPCjjvbdMuTRkNAX -DoCkKvbdUaCQrprZ -EPCjjvbdjmCLydfo -DoCjjvbdFyVVAcxC -EPCjjvbdQvnDblID -DnbjjvbdLhbLqYAS -DncLKvbdFxuVBEYC -DncKjvbdGLFScIMu -DncKjvbdBvzcheQW -EPDLKvbdSPsfjFcw -DnbkKvbdsQWOibvG -DnbkKvbdaSGChTfL -EPDLKvbdjmBkzFGo -DoDLKvbdqAiFAWhE -EPDLKvbdkVwNcaww -DoCkKvbdKRZePGOF -EOcLKvbdJXtCIMRQ -EPCkKvbdaNLCTUmH -EPDLKvbdliDtRUrB -EOcLKvbdKfGHbApu -EObkKvbdDwwlTstM -DoDLKvbdmgExMmfy -EOcLKvbdKWUfEFHJ -EPCjjvbdkxrqrxft -DncLKvbdkClKqHUg -DoDKjvbdVqnXadlD -DoDLKvbdULvPBWPJ -DoDKjvbdUslsfMWK -EOcLKvbdJvVFdFGi -DncKjvbdiifHilxS -EPCkKvbdRaceMJYk -DoCkKvbddwytTrFz -EPDLKvbdYkrETnLm -DoCjjvbdiMEdOUby -DoCkKvbdxVMeQyLn -EPCkKvbdwuMdpxlO -EPDLKvbdNPxQumfs -DncKjvbdYpleJNEq -DncKjvbdTAEhhCPE -EOcLKvbdUGznLwVe -EOcKjvbdNPwpunHT -EPDLKvbdKaLHNBwq -EOcLKvbdFfKRmhtR -EObkKvbdYlRcsmlN -DoDLKvbdWSOXadlD -EOcLKvbdWWiXucdg -DoCkKvbdZsiIxcsO -DoDLKvbdbhlikFvx -EOcKjvbdtlYXAsaX -EOcLKvbdUtNTelVj -DoDKjvbdhaoDFXRR -DoDLKvbdEuxoomJe -DoDLKvbdEYYLtTsl -DncLKvbdbhmJkGWx -EPDLKvbdqwPkbhxq -DnbjjvbdlrYuZsEJ -DncLKvbdeKKSWUzn -DnbkKvbdyTNiNSCH -DncKjvbddwzTsqez -DncLKvbdTXkMNzjx -DoDKjvbdJmAEZgUa -DncKjvbdeEnqavbj -EPDLKvbdcJNJjfWx -DncLKvbdPyNAGsRj -DoCjjvbdLGGHbAqV -DncKjvbdddoRbWcK -DoDLKvbdZjTHogBf -EPDLKvbdRkZFuHKs -EOcLKvbdEuyPoljF -EPDKjvbdEYYMTtUM -DncKjvbdDxXlTssl -DnbkKvbdQvmcblID -EObkKvbdjmBkydgP -DoCkKvbdOAJTUKSA -DncKjvbdhgJbxvJu -DoDKjvbdVvhxVceH -DoCkKvbdjvXODaww -EPDKjvbdemFvflik -DoDKjvbdkCkkRGtg -DoCjjvbdDigjVxKA -DncLKvbdLAjgNCYR -EPDKjvbdbUbGwkTh -EObjjvbdmuUzLJrG -DnbjjvbdmgFXlnGy -DoCkKvbdFxttaDwb -EPCjjvbdJcKDRKCx -DoCkKvbdpfDeUWAh -EPDLKvbdADSYJyhp -DoCjjvbdHkazmvqL -DnbkKvbduLxWaUBX -EPCkKvbdQdCaPpdS -EOcLKvbdZdwfzhIb -EPDKjvbdKWUeceGi -EPDKjvbdSCDeMJZL -DoDKjvbdyOShYShc -EObjjvbdliEURVSB -DncLKvbdmgEwlnGy -DnbkKvbdsBemMHKy -DoDKjvbdYzcGSJvZ -EObkKvbdGcjvKBjK -EOcLKvbdJuuGDdgJ -EPCjjvbdOStWGeUp -EOcLKvbdGLEsChMu -EOcLKvbdeATqNYJf -DncLKvbdxxIjCQZk -EObkKvbddZyQXyQb -DoDKjvbdVBCRTRRy -EPCjjvbduDDVWuoP -EOcKjvbdVZHtZkOn -EPCjjvbdZQmEhmFR -DnbkKvbdZyDimcLr -EPDLKvbdjblKqHVH -EOcLKvbdZtIiZDsO -DnbkKvbdRWmcbkhD -EPCjjvbddneSjtTr -DoCkKvbdZQmFJMdq -DoDLKvbdLFegbBRV -EOcKjvbdSwkMNzjx -DoCjjvbdFjeTDHlu -EPCjjvbdtSqrxydc -DncLKvbdSPtHKFcw -DncLKvbdyYJJapZk -EOcKjvbddxZssrFz -EObjjvbdfekzOGgA -EPDKjvbdrylQSaHn -DnbjjvbdZisHofbG -EObjjvbdrbGNMHKy -DnbkKvbdLBKfmBxR -DncKjvbdACqxJyhp -DncLKvbddijRutzn -EPDLKvbdMpYRVmfs -DncLKvbdmttzKiqf -DnbkKvbdZnmhdeZj -EPCkKvbdjKFgjNYS -DnbjjvbdxnTHxShc -EPCjjvbdlZTSTYgU -DoCjjvbdqlyjYkgi -EObkKvbdxVMeQyMO -EPDLKvbdSPtHJecw -EPDLKvbdrpWOibvG -EObkKvbdRbEFLhyL -DoCkKvbdYNqAYUvU -DoCkKvbdnCKXXnnV -EObkKvbdddoSBvbj -DncKjvbdNGcPlpUk -DnbkKvbdmajXXnmu -DoCjjvbdJXsbHlQp -DncLKvbdNGcPlouL -DoCkKvbdTAFJHaoE -EPCjjvbdnPyxvKyC -EPCkKvbdRyihTDWA -DncLKvbdQlxCZNtz -EObkKvbdJSyAsMwl -DoCjjvbdmttykJrG -EPCkKvbdfpBzwEXh -DoCjjvbdrzMQTBIO -EPDKjvbddZxowyRC -DncKjvbdaNKaruNH -DnbjjvbdaNKasVMg -DncKjvbdcbTNSATm -EPCkKvbdiLdcnVDZ -EObjjvbdYTLaMtOx -EOcKjvbdEASIlzWw -DnbjjvbdziuPodTU -EOcLKvbdqUUHRqkU -DnbkKvbdyNsHxSiD -EObjjvbdhkeDnUcZ -EOcKjvbdNHCpNQUk -EPDLKvbdIryBSmYM -DnbkKvbdfekynGgA -EOcLKvbdiHKCyWJu -EObkKvbdrMzKYlIJ -DoCjjvbdsZkoraIO -EOcKjvbdQccAoqES -DoCjjvbdtTRrxzFD -EPCjjvbdJXtBhMRQ -DnbjjvbdsBfNMHKy -DnbkKvbdeEnrBwCj -DoDLKvbdTfzmkvvF -DoCjjvbdCJLCLIej -DnbjjvbdNUrrLNAX -DoCkKvbdxsNiNRag -EPCjjvbdtbcUwVoP -DoDKjvbdaogHDkzd -DncKjvbdpedFTuaI -DnbjjvbdqYngfpdY -DncKjvbdbiNJkGWx -DoCjjvbdGckVjBij -EObkKvbdqceIomvB -EPDLKvbdFWZQQNJe -EObkKvbdrRtkOLAm -DncKjvbdDwwktUTl -EObkKvbdwNWAMceN -DncKjvbdZMSDtOLm -EObjjvbdTkvPAuni -DoDLKvbdUxhTykPO -EOcLKvbdVBCQsQqy -EPDKjvbdZshhxcrn -DnbjjvbdqdEiQOWB -DoDKjvbdkWWmdBww -DoDLKvbdzQoMhiwA -DnbjjvbdUGzmlXWF -DncKjvbdJTYaTMwl -DoDKjvbdGLFScHmV -DoDKjvbdrWpLcJZR -EOcKjvbdwNWAMcdm -EObkKvbdmfeYNOGy -EObkKvbdtcDUwVoP -DnbjjvbdiZuGMQmf -EObjjvbdfMewGmJk -DnbjjvbdANIZTWyx -DncKjvbdtTSSxydc -DnbkKvbdsBfMkfjy -DoDKjvbdSLYfUgKs -DoDLKvbdZisHogCG -EObkKvbdVTlsfMVj -DncKjvbddZyPwxpb -DncLKvbdAMhYsXZx -DncLKvbdxwhjCPzL -EOcKjvbdKRZeOeme -DoCkKvbdunszqLOt -EPDKjvbdZRMdiMdq -DnbjjvbdEuxpPljF -EPDLKvbdGGJrOJUR -EPDKjvbdVviXudEg -DnbjjvbdpfDeTvBI -DncLKvbdRadElJYk -EPDKjvbdaMjbSuMg -EPDLKvbdTAEhhCOd -DncLKvbdTIyiqABM -EPCkKvbdBsBDUFvr -DoCjjvbdcSbkUEJa -EObjjvbdCIjbKhfK -DoDKjvbdauCHXjsh -DoCkKvbdpyPHfqEY -EOcLKvbdDwxMUUUM -DnbjjvbdGFjRmiUR -DoDLKvbdbQGgELzd -EOcKjvbdGGJqnItR -EPCjjvbdxrnJNRag -DoDLKvbdbhmJkFwY -EPDKjvbddoFSkTtS -DncKjvbdNUsSKmAX -EPCjjvbdfelZmfgA -DoCkKvbdjKGIJlwr -EPDLKvbdJYTaglQp -EPCkKvbdVrOXbFMD -EPDKjvbdTpqPUuIN -EPCjjvbdGckViaij -DnbjjvbdczZQYYqC -DoDKjvbdMtrqkNAX -EObkKvbdaNKartmH -EPDKjvbdmSZUysDi -EOcLKvbdlhdURVSB -DncKjvbdWRnXbEkc -DncLKvbdLBKfmBwq -EPDKjvbdZdwfzhIb -EPCkKvbdhancFXRR -EObkKvbdaSFbgtGL -DncLKvbdJXsaglQp -DncLKvbdUsltFlVj -DoDKjvbdLBKfmBwq -EPCkKvbdnVVZjirG -EObjjvbdiZuFlROG -EObkKvbdwygeeweS -EPCkKvbdwjvcgzyf -DnbkKvbdssRsYzFD -DnbjjvbdxwiJaoyk -EPCjjvbdVhYWYHYz -DncKjvbdhzVFkpnG -DncLKvbdeJjSVtzn -DncLKvbdyYIjCPyk -EPDLKvbdJpzEoGNe -DncKjvbdnBiwXoNu -EOcKjvbdVrOYCElD -EObkKvbdLBKgNCXq -EPDKjvbdTlWPBVni -EPDKjvbdFxuVBDxC -DncKjvbdnHFXlnGy -EPCjjvbdYkrDtOMN -DoCkKvbdUWMPjTaR -DoCjjvbdjSziSjiz -DnbjjvbdeOdsKtUS -EPCkKvbdmfdwmOHZ -EObjjvbdtSrTYydc -DnbkKvbdRjxeuGkT -EObkKvbdKeehCApu -EOcLKvbdpxoIGqEY -DncKjvbdbLMGOnDA -EPCkKvbdEXwktUUM -EObkKvbdiUzFWqtb -DoCjjvbdiHKCyViu -EObkKvbdvwLaWAuu -DoDLKvbdiCPDEvqR -EOcKjvbdWXJXvEEg -DoCkKvbdqTtGrSLU -DnbkKvbdtbbuXWOo -EObjjvbdgGLzOGgA -DncKjvbdTlVoBWPJ -DoCkKvbdeEoRbWcK -DoCkKvbdkWWmdCXw -DncKjvbdehLWRmpg -EPCkKvbdjFLGtoAO -DoDKjvbdGLFScIMu -EObjjvbdrRtkOKaN -EPCkKvbdczZQYYqC -DnbjjvbdfHkVqnRH -EOcLKvbdtvNxKRTA -EPCkKvbdADSYJyiQ -EOcKjvbdmJETptrB -EOcLKvbdURQoUtgm -DoDLKvbdZMSDtOMN -EPCjjvbdFfJqnIsq -EOcKjvbdcJNKKfWx -DnbjjvbdkySqrxft -DncLKvbdJpyePFme -DncKjvbduCcVXWPP -EOcLKvbdxKvcgzzG -DoDLKvbdpfEEsvAh -EObkKvbdZyDjNblS -EPCjjvbdhbPDEwRR -EPDLKvbdTqQoUthN -DoDKjvbdxnSgxShc -DoCkKvbdcTCjscjB -DoCkKvbdOTUVfeVQ -DncKjvbdkMbMZeHP -DncLKvbdEvYpPmKF -DncLKvbdJTZBTNYM -EObjjvbdIHGyxxYH -EOcKjvbdraemLfkZ -EOcKjvbdMpYRVmgT -DncKjvbdxZgfFxEr -DnbkKvbdpxoIGpcx -EPCkKvbdkIGlGFnL -DoDKjvbdUslselVj -DnbjjvbdZnnJEdzK -DncLKvbdehLVrORH -DoCjjvbdySmhlqbH -DoDLKvbdADSXiyhp -DoDKjvbdZtJJZDrn -DoCjjvbdezvZEiUX -EOcLKvbdqTtHSRkU -EPDKjvbdVgxWXgYz -DoCjjvbdGZUuBDwb -DncLKvbdhzUekpnG -EPCjjvbdZxcinDMS -EPCkKvbdOFEThiLE -DoDLKvbdhzVGLqOG -EObjjvbdkySqryGt -DoDKjvbdmpZyVkYb -DoCjjvbdnHFYMnGy -EObkKvbdRotGjFcw -EPDKjvbdjblKpgUg -EOcLKvbdWWiYVdFH -DoDLKvbdtbcVXVoP -EPDLKvbdqqtkOLAm -EPDLKvbdmRyUysEJ -DnbkKvbdxnShYTJD -DoDLKvbdGKeSbhMu -DoCkKvbdjuwODbXw -DncLKvbdaMkCSuMg -DncKjvbdtbcUvuno -DnbjjvbdiVZeWqtb -DoCjjvbdLBKgNBxR -EObkKvbdlZSqrxgU -EPCkKvbdULunaWOi -DoCkKvbdwzIGGYEr -EPCkKvbdnHExNOHZ -EObjjvbdpyOgfqEY -DnbjjvbdpedFUWAh -DoCkKvbdhaoDFXQq -DnbkKvbdYqMdhleR -DnbjjvbdsZkpSaIO -EPDKjvbdJcJbqJbx -EObjjvbdehKvRmqH -EOcLKvbdmIdURVSB -EPDLKvbdvOszqKoU -EOcLKvbdZisIQGbG -DnbjjvbdFyVUaDwb -EPCjjvbdTAEiIBoE -DncLKvbdRkZFtgKs -EOcLKvbdzdynzdyp -EOcLKvbdnUtykKSG -DoDKjvbdZQmEhldq -EOcKjvbdnBjWxOnV -EPCkKvbdqvpLbiZR -DoDKjvbdrykosBIO -EOcLKvbdBiKbLJGK -EPDLKvbdBvzciFPv -DoCjjvbdemFwGlik -EPDLKvbdqTsfqqjt -DncLKvbdptUHRrLU -EObkKvbdbUbGwjsh -DoCkKvbdHffyyXwg -EPCjjvbdgGMZnHHA -EPDKjvbdFejRmhsq -DoCkKvbdQvmdCkgc -DncLKvbdyNsHxShc -DoCkKvbdrDeIpOWB -EObkKvbdYzcGRiuy -DncKjvbdMowqWNfs -DoDLKvbdbsDLTcjB -EPCkKvbdZQmEiNEq -EObjjvbdNPwqWNfs -DoDLKvbddeOrBwDK -EObkKvbdrNZixkgi -DoDKjvbdtlXvaUBX -DncKjvbdtunYKRTA -EOcLKvbdfSBWzkcP -EObjjvbdVAbRTQrZ -DnbjjvbdcJNKLFvx -DncKjvbdssRsYyeD -DoDLKvbdqTsgSSLU -EPCkKvbdMowqVmgT -DoCjjvbdDnbjjvbd -EPCkKvbdlhdURUqa -DncKjvbdqrVLOLAm -DoDKjvbdNHDQNQUk -EPCkKvbdXsLaMtOx -EPCkKvbdRosgJfDw -DncLKvbdKVuFcdgJ -DoCjjvbdGGKRnItR -DnbkKvbdeEnrCWcK -EPDLKvbdlZSrTYgU -EPCjjvbdtSrTYyeD -DoCkKvbdZisHpHCG -DnbjjvbdbrbkUDia -DnbkKvbdhficYvKV -EOcKjvbdsBfMlHLZ -DoDKjvbdBdQBVjNG -DnbkKvbdTvLpKUAq -DoCjjvbdzaAPGgCM -EObjjvbdiVZeWrVC -EPCjjvbdZshiYcrn -EObjjvbdRNXbYnUz -EObkKvbdBcpBWJlf -DncKjvbdtbcUvuoP -DoCkKvbdmfeXmNgZ -DncLKvbdbPfgELzd -DncKjvbdZshiYdSn -EObkKvbdDjHiuwjA -DoDLKvbdfIKvRnRH -DnbjjvbdiLeDmtcZ -DoDLKvbdQwNcblID -EObkKvbdmRyUzSdJ -DnbkKvbdnHFYMnHZ -EOcLKvbdfHjvSORH -DncLKvbdlZSrSyHU -EObkKvbdtSrSxzFD -EObjjvbdZyEKNcLr -EObkKvbdRkYeuHLT -EOcKjvbdTkuoAuoJ -DnbjjvbdEPDKkXCd -EPCkKvbdnCJwXoOV -EObjjvbdxrmiMqbH -DoDLKvbdRaceMIyL -EPDKjvbdRosgKFdX -DoCjjvbdzoQQeDMY -DncKjvbdZyEJmcMS -DoDLKvbdOFDshiLE -EPDKjvbdSQUGiedX -EPCkKvbdTIyjRAAl -EObjjvbdxUmFRYkn -DncKjvbdmpZyWLYb -DoCkKvbdygZMANEw -DoDLKvbdhuZeWquC -EObkKvbdFyUuAcxC -DoCkKvbdiCPCeXQq -DncKjvbdsCFlkfkZ -EPCjjvbdNPwpvOHT -DoCjjvbdSPtGjGDw -DncLKvbdAMhZSvyx -EPCkKvbdWXJYWDdg -EPDKjvbdaogHDkzd -DoDLKvbdRosgKFcw -EPDLKvbdrRtjnKaN -DncKjvbdvBEZSoEh -DoDLKvbdmajXYOmu -DnbjjvbdfNFwHMjL -EPCkKvbdezuyEhtX -DoCkKvbdHffzZYYH -EPCkKvbdvAdYsOdh -EPCjjvbdhlFDnVDZ -DncKjvbdbiNKLFvx -DoDLKvbdMIalQxAS -EPDLKvbdGckWKBjK -EOcKjvbdvOszqKnt -DoCkKvbdraelkgKy -EOcKjvbdMgComPtk -DoDKjvbdOSsugFVQ -DoCkKvbdyNrhYTJD -EPCjjvbduDDVXWOo -DncLKvbdiCPDFXRR -DncLKvbdiGibyWKV -EOcLKvbdfNGXHNJk -EObkKvbdBhjakIej -EPCjjvbdxmrhXriD -DnbkKvbdJbibqKDY -DnbkKvbdSCDdkhyL -EPCjjvbdGFirOIsq -DnbkKvbdKVtfDeHJ -DoDKjvbdGKdrbhMu -DncLKvbdZLrETmlN -EObjjvbdjuvmcbXw -DncKjvbdQdDApRDr -EObkKvbdeATplwjG -DoCjjvbdZMRdUNkm -DoDKjvbdTqQoVVIN -EPCkKvbdOTTufeVQ -EPDKjvbdWRnXadlD -DncKjvbdZsiJYdSn -DoCkKvbdZLrDsnMN -DoDKjvbdEKHiuwjA -EPDLKvbdnBivxPOV -EPCjjvbdddnrCWbj -EOcLKvbdpssgSRkU -EPCjjvbdzdzOzdyp -EPCjjvbdZxcinClS -DoDKjvbdvAcySoEh -DnbjjvbdWHxWXfxz -DoDLKvbdCWzdJEpW -DoCjjvbdehLVqnRH -EObjjvbdEXxLstTl -EObjjvbdkMakzEfo -EPCkKvbdKaKflbXq -EPDLKvbdijFgjNYS -DoCjjvbdZsiIxdSn -DncKjvbdeATqNXif -DncLKvbdzoPqEblY -EObkKvbdLAjgNBwq -DncKjvbdUxgsykPO -DoDKjvbdaogGckzd -DncKjvbdFVxpPmJe -EOcLKvbdZLrDtNlN -EObjjvbdYNqAXuWU -DoCkKvbdEYYLstUM -EObjjvbdeFPSBwDK -DncKjvbdePEsKssr -DncKjvbdZjTHogCG -EPCkKvbdjKGHjNXr -DoCkKvbdNrtVgFVQ -DncLKvbdaMjaruNH -DoDLKvbdwjwEHzzG -EOcLKvbdTIzJqABM -DoDLKvbdliETqVSB -DoDLKvbdNrtVfdtp -DnbjjvbdZxdKNcMS -EPDLKvbdbUafxKsh -DoCkKvbdVrNxCFMD -DoCkKvbdxZgefYEr -DoDKjvbdYTLaMsoY -DncKjvbdeAURMwif -EOcLKvbdNGcPmQVL -EPDKjvbdqceJQOVa -DncKjvbdRotHKGEX -DoCjjvbdwNWAMdFN -EPCkKvbdFyVVAcwb -DoDKjvbdmozYvKyC -DncKjvbdSPsgJecw -EPDKjvbdZtJJYcrn -EOcLKvbdGckWKCJj -DoDKjvbdkxrrSxft -DnbjjvbdRbDdlIxk -DncKjvbdyYJJbPyk -DnbjjvbdhgJcYvKV -EObkKvbdjcLjqHUg -EObkKvbdhgJbyWKV -EObjjvbdrovPKCvG -DoCkKvbdbBVdepQX -DnbjjvbdUVkojTaR -EPCkKvbdbUagYLUI -DoDLKvbdptUGqqkU -DoCjjvbdyTNhlqag -DncKjvbdEYXlTssl -EPCkKvbdXFxytAOs -EOcLKvbdNdctIhkE -EPDLKvbdkDMLRGuH -EPDLKvbdDihJuxKA -EOcLKvbdrafNMHLZ -EPDLKvbdbKlFoODA -DncLKvbdZLqcsnMN -DnbjjvbdznpRFDLx -DncLKvbdziuQPdSt -EPCkKvbdbrcKsdKB -DncLKvbdaMkCTUmH -EPDLKvbdYkqdUOLm -DoDKjvbdjhHLfGNk -DoDLKvbdZMSDtNlN -DnbjjvbdZjTHpHCG -DoCkKvbdemFvgNKL -DncKjvbdrRtkOLAm -EPCjjvbdyNrhXsIc -EObjjvbdgPazwDwh -DoDKjvbdRDcAoqDr -DoDKjvbdvvkaWBWV -EOcKjvbdZRMdiNFR -EPCkKvbddePRawCj -DoCkKvbdHDjvKBij -DnbkKvbdZirgpGbG -EOcKjvbdhbPCeWqR -DnbkKvbdNPwpvNfs -EPCjjvbdZirhPfbG -EOcLKvbdIGgZxwxH -EPCkKvbdrykosBHn -DoDKjvbdxnTIYShc -DnbjjvbdNsTvGduQ -DncLKvbdBcpAvJlf -DnbjjvbdlqxtysDi -DoCkKvbdOEdTiIjd -DncKjvbdfHkVrOQg -DoCkKvbdiHKDYvKV -DoDKjvbdOTUVgFUp -EObkKvbdaaVdfPow -DncLKvbdZHXEAPTJ -DnbkKvbdkIHLefNk -DnbkKvbdjEjfuPAO -EObjjvbdhtzFWqtb -DoDLKvbdSQTfjFdX -DncLKvbdHEKvKBjK -DncLKvbdHDkVjBij -EPDKjvbdRpTfiecw -DnbkKvbdiBncEwQq -EObkKvbdRadEkhyL -EPCkKvbdezvYdiTw -EOcKjvbdaMjasUlg -EObkKvbdczZPwyQb -EPCjjvbdTvMQJtAq -EPCjjvbdJXtCIMRQ -DoDLKvbdkDMKpftg -EPCjjvbdiVZdvqtb -DnbkKvbdtunXipsA -DoCjjvbdjJehKNYS -DnbjjvbdJvUeceHJ -DoDKjvbdKRZdoFme -DncLKvbdJcKCpjCx -EPDKjvbdmbKXYPNu -DnbjjvbdkIHLeenL -EPDLKvbdNPxQunHT -DnbjjvbdUtMtFkvK -EPDLKvbdsPvPJcWG -EObjjvbdMRvlzVQz -DoCkKvbdsQWOjDWG -DnbjjvbdXGZZtAPT -DnbjjvbdunszpkOt -DncKjvbdxZhFfXdr -DnbjjvbdRzJgsCvA -EPCkKvbdSCDdlIxk -EPDKjvbdREDBPqES -DnbjjvbdBvzdIdov -DoDLKvbdSLYetfkT -EObjjvbdKWVGDeHJ -DoCjjvbduDDUvuoP -EOcLKvbdWIYWXgYz -DoCjjvbdbhmJjfWx -EPDKjvbdIxUCILpp -EOcLKvbdeXzTsrFz -EPDLKvbdsBemLgKy -EPCkKvbdzjVPpDrt -DncLKvbdZyDimbkr -DnbjjvbdRNYBxmtz -EPCkKvbdvOszpkPU -EObkKvbdSQTfiedX -DncKjvbdZRNFIldq -DoDKjvbdbhlijfXY -EObkKvbdEzspeLcJ -EPCjjvbdKCicRJbx -EOcLKvbdOYOuzcnU -DoCkKvbdhkddOVDZ -DncKjvbdIxTahMQp -EOcLKvbdwygeexFS -EPCjjvbdKRZeOeme -EPDLKvbdgPazvcxI -DncKjvbdfNFwHMik -EOcLKvbdtkwvaTaX -EObjjvbdURQnuVIN -DnbkKvbdiBncFWqR -DncLKvbdaMkCStmH -EPCjjvbdZjSgogBf -DoDKjvbdMowpvOGs -EPCkKvbdsrqsZZdc -DnbkKvbdRpTfjFdX -EOcKjvbdaMjbTVMg -EOcLKvbdmgExMmfy -DncKjvbdCJLCLJGK -DoCkKvbdNeDshiKd -DnbkKvbdGLFSbgmV -EObjjvbdMtrrLNAX -EOcKjvbdpedEsvAh -DoDKjvbdcyxpXyQb -EObkKvbdxZhGGXdr -DoCkKvbdEztQdlCi -EObkKvbdijFgilxS -EPDLKvbdkHgMFenL -EOcLKvbdlrYtysDi -DncLKvbdjcLjpgVH -DoCjjvbdnVVZkKRf -EPDKjvbdFeirNhsq -DnbkKvbdjblLRGuH -EPDLKvbdtTSTZZeD -DoDKjvbdVBCRTRSZ -DncKjvbdTYLMNzjx -DoCkKvbdEztQdkcJ -EObjjvbdpfEFTuaI -DncLKvbdYSlAmUPY -DncKjvbdYpldiNFR -DncLKvbdWXIwvDdg -DoDLKvbdeXyssrFz -DncLKvbdqdEhonVa -EOcLKvbdNQYRVnGs -EObjjvbdRpTgKGDw -DoDKjvbdauCHXkUI -DoDLKvbdhficZViu -DnbjjvbdzoPpeCkx -DoCkKvbdJYTaglQp -DoDKjvbdnBiwYPNu -EOcLKvbdMJCLqYAS -EPCjjvbdYkrDsnMN -EPCkKvbdehKvRmqH -EObkKvbdVqmxCFMD -DncKjvbdrDeJPmvB -EPDLKvbdzaAOgHCM -EOcLKvbdNPxQvNfs -DncLKvbdFVxopMie -EPDKjvbdgQBzwDwh -EObjjvbdTfzmkvvF -EPDLKvbdUaBprpqy -DoCkKvbdnGdxNOGy -DncLKvbdfIKurOQg -EPCkKvbdKDJcRKCx -EPCjjvbdmJEUQuSB -DncLKvbdrafNMGjy -EOcKjvbdZxdKNbkr -DnbkKvbdJmADzGuB -EPCjjvbdQvmdDMID -DnbkKvbdemGWgNJk -DncKjvbdyfxlAMdw -EPCkKvbddtAUATNW -DncKjvbdcasMrATm -DoDKjvbdVhYVxHYz -EPCjjvbdhyuFkpmf -DoDLKvbdcbTMrATm -EPCkKvbdILaznXRL -DoDKjvbdRDbaQQcr -DncKjvbdijFgjNYS -EObkKvbdIMBznXRL -EPCjjvbdxVNEpyLn -DncLKvbdYkqctOMN -EOcKjvbdxrmiNSBg -EPDLKvbdtTRsYzFD -EOcKjvbdzjVQQDsU -EPCjjvbdZMRctNlN -DncKjvbdXrlAmTnx -EOcLKvbdbPgGdLzd -EPDLKvbdFfJqmhsq -EOcLKvbdyzdmqgiI -DoCjjvbduCbtvuoP -DncLKvbdNGcPlpVL -EPCjjvbdGBOpyJzm -EPCkKvbdRDcBPpcr -EOcLKvbdRbEFLhyL -EOcLKvbdePFTLTsr -EObkKvbdcTCkUDjB -DnbkKvbdrWokbhxq -DncLKvbdqUTfrRjt -EOcLKvbdRyihTDWA -EObkKvbdpxnhHQdY -DnbkKvbdrSUkOKaN -DoCjjvbdIGgZyYXg -DoDLKvbdMowqWNfs -DoDKjvbdUxgtZkOn -EObjjvbdUtNTelVj -EObjjvbdlqxtyrdJ -DncKjvbdkVvnDbYX -EObjjvbdePFTKssr -DoCkKvbdMuSrLNAX -EOcLKvbdnQZyWLZC -DoDKjvbdhgJcYujV -DoDLKvbdaMjasVMg -EPCjjvbdcScLUDia -DnbjjvbdbKkeoNcA -DnbkKvbdfpBzwEYI -DoCkKvbdBhkBjhej -DnbjjvbdkDMLRGtg -EObkKvbdeATqNXjG -EOcKjvbdFkFSbglu -DnbjjvbdznpQdcMY -DncLKvbdIidAJpHE -DoCjjvbdLZQirzuG -DnbjjvbdzjUopDrt -EOcLKvbdnUuZjiqf -DoDLKvbdwyhFeweS -DoCkKvbdaoffckzd -EObkKvbdzaAPGgCM -EObkKvbdEzspdkcJ -DnbjjvbdDjHiuxKA -DnbkKvbdVqmxBdlD -EOcLKvbdrJAKFMne -EOcKjvbdZjSgofbG -EPCjjvbdfMfWgNJk -DoCkKvbdTukpJsaR -DoCjjvbdySmiNSBg -DnbkKvbdzGyMANFX -EObkKvbduWNxKQsA -DoDKjvbdRkZFuHLT -DncLKvbdbKlGOmcA -DncLKvbdyNsIXsJD -DnbkKvbdMpXqWNfs -DoCkKvbdHEKujBjK -DncLKvbdDxXktTsl -EPCkKvbdACrYJyiQ -EOcKjvbdqUUHSRjt -DoDLKvbdOFDsiJLE -EObkKvbdrbGMlGjy -DoCjjvbdjblKpgUg -EPCkKvbdiHJcYujV -EPDKjvbdrDeJQNvB -EPDLKvbdbrbkTdJa -DnbkKvbdNeDtIhkE -DnbkKvbdcJNKKevx -EPCjjvbdxVNFQxkn -EObjjvbdhyuGLqOG -EOcKjvbdrafMkfkZ -EObkKvbdRkYetgKs -DnbjjvbdUWLoitBR -DoCjjvbdQvmcblID -EOcLKvbdDoDLLXCd -DncLKvbdzRPMiJwA -DoCkKvbdsZkoraHn -DoDKjvbdkHgMGFnL -EObkKvbdrbFmMGjy -DnbkKvbdRWnDbkhD -EPDKjvbdJbicRJbx -DncKjvbdGZUuAcwb -DoCjjvbdmfdwmNfy -DoDKjvbdBdQAujNG -EPDLKvbdwWlAuaVu -DncLKvbdxmrgxSiD -DoCkKvbdUsmUFkuj -EOcKjvbdcTDKsdKB -DnbjjvbdjcLkRHVH -DoDKjvbdbiMijewY -EPCjjvbdPyNAHSrK -DnbjjvbdFkErcINV -EPDKjvbdZQldhmFR -EPDKjvbdTJZjRABM -EOcKjvbdKaKgMaxR -DoCjjvbdwzHefYEr -DoDLKvbdDwxLtUUM -DoCkKvbdfILWRmpg -DoCkKvbdRyihTCvA -DoDKjvbdSQUGjFcw -DoCjjvbdEYXktUTl -EPCjjvbdoznEKxPA -EPDLKvbdSiZiqABM -EObkKvbdVUNUFkuj -DncKjvbdMfbpNQUk -DncLKvbdEvYopMie -DnbjjvbdMowpvNgT -DncLKvbdKjaHvAKZ -DoDKjvbdqmZjZMIJ -EObjjvbdGcjuibJj -DoDLKvbduLwvaTaX -DoCkKvbdHgHZyYYH -EObjjvbdEOcKjwCd -EPCjjvbdGckWKCKK -EObkKvbdEuyQQMie -DnbjjvbdHgGzZYYH -EObjjvbdVUMsekuj -EObkKvbdWWiXucdg -EPDKjvbdRWnECkgc -EPDKjvbdxZgefYFS -DnbkKvbdEuyPomKF -EPCjjvbddePSCXCj -DoDKjvbdUsltFlWK -DnbkKvbdbsDKtEJa -EObkKvbdmoyyWLZC -DoDKjvbdSCDeMJZL -DnbkKvbdwtleRYkn -EPDLKvbdJpzEnfNe -DncKjvbdZisIQGbG -DoCjjvbdiUzEwRtb -DncKjvbdrounicVf -DncLKvbdmIdURVRa -DoDKjvbdYSlBNUPY -DnbjjvbdKDKDQibx -DoDLKvbdnCJvwoOV -EPDKjvbdgFlZmfgA -DoDKjvbdTukojTaR -DnbjjvbdVAbQsQqy -EOcLKvbdtAHRIABS -DnbjjvbdmbJvwnnV -EOcKjvbdvBDxrneI -DnbjjvbdeJirWUzn -DnbjjvbdKeegaaQu -DnbjjvbdzQoMiKXA -DnbjjvbdxwiJbPyk -EPDLKvbdKNADzHUa -DoCkKvbdANHyTXZx -EObkKvbdxLXDgzyf -EOcKjvbdpxoHgQcx -DncKjvbdLBKflawq -EPDKjvbdhanbdwQq -DnbkKvbdEASIlyvw -EPCkKvbdwzHfGYEr -EOcLKvbdqZPHgQdY -EPDKjvbdqTtGqqjt -DoCjjvbdDxXksssl -DoDKjvbdQlwayNtz -EOcKjvbdTvLoitAq -DnbkKvbdirzhsKiz -EPDKjvbdyzeORghh -DncLKvbdmJDsqVRa -DncLKvbdKefICAqV -EOcLKvbdZnmheFZj -DoDKjvbdIxUCILpp -DncLKvbdxsOIlrBg -DoCkKvbdiVZdvqtb -EPDLKvbdbBWEfQPw -EObkKvbdsCFllGkZ -EObkKvbdNdctIiKd -EObjjvbdozmcjwoA -EPDLKvbdlhdTqUqa -EOcKjvbdbUagYKsh -DnbkKvbdJpydoGOF -DnbkKvbdnGeYMmfy -DncKjvbdtlXwBUAw -DncKjvbdqiAJdlne -EPCkKvbdMIakqYAS -DnbkKvbdCWzchdov -EObkKvbdelewHNJk -EPCjjvbdFpASvgFy -DoDLKvbdVrNxCFMD -DnbkKvbdMpYQvNfs -EPCkKvbdEObkKwDE -EPDLKvbdHDjuibJj -EPCjjvbdKaLHMaxR -DoDKjvbdakLfOmcA -EPDLKvbdMgDQNQVL -DoCjjvbdEvYpQNKF -EPDKjvbdrEEhpOVa -EOcLKvbdOFDsiIjd -DncKjvbdtTSTYyeD -EObjjvbdQvnDblHc -DoDKjvbdVrNwbElD -EPCjjvbdZMRdUNkm -DoCjjvbdhfibxujV -DnbjjvbdYpmFJMeR -DncLKvbdDihKVxKA -DoCjjvbdrNZjYkgi -EOcLKvbdYqNFImEq -DoDLKvbdJbjDQjCx -DoDKjvbdwygefXeS -DncLKvbdUyHsykPO -DncLKvbdJSyBTMxM -EPDKjvbdcImKKfXY -EPCjjvbddndsLTtS -DoDLKvbdEASIlzWw -EObjjvbdrylQTAgn -DoDKjvbdFkFTChMu -DncLKvbdUaCQrprZ -DnbjjvbdOFEThhjd -EObjjvbdlYsRrxgU -EPCkKvbdnGeYNOGy -DoDKjvbdwygefYEr -DoCjjvbdGckViajK -DoDKjvbdSZjITDWA -EObjjvbdkWXNdCXw -EPCkKvbdKjaIWAJy -EObkKvbdKkBIWAKZ -DoDLKvbdptTfqrLU -DoDKjvbdPxmAGsRj -EObkKvbdTvMPitBR -EPCkKvbdegjvSOQg -DoDKjvbdwNWANEEm -EOcLKvbdRNXbYmtz -DoDKjvbdEOcKjwDE -EPDLKvbdfMfXHMik -DoCkKvbdWHwvXfxz -EPCjjvbdelfWgNKL -EPCjjvbdqcdiQOVa -DncKjvbdkyTSTZGt -DoCkKvbdbAueFpPw -EOcKjvbdQwNdClHc -DnbjjvbdxmsIYSiD -EPDKjvbdCTAbtFwS -DncLKvbdJpzFOeme -EOcKjvbdiZuGLqOG -DncKjvbdKaLHMaxR -EPDLKvbdbiMjLFvx -EPCkKvbdjvXODaxX -EOcLKvbdOAJSsirA -EPDKjvbdqYnhHQdY -DoCkKvbdDwwlTtUM -DnbkKvbdRjxfVHKs -EObjjvbdzjUpPcrt -EOcLKvbdeUAUATNW -EObkKvbdQlwaxmtz -EObkKvbdEXxLtUUM -EObkKvbdYkrETmkm -DoCkKvbdxmsHwsIc -DoDKjvbdzjUoocrt -EPDKjvbdqGEFTuaI -EPCjjvbdbiMjLGXY -EPDKjvbdfpBzwEXh -DncKjvbdZeYGzhJC -DoCjjvbdFkEsCglu -DncKjvbdOFDshhjd -DncKjvbdZMRcsnMN -EPCkKvbdrEFJPnVa -DoCkKvbdcyyPxYpb -EPDLKvbdijGIKMwr -DoCjjvbdbAudepQX -DncLKvbdFejSOItR -EOcKjvbdSLZGVHLT -EPDKjvbdMJBkpxAS -DncKjvbdJXsaglQp -DnbkKvbdjcMLRHVH -DoCkKvbdFjeTCgmV -DnbjjvbdqUTfrRkU -DnbjjvbdznoqFCkx -EObkKvbdVqnYBeLc -DoDLKvbdaMjbTVMg -DoCkKvbdSQUHKFdX -DoCjjvbdrDdhomua -DncLKvbdcTCjsdJa -DoCkKvbdsCFlkgKy -EPCkKvbdmbKWwnmu -DoCjjvbdZQmFImEq -EPCkKvbdyXiKCPzL -EOcLKvbdKQzEnenF -EPCjjvbdrbGNMGjy -EPDKjvbdgGMZnHHA -EOcLKvbdfHjuqnRH -EOcLKvbdFeirNiUR -DoCjjvbduaEZSoFI -DncKjvbdbAudfPow -DoCkKvbdbiMikFwY -DoDLKvbdcyxpYYqC -DnbjjvbdpxoHfpdY -DncKjvbdqUTgRqjt -DoDKjvbdcImKKfWx -DnbjjvbdmfeYNNfy -EPCjjvbdIjEAJofd -EObjjvbdLBKgNCXq -EObjjvbduLxWaUAw -DnbjjvbdJTZBTNXl -DoCkKvbduaDyTOeI -EOcLKvbdUyIUZkPO -EOcLKvbddePRawCj -EPDKjvbdhbObeWqR -EOcKjvbdBdQAvJmG -EOcKjvbdkVwODaww -DnbkKvbdUVkoisaR -DnbkKvbdMoxQvNfs -EObjjvbdCJKbLIfK -DncKjvbdYpmFJNEq -DoCjjvbdjKFhKMxS -DnbjjvbdZLrEUNlN -EPDKjvbdwuNFRZMO -EObjjvbdjuvnECXw -EPCkKvbdlZTSTZGt -DoCjjvbdsQVoJcWG -DncLKvbdmJETqVSB -DnbjjvbdjggLfGOL -EObjjvbdxwiKBpZk -DoDLKvbdKDKCpjDY -EPCjjvbdzRPNIjXA -DoCkKvbdkaMoNALA -EPCkKvbdjvWnDaww -EPCkKvbdSBcdkiZL -DnbkKvbdbUbHXkUI -EOcKjvbdURROtuHm -DncLKvbdJmAEZgVB -DoDLKvbdDxYLsssl -DncKjvbdWRnXadlD -EPCjjvbdADSXiyhp -DnbkKvbdNGcPlouL -DnbjjvbdBsAcTevr -EObjjvbdWWhwvDeH -EOcLKvbdbUafxKsh -DoCkKvbdtcCuXWOo -EOcKjvbdbKkennDA -EPDLKvbdGcjujBjK -DoDKjvbdRWmdDMHc -EPCkKvbdmSZUyrdJ -DoCkKvbdLZRKSztf -DncKjvbdZQmFJNFR -EPDLKvbdjhGkefNk -DncKjvbdeATpmYJf -EPCkKvbdDjHivXjA -EObjjvbdFyVVBEXb -DncKjvbdIHHZxxXg -DnbjjvbdMoxQvNfs -EObjjvbdlYsRsZGt -EOcLKvbdZHWdAPTJ -DoCkKvbdoznDjwoA -EOcLKvbdYpmEiNEq -EOcLKvbdfMfWgNJk -DnbjjvbdjlalZeGo -EPDLKvbdVgxVxGxz -DoDKjvbdZRMdiMeR -DnbkKvbdNsUVgFUp -EObjjvbdNGcPmPuL -EPDLKvbdrSUjnKaN -DncKjvbdMgDPmQUk -DoDLKvbdRkZGUfkT -EOcLKvbdpxoIGqDx -DoCkKvbdVwIxVcdg -DoDKjvbdZQmFIleR -EPDKjvbdZshiZDrn -EPCkKvbdFWZPpNJe -DnbkKvbdcImKKfXY -DoCkKvbdiVZeWqtb -EPCkKvbdkxsSSyHU -EObkKvbdcSbkTdKB -EOcKjvbdFxttaEYC -EPCkKvbdhtzEwSVC -EOcKjvbdLAjgNBwq -DoCkKvbdZisHofbG -DoDLKvbdIsYaTNYM -EPDLKvbdADRxJzIp -DoDKjvbdTkuoAvOi -EOcLKvbdZRMeJMdq -EPDLKvbdWWiXvDdg -DnbjjvbdbsDKscjB -DnbkKvbdtlXwBUBX -EPCjjvbdmgFXlmgZ -EObkKvbdjmBlZeGo -EObkKvbdmgEwmOGy -DoCjjvbdtlXwBTaX -EPDKjvbdSiZiqABM -EPDLKvbdEXxMTssl -EPCkKvbdRWmccLhD -DncLKvbdrWpMDJZR -EPDLKvbdelfXGlik -EOcLKvbdFjdsChNV -EPCkKvbdVUMtFkuj -DoDLKvbdtkxXBUBX -DncLKvbdMgDQNPtk -DnbkKvbdMJCMQxAS -EOcLKvbduWOYJpsA -EPCjjvbdZxcimcMS -DoDKjvbdqrUjmkAm -EObjjvbdRzJgsCvA -EOcLKvbdiBoDFXRR -EPCjjvbdSPtHKFcw -DncKjvbdbBVeGPpX -DnbjjvbdRotGiedX -DoDKjvbdIHGzZYXg -DnbjjvbdiGjCyViu -EPCjjvbdSxKkmzjx -EPCjjvbdmajWwoOV -DnbjjvbdmbKWxPNu -EObkKvbdCTBCsfXS -DoCjjvbdKQzEnfOF -EPCkKvbddijRutzn -EObkKvbdFjeTCgmV -DnbjjvbdURQnuUhN -DnbkKvbdiCOcFXRR -EObkKvbdJutfEEfi -DncLKvbdhtydwRuC -DoCjjvbdcTCjsdJa -DnbjjvbdzoPqEcMY -DoDLKvbdSCDdlJZL -EOcKjvbdlhctQuSB -EPDKjvbdOFETiJKd -EObkKvbddZyQYZQb -EOcLKvbdrMyjYlHi -DoDLKvbdqrVLOLBN -DncKjvbdyNsHwriD -EObkKvbdQvnECkgc -DnbkKvbdznopeClY -DoCkKvbdCJLBjiGK -EOcLKvbdauCGxKtI -EPCjjvbdeFOrCWcK -DncLKvbdcSbjtDia -DnbkKvbdKWVGDdgJ -EPDKjvbdrDdiQNua -DncLKvbdqTtGqrKt -DoDKjvbdjJfIKMwr -DoCkKvbdkxsSTZHU -EObkKvbdFejSNhtR -DoDKjvbdnCKWxOmu -DoDLKvbdvBDySneI -DncKjvbddZxpXyRC -EPDKjvbddwzTsqez -DoDLKvbdLFfIBaQu -DncLKvbdwzHeewdr -DncLKvbdOFEUJJKd -DoDLKvbdEvZQQMie -EPDLKvbdWHxVwgYz -DoCjjvbdiGjCxujV -EPDKjvbdrovPJcWG -DoDLKvbdZxcjOCkr -DnbjjvbdRzJgsDWA -DoDLKvbdiZuGLpnG -DncLKvbdTukoitBR -DnbkKvbdnBiwXnnV -DoDKjvbdBvzdIdov -EObkKvbdRWnECkhD -DoCkKvbdRbDeMJZL -DncKjvbdiGjDYujV -EPCkKvbdNdctIiLE -EPCjjvbdKWUfDdfi -EOcKjvbdkIGlGGNk -EPDKjvbdGZVVBDxC -EObkKvbdXsMBNUOx -EObjjvbdANHxrvyx -EPDKjvbdZtIhyDrn -DoCkKvbdRWmdCkgc -EObkKvbdffLynGgA -DoDKjvbdIxTahMQp -DncKjvbdKQzFPGOF -DoDKjvbduDCtwWOo -EOcKjvbdnCJvxOmu -DoCjjvbdEJgivXjA -DncKjvbdemGWgMjL -DncKjvbdCDpBVjMf -DncLKvbdmoyxukZC -EOcLKvbdtkwwBTaX -DoCkKvbdLqwMzUpz -DncLKvbdqFdFUWBI -EPDLKvbdZyEJmblS -EOcKjvbdEzsqFMCi -DoCkKvbdcarmSATm -DncLKvbdFfJqmiTq -DncLKvbdKQzEoGNe -DoCjjvbdUaCRTRSZ -EOcLKvbdqZOhGqEY -DoCkKvbdZisIQGaf -DoCkKvbdeFOrBwCj -DoDLKvbdmIctQtqa -EObkKvbdxVMdqYkn -DncKjvbdwygfFxFS -DoCkKvbdRWnEDLhD -EOcKjvbdmRyUyrci -DoCkKvbdWXIwvDeH -EPDLKvbdRXODcLgc -DoDLKvbdBsBDUGWr -EOcKjvbdEvYopNJe -DoCjjvbdBvzdIdov -DoCkKvbdyzeNrIJI -EObkKvbdCJKbKhej -EObjjvbdQccBQQcr -DnbkKvbdxZgeewdr -DoDKjvbdqcdhpNua -DoCjjvbdeJjSVtzn -DncKjvbddneTKssr -DnbjjvbdZxcjNbkr -EPCjjvbdZisIPfaf -EPCkKvbdkyTRrxft -DncKjvbdVwIxVcdg -DncLKvbdIxTagkpp -EPCjjvbdbrbjtEJa -DncKjvbdkCkjqHUg -DoCkKvbdUxgsyjnn -EObjjvbdUaCRSprZ -DnbjjvbdMJCLpxAS -DncLKvbdliEUQuRa -EPCkKvbdANHxrvzY -EPCjjvbdeAURMwjG -EPDKjvbdZoOIeEzK -DoDKjvbdmuVZkJqf -DncLKvbdaNLCTUlg -DoCkKvbdnQZxvLYb -DncLKvbdhficZWJu -DncKjvbdatbHYLUI -DoCjjvbddndrjtUS -EOcLKvbdsBfMkgKy -DnbjjvbdBiKakIfK -DnbjjvbdSQTfjFcw -DoCjjvbdmoyxvKyC -DoCkKvbdGcjuibKK -DnbkKvbdZQldiMeR -EObkKvbdqquKnKaN -DoCjjvbdZRNEhldq -EPCjjvbdBiKbLJFj -EPCjjvbdyXhjCPyk -DncLKvbdtTSSxzEc -EPCjjvbdnCJwXnmu -DoDLKvbdbBWEfQPw -EOcLKvbdemGXHNKL -DoDLKvbdmfdxMnGy -EOcLKvbdTqQntthN -EOcLKvbdrMyixlIJ -EOcLKvbdVUMselWK -EOcLKvbdBvzchePv -DoCjjvbdbVCHXjsh -EPCjjvbdZRMdhleR -EOcLKvbdhbObeXRR -EPCkKvbdFWZPpMie -DncLKvbdXFyZtAOs -DnbkKvbdTqQoUuHm -EPCjjvbdCSaDUFvr -DoDKjvbdQZNAHTSK -EOcLKvbdmoyyVkZC -DoCkKvbdGLErbhMu -EOcLKvbdtvNwjRTA -EObkKvbdFjdsDINV -EOcKjvbdeOdsLUUS -DncKjvbdMtrrKmAX -EObkKvbdBsBCtGWr -EOcLKvbdVBCRTRSZ -DoDKjvbdKQydoFme -DncLKvbdnHFXmOGy -DnbkKvbdGAnqYizm -EOcLKvbdjlakzEfo -EOcKjvbdegkWSOQg -DoCjjvbdtkwwAsaX -EPCkKvbdeKKSWUzn -EObjjvbdrRtjnLBN -EPCkKvbdeATqMxKG -DnbkKvbdZMRdTmlN -DoDKjvbdNsUWGeVQ -EObjjvbdyXiKBpZk -EOcLKvbdJKEAJpHE -DoDKjvbdzQoNJJwA -DoCkKvbdwygeewdr -EObkKvbdsCGNMHKy -EOcLKvbdlhdUQuRa -EObjjvbdyNsHwsIc -DoDLKvbdWRnXbFLc -EObjjvbduCcUvvPP -EOcLKvbdrEEhonWB -EPCjjvbdRjyFtgKs -EPCjjvbdkNCLzFGo -DoCkKvbdRDbaPpcr -DoDKjvbdQdCaQQdS -DncKjvbdwyhFexFS -EPDLKvbdBhjakJGK -EPDKjvbdaNKaruMg -EObkKvbdzQnliJwA -DnbjjvbdptTfrSLU -DoDKjvbdFWZPpNJe -EObkKvbdZxcjOCkr -DoDKjvbdehLWRnQg -EOcLKvbdcSbkUEKB -EObjjvbdbUafxLTh -EObkKvbdBcpAvKNG -DoDLKvbdySmiNSBg -DncLKvbdmIdUQuRa -EPCkKvbduDDUvuoP -DoDLKvbdMtrqjmAX -DoDLKvbdVZHtZkOn -EOcLKvbdiZuGLpnG -EOcKjvbdxmrgxShc -DoCjjvbdMpYQvNfs -EOcKjvbdCIkCKiFj -EPDLKvbdaaVdepPw -EObkKvbdXFyZtAOs -EPDLKvbdbKlFnnDA -DncLKvbdqGEFTuaI -EOcKjvbdqFcdsvAh -EPCkKvbdcSbkUDjB -DncKjvbdrJAJeMoF -EObjjvbdZMRdUNkm -DncKjvbdCEPaVjNG -DnbjjvbdptUHSSLU -EPCkKvbdUtNTekuj -DoCkKvbdVqmwadlD -EObjjvbdCIkBjiFj -EOcLKvbdbVCGwkUI -EObjjvbdFfKSNiTq -EPDKjvbdJXtCHlRQ -EPDKjvbdTvMQJtBR -EPCjjvbdZMRdTnLm -EPCjjvbdemGXGljL -EPDKjvbdxmsHxTJD -EOcKjvbdiVZdvrVC -DnbkKvbdmSZUzSdJ -EPCkKvbdUaCRTRSZ -DncLKvbdoAKztIDn -EObjjvbdHffyyXxH -EPCkKvbdaMjbStmH -EObjjvbdZyDinDMS -DoDKjvbdjlbMZdgP -DncKjvbdQwOEDMHc -DncLKvbdGLFSbgmV -EPCkKvbdjvXOECXw -DoCkKvbdSBceLhyL -DoDLKvbdEvYpPmKF -EOcKjvbdrbFlkfkZ -EPDKjvbdTvMQJsaR -DncLKvbdjvXNcaxX -DnbkKvbdijGIKNXr -EOcLKvbdiHJcZViu -DoCjjvbdlqxuZsDi -DnbkKvbdhuZeXRtb -DncLKvbdACqxJzJQ -EObjjvbdjlbLydgP -EPDKjvbdxZgefXdr -EOcKjvbdSCEFLiYk -EObjjvbdKefICApu -EPDKjvbdjlbLyeGo -DncLKvbdbAvEepQX -EPCkKvbdrSVKnLAm -DncLKvbdZjTHpHBf -DnbkKvbdCWzdIdov -DoDLKvbdxUmFQyLn -DnbkKvbdxVNFRYkn -DoCkKvbdZisHpHCG -DoDKjvbdwkXEHzzG -DoCjjvbdSPtHJedX -EOcLKvbdBiLBkIej -DoCkKvbdiLdcnVCy -DnbkKvbdlhcsqUqa -EPCjjvbdwzIGFxEr -EPCkKvbdySmiNRag -DncLKvbdHEKujCKK -EPDLKvbddeOrCXDK -DoDLKvbdNGbolpUk -EOcLKvbdtlYXBTaX -EOcLKvbdqwQLcIyR -EObjjvbdIrxaSlxM -EObjjvbdbrcKtEKB -EOcKjvbdpxngfqDx -DoDLKvbdKfFhCApu -DoDLKvbdJvUfEEfi -DncKjvbdsQWOibuf -DoCjjvbdHgGyxxXg -DoCkKvbdZHWdAPTJ -DncKjvbdauBgYLTh -DoDLKvbdJYUCIMRQ -DncKjvbdbrbjtEJa -DnbjjvbdemFwHNJk -DnbkKvbdBvzcheQW -EPCkKvbdJqZePGNe -EPCkKvbdSKxeuGkT -EPDLKvbdIryBTMxM -EPCjjvbdwWlAuaVu -EOcLKvbdyTOJNRbH -EPCjjvbdQvmdClID -DnbjjvbdyTOJMqag -DncKjvbdrXQMDJYq -EPCkKvbdGdLVjBij -EOcLKvbdjJehJmXr -DnbkKvbdCJKakJGK -DoCjjvbdLrWlzUpz -EPCkKvbdhzVFlRNf -DoCjjvbdRDcApRES -EObkKvbdzROmJKXA -DncKjvbdxUmFRYlO -EPCkKvbdURQoVVIN -EPDLKvbdVZHtZkPO -DnbkKvbdatafwjsh -EObjjvbdNrtWGdtp -DoDLKvbdBiLCLJFj -EOcKjvbdmgFXmOHZ -EObjjvbdZRMeImEq -DoCjjvbdiMEdNtcZ -DnbjjvbdgFkzNfgA -DnbjjvbdGKdsDHmV -DncLKvbdIxUBhMRQ -DoDLKvbdjSzhrjiz -DoDLKvbdpyPHgRDx -DoDLKvbdqYoIGpdY -DoCkKvbdUQqPUuHm -EPCkKvbdBraDTfXS -DncKjvbdNrtWGeUp -DncKjvbdJqZdnenF -EPCjjvbdCWzdIePv -DoDKjvbdrXPlDIxq -EPDKjvbdauBgYLUI -EPCjjvbdQmXbYnUz -DoCjjvbdGGJqnJUR -EPDLKvbdkVvnEBww -EPCjjvbdTukoitBR -DoCjjvbdRkZFtgLT -DoDKjvbdEuyPpMie -EPCkKvbdSLYfUgLT -DnbjjvbdIwtBglQp -DnbkKvbdznpQeDMY -EOcKjvbdznpRFCkx -EPDLKvbdtumwjQsA -DoDLKvbdBhjajiGK -DoDKjvbdhlFDmuDZ -DnbkKvbdqquKnKaN -DncLKvbdMowqVmfs -EOcKjvbdqrUjnLAm -EObjjvbdqwQMDIyR -EPDKjvbdnCKXYPOV -DnbkKvbdHffyyXxH -DoCjjvbdlZSrTZGt -DoDLKvbdznpRFDMY -EPDKjvbdWWiXvDdg -DoDKjvbdRWnEClID -DnbjjvbdJcKCqKDY -EPDKjvbdJbjDQicY -DncLKvbdhaoDEwRR -DncLKvbdvAdZSoEh -DncLKvbdeEnrCWbj -DoDKjvbdVvhwvDeH -EOcKjvbdVAapsQqy -EPCkKvbdxnTIYSiD -EPCkKvbdrouoJbuf -EObjjvbdePEsKtUS -EPDLKvbdirziSkJz -DnbjjvbdhaoCdvqR -EPCkKvbdGZVVAdYC -DncKjvbdtbbuWuoP -DoCkKvbdLFehCBRV -DoDKjvbdLZRJrztf -EObkKvbdkHflGFmk -EOcKjvbdJYUCIMQp -EPDLKvbduCcVXWOo -EPCkKvbdptTfqqkU -DoDKjvbdGQATWgGZ -DncKjvbdEztQeMCi -EObkKvbdZtJJZETO -DoCjjvbdZsiIyETO -EObkKvbddndrjstS -EOcLKvbddeOqbXDK -DnbkKvbdCTBDUGXS -EPDKjvbdQlwayOUz -EPCjjvbdlqyUzTEJ -DoDLKvbdhtydvrUb -EOcKjvbdlZTSSyGt -EOcKjvbdmJDtQuSB -DnbjjvbdtSqsZZeD -DoDLKvbdUaBpsRSZ -EPDKjvbdLGFhBaRV -DnbkKvbdSBcdkhxk -DoCjjvbdDoDKkXDE -DoDKjvbdwyhFfYFS -EPDKjvbdOEctJIjd -EPCjjvbdEObjkWcE -EPDLKvbdhtzEvquC -EObkKvbdZjShQHCG -EPCjjvbdmIctQuRa -EPCkKvbdVwIwucdg -EOcLKvbdADRxJzJQ -EOcLKvbdWWiXvEEg -EPCjjvbdTAFIhBoE -EPDLKvbdZLqdTnMN -EPDLKvbdZQldhmEq -EOcKjvbdLLBIWAJy -DncLKvbdrMzKYlIJ -EPCjjvbdzitoodSt -EPDLKvbdLFehCAqV -DoCkKvbdrMyiyMHi -EPDKjvbdkVvmcaxX -EOcKjvbdmpZxvKxb -EPCkKvbdliDtRUrB -DncLKvbdkxsRsYft -EPDKjvbdTqROuVHm -EPCjjvbdSQTgJedX -EPDLKvbdHlBznXRL -DncKjvbdQdDBQRDr -EPDLKvbdliDsqVRa -DoDKjvbdjgflFfOL -EPDKjvbdeEoSCWbj -DnbkKvbdfSBWzkcP -EObkKvbdmIcspuSB -EPCjjvbdvAdZTPEh -DoCkKvbdIGfyxwxH -DnbjjvbdWWiYWDeH -EObkKvbdZQleImFR -DncLKvbdQwNdCkgc -EOcLKvbdQdDBPqES -DnbjjvbdrpWPJbuf -DoCkKvbdTulQKTaR -DoDLKvbdeUAUASlv -EPCjjvbdZQmFJNEq -DncLKvbdVBBqSqSZ -EOcKjvbdqceJPmvB -DncLKvbdZtIiYcrn -EOcLKvbdJSxaSmYM -DoCkKvbdqqtkOLBN -EObkKvbdgFkymfgA -DnbjjvbdVqmwadlD -DncLKvbdsBfNMGkZ -EPDKjvbdEPDKjwCd -EObjjvbdHDjvKBjK -DncLKvbdCTAbsevr -EObkKvbdFxuUaEXb -DoCjjvbdcyyQYZQb -EObjjvbdZsiIxdSn -EPDLKvbdZQmEhmEq -DnbkKvbdxnTIXriD -DncKjvbdfHkVrORH -EOcKjvbdddoSCXDK -EPCkKvbdhanbdvpq -EOcKjvbdRyihTDWA -DnbjjvbdajkeoODA -EOcLKvbdlhdTpuSB -EPDLKvbdhgJbxuiu -EPCjjvbdnHFXmNgZ -EPCkKvbdpecdsvAh -DnbkKvbdVZIUZjnn -DncKjvbdbAvFGPpX -DnbjjvbdkMalZeHP -EOcLKvbdYSlAmUOx -DoCjjvbdHDkWKCKK -EPDLKvbdaRecHsek -EPCjjvbdJXsagkqQ -EObjjvbdRMwbZNtz -EPCkKvbdrbGMlHKy -DncLKvbdKfGICApu -EPDLKvbdUtNTfLvK -EPCkKvbdMJCMRYAS -EOcLKvbdCJKbLJFj -DoDKjvbdfpBzvcxI -EObkKvbdYpldhmFR -EOcLKvbdSPsfiecw -DoCjjvbdHEKvKCKK -DnbjjvbdUGzmkwVe -DnbjjvbdfMfXGmJk -DnbkKvbdZoOIeEyj -EObkKvbdZnmhdeZj -EOcKjvbdTkuoBVoJ -EPCjjvbdGKdsChMu -DoDLKvbdJYTahLpp -EPCjjvbdbhmJkFwY -DoDLKvbdkIHMGGOL -EPDKjvbdZsiIxdSn -EPCjjvbdMgCpNQUk -DncLKvbdjblKqGtg -DncLKvbdOYOuzdNt -DncKjvbdTvMPjTaR -EPDLKvbdiiehKNXr -DoCjjvbdZdxGzghb -DoDLKvbdeOdsKssr -DoDLKvbddBsMrAUN -DoCkKvbdxxIjBozL -DoDKjvbddoErkUTr -EOcLKvbdwzIFeweS -DoDLKvbdREDBQRES -EObkKvbdhlEdOUby -DoCjjvbdNPxRWNgT -DoDLKvbdZLqctNlN -EObjjvbdbUbHXkUI -DnbkKvbdhtydwSVC -EPDKjvbdeUAUASmW -EObjjvbdhgKDYvJu -EOcLKvbdZnmhddyj -DoDLKvbdUVlQKUAq -DoDKjvbdDihJvXjA -DnbkKvbdZLrETmlN -EPCjjvbdxxJJbQZk -EPCkKvbdrounjDVf -DoCjjvbddiirVtzn -DoDLKvbdmttyjiqf -DncKjvbdfHjvSNpg -DoCjjvbdmRxuZsEJ -DoCkKvbdjAQGaQGj -DncLKvbdnVUzLJrG -EPCjjvbdLAjgNCXq -DoDLKvbdqmZixlHi -EPDLKvbdVUMsekvK -EPDKjvbdrMzKZMIJ -EPCkKvbdKDKCpicY -EOcLKvbdwtmEqZMO -EPDLKvbdmgFXlnGy -DncKjvbdyTNhlqbH -DncKjvbdnHFXlnHZ -DoDLKvbdTqROuUgm -DoDKjvbdRMwbZOUz -EPDKjvbdRMwbYmtz -DoDKjvbdZnmheEyj -EPCkKvbdbBWEfPow -DoDKjvbdQwNccLgc -DoCjjvbdhtzFWqtb -DoDKjvbdRotHKGEX -DncKjvbdZsiJZETO -EObjjvbdaNKbStlg -DoCkKvbdsZlQTAhO -EObjjvbdjhGlGGNk -EObkKvbdQdDBQQcr -DoDKjvbdMtrrLNAX -EPCjjvbdRotHKGDw -EPCjjvbdqZPIGqDx -EOcLKvbdiGicZViu -DnbjjvbdJvVGEFGi -DoCkKvbdKNAEZfuB -EPDLKvbdLZRJrzuG -DnbkKvbdhytfLpnG -EPDKjvbdRbEEkiYk -EOcLKvbdcJMjLFvx -DncKjvbdFfKRnItR -DoDLKvbdegjurORH -DnbjjvbdEPDKjvcE -EPCjjvbdkHgLeenL -DncLKvbdZnmheEzK -DncKjvbdZjSgpHCG -DoCkKvbdbBVdeoow -DoDLKvbdZQmEhleR -EPDLKvbdpxoHfpcx -EPCkKvbdSPtGjGEX -DncKjvbdRbDeLhxk -EObkKvbdrpWOibvG -DnbjjvbdfIKurNpg -EPDLKvbdZyEKNbkr -DoDLKvbdwXMAvBWV -EOcLKvbdWWiXvDdg -EOcKjvbdelfWfljL -DncLKvbdjuvnEBxX -DncLKvbdliDspuRa -EObjjvbdVTlsekuj -DoCjjvbderAvzlDP -EPDKjvbdNeDtIhkE -Dnbjjvbddwyssqez -EObkKvbdGGKRnItR -DoCkKvbdHbLzEzAD -EPCkKvbdTvMPjUBR -EObjjvbdTAEiIBoE -DoCjjvbdRjxfUgLT -DnbkKvbdnUuZkKRf -EPDLKvbdjmBkydgP -EObkKvbdNeDsiIjd -DncKjvbdrounjDWG -DnbjjvbdrWokbhxq -DoDLKvbdsPvPKDWG -DncKjvbdZdwfzgiC -EOcLKvbdZLqdUNlN -DoCjjvbdkDMLRHVH -EPDKjvbdirziSjiz -EObkKvbduDDUvuno -DoDLKvbdkHgMGGOL -DncLKvbdhkdcmuCy -EObkKvbdCJLCLIej -DnbkKvbdeFPRawCj -DncKjvbdsQVoKDVf -EPDLKvbdRXNccLhD -EObkKvbdFxttaDxC -EObkKvbdqrVKnKaN -EPCjjvbddoEsKtUS -EObjjvbdzaAOffbM -DoCjjvbdWSNxBdlD -EPCjjvbdqlzKYlIJ -EOcLKvbdQdDApRDr -DncKjvbdczZPwyRC -EOcLKvbdtlXwBUBX -EOcKjvbdmgFYNOGy -DoCjjvbdKVtfEFGi -EObkKvbdrNZjZLgi -EOcKjvbdliETqVSB -EOcKjvbdbVBgXkUI -DncLKvbdNHDPmPtk -DnbjjvbdjlakzEfo -EOcKjvbdVUNTfLvK -EPDKjvbdTXjkmzjx -DncLKvbdrylQTBIO -EPCkKvbdJpzEoGOF -DncKjvbdFeiqmhtR -DncLKvbdZnnJFFZj -EPDLKvbdlrZUzTEJ -EPDKjvbdLFfICBRV -EPCjjvbdcyxpXyRC -DoDLKvbdQdCaQQcr -DncLKvbdZsiJZDsO -EObjjvbdzQoNIjXA -DncLKvbdVqmxBdlD -DoDKjvbdRjxfUgLT -EObjjvbdWIYVxHYz -DoCkKvbdIGfzZXxH -DncKjvbdxsNhlqag -DoDKjvbdFWYopNJe -EPDKjvbdVBCRTRSZ -EPDKjvbdwyhFfXeS -DoCjjvbdziuPocsU -EPDKjvbdYSkaNUPY -EObjjvbdznopdcLx -EOcLKvbduMYWaUBX -EPDKjvbdnPzZWKyC -EObkKvbdZxcimbkr -EObkKvbdBhjbKiFj -EOcLKvbdjuwNdBww -EPDKjvbdmbKWxOnV -DoCkKvbdnHFYNNgZ -DoDLKvbdrMzKYkhJ -EOcLKvbdqdFIpNvB -EPDKjvbdcScKtDjB -EOcLKvbdygZMAMdw -EOcLKvbdsCGNLgLZ -DoDLKvbdaMkBsUlg -DncKjvbdlZSqsYft -DnbkKvbdnVUzLKRf -DoCkKvbdnHFXlmgZ -EPDKjvbdxZgfGYFS -DoCkKvbdxwiKCPzL -DnbkKvbdBcpAvKMf -DoCjjvbddZyQXxpb -DncLKvbdzQnmIjXA -EPDKjvbdFWZQQMjF -DnbjjvbdMgDQMpUk -DncLKvbdOFDtIiKd -DoDKjvbdKNAEZfta -EOcKjvbdhyuGMQmf -DnbjjvbdZnmhdeZj -DncLKvbdhbOcFXRR -EOcLKvbdvBEZSoEh -EOcKjvbdYkrEUOLm -EPCkKvbdNrtWGduQ -EPDKjvbdZjSgpHCG -EObkKvbdyzdmrHhh -DoDLKvbdznpQdblY -DncLKvbdZshhyDrn -DnbkKvbdjvWmdCYX -EOcLKvbdAMgxsWzY -DnbjjvbdwzIGGXdr -EPDKjvbdrNZixlIJ -DoDKjvbdsQWOicVf -DoDKjvbdjuvmdBxX -EObkKvbdzHZMANFX -DoDLKvbddjJqutzn -EOcKjvbdwNWAMdFN -DnbkKvbdTqRPUtgm -EOcKjvbdVYgtZkOn -EPDKjvbdNGcPlotk -DnbjjvbdJbjDRJcY -EPDLKvbdZtJIyESn -DoDKjvbdtcCuXVoP -DoCjjvbdZMSETmlN -DoCjjvbdgGLzNfgA -EPDKjvbdxKvcgzyf -EObjjvbdrMzKZMIJ -DncLKvbdMoxQumfs -EPCjjvbdbhlikFvx -DoDLKvbdRadFMJYk -DnbjjvbdHgGzYxYH -EObjjvbdVZHtZkOn -DnbkKvbdakLfPNcA -DoCjjvbdmfeXmOGy -DoDLKvbdrRtjmjaN -DnbjjvbdUxgsyjoO -DnbjjvbdbhlikFvx -EPDLKvbdRbEFMJYk -EOcKjvbdRXNcblHc -DnbkKvbdqmZixlHi -DoCjjvbdrzLpTBIO -DoCjjvbdILaznXRL -EPDLKvbdRjyGVGkT -EOcLKvbdehKurOQg -DncLKvbdYkrDsnLm -DoDKjvbdZisHpGaf -DncLKvbdpyPIGpcx -EOcLKvbdijFhKNYS -EOcKjvbdMuSqkNAX -EObjjvbdajlFnnDA -EOcKjvbduLxXAsaX -DnbjjvbdiiegjMwr -EPCkKvbdiMEdNuCy -EPCkKvbdqTtHSRkU -EPCkKvbdIryBTNXl -DncLKvbdFjdrcHlu -EPDKjvbdZoOIeFZj -DncLKvbdcbTNSATm -DoDKjvbddePSCWcK -DoDKjvbdZsiJYcsO -DoDKjvbdpeceTuaI -EOcKjvbdjhHMGFnL -EOcLKvbdjcLkRGtg -DnbjjvbdCJLCKiFj -EPDLKvbdZsiIxdSn -EObkKvbdVTlsekvK -EObkKvbdCTAcTewS -DoDLKvbdOYOuzcnU -EPCkKvbdiUydwRuC -DncLKvbdGQATXGey -EPDLKvbdDjIJvXjA -DncKjvbdpxoIHQdY -EObkKvbdZMSDsmkm -EOcLKvbdBvzchdov -EOcLKvbdKRZeOenF -DnbkKvbdwzIFfYEr -DnbkKvbdSKyFuHKs -EPDKjvbddCSlrATm -EObkKvbdSCDeMIyL -EPCjjvbdsCFllGjy -DnbjjvbdHgGyyYYH -DncKjvbdjKFgilwr -DncLKvbdEvYoomJe -EObkKvbdlhdTpuSB -DoDKjvbdWWiYVceH -DnbjjvbdLGGHbBQu -EObkKvbdOXoVzcnU -DnbjjvbdbsCjtDjB -DnbjjvbdQwOECkhD -DnbjjvbdMgComQVL -DoCjjvbdRotGjFcw -DnbjjvbdmajWxOmu -EPCkKvbdbPfgDkzd -Dnbjjvbdpxngfpcx -DoCkKvbdBraCtGWr -DncKjvbduDCtwWPP -EPDLKvbdYzcFrKVy -EObjjvbdbVBgXkTh -DnbkKvbdyYIibPyk -DncLKvbdUVlPitAq -EObkKvbdbKlGOnDA -DnbjjvbdrJAKFNPF -EPDLKvbdLAjgMbYR -DoCjjvbdSxLLmzjx -DncKjvbdeEnqawCj -EObkKvbdFWZQPmKF -EOcKjvbdGdKvJbJj -DnbkKvbdjcLjqHUg -EPCjjvbdQvnDcLgc -EPCkKvbddoFTLTtS -DnbkKvbdZtIhyDrn -EPDKjvbdBvzdIdpW -EObjjvbdEYYLstUM -EPCkKvbdyzdnSHiI -EObjjvbdZLqdTmlN -EPDLKvbdIHHZyXwg -DoCkKvbdbVBfxKtI -DnbkKvbdMpYRWOGs -EOcKjvbdczYoxYqC -EPCjjvbddwytTqez -EPCjjvbduaDySoEh -EObkKvbdTJZiqAAl -EObjjvbdmoyyWLYb -EPDKjvbdnPyxukZC -EObjjvbdrWolDJZR -DoCkKvbduCbtvvPP -EPDLKvbdJbicQibx -DncLKvbdHELVibJj -DnbjjvbdKefHbAqV -DncLKvbdsZkpTBHn -DoDKjvbduCcVXWOo -DnbkKvbdidkGtoAO -DnbjjvbdrEFIonWB -EPCkKvbdfpBzwEYI -DncLKvbdwuNFRZMO -EPDLKvbdrounjCvG -DncLKvbdxxJJaoyk -EPCjjvbdJmADzHUa -EPDLKvbdqGEFTvBI -EPDLKvbdyOShYTJD -EPCjjvbdJutecdfi -EPDLKvbdIMBznXQk -DncKjvbdmoyxvKyC -EPDLKvbdrXQMChyR -DoCkKvbddwytUSFz -DncKjvbdZjTHofbG -EPDKjvbdGcjujCJj -EPCkKvbdvBEYsOeI -DncKjvbdCTAcUGWr -EPCkKvbdmbKWwnnV -DnbjjvbdpxnhHREY -EObjjvbdlZTRsYft -DoCjjvbdhkdcmtcZ -EObjjvbdMfcPmPtk -EPCkKvbdJXtCHkpp -DnbjjvbdrSUjmkBN -EOcLKvbdYSlBMtOx -EObjjvbdznopdbkx -DncLKvbdddoSCXDK -DoCjjvbdOXnuzcnU -EPCkKvbdZGwEAOsJ -EOcKjvbdauCGwjtI -EPDLKvbdNHDPmPuL -EOcLKvbdNHCpMpUk -DoCjjvbdmSYtysDi -DncKjvbdFjeTDINV -DncKjvbdNrtWHFUp -EPCjjvbdmJETqUqa -DncKjvbdEzsqEkcJ -EOcLKvbdmoyyVjyC -EOcLKvbdZMSETnMN -EOcLKvbdBsAbtFvr -EPCjjvbdJutfEFHJ -DoCkKvbdiBoDEwRR -EPDLKvbdZQmFImFR -EPDLKvbdpfDdsuaI -DnbkKvbdmbKXYPNu -EObjjvbdjKGHjNXr -EOcLKvbdpssgSRjt -DoDLKvbdKRZePGOF -DnbkKvbdfekymgHA -DoDLKvbdiCOcFWqR -DnbjjvbdiHJbyWKV -DoDKjvbdsCGNMHKy -DoCjjvbdGKeSbgmV -DoDLKvbdkIGkfFnL -DncKjvbdfILWRnRH -DoDKjvbdGLEsChNV -EPCjjvbdVrNxBeMD -EPDKjvbdSLZGVHKs -EPDLKvbdQlxByOUz -EOcLKvbdMgDQNQVL -DoDLKvbdrRtjnLAm -EObjjvbdCIkBjhfK -DncKjvbdDwwlTssl -DoDLKvbdANIYsWzY -DnbjjvbdxVMdqYkn -DoCkKvbdzdynzdzQ -DnbjjvbdxsNhmRag -EObjjvbdzjVQPcrt -DoCkKvbdbBWFFopX -EPDKjvbdhfibxvKV -DnbkKvbdegjvRmqH -EPCjjvbdkNCMZdgP -EOcLKvbdmtuZkJqf -EObjjvbdemFvfljL -DncLKvbdyYIibPyk -EObjjvbdieKftoAO -DncKjvbdvOszqKoU -DncLKvbdVUNTelWK -EOcKjvbdCDoaWKMf -EPCkKvbdbsDKtDjB -EPDLKvbdmSYuZsDi -DncLKvbdwWlBWBWV -EObjjvbdkVwOEBww -EObkKvbdWSNwbFLc -DnbjjvbdZRNFImEq -DoDKjvbdrounjDVf -EPDKjvbdCJKbKhej -DncKjvbdsrrTYyeD -DoCjjvbdQvnEDMHc -DoCkKvbdGQASwGfZ -EOcLKvbdfSBWzkbo -DoDLKvbdRkZGVGkT -EOcKjvbdyXhjCPzL -EPCkKvbdbrbkTdJa -EPDLKvbdsQVnibvG -DnbjjvbdpyOgfpdY -DoDLKvbdtunXiqTA -EPDKjvbdqGDdsvAh -DncKjvbdjEkHUoAO -EPCjjvbdGQATXGfZ -EOcKjvbdKDJcRKCx -DncKjvbdhyuGMQnG -DoCkKvbdYkrDsnMN -DoCjjvbdaNKbSuMg -EOcLKvbdrykpTAhO -DnbkKvbdrSUkNkAm -EPCjjvbdwzHeeweS -DoDLKvbdSBdFMJYk -DnbjjvbdqUUGrRjt -DoDKjvbdzitoocrt -EPDKjvbdxnShXriD -DoCkKvbdVviXvEEg -EObkKvbdFxuUaDxC -EObkKvbdygZMAMeX -DnbjjvbdiifHilxS -EPDKjvbdZxcjODMS -DoDLKvbdWWhxWEFH -EPCjjvbdzoQQeClY -EOcLKvbdptUHRqjt -DoDKjvbdVviXudEg -EPDLKvbdUQpnuVHm -EPCjjvbdwzHfFweS -EOcLKvbdZxcjNbkr -EObkKvbdZnmhddyj -DoDLKvbdvlvANDdm -EOcKjvbdMfbolpVL -EObjjvbdbAvFFpQX -EOcKjvbdBdPaWJlf -DncKjvbdqceIonWB -DoCkKvbdtcDVWvOo -DoCkKvbddoFTKssr -DoDKjvbdaMkBruMg -EPCjjvbdEuyPolie -DnbkKvbdOEcsiJLE -DncKjvbdHlBznWqL -EPDKjvbdbhlijewY -EObjjvbdfoazwDwh -EOcLKvbdaNKbStlg -DoCkKvbdqdEiQOWB -DoCkKvbdTvLpKUBR -DncKjvbdkNBkzFHP -EObkKvbdFkErcHlu -DoCkKvbdZshiYcrn -EObjjvbdEJhJvYKA -DnbkKvbdOTUWHFUp -DoDLKvbdVhXvXfxz -EPDLKvbdBdPaWKMf -EObjjvbdFejRnJTq -EPDLKvbdULvPBVoJ -EPDKjvbdJzpFwdAN -EPDKjvbdqwPkbiZR -EPDLKvbdrEFIomua -EOcLKvbdijFhJlxS -DnbkKvbdYkrEUOLm -DnbkKvbdIMBznXQk -DncKjvbdZisHpHCG -EPDLKvbdzjUopESt -DnbjjvbdzjUpPcrt -EPDKjvbdqZOgfpdY -DoDKjvbduLxXAsaX -EObkKvbdrMyiyMHi -EPCkKvbdqTsfqrKt -DoDKjvbdTfznMXVe -EObkKvbddoErkUTr -EOcLKvbdHELWKCJj -DncLKvbdUVkpJtAq -EPCjjvbdRMxBxmtz -EPDKjvbdjEjftoAO -EOcLKvbdYkrDsmkm -DoDLKvbdajlFoNcA -DoCjjvbdmJDtRUqa -EPDKjvbdTqQoUuIN -DnbkKvbdtcDUvvPP -DncLKvbdrbGMlHLZ -DnbkKvbdKfGHbApu -DncLKvbdGFjRnIsq -EPDLKvbdJzpGYEAN -DoCjjvbdkySrSyHU -EObjjvbdKVtfDdfi -EPDKjvbdNrsugFUp -DoCkKvbdNxOuzcmt -DoDLKvbdDihJuxKA -DnbkKvbdzdzOzdzQ -DncKjvbdmSYuZrci -EOcLKvbdptTfqqkU -EPCkKvbdVUNTfLvK -DoCkKvbdGdKujBjK -DoCjjvbdzitopETU -DoDKjvbdqvokbiYq -EPDLKvbdGFjSOJTq -DoDKjvbdliETqUrB -DoDKjvbdZisIQGbG -DoCjjvbdnQZyWLZC -EOcLKvbdGdKujCJj -EPCkKvbdaRfDIUGL -EOcKjvbdauCHXjtI -DnbkKvbdbQHHDkzd -DoCjjvbddZxpYYpb -EObkKvbdbBWEepPw -DncKjvbdSLYfVGkT -EObkKvbdVgxVxHYz -DoCjjvbdfpBzwEYI -DoDKjvbdmfdxMmfy -DncKjvbdhancEwRR -DnbkKvbdEASJMzXX -EObjjvbdmfdwmNfy -DnbjjvbdhbOcFXQq -DoCjjvbdVgxVxGxz -EPCkKvbdQcbaQQdS -EPCjjvbdhbObeXRR -EPDKjvbdePFSkUTr -EPDLKvbdMoxQumgT -DoCkKvbdIBkydzAD -EOcLKvbdcasMrAUN -DoCkKvbdUQqOttgm -DnbkKvbdelevfljL -EObjjvbdZeXfzgiC -EPCjjvbdQYmAGrrK -EObjjvbdxZhGFxFS -EObjjvbdJuuGEEgJ -DoDLKvbdEARhlyvw -EPDKjvbdZdxGzhJC -DoCkKvbdzRPMhiwA -DoCkKvbdZxcinClS -EOcKjvbdFyVVBEYC -EOcLKvbdtbcUwVoP -DncLKvbdlZSrTYft -EObkKvbdaaVeGPow -DncLKvbdEKIJvXjA -DncLKvbdbhljKfWx -EObkKvbdVhYVxGxz -EPDKjvbdmpZxukZC -DoDLKvbdnBivxOnV -EObjjvbdRbEEkiZL -EPCkKvbdZRNFIleR -DoDLKvbdZyEJmblS -DncKjvbdkIGkefNk -EPDKjvbdRkZGVGjs -DnbkKvbdiHJbyVjV -EPDLKvbdFjeSbglu -DncLKvbdqFcdtVaI -EOcKjvbdGYuVAdYC -DoCjjvbduaEZSneI -DnbjjvbdKWVFdFHJ -EObjjvbdGdLVjCJj -DnbkKvbdpssgSSKt -DoCjjvbdssRryZdc -EPDKjvbdZisIQHCG -EOcKjvbdCIjajhfK -DoDKjvbdrafNMGjy -EObkKvbdgQBzwEXh -DnbjjvbdgQBzwDwh -DncKjvbdCEQAvKMf -EPCkKvbdiCOcFWpq -EPDLKvbdLFfHbBQu -EPCjjvbdJTYaSmXl -EPCjjvbdRjyFuGkT -DoCkKvbdjFKftoAO -DncKjvbdmaiwXoNu -DoCjjvbdVZITyjnn -DoDLKvbdDxYLtUTl -DnbjjvbdqvpLcJYq -EOcLKvbdlqxuZsDi -DoDKjvbdZshhyDsO -DoCjjvbdGFjSOIsq -DnbkKvbdcScKtEKB -EPCjjvbdMpXqVmfs -EPCjjvbduoTzpjoU -DoDLKvbdYkqctNkm -EObkKvbddoErjstS -DnbjjvbduLxWaUAw -DoCkKvbdRXODbkgc -DoCjjvbdwzIGFweS -DoCkKvbdZyEKOClS -EObjjvbdiGjCxvJu -EObkKvbdbiMijewY -DoDKjvbdqrVKmkBN -DoCkKvbdFyUuBEYC -DoDLKvbdNsTufduQ -DoDLKvbdEPCkKvcE -DoDLKvbdNQYRWNgT -DnbjjvbdNrtWGeUp -DoCjjvbdPxmAGrqj -EPDKjvbdKNAEZgVB -EPDKjvbdmttzKjSG -EPDKjvbdssSSxydc -DoCjjvbdTlWPAuni -EObjjvbdDHLegAzc -EObjjvbdXnRAXtvU -EObkKvbdKfFgaaQu -EOcKjvbdhtzFXSUb -EPCkKvbdJTZAsMwl -EOcKjvbdQYmAGsSK -DoCkKvbdjhHLeemk -EOcLKvbdiifIJmYS -EPDKjvbdLrWlzVQz -DoCjjvbdxsOIlrBg -EPDLKvbdNPxQvNfs -DnbkKvbdIGfyxwxH -DoCjjvbdjKFhKMwr -DnbjjvbddjKSVtzn -DoCjjvbdZoNiFEzK -EPCjjvbdeFOqavcK -DoDLKvbdEuxpQMie -EObjjvbdZjShQHCG -DoDLKvbdZMSDsmkm -DoDLKvbdGYtuBEYC -EPCjjvbdUaBprqRy -EOcLKvbdmozZWLZC -DncLKvbdUWLpKUBR -EPCjjvbdqYnhHQcx -DoDLKvbdUaBprpqy -EPDKjvbdrzMQSaHn -DnbjjvbdGdLWKCJj -EObkKvbdfILVrNqH -EPCjjvbdehKvRmqH -EPDKjvbdOSsvGeVQ -DncLKvbdxxJJaozL -EPCjjvbdZLqctNkm -EOcLKvbdZxcinCkr -DncLKvbdkWWmcbXw -DoDLKvbduCcVXWPP -DncLKvbdyTNhlqbH -DncKjvbdYTMAlsoY -DoCkKvbdRosfjFcw -EPDLKvbdDwxLsstM -EOcKjvbdlZTRryHU -DoCjjvbdNGbpMpVL -EOcLKvbdYgWdAOri -DoCjjvbdDxYLstTl -EObjjvbdIwtBglRQ -EOcKjvbdvPTzpkPU -DoCjjvbduLxXAtBX -DoCjjvbdiLeENuCy -DnbjjvbdUaCRSqRy -DnbjjvbdYpmEhleR -EObjjvbdsPvOjDWG -DoCkKvbdLFfICApu -DncKjvbddxZstRez -EPCkKvbdFyVVAdXb -DoCjjvbdFyVVBDxC -DoDLKvbdFeirNiTq -EPCjjvbdxnSgxTIc -EOcKjvbdAMgySwZx -EObkKvbdkyTRryHU -DoCkKvbdMRwMzUpz -DnbjjvbdCWzdJEov -DoCkKvbdUyITzLPO -EPCkKvbdcSbjsdKB -DoCkKvbdqceIonVa -DoCkKvbdjmCMZeGo -DncKjvbdfMewGljL -EObkKvbdpfEEtVaI -DoDLKvbdczZQYYqC -DoDLKvbdRNXbYmtz -EObjjvbdTvLojUBR -EPCkKvbdtbcVXWPP -DncLKvbdmSYuZrdJ -DoDLKvbdTukpKUBR -EPDLKvbdsQVoKCvG -EPDLKvbdBraCtFvr -EPDLKvbdZQmEiNEq -EPCjjvbdrzLosAgn -EPCjjvbdssRsZZdc -DncKjvbdbAudepQX -DncKjvbdcTDKscia -DncLKvbdlqyVZsEJ -EOcLKvbdbVCHXkTh -EObkKvbdYTMBMsnx -DnbjjvbdULvPAuoJ -DoCjjvbddtAUASlv -DoDKjvbdxUmEpxkn -DncKjvbdQwOEDLgc -DoCkKvbdSPsgKGDw -DncKjvbdiCOcFXQq -EPDKjvbdRkYfUfkT -EObkKvbdKCjDRJcY -DoCjjvbdZLqctOMN -EPCjjvbdUWLpKTaR -EPCjjvbdLqwMzVQz -DnbjjvbdnBivxPNu -EObkKvbdRpUHKFdX -EPCjjvbdeATqNXif -DoCjjvbdfILVrOQg -DoDKjvbdNrtVfeUp -EOcLKvbdNUrrKmAX -EPCjjvbdrbFllHLZ -DncKjvbdkDMLQgUg -DoCkKvbdVvhwvDeH -DnbjjvbdKeegaaRV -DoDKjvbdcJMjKfXY -DnbjjvbdZtJJYcrn -DoDLKvbdyqOliJwA -DoDLKvbdMgDPmPuL -DoCkKvbdHffzZXxH -DoCjjvbdZxdKNblS -EPDKjvbdkDLjqGtg -EPDKjvbdYzbeqjVy -DncLKvbdTppnttgm -EObkKvbdVYgtZjnn -EPCjjvbdzaAOgHCM -EOcKjvbdcyxoxZRC -EPDLKvbdxnSgxTJD -EObkKvbdfMfXHNJk -EPDKjvbdunszpjoU -EObkKvbdFfKRmhsq -EOcLKvbdhtydwRtb -DoDLKvbdYkrDsnLm -EPDLKvbdGGKSOItR -EPCkKvbduDCuXVno -EPDLKvbdrEFJQOVa -EPDLKvbdIjEAKQGd -EObjjvbdIryArmYM -DoDLKvbdYkqctOMN -EPCkKvbdiZtekqOG -DncKjvbdzdzOzeZp -DoDLKvbdbiNKLFwY -DnbkKvbdlhcsqUrB -DnbkKvbdKyRJrzuG -DoDKjvbdOFDtIiKd -DnbjjvbdvvlBWBVu -DnbkKvbdlrZUyrdJ -EObkKvbdxZgeewdr -DncKjvbdegkVrNpg -DoCjjvbdrJAJeNPF -EObjjvbdmfeXmOHZ -DoCjjvbdNPwqVmfs -DnbjjvbdnPzYvLZC -EPDKjvbdZshiYcrn -EOcLKvbdhgJcYvJu -DoDLKvbdXrlAmToY -DnbkKvbdwWlAvBVu -DnbkKvbdjvWnEBww -DoDLKvbdTYLLmzjx -EOcKjvbdDihJuxKA -DncLKvbdTfznLvue -DoCjjvbdVgwvXgYz -EObjjvbdsBfMkgKy -EPCjjvbdUaBqTQrZ -DnbjjvbdbhmJkGWx -EPCjjvbdLBLGmCYR -DoDKjvbdwjwEHzyf -EPDLKvbdegkVrNpg -DoCkKvbdJpzEnfOF -EPCkKvbdFejSOItR -DnbjjvbdTqQnuUhN -EOcLKvbdUMVoAvOi -EPCkKvbdSCEFLiZL -EPCkKvbdnCKXYPNu -EPDLKvbdZyEKNbkr -DncLKvbdZisIQGaf -EObjjvbdGLEsDHmV -DoCjjvbdBcpAujNG -EObjjvbdZRNFIleR -DnbjjvbdVrOXaeLc -EPCjjvbdHELViaij -EOcLKvbdqcdhpNvB -EPCkKvbdiZuFkqOG -DoCkKvbdOSsufeVQ -DoDLKvbduoTzpjnt -EOcLKvbdTqRPUuHm -DoDLKvbdCDpAuilf -EOcKjvbdZMSDsnMN -DoDLKvbdYqNFJMeR -DnbkKvbdbAvFFpPw -EOcKjvbdVqmwaeMD -EPCkKvbdUyHsyjnn -EPCjjvbdKeehBaQu -DoCjjvbdZshiYdTO -EObkKvbdTvMQJsaR -EPCjjvbdjblKqHUg -DnbkKvbdYlSDtOMN -EObkKvbdrWpMCiZR -EOcKjvbdUGzmlWue -DncKjvbdFyUuAcwb -EPCkKvbdLZQjSztf -EPCjjvbdfjfzbfAE -DncKjvbdFWZQQMie -DoCjjvbdVgxVxHYz -EOcKjvbdWWhxWEFH -DoDLKvbdUWLoitAq -DoDLKvbdzaAOffbM -EOcLKvbdrXPkbiYq -DoCkKvbdYzberKVy -DncLKvbdIMBznWpk -EPCkKvbdEPCkKwDE -DnbkKvbdWWiYVcdg -DoCkKvbdCWzchdpW -EOcLKvbdjvXNcbYX -EPDLKvbdSxLMNzjx -DnbjjvbdhficYuiu -DncLKvbdvmWAMdEm -EObjjvbduaDyTOdh -DncKjvbdwWlAvBWV -DoDKjvbdVviYWDeH -EOcKjvbdNsUWGdtp -DoCjjvbdzjVPodTU -EPCkKvbdmIcsptqa -EPDLKvbdIHHZxxYH -EPDLKvbdUyIUZkPO -EObkKvbdCDpBWJlf -EPDKjvbdWSNwaeMD -DoCjjvbdACrXjZhp -EPDLKvbdwuMdqYlO -DnbjjvbdHlBznWpk -DnbjjvbduaDyTPEh -DnbjjvbdwuNFRZLn -EObjjvbdajkfOnDA -DnbkKvbdWWiYWEEg -EPDLKvbdffLymgHA -EOcLKvbdkDMKpfuH -EPDLKvbdMoxQvOHT -DnbkKvbdbKkenmcA -DoCjjvbdhytfMRNf -DoCjjvbdIsZAsNXl -DoDKjvbdLiBkqYAS -DncLKvbdyzdmrHiI -DnbjjvbdemFvfmJk -EOcLKvbdSCEEkiYk -DoDKjvbdbiNKKevx -DoDLKvbdaaVdeoow -DnbjjvbdNGcQNPuL -DncLKvbdQYmAGrrK -EPDKjvbdrbGMkfjy -EPCjjvbdZjShPfbG -DnbjjvbdJmADyfuB -DnbjjvbdhtzFWquC -DnbjjvbdQvmdDMID -DncLKvbdjvWnEBww -EPCjjvbdxZgfGXdr -EObkKvbdDihKWXjA -EPCkKvbdZMSETnLm -EPDKjvbdZLqcsnMN -EObkKvbdqwPlDJZR -DoDKjvbdZisIQGaf -EObjjvbdjlalZeGo -DncKjvbdxsOJMqag -DoDKjvbdOFEUIhkE -DoCkKvbdzitoodSt -DncLKvbdVrNwaeMD -DoCjjvbdezuyEiTw -EPDKjvbdiCOcEvpq -DoCjjvbdvvlAvAvV -DnbjjvbdJuuFceHJ -DoCjjvbdlYrrSyGt -EPCkKvbdfILVrNqH -DoDLKvbdxsOJNRbH -DncKjvbdIwtBgkpp -DnbkKvbdOTUWHEtp -EPDKjvbdFejRnIsq -DnbjjvbdVBCRTQrZ -EPCjjvbdiMEcnUcZ -EObkKvbdiZuGMRNf -EOcKjvbdatbHYLTh -DoCkKvbdmSZVZrdJ -DoDKjvbdqTsgRqjt -DoDLKvbdCEQBWKNG -DnbjjvbdZtJJZESn -DncLKvbdIHGzZXwg -EPDLKvbdwtmFRZMO -DoCjjvbdKDJbqJcY -EObkKvbdatbHXkUI -DnbkKvbdYqNEhleR -EObjjvbdNHColotk -EPDKjvbdegkWSNpg -DoDLKvbdRjyFtfjs -DoCjjvbddoEsKtUS -EOcLKvbdsQWOjCvG -DoCkKvbdvAcxsOeI -EObjjvbdbAueGQQX -EOcLKvbdxKwEHzzG -DoDKjvbdqTtHSRkU -EOcKjvbdOAIsUKSA -EPCjjvbdWSNxCElD -EPDLKvbdnCKWwoNu -DncLKvbdEARiMzXX -DoCkKvbdbAvEeoow -EOcKjvbdhgJcYvJu -DnbjjvbdTulPisaR -DnbjjvbdIidAKQGd -EPDKjvbdyOTIXrhc -EPCkKvbdrbFmLgLZ -EPCjjvbddeOqbXDK -DncKjvbdRacdlJZL -EOcLKvbdbsDKtDjB -EPCjjvbdUyHtZkOn -EObkKvbdyTOImSBg -DncKjvbdtbbtwWPP -EPDKjvbdKDKDRJcY -EObjjvbdhanbeXQq -EOcLKvbdvvlAuaWV -EPDLKvbdVYgsyjoO -EPDLKvbdKaKflawq -EOcLKvbdCIjajiFj -EObkKvbdUsmUGMWK -EPDLKvbdIjEAJofd -EOcLKvbdqBJFAWhE -EPCkKvbdEJgivXjA -DnbkKvbdYkqdTmkm -EPCkKvbdliDsqUrB -EObjjvbdKVtfEEfi -EObkKvbdmgFYMmgZ -EObjjvbdEARhlyvw -DncKjvbdaRecHtGL -DnbjjvbdNQYRVmfs -EOcLKvbdFfKRnJTq -DncLKvbdMgDQNQUk -EObkKvbdHgGyyXwg -EPCkKvbdCJKbKiFj -EPCkKvbdBraDUGXS -EPDLKvbdiMEcnVCy -DoDLKvbdkCkkQfuH -EOcLKvbdwtmFRZLn -EPDKjvbdKefHbApu -DnbkKvbdkxrqsZGt -EPCkKvbdfIKvRmqH -EOcKjvbdDnbkLWbd -EPDLKvbdaRebhTek -DoDLKvbdjuwODaxX -DnbjjvbdREDBPpdS -DncLKvbdjuwNcaww -EOcKjvbdbiMjKevx -EPDKjvbdqvpLcIyR -EPCjjvbdijGIKMxS -EPDLKvbdQmYCZNtz -EObjjvbdCDpAvKMf -EOcLKvbdJJdAKPgE -DoDKjvbdUxgszLOn -DnbjjvbdOEcshhjd -DoCjjvbdUaCRSprZ -EPCkKvbdxmrhYTJD -EPDKjvbdICLydzAD -EPCjjvbdKRZdoFme -EObkKvbdNdctJIjd -EPCjjvbdKVuFdEgJ -EObjjvbdrXPlDIyR -DoCkKvbdfMewGmKL -DnbkKvbdIwsahMQp -EOcLKvbdRaceMIxk -EPCkKvbdcyxoxZQb -EObjjvbdRkYeuGkT -DncLKvbdbVBfwkTh -EObjjvbdTppoVUhN -EPCjjvbdhytfMROG -EOcKjvbdUxgszKoO -DoCjjvbdGLEsDHlu -EObkKvbdegkVqmqH -DncKjvbdkMbLyeGo -DncKjvbdyzdmqghh -EPCkKvbdGFiqnIsq -EPDKjvbdpstGqqjt -EPDKjvbdYkrDsmkm -EPCkKvbdKaLGlbXq -DoCkKvbdxwiJbPyk -EPCkKvbdJcKDQibx -EPCkKvbduDCuXWPP -DnbjjvbdiGicZWKV -DoCkKvbdsPunicWG -DnbjjvbdKNAEZgVB -EPDLKvbdnPyxujyC -EObkKvbdJXsagkpp -EObkKvbdNddUIiKd -DnbjjvbdQwOEClID -DnbkKvbdFVxpQMie -EPCkKvbdVrNxBeLc -EPCjjvbdUsmUGLuj -EPDLKvbdGZVVBDwb -DoCjjvbdmRyUyrdJ -DncKjvbddZxoxZQb -DnbjjvbdGKdsDINV -EObjjvbdrafNLgKy -DoCjjvbdJbjCqJbx -DnbjjvbdlYsSTYgU -DoCkKvbdQvnDblID -DoDKjvbdssSTYzFD -DncKjvbdmozZVkZC -EPDKjvbdjbkkRGuH -DoDLKvbdxmrgwriD -DoDKjvbdfHkVrORH -EPCkKvbdJuuFceHJ -DoDKjvbdcbSlrATm -EPCkKvbdeATpmXif -DncLKvbdBiKajhej -EPCkKvbdrNZixlIJ -EPDLKvbdKVteceGi -EObkKvbdzjVPodTU -DoDLKvbdWSNxCEkc -EOcKjvbdZxcimcLr -EOcKjvbdZnnIeEyj -DnbkKvbdmbKWxPOV -EPCkKvbdZLrETmkm -EPDKjvbdnUtyjiqf -DoCkKvbdrWpLcJZR -DoCkKvbdaMkCStmH -DncLKvbdFVxpQMie -EPCjjvbdrpWOicWG -EOcKjvbdyOTIYShc -EObkKvbdqrVLNkBN -EOcLKvbdQvnDbkhD -EOcLKvbdDigiuxKA -DncLKvbddoErkTtS -DoDKjvbdRWmdDLgc -EPCjjvbdiHKDZVjV -DnbkKvbdADSYKZiQ -DnbkKvbdsPunibuf -DoCjjvbdSPsfiedX -EPDKjvbdJmAEZfta -EOcKjvbdZMRcsnLm -DoCkKvbdiLddOUcZ -EObkKvbdqqtkOLAm -DoDLKvbdYpmFImFR -EObjjvbdVhYWXfxz -DnbjjvbdMowqWNfs -EObkKvbdVgwuwgYz -DoDKjvbdDxYLsssl -DnbjjvbdZtIiYcsO -DnbkKvbdxwiKBpZk -DoDKjvbdEuxpPmKF -EOcKjvbdJcKDRKCx -EObkKvbdUtNUFlWK -EOcKjvbdjhHLfFnL -DoCkKvbdSQTgKGDw -DncLKvbdQccBQRDr -DncLKvbdILazmwRL -DoDKjvbdYTMBNUPY -DoDLKvbdKaKfmCXq -EPCjjvbdkIHMGGOL -DnbjjvbdCIjbKhfK -DnbkKvbdVgwuwfxz -EPCjjvbdwtmFQxkn -EPDLKvbdcyyQYZRC -DoDKjvbdPyNAGsRj -EObjjvbdSLYetgLT -DoDLKvbdMRwNZuQz -DncKjvbdFjdrcHlu -DoCjjvbdZyDimbkr -DnbkKvbdRXNdClID -EObjjvbdEYYLtUTl -EObkKvbdVqmxBdlD -DoDLKvbdptTgRqkU -EOcLKvbdBdPaWKMf -EPCjjvbdiBncEvpq -DoDLKvbdzQoNJKXA -DoDKjvbdUQpoUtgm -DnbkKvbdrzLpTBHn -DoCjjvbdunszpkPU -EPDLKvbdSZjHsCvA -DncKjvbdRotHJfDw -DnbkKvbdFejSOItR -EOcKjvbdeFOrBwCj -DoDLKvbdkVwNdCXw -EPCkKvbdeOdrjtTr -EPCjjvbdhuZdwRuC -DnbkKvbdfILVqmqH -DncKjvbdnPzYvLYb -DncKjvbdHgGzZYXg -DncKjvbdkVwNcaxX -DoDLKvbdOAJSsjSA -DncKjvbdOFDtJIjd -EOcLKvbdVgwvYGxz -EObkKvbdsQVnjDWG -DoCjjvbdZjShQHCG -DncKjvbdzoPpeCkx -DoDLKvbdSLZFtfjs -DnbkKvbdBsBCtFvr -EOcLKvbdFyUuAcwb -DnbjjvbdqUTfqrKt -DoCjjvbdZxdJmcLr -DncLKvbdmbJwYPOV -EObjjvbdEObjkXDE -EOcKjvbdaSFcIUGL -EPCkKvbdqYoIHQcx -EOcKjvbdfNGWgMjL -DoCjjvbdbrcKtEKB -EPCkKvbdvBDxsOdh -DnbjjvbdtcCuXVoP -DnbjjvbdrpWPKDVf -EOcKjvbdwyhFfYFS -EPCjjvbdnPyyWLZC -EPDLKvbduMYXBUAw -DoDKjvbduaDySoFI -DoCjjvbdyXiKCPzL -DncLKvbdGFjSOIsq -DoDLKvbdeEoRbXDK -DncLKvbdcTCjtDia -DnbjjvbdnUuZjiqf -DnbjjvbdjlakzFHP -EOcLKvbdwWlBWAvV -DnbkKvbdWWiXuceH -EObkKvbdemGWfmKL -EObkKvbdmuUykJrG -DoCkKvbdmozYvKxb -DncKjvbdQZNAGsSK -EObjjvbdjblKpgUg -DncKjvbdSZigsDWA -EOcLKvbdZyEJmblS -DoCjjvbdnCJwYOmu -EPDKjvbdtkxWaTaX -EPDKjvbdGZUuAcwb -DoCkKvbdyfxlANEw -EPCkKvbdTAFJIBnd -DncKjvbdZLqctOMN -DncKjvbdUMWPBWPJ -EPCkKvbdDwwksstM -EPDKjvbdEObjjvbd -EObjjvbdWXJYWEEg -DnbjjvbdpaIeAXIE -DoCjjvbdqYoIHREY -DnbjjvbdvmWAMceN -EObkKvbdLFfHaaQu -EOcLKvbdpaIeAWgd -EPDLKvbdkCkkQgUg -DnbjjvbdePErkTtS -DnbkKvbdNGbomQVL -DoDLKvbdEPCjkWcE -DoCkKvbdehLWRnRH -EOcKjvbdyXhibQZk -EOcLKvbdZyEKOCkr -DoCjjvbdkDLkRGtg -DoDLKvbdkaNPNALA -EObkKvbdrWpLbiYq -DoDLKvbdfHkVqmqH -DoDLKvbdEOcLKwCd -DoDKjvbdrykpTBHn -DncKjvbdxZgefYFS -DnbkKvbdJpzFPFnF -DoCkKvbdNGcPmPtk -EPCjjvbdhzUelRNf -EObkKvbdVTltFlWK -DoCkKvbduaDxrneI -EObkKvbdSQTgJfEX -EOcKjvbdVhYVxHYz -EOcKjvbdkCkkQgUg -EObkKvbdqUUHSSLU -EOcLKvbduLwwAtAw -EPDKjvbdZLrETnMN -EObkKvbdmttyjjRf -DoDKjvbdYqMdiMdq -DoCkKvbdkNBkzEfo -DncKjvbdiLeDnUcZ -DoDKjvbdZLrDsnLm -EPCkKvbduVnYKRTA -EPCjjvbdCIkCLJFj -EPDKjvbdssRrxyeD -DncKjvbdQwOEClHc -EPCkKvbdwXLaWAuu -EPCkKvbdUyHszKoO -EPCkKvbdJYTagkqQ -DoCkKvbdwuNFRYlO -EPCjjvbdfHkWRmqH -EOcKjvbddeOqbXCj -EObkKvbdhficYujV -EPCkKvbdmSYtzTEJ -EPCjjvbdtkxWaTaX -EPDLKvbdwygfGYEr -EPDKjvbdmpZxvKyC -DoCjjvbdpstGrSLU -EPDKjvbdUtMtGLuj -EOcKjvbdjlbLzFGo -EObkKvbdkyTSTZGt -EOcLKvbdLYpjSzuG -EPDLKvbdyXhibQZk -DncKjvbdptUHSRkU -DnbjjvbdFfKRmhtR -DoCjjvbdtbcUwVoP -EPDKjvbdhyuFkpnG -EPDLKvbdFpASwHFy -EPCjjvbdRbDeLiYk -DncLKvbdXmqAYUut -EObjjvbdqlyjZLgi -DoCjjvbdssSTYydc -DnbkKvbdTIzJqABM -EPCkKvbdxsOJNRag -EPCjjvbdlhcspuSB -EObkKvbdqUTgSRjt -EOcKjvbdOEcshhkE -EObjjvbdzjUpPdTU -DnbkKvbdvwLaVaWV -EPCjjvbdmoyyVkYb -DoCkKvbdOFETiJKd -EPCjjvbdeEnqawCj -EObjjvbdmuUzKjRf -EPDLKvbdVvhxVdFH -EPCkKvbdaSGDHsek -EPCjjvbdkySrTZHU -EObjjvbdtAGqIABS -EObkKvbdZyEJmblS -DncKjvbdyTOJMrCH -DncLKvbdFWYoolie -DoDLKvbdTvMPjUAq -EObjjvbdZLqctOLm -DnbkKvbdmIctQuSB -DoCkKvbdZGvdAPTJ -DoCjjvbdkDMLRGuH -DoDLKvbdnVUykKSG -DoDKjvbdLGFhBaRV -DncLKvbdxwiKBozL -DncLKvbdWIYWXgYz -DncLKvbdFkFSbglu -DoDKjvbdIGgZxxXg -DnbjjvbdEztRFMDJ -DoDLKvbdZQldiNEq -EOcLKvbdwWkaWAvV -DoDKjvbdLBLHMawq -DoDLKvbdkMbLzFGo -EPDKjvbdREDAopcr -DoCkKvbdZoNiEdyj -EPDLKvbddneSkUUS -DnbkKvbdSQUHJecw -DoCjjvbdZshhxcrn -DnbjjvbdRkZFuHLT -EPDKjvbdwuNEqYkn -DoDLKvbdemGXGmJk -EOcLKvbdKWVGDeGi -DoCkKvbdWSOXadkc -EObjjvbdVTmTelWK -DncKjvbdhkeDmuDZ -EPCkKvbdRWnEDMID -DnbjjvbdNQYRVnGs -DnbkKvbdTfzmlWvF -DoCkKvbdFpASvgGZ -DoCjjvbdqTsfqqkU -EObkKvbdUVkpKUAq -DoDLKvbdrRtkNjaN -EPCkKvbdrJAKEmOe -DncKjvbdIGfyyYXg -DnbjjvbdZLrDtNkm -EObjjvbdiMEcmuCy -DncKjvbdkyTSTZHU -DncLKvbdBsAbtFvr -DnbkKvbdrpWPKDWG -DncKjvbdbBWFFoow -DoDLKvbdxmsIXsJD -DnbkKvbdehLWRnRH -EObkKvbdiVZeXRuC -DnbkKvbdOTUVfduQ -DncLKvbdZjTIQHCG -DoDLKvbdOSsugFVQ -DoCjjvbdrafNLgKy -EPDLKvbdNPxRVmgT -EPDKjvbdHlBznXQk -EPCkKvbdCEQBWKMf -EObjjvbdtcDUwWOo -DoCjjvbdZMSDtNlN -DoDLKvbdvAcxrneI -EObjjvbdIxUCILpp -EOcKjvbdfSBWzkbo -EObkKvbdShzKRAAl -DnbjjvbdGZUuBDxC -EObkKvbdqlzKYkhJ -EPDKjvbdZyEKNbkr -DoDLKvbdsrrTYzFD -DoCkKvbdfSAvzkcP -DnbjjvbdqlzKYlHi -EPDKjvbdYTLaNToY -EPCjjvbdjEjgUoAO -EOcKjvbdTJZjRABM -EObkKvbdYORAXtvU -DoDLKvbdGKdrcHmV -DoDLKvbdbrcLUEJa -DncLKvbdqvpLcJZR -DnbkKvbdFeiqnIsq -EPDKjvbdZnnIeEzK -EPCjjvbdnUtzLKRf -DoDLKvbdDxXlUUTl -DoDKjvbdiMEcnUby -EObkKvbdYzbeqjWZ -DncKjvbdTvLojUAq -EOcLKvbdjuvmdBxX -DnbjjvbdzoPpdcMY -DoDKjvbdrovOibuf -DoDKjvbdFWZPomJe -DoDKjvbdqGDeUWBI -DoCkKvbdWWiYVdEg -EObkKvbdtvOXiqTA -DnbjjvbdqZPIGpdY -EObkKvbdLBKgNCYR -DoCjjvbdLBKgNCYR -EObjjvbdZsiJZESn -DoCkKvbdTqROtuIN -EPCjjvbdyfyMAMdw -EOcLKvbdptTgSSLU -DncLKvbdPxmAHTSK -DnbjjvbdRkZFtfkT -EPDLKvbdtlXvaUAw -EPCkKvbdqBJFAWhE -EPCkKvbdIidAJogE -EPDLKvbdKQydoGOF -EObkKvbdauCGwkTh -EPCjjvbdNddUIiKd -DoDLKvbdFfKRmhsq -EPCkKvbdeEnqbXCj -EObkKvbdJvVGDdfi -DoDKjvbdWRmwaeLc -EObkKvbdSCDeLiZL -EPDKjvbdDoDLLWcE -EPDLKvbdiMEcnUby -DnbjjvbdLBLGmBxR -EPCjjvbdZnmiEdyj -EObjjvbdVhXuwgYz -DncLKvbdUtNTfMVj -EPDLKvbdKaKgMaxR -DncKjvbdJcJbpicY -DnbkKvbdSKyGVHLT -DoDKjvbdzROlhjXA -DnbkKvbdlrZUysEJ -DoCkKvbdnQZyWLYb -DoCjjvbdeFOqbWbj -EOcLKvbdjgfkfGOL -EObkKvbdiHJbyWKV -DnbkKvbdGdLVibJj -DoDKjvbdGLErcINV -EPCjjvbdNGcPlpUk -EOcKjvbdjFLGtoAO -EOcKjvbdsBfMlGkZ -EObjjvbdhtydvquC -DoCjjvbdznpRFCkx -DncLKvbdYSkaNUOx -DoCjjvbdVvhxVdFH -EPDLKvbdNeETiJLE -DoDKjvbdcScLTdJa -EOcLKvbdQwNdDLgc -DoDLKvbdUMWPBWPJ -DncKjvbdqFdEtVaI -EObjjvbdhbPCeXRR -DoCjjvbdKeehCApu -DncKjvbdYNqAXuVt -DoDLKvbdjmCLzFGo -DoCkKvbdtlXwBUAw -EObkKvbdwtmEqYlO -EObjjvbdrovOjCvG -EObkKvbdqrVLOLBN -DoCjjvbdSBcdkhxk -DncLKvbdrEEhomua -EObkKvbdtbbtvuno -EPDLKvbdZjShQGaf -EPCjjvbdTAFJHbPE -DnbjjvbdcScLTcia -EObkKvbdbsDLUDia -DnbkKvbdkyTSTYgU -DncKjvbdySmhmSCH -DoCjjvbdnBivxPNu -DncKjvbdEXxLtTtM -EObjjvbdZshhyESn -DoDKjvbdkMbLzEfo -EObjjvbdssRrxyeD -DoDKjvbdcSbkTdKB -EPDLKvbdHDjvJbKK -DncLKvbdsQVnjCvG -DnbjjvbdJSyBTMwl -EOcLKvbddZxpYYqC -EPCjjvbdrXQLcJZR -DoCkKvbdnHEwlmfy -EOcKjvbdGZUuBDwb -EObjjvbdvOszqKnt -EOcLKvbdRosgKFdX -EPCjjvbdMpXqWNfs -EPCkKvbdJbibqJcY -DncKjvbdJvVFdEgJ -EObkKvbdqwPkcIyR -DnbkKvbdDwxMUTtM -DncKjvbdtcDVXVno -EPDLKvbdlZSrSxft -DoCkKvbdKeehCApu -EPDLKvbdQlxCYmtz -EOcLKvbdYqNFJNFR -DoCkKvbdnCKWwoOV -EObjjvbdwzIFfYEr -EOcKjvbdkDMLQfuH -EPCjjvbdrSUjnLBN -EPCkKvbdTfznMXVe -EPCkKvbdZxdKNcMS -DoCjjvbdJXsaglRQ -DoCjjvbdNPwqWNgT -DoCjjvbdLqwMzUpz -EOcKjvbdCDoaWJlf -DnbjjvbdlYsRsZGt -DncKjvbdeOdsLUUS -EOcKjvbdEvZQPmJe -DoCkKvbdqBJFAXHd -DnbjjvbdtkwwBUBX -EObjjvbdLFfHaaQu -DoDLKvbdbLMFoNcA -EPDLKvbdiLdcnUby -DnbkKvbdUQqPVUgm -EOcLKvbdEOcLLXDE -DoDKjvbdrEEhpOWB -DncKjvbdkCkkQftg -DncLKvbdMfbpNQUk -DnbjjvbdTulQKUAq -DoDLKvbdUtNUFkvK -DncKjvbddndsKtTr -EPDKjvbdliDsqVSB -EPCkKvbdhbOcEvqR -DoCkKvbdqceJQNua -DoCkKvbdrWpLcIyR -DncKjvbdrSVLNkAm -DoDLKvbdyOShYTJD -DncKjvbdyYJKBoyk -DnbjjvbdZQldiNFR -EPDLKvbdePEsKstS -EPCjjvbdcScKtDia -DncLKvbdxsOJNRbH -EObjjvbdEYXlUUTl -DoCkKvbdxUldqZMO -EOcKjvbdRjxeuGkT -EOcLKvbdqrVLNjaN -DoCkKvbdDwwktUUM -EOcLKvbdZQmEiNFR -EPCkKvbdMSXMytpz -DnbkKvbdnUtzKiqf -DoCjjvbdREDAoqDr -EPCjjvbdZyDinDMS -EPCjjvbdiCPDEwRR -EPCkKvbdmSZUzSci -DoDKjvbdkWWmdCXw -DnbkKvbdmJDsqVRa -EPDKjvbdhzVGLpnG -DoCkKvbdsPuoKDWG -DoDLKvbdrylPsAgn -EPCjjvbdsPuoJbuf -EOcKjvbdrEFJQOVa -EPCjjvbdEPDLLXCd -DncKjvbdkVwOEBxX -EPCkKvbdqGEFUWAh -DncLKvbdtbcUvuno -EOcKjvbdWIYWYGxz -EPDLKvbdZLqcsmkm -DoDKjvbdmaivwnnV -DoCkKvbdOYPVzcmt -DoCjjvbdVwIwvDeH -DoCjjvbdYkrETmkm -DoDKjvbdLFfHbAqV -EObjjvbdkIHLefOL -EPDKjvbdZjShPfaf -DoCjjvbdehLWSORH -DncLKvbdKfFgbBQu -EObkKvbdsPunjDVf -DncKjvbdiMEdNuCy -DncKjvbdFfKSNhtR -EOcKjvbdFVxpQNKF -DncLKvbdfHkVrORH -EObjjvbdKefIBaQu -EPDKjvbduCbtvuoP -EPCkKvbdGdLWKCKK -DncLKvbdLAkGmBwq -DncLKvbdZshiZESn -DnbjjvbdySmhmSCH -DoDKjvbdACqxJyiQ -DncLKvbdmajXYOmu -DnbjjvbdxVNFRZMO -DnbjjvbdVqmxBdlD -DnbkKvbdIGgZyYXg -DncKjvbdddnrBvcK -EPCjjvbdUGzmkwVe -DncLKvbdaNLCTVNH -DoCkKvbdWWhwucdg -DncKjvbdkWWmcaxX -DoDKjvbdaRfChUGL -EPDLKvbdOEcsiJKd -DoDLKvbdGLFTChMu -EObjjvbdjmBkzFHP -DncLKvbdrWokcJYq -EObjjvbdDHMGHAzc -EObkKvbdRyjITCvA -DnbjjvbdWRnXbElD -DoCjjvbdEARiNZvw -DnbkKvbdRjyFtfjs -DoCkKvbdMgDQNQVL -DoDKjvbdCEPaWJmG -DoCkKvbdUtNTfLuj -DoDKjvbdNGcQMpVL -DoDKjvbdZQmFImEq -EObjjvbdyYIibPyk -DoDLKvbdcSbjtDjB -EPCjjvbdPxmAGsSK -EPCjjvbdnUuZjirG -EPCkKvbddijSVtzn -EOcKjvbdxUmEqYlO -EOcKjvbdxrmiNRag -EPCkKvbdjmBlZeHP -EOcKjvbdvBDySndh -EObjjvbdliDsqVSB -EOcKjvbdTvMQKUBR -DncLKvbdRNXbYnUz -DnbjjvbdyYIiaozL -DoCkKvbdhbPDEwRR -EPDKjvbdptUGrSLU -DoDKjvbdFjeTChMu -DnbkKvbdFVxoomJe -EObkKvbdlYrrSyGt -EPDLKvbdVZHszKnn -DncLKvbdDwwktUUM -DncLKvbdDnbkKvcE -EPCkKvbdjJfHjMwr -EPDKjvbdUtNTfMWK -EObjjvbdbhlikGWx -DncLKvbdKfFhCBQu -DoDKjvbdVgwvXgYz -EPDLKvbdiBoCdwRR -EPDLKvbdzdzOzeZp -EObkKvbdMoxRWNgT -EPDKjvbdjvXNdBww -EObkKvbdUtMsfLuj -EOcLKvbdnUuZjjRf -DnbkKvbduCbtwVoP -EPDLKvbdGGKRmhsq -EObkKvbdePEsLTtS -DoCjjvbdSKyGUgLT -EOcLKvbdRbDdlIyL -DoDLKvbdNxPVzcnU -EObjjvbdkCkkRGtg -DncKjvbdVTmUFkvK -DncKjvbdUsltFkuj -EPDKjvbdSCEElJZL -EOcKjvbdZxcjNcMS -DoCjjvbdEJgjWYKA -DncLKvbdREDBQRDr -DncKjvbddoErjtUS -EPDLKvbdADSYJyiQ -EPDKjvbdatafxKsh -EPDLKvbdkIGkeemk -DoDLKvbdmRxtzSci -DnbkKvbdTlWPAvPJ -DncKjvbdjJegjMwr -DoCkKvbdqTtHSSKt -EOcKjvbdkMakzFHP -DncLKvbddZyPwxpb -DnbkKvbdTppnuUgm -EObkKvbdnPyxukZC -DoDKjvbdbiNJjewY -EPDKjvbdJSyArlwl -EPDLKvbdvvlBVaVu -EOcLKvbdjJfIKMxS -EPDLKvbdliETqVRa -DoCkKvbdWXJXvEFH -DncLKvbdiHKDZWKV -EObkKvbdEXwktUUM -EOcKjvbdRWnDcMID -EPDLKvbdbhljKfWx -DnbkKvbdVTlsfMVj -DnbjjvbdZoOIdeZj -DoDKjvbdDxYLtUTl -EObjjvbdmIdTqUqa -EPCjjvbdiZtekqNf -DoDLKvbdMfcPmPtk -EPDLKvbdKxpirztf -DnbkKvbdEARhlzWw -EOcKjvbdqiAJeMne -DnbjjvbdUsltGMWK -DnbkKvbdMoxRWNfs -EPCjjvbdTqQntuIN -EPDKjvbdLFfHbApu -EOcLKvbdANIZSwZx -DoCjjvbdSLZGUfjs -DoDLKvbdJSyArlxM -EOcLKvbddZxoxZRC -DoDLKvbdRpTfjFcw -EObjjvbdKefHbBRV -EPCkKvbdjlakyeGo -DoDLKvbdiBncFXRR -EObkKvbdkHfkefOL -DnbjjvbdfILVrORH -DnbjjvbdbsDKtDia -DoCjjvbdqiAKElne -EObkKvbdEXxMTtUM -DncKjvbdHfgZxxXg -EPDKjvbdQvnDcMID -DoDKjvbdCSaCsewS -DncLKvbdSZigsDWA -DnbkKvbdiUyeXSUb -DnbkKvbdZRNFJMeR -EPDKjvbdDxXlTstM -EPCjjvbdkNBlZdfo -DnbkKvbdhuZdvqtb -DncLKvbdHDkWJajK -EOcKjvbdhficZWKV -DoDLKvbdxwiKCPyk -EPDLKvbdZQleJMeR -DoDLKvbdLrXMytpz -DncKjvbdcTCjtEJa -DnbkKvbdUMVnaWPJ -DoCjjvbdnBjXYPOV -EObjjvbduWNwjQsA -DoCjjvbdRpUHJecw -DnbkKvbdJYUBglQp -EOcLKvbduoTzqKoU -EObjjvbdZMRctNlN -EObkKvbdziuPpESt -DoDLKvbduLxWaTaX -EOcLKvbdhgKDZWKV -DnbkKvbdZQldhmFR -EOcLKvbdcyyPxZQb -EOcKjvbdRWnDcLgc -DncLKvbdxZgfFweS -EPCkKvbdyqOliJwA -DnbjjvbdsPvPKCuf -DoCjjvbdMgCpNQVL -DncLKvbdOEdTiJKd -EPDKjvbdEARiMyvw -EOcLKvbdJbibqKDY -DoCkKvbdeEnrCWbj -DoCkKvbdGKdrcIMu -DnbkKvbdUMWOaVoJ -DoCkKvbdKaKgNCXq -DnbkKvbdoAKztHdO -EPDKjvbdDxXlUUTl -EOcLKvbdFVxoomJe -EOcKjvbdpyPHfpdY -EPCjjvbdxwiJaoyk -DoCkKvbdlqxtyrci -EOcKjvbdfHkWRmpg -DoCjjvbdkMalZdfo -EPCjjvbdJpyePGOF -DncLKvbdqUUHRqjt -DoDLKvbdziuQPdSt -DoDKjvbdBhjajiGK -EPDKjvbdjcLjpftg -EPDKjvbdVwJYWEFH -DnbjjvbdNdcsiJLE -DoCjjvbdQwODcLgc -EOcLKvbdtkxXAtAw -EPDKjvbdwMvANEEm -DoCjjvbdqFdEsuaI -EObjjvbdrSUjmjaN -DoDLKvbdnGeYMnGy -EOcLKvbdPyNAHTSK -DnbkKvbdMowpvNgT -DoCjjvbdGdLVibKK -DoDLKvbdtcDVXVno -EObkKvbdtlXwBUAw -DoCjjvbdSPsgKGEX -EPCjjvbdURQntuHm -DncLKvbdrMyjZLgi -EPDKjvbdwXMAvBVu -EOcLKvbdRjxfUfkT -DnbkKvbdGFjRnJTq -DoCkKvbdbUbHYLTh -EPDKjvbdoznEKxPA -EPCjjvbdLiBlQxAS -DncKjvbdfVzxPizs -DnbjjvbdSKyFtgLT -EPDKjvbdrXPlCiZR -DncLKvbdhzVGLpnG -EObjjvbdVwJYVdFH -EPDKjvbdwXLaWBVu -EPCjjvbdjhHMGFmk -EObkKvbdKyQjSzuG -DoCjjvbdmfeYNOHZ -DoDLKvbdZirgofaf -EOcLKvbdZoOIdeZj -EPCkKvbdLFfHbApu -EPCkKvbdjvWnEBww -DoDKjvbdcScLUEKB -DoCkKvbdkCkjqHUg -DoDKjvbdyTNhmSBg -DoCkKvbdkHgLfFnL -EPCjjvbdzoQQdcLx -DoCjjvbdOTTvHEtp -EPCkKvbdznopeDLx -EPCkKvbdGFjRmhtR -EPCkKvbdUaCQrpqy -EOcKjvbdnGeXmOHZ -DoDKjvbdiCPDEwRR -DoCjjvbdRbEFLiYk -DncKjvbdRXOECkgc -EPCjjvbdKWUedEgJ -DncKjvbdDjIJvYKA -DoDKjvbdyTOJNRbH -DoCjjvbdePFTKtTr -DoDKjvbdhtyeWrVC -EPCkKvbdqvolCiZR -DoDLKvbdapHHELzd -EObjjvbdlhdUQtrB -EOcKjvbdptUGrRkU -EPCjjvbdqUTfqrLU -EPCkKvbdcJMikGWx -DoDKjvbdlhctRVRa -EOcLKvbdANHyTXZx -EPDKjvbdpssfqrKt -EPCkKvbdFeiqnJTq -DoCkKvbdxZgfGXdr -EOcLKvbdRWmcblHc -DncLKvbdjggMFemk -DoDKjvbdKeegbBQu From 6563cda42b83ed71831ad824a4eb59197d64ff79 Mon Sep 17 00:00:00 2001 From: Keith McGuigan Date: Thu, 11 Oct 2012 12:25:42 -0400 Subject: [PATCH 029/241] 7200776: Implement default methods in interfaces Add generic type analysis and default method selection algorithms Reviewed-by: coleenp, acorn --- .../share/vm/classfile/bytecodeAssembler.cpp | 269 ++++ .../share/vm/classfile/bytecodeAssembler.hpp | 214 +++ .../share/vm/classfile/classFileParser.cpp | 136 +- .../share/vm/classfile/classFileParser.hpp | 2 + .../src/share/vm/classfile/defaultMethods.cpp | 1387 +++++++++++++++++ .../src/share/vm/classfile/defaultMethods.hpp | 58 + .../share/vm/classfile/genericSignatures.cpp | 1272 +++++++++++++++ .../share/vm/classfile/genericSignatures.hpp | 467 ++++++ .../share/vm/classfile/systemDictionary.hpp | 1 + hotspot/src/share/vm/classfile/verifier.cpp | 25 +- hotspot/src/share/vm/classfile/vmSymbols.hpp | 1 + hotspot/src/share/vm/code/dependencies.cpp | 6 +- .../src/share/vm/interpreter/linkResolver.cpp | 55 +- hotspot/src/share/vm/oops/constMethod.cpp | 30 +- hotspot/src/share/vm/oops/constMethod.hpp | 45 +- hotspot/src/share/vm/oops/constantPool.cpp | 9 +- hotspot/src/share/vm/oops/instanceKlass.cpp | 114 +- hotspot/src/share/vm/oops/instanceKlass.hpp | 19 +- hotspot/src/share/vm/oops/klassVtable.cpp | 95 +- hotspot/src/share/vm/oops/klassVtable.hpp | 25 +- hotspot/src/share/vm/oops/method.cpp | 48 +- hotspot/src/share/vm/oops/method.hpp | 22 +- hotspot/src/share/vm/runtime/globals.hpp | 9 + hotspot/src/share/vm/runtime/reflection.cpp | 12 + .../src/share/vm/utilities/growableArray.hpp | 7 +- hotspot/src/share/vm/utilities/pair.hpp | 42 + .../src/share/vm/utilities/resourceHash.hpp | 134 ++ 27 files changed, 4301 insertions(+), 203 deletions(-) create mode 100644 hotspot/src/share/vm/classfile/bytecodeAssembler.cpp create mode 100644 hotspot/src/share/vm/classfile/bytecodeAssembler.hpp create mode 100644 hotspot/src/share/vm/classfile/defaultMethods.cpp create mode 100644 hotspot/src/share/vm/classfile/defaultMethods.hpp create mode 100644 hotspot/src/share/vm/classfile/genericSignatures.cpp create mode 100644 hotspot/src/share/vm/classfile/genericSignatures.hpp create mode 100644 hotspot/src/share/vm/utilities/pair.hpp create mode 100644 hotspot/src/share/vm/utilities/resourceHash.hpp diff --git a/hotspot/src/share/vm/classfile/bytecodeAssembler.cpp b/hotspot/src/share/vm/classfile/bytecodeAssembler.cpp new file mode 100644 index 00000000000..c7e08d94c47 --- /dev/null +++ b/hotspot/src/share/vm/classfile/bytecodeAssembler.cpp @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" + +#include "classfile/bytecodeAssembler.hpp" +#include "interpreter/bytecodes.hpp" +#include "memory/oopFactory.hpp" +#include "oops/constantPool.hpp" + +#ifdef TARGET_ARCH_x86 +# include "bytes_x86.hpp" +#endif +#ifdef TARGET_ARCH_sparc +# include "bytes_sparc.hpp" +#endif +#ifdef TARGET_ARCH_zero +# include "bytes_zero.hpp" +#endif +#ifdef TARGET_ARCH_arm +# include "bytes_arm.hpp" +#endif +#ifdef TARGET_ARCH_ppc +# include "bytes_ppc.hpp" +#endif + +u2 BytecodeConstantPool::find_or_add(BytecodeCPEntry const& bcpe) { + u2 index; + u2* probe = _indices.get(bcpe); + if (probe == NULL) { + index = _entries.length(); + _entries.append(bcpe); + _indices.put(bcpe, index); + } else { + index = *probe; + } + return index + _orig->length(); +} + +ConstantPool* BytecodeConstantPool::create_constant_pool(TRAPS) const { + if (_entries.length() == 0) { + return _orig; + } + + ConstantPool* cp = ConstantPool::allocate( + _orig->pool_holder()->class_loader_data(), + _orig->length() + _entries.length(), CHECK_NULL); + + cp->set_pool_holder(_orig->pool_holder()); + _orig->copy_cp_to(1, _orig->length() - 1, cp, 1, CHECK_NULL); + + for (int i = 0; i < _entries.length(); ++i) { + BytecodeCPEntry entry = _entries.at(i); + int idx = i + _orig->length(); + switch (entry._tag) { + case BytecodeCPEntry::UTF8: + cp->symbol_at_put(idx, entry._u.utf8); + entry._u.utf8->increment_refcount(); + break; + case BytecodeCPEntry::KLASS: + cp->unresolved_klass_at_put( + idx, cp->symbol_at(entry._u.klass)); + break; + case BytecodeCPEntry::STRING: + cp->unresolved_string_at_put( + idx, cp->symbol_at(entry._u.string)); + break; + case BytecodeCPEntry::NAME_AND_TYPE: + cp->name_and_type_at_put(idx, + entry._u.name_and_type.name_index, + entry._u.name_and_type.type_index); + break; + case BytecodeCPEntry::METHODREF: + cp->method_at_put(idx, + entry._u.methodref.class_index, + entry._u.methodref.name_and_type_index); + break; + default: + ShouldNotReachHere(); + } + } + return cp; +} + +void BytecodeAssembler::append(u1 imm_u1) { + _code->append(imm_u1); +} + +void BytecodeAssembler::append(u2 imm_u2) { + _code->append(0); + _code->append(0); + Bytes::put_Java_u2(_code->adr_at(_code->length() - 2), imm_u2); +} + +void BytecodeAssembler::append(u4 imm_u4) { + _code->append(0); + _code->append(0); + _code->append(0); + _code->append(0); + Bytes::put_Java_u4(_code->adr_at(_code->length() - 4), imm_u4); +} + +void BytecodeAssembler::xload(u4 index, u1 onebyteop, u1 twobyteop) { + if (index < 4) { + _code->append(onebyteop + index); + } else { + _code->append(twobyteop); + _code->append((u2)index); + } +} + +void BytecodeAssembler::dup() { + _code->append(Bytecodes::_dup); +} + +void BytecodeAssembler::_new(Symbol* sym) { + u2 cpool_index = _cp->klass(sym); + _code->append(Bytecodes::_new); + append(cpool_index); +} + +void BytecodeAssembler::load_string(Symbol* sym) { + u2 cpool_index = _cp->string(sym); + if (cpool_index < 0x100) { + ldc(cpool_index); + } else { + ldc_w(cpool_index); + } +} + +void BytecodeAssembler::ldc(u1 index) { + _code->append(Bytecodes::_ldc); + append(index); +} + +void BytecodeAssembler::ldc_w(u2 index) { + _code->append(Bytecodes::_ldc_w); + append(index); +} + +void BytecodeAssembler::athrow() { + _code->append(Bytecodes::_athrow); +} + +void BytecodeAssembler::iload(u4 index) { + xload(index, Bytecodes::_iload_0, Bytecodes::_iload); +} + +void BytecodeAssembler::lload(u4 index) { + xload(index, Bytecodes::_lload_0, Bytecodes::_lload); +} + +void BytecodeAssembler::fload(u4 index) { + xload(index, Bytecodes::_fload_0, Bytecodes::_fload); +} + +void BytecodeAssembler::dload(u4 index) { + xload(index, Bytecodes::_dload_0, Bytecodes::_dload); +} + +void BytecodeAssembler::aload(u4 index) { + xload(index, Bytecodes::_aload_0, Bytecodes::_aload); +} + +void BytecodeAssembler::load(BasicType bt, u4 index) { + switch (bt) { + case T_BOOLEAN: + case T_CHAR: + case T_BYTE: + case T_SHORT: + case T_INT: iload(index); break; + case T_FLOAT: fload(index); break; + case T_DOUBLE: dload(index); break; + case T_LONG: lload(index); break; + case T_OBJECT: + case T_ARRAY: aload(index); break; + default: + ShouldNotReachHere(); + } +} + +void BytecodeAssembler::checkcast(Symbol* sym) { + u2 cpool_index = _cp->klass(sym); + _code->append(Bytecodes::_checkcast); + append(cpool_index); +} + +void BytecodeAssembler::invokespecial(Method* method) { + invokespecial(method->klass_name(), method->name(), method->signature()); +} + +void BytecodeAssembler::invokespecial(Symbol* klss, Symbol* name, Symbol* sig) { + u2 methodref_index = _cp->methodref(klss, name, sig); + _code->append(Bytecodes::_invokespecial); + append(methodref_index); +} + +void BytecodeAssembler::invokevirtual(Method* method) { + invokevirtual(method->klass_name(), method->name(), method->signature()); +} + +void BytecodeAssembler::invokevirtual(Symbol* klss, Symbol* name, Symbol* sig) { + u2 methodref_index = _cp->methodref(klss, name, sig); + _code->append(Bytecodes::_invokevirtual); + append(methodref_index); +} + +void BytecodeAssembler::ireturn() { + _code->append(Bytecodes::_ireturn); +} + +void BytecodeAssembler::lreturn() { + _code->append(Bytecodes::_lreturn); +} + +void BytecodeAssembler::freturn() { + _code->append(Bytecodes::_freturn); +} + +void BytecodeAssembler::dreturn() { + _code->append(Bytecodes::_dreturn); +} + +void BytecodeAssembler::areturn() { + _code->append(Bytecodes::_areturn); +} + +void BytecodeAssembler::_return() { + _code->append(Bytecodes::_return); +} + +void BytecodeAssembler::_return(BasicType bt) { + switch (bt) { + case T_BOOLEAN: + case T_CHAR: + case T_BYTE: + case T_SHORT: + case T_INT: ireturn(); break; + case T_FLOAT: freturn(); break; + case T_DOUBLE: dreturn(); break; + case T_LONG: lreturn(); break; + case T_OBJECT: + case T_ARRAY: areturn(); break; + case T_VOID: _return(); break; + default: + ShouldNotReachHere(); + } +} diff --git a/hotspot/src/share/vm/classfile/bytecodeAssembler.hpp b/hotspot/src/share/vm/classfile/bytecodeAssembler.hpp new file mode 100644 index 00000000000..74301472a63 --- /dev/null +++ b/hotspot/src/share/vm/classfile/bytecodeAssembler.hpp @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_CLASSFILE_BYTECODEASSEMBLER_HPP +#define SHARE_VM_CLASSFILE_BYTECODEASSEMBLER_HPP + +#include "memory/allocation.hpp" +#include "oops/method.hpp" +#include "oops/symbol.hpp" +#include "utilities/globalDefinitions.hpp" +#include "utilities/growableArray.hpp" +#include "utilities/resourceHash.hpp" + + +/** + * Bytecode Assembler + * + * These classes are used to synthesize code for creating new methods from + * within the VM. This is only a partial implementation of an assembler; + * only the bytecodes that are needed by clients are implemented at this time. + * This is used during default method analysis to create overpass methods + * and add them to a call during parsing. Other uses (such as creating + * bridges) may come later. Any missing bytecodes can be implemented on an + * as-need basis. + */ + +class BytecodeBuffer : public GrowableArray { + public: + BytecodeBuffer() : GrowableArray(20) {} +}; + +// Entries in a yet-to-be-created constant pool. Limited types for now. +class BytecodeCPEntry VALUE_OBJ_CLASS_SPEC { + public: + enum tag { + ERROR_TAG, + UTF8, + KLASS, + STRING, + NAME_AND_TYPE, + METHODREF + }; + + u1 _tag; + union { + Symbol* utf8; + u2 klass; + u2 string; + struct { + u2 name_index; + u2 type_index; + } name_and_type; + struct { + u2 class_index; + u2 name_and_type_index; + } methodref; + uintptr_t hash; + } _u; + + BytecodeCPEntry() : _tag(ERROR_TAG) { _u.hash = 0; } + BytecodeCPEntry(u1 tag) : _tag(tag) { _u.hash = 0; } + + static BytecodeCPEntry utf8(Symbol* symbol) { + BytecodeCPEntry bcpe(UTF8); + bcpe._u.utf8 = symbol; + return bcpe; + } + + static BytecodeCPEntry klass(u2 index) { + BytecodeCPEntry bcpe(KLASS); + bcpe._u.klass = index; + return bcpe; + } + + static BytecodeCPEntry string(u2 index) { + BytecodeCPEntry bcpe(STRING); + bcpe._u.string = index; + return bcpe; + } + + static BytecodeCPEntry name_and_type(u2 name, u2 type) { + BytecodeCPEntry bcpe(NAME_AND_TYPE); + bcpe._u.name_and_type.name_index = name; + bcpe._u.name_and_type.type_index = type; + return bcpe; + } + + static BytecodeCPEntry methodref(u2 class_index, u2 nat) { + BytecodeCPEntry bcpe(METHODREF); + bcpe._u.methodref.class_index = class_index; + bcpe._u.methodref.name_and_type_index = nat; + return bcpe; + } + + static bool equals(BytecodeCPEntry const& e0, BytecodeCPEntry const& e1) { + return e0._tag == e1._tag && e0._u.hash == e1._u.hash; + } + + static unsigned hash(BytecodeCPEntry const& e0) { + return (unsigned)(e0._tag ^ e0._u.hash); + } +}; + +class BytecodeConstantPool : ResourceObj { + private: + typedef ResourceHashtable IndexHash; + + ConstantPool* _orig; + GrowableArray _entries; + IndexHash _indices; + + u2 find_or_add(BytecodeCPEntry const& bcpe); + + public: + + BytecodeConstantPool(ConstantPool* orig) : _orig(orig) {} + + BytecodeCPEntry const& at(u2 index) const { return _entries.at(index); } + + InstanceKlass* pool_holder() const { + return InstanceKlass::cast(_orig->pool_holder()); + } + + u2 utf8(Symbol* sym) { + return find_or_add(BytecodeCPEntry::utf8(sym)); + } + + u2 klass(Symbol* class_name) { + return find_or_add(BytecodeCPEntry::klass(utf8(class_name))); + } + + u2 string(Symbol* str) { + return find_or_add(BytecodeCPEntry::string(utf8(str))); + } + + u2 name_and_type(Symbol* name, Symbol* sig) { + return find_or_add(BytecodeCPEntry::name_and_type(utf8(name), utf8(sig))); + } + + u2 methodref(Symbol* class_name, Symbol* name, Symbol* sig) { + return find_or_add(BytecodeCPEntry::methodref( + klass(class_name), name_and_type(name, sig))); + } + + ConstantPool* create_constant_pool(TRAPS) const; +}; + +// Partial bytecode assembler - only what we need for creating +// overpass methods for default methods is implemented +class BytecodeAssembler : StackObj { + private: + BytecodeBuffer* _code; + BytecodeConstantPool* _cp; + + void append(u1 imm_u1); + void append(u2 imm_u2); + void append(u4 imm_u4); + + void xload(u4 index, u1 quick, u1 twobyte); + + public: + BytecodeAssembler(BytecodeBuffer* buffer, BytecodeConstantPool* cp) + : _code(buffer), _cp(cp) {} + + void aload(u4 index); + void areturn(); + void athrow(); + void checkcast(Symbol* sym); + void dload(u4 index); + void dreturn(); + void dup(); + void fload(u4 index); + void freturn(); + void iload(u4 index); + void invokespecial(Method* method); + void invokespecial(Symbol* cls, Symbol* name, Symbol* sig); + void invokevirtual(Method* method); + void invokevirtual(Symbol* cls, Symbol* name, Symbol* sig); + void ireturn(); + void ldc(u1 index); + void ldc_w(u2 index); + void lload(u4 index); + void lreturn(); + void _new(Symbol* sym); + void _return(); + + void load_string(Symbol* sym); + void load(BasicType bt, u4 index); + void _return(BasicType bt); +}; + +#endif // SHARE_VM_CLASSFILE_BYTECODEASSEMBLER_HPP diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index ae394e36e75..78ead36a002 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -27,6 +27,8 @@ #include "classfile/classLoader.hpp" #include "classfile/classLoaderData.hpp" #include "classfile/classLoaderData.inline.hpp" +#include "classfile/defaultMethods.hpp" +#include "classfile/genericSignatures.hpp" #include "classfile/javaClasses.hpp" #include "classfile/symbolTable.hpp" #include "classfile/systemDictionary.hpp" @@ -84,6 +86,9 @@ // - to check NameAndType_info signatures more aggressively #define JAVA_7_VERSION 51 +// Extension method support. +#define JAVA_8_VERSION 52 + void ClassFileParser::parse_constant_pool_entries(ClassLoaderData* loader_data, constantPoolHandle cp, int length, TRAPS) { // Use a local copy of ClassFileStream. It helps the C++ compiler to optimize @@ -785,6 +790,7 @@ Array* ClassFileParser::parse_interfaces(constantPoolHandle cp, ClassLoaderData* loader_data, Handle protection_domain, Symbol* class_name, + bool* has_default_methods, TRAPS) { ClassFileStream* cfs = stream(); assert(length > 0, "only called for length>0"); @@ -821,6 +827,9 @@ Array* ClassFileParser::parse_interfaces(constantPoolHandle cp, if (!Klass::cast(interf())->is_interface()) { THROW_MSG_(vmSymbols::java_lang_IncompatibleClassChangeError(), "Implementing class", NULL); } + if (InstanceKlass::cast(interf())->has_default_methods()) { + *has_default_methods = true; + } interfaces->at_put(index, interf()); } @@ -1928,7 +1937,8 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, if (method_attribute_name == vmSymbols::tag_code()) { // Parse Code attribute if (_need_verify) { - guarantee_property(!access_flags.is_native() && !access_flags.is_abstract(), + guarantee_property( + !access_flags.is_native() && !access_flags.is_abstract(), "Code attribute in native or abstract methods in class file %s", CHECK_(nullHandle)); } @@ -2125,7 +2135,9 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, runtime_visible_annotations_length = method_attribute_length; runtime_visible_annotations = cfs->get_u1_buffer(); assert(runtime_visible_annotations != NULL, "null visible annotations"); - parse_annotations(runtime_visible_annotations, runtime_visible_annotations_length, cp, &parsed_annotations, CHECK_(nullHandle)); + parse_annotations(runtime_visible_annotations, + runtime_visible_annotations_length, cp, &parsed_annotations, + CHECK_(nullHandle)); cfs->skip_u1(runtime_visible_annotations_length, CHECK_(nullHandle)); } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) { runtime_invisible_annotations_length = method_attribute_length; @@ -2169,12 +2181,10 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, } // All sizing information for a Method* is finally available, now create it - Method* m = Method::allocate(loader_data, code_length, access_flags, - linenumber_table_length, - total_lvt_length, - exception_table_length, - checked_exceptions_length, - CHECK_(nullHandle)); + Method* m = Method::allocate( + loader_data, code_length, access_flags, linenumber_table_length, + total_lvt_length, exception_table_length, checked_exceptions_length, + ConstMethod::NORMAL, CHECK_(nullHandle)); ClassLoadingService::add_class_method_size(m->size()*HeapWordSize); @@ -2204,7 +2214,6 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, // Fill in code attribute information m->set_max_stack(max_stack); m->set_max_locals(max_locals); - m->constMethod()->set_stackmap_data(stackmap_data); // Copy byte codes @@ -2356,6 +2365,7 @@ Array* ClassFileParser::parse_methods(ClassLoaderData* loader_data, Array** methods_annotations, Array** methods_parameter_annotations, Array** methods_default_annotations, + bool* has_default_methods, TRAPS) { ClassFileStream* cfs = stream(); AnnotationArray* method_annotations = NULL; @@ -2382,6 +2392,10 @@ Array* ClassFileParser::parse_methods(ClassLoaderData* loader_data, if (method->is_final()) { *has_final_method = true; } + if (is_interface && !method->is_abstract() && !method->is_static()) { + // default method + *has_default_methods = true; + } methods->at_put(index, method()); if (*methods_annotations == NULL) { *methods_annotations = @@ -2907,6 +2921,34 @@ AnnotationArray* ClassFileParser::assemble_annotations(ClassLoaderData* loader_d } +#ifndef PRODUCT +static void parseAndPrintGenericSignatures( + instanceKlassHandle this_klass, TRAPS) { + assert(ParseAllGenericSignatures == true, "Shouldn't call otherwise"); + ResourceMark rm; + + if (this_klass->generic_signature() != NULL) { + using namespace generic; + ClassDescriptor* spec = ClassDescriptor::parse_generic_signature(this_klass(), CHECK); + + tty->print_cr("Parsing %s", this_klass->generic_signature()->as_C_string()); + spec->print_on(tty); + + for (int i = 0; i < this_klass->methods()->length(); ++i) { + Method* m = this_klass->methods()->at(i); + MethodDescriptor* method_spec = MethodDescriptor::parse_generic_signature(m, spec); + Symbol* sig = m->generic_signature(); + if (sig == NULL) { + sig = m->signature(); + } + tty->print_cr("Parsing %s", sig->as_C_string()); + method_spec->print_on(tty); + } + } +} +#endif // ndef PRODUCT + + instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, Handle class_loader, Handle protection_domain, @@ -2923,6 +2965,8 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, unsigned char *cached_class_file_bytes = NULL; jint cached_class_file_length; ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); + bool has_default_methods = false; + ResourceMark rm(THREAD); ClassFileStream* cfs = stream(); // Timing @@ -3138,7 +3182,9 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, if (itfs_len == 0) { local_interfaces = Universe::the_empty_klass_array(); } else { - local_interfaces = parse_interfaces(cp, itfs_len, loader_data, protection_domain, _class_name, CHECK_(nullHandle)); + local_interfaces = parse_interfaces( + cp, itfs_len, loader_data, protection_domain, _class_name, + &has_default_methods, CHECK_(nullHandle)); } u2 java_fields_count = 0; @@ -3164,6 +3210,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, &methods_annotations, &methods_parameter_annotations, &methods_default_annotations, + &has_default_methods, CHECK_(nullHandle)); // Additional attributes @@ -3193,6 +3240,11 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, super_klass = instanceKlassHandle(THREAD, kh()); } if (super_klass.not_null()) { + + if (super_klass->has_default_methods()) { + has_default_methods = true; + } + if (super_klass->is_interface()) { ResourceMark rm(THREAD); Exceptions::fthrow( @@ -3229,14 +3281,11 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, int itable_size = 0; int num_miranda_methods = 0; - klassVtable::compute_vtable_size_and_num_mirandas(vtable_size, - num_miranda_methods, - super_klass(), - methods, - access_flags, - class_loader, - class_name, - local_interfaces, + GrowableArray all_mirandas(20); + + klassVtable::compute_vtable_size_and_num_mirandas( + &vtable_size, &num_miranda_methods, &all_mirandas, super_klass(), methods, + access_flags, class_loader, class_name, local_interfaces, CHECK_(nullHandle)); // Size of Java itable (in words) @@ -3656,6 +3705,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, this_klass->set_minor_version(minor_version); this_klass->set_major_version(major_version); + this_klass->set_has_default_methods(has_default_methods); // Set up Method*::intrinsic_id as soon as we know the names of methods. // (We used to do this lazily, but now we query it in Rewriter, @@ -3673,6 +3723,16 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, cached_class_file_length); } + // Fill in field values obtained by parse_classfile_attributes + if (parsed_annotations.has_any_annotations()) + parsed_annotations.apply_to(this_klass); + // Create annotations + if (_annotations != NULL && this_klass->annotations() == NULL) { + Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL); + this_klass->set_annotations(anno); + } + apply_parsed_class_attributes(this_klass); + // Miranda methods if ((num_miranda_methods > 0) || // if this class introduced new miranda methods or @@ -3682,18 +3742,6 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, this_klass->set_has_miranda_methods(); // then set a flag } - // Fill in field values obtained by parse_classfile_attributes - if (parsed_annotations.has_any_annotations()) { - parsed_annotations.apply_to(this_klass); - } - // Create annotations - if (_annotations != NULL && this_klass->annotations() == NULL) { - Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL); - this_klass->set_annotations(anno); - } - apply_parsed_class_attributes(this_klass); - - // Compute transitive closure of interfaces this class implements this_klass->set_transitive_interfaces(transitive_interfaces); // Fill in information needed to compute superclasses. @@ -3702,6 +3750,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, // Initialize itable offset tables klassItable::setup_itable_offset_table(this_klass); + // Compute transitive closure of interfaces this class implements // Do final class setup fill_oop_maps(this_klass, nonstatic_oop_map_count, nonstatic_oop_offsets, nonstatic_oop_counts); @@ -3726,6 +3775,21 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, check_illegal_static_method(this_klass, CHECK_(nullHandle)); } + +#ifdef ASSERT + if (ParseAllGenericSignatures) { + parseAndPrintGenericSignatures(this_klass, CHECK_(nullHandle)); + } +#endif + + // Generate any default methods - default methods are interface methods + // that have a default implementation. This is new with Lambda project. + if (has_default_methods && !access_flags.is_interface() && + local_interfaces->length() > 0) { + DefaultMethods::generate_default_methods( + this_klass(), &all_mirandas, CHECK_(nullHandle)); + } + // Allocate mirror and initialize static fields java_lang_Class::create_mirror(this_klass, CHECK_(nullHandle)); @@ -3744,6 +3808,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, false /* not shared class */); if (TraceClassLoading) { + ResourceMark rm; // print in a single call to reduce interleaving of output if (cfs->source() != NULL) { tty->print("[Loaded %s from %s]\n", this_klass->external_name(), @@ -3758,13 +3823,13 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, tty->print("[Loaded %s]\n", this_klass->external_name()); } } else { - ResourceMark rm; tty->print("[Loaded %s from %s]\n", this_klass->external_name(), InstanceKlass::cast(class_loader->klass())->external_name()); } } if (TraceClassResolution) { + ResourceMark rm; // print out the superclass. const char * from = Klass::cast(this_klass())->external_name(); if (this_klass->java_super() != NULL) { @@ -3785,6 +3850,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, #ifndef PRODUCT if( PrintCompactFieldsSavings ) { + ResourceMark rm; if( nonstatic_field_size < orig_nonstatic_field_size ) { tty->print("[Saved %d of %d bytes in %s]\n", (orig_nonstatic_field_size - nonstatic_field_size)*heapOopSize, @@ -3811,7 +3877,6 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, return this_klass; } - unsigned int ClassFileParser::compute_oop_map_count(instanceKlassHandle super, unsigned int nonstatic_oop_map_count, @@ -4263,13 +4328,16 @@ void ClassFileParser::verify_legal_method_modifiers( const bool is_strict = (flags & JVM_ACC_STRICT) != 0; const bool is_synchronized = (flags & JVM_ACC_SYNCHRONIZED) != 0; const bool major_gte_15 = _major_version >= JAVA_1_5_VERSION; + const bool major_gte_8 = _major_version >= JAVA_8_VERSION; const bool is_initializer = (name == vmSymbols::object_initializer_name()); bool is_illegal = false; if (is_interface) { - if (!is_abstract || !is_public || is_static || is_final || - is_native || (major_gte_15 && (is_synchronized || is_strict))) { + if (!is_public || is_static || is_final || is_native || + ((is_synchronized || is_strict) && major_gte_15 && + (!major_gte_8 || is_abstract)) || + (!major_gte_8 && !is_abstract)) { is_illegal = true; } } else { // not interface diff --git a/hotspot/src/share/vm/classfile/classFileParser.hpp b/hotspot/src/share/vm/classfile/classFileParser.hpp index c6c4a089c1b..8fa1404cf48 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.hpp +++ b/hotspot/src/share/vm/classfile/classFileParser.hpp @@ -151,6 +151,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { ClassLoaderData* loader_data, Handle protection_domain, Symbol* class_name, + bool* has_default_methods, TRAPS); void record_defined_class_dependencies(instanceKlassHandle defined_klass, TRAPS); @@ -188,6 +189,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { Array** methods_annotations, Array** methods_parameter_annotations, Array** methods_default_annotations, + bool* has_default_method, TRAPS); Array* sort_methods(ClassLoaderData* loader_data, Array* methods, diff --git a/hotspot/src/share/vm/classfile/defaultMethods.cpp b/hotspot/src/share/vm/classfile/defaultMethods.cpp new file mode 100644 index 00000000000..9ac1bef7a31 --- /dev/null +++ b/hotspot/src/share/vm/classfile/defaultMethods.cpp @@ -0,0 +1,1387 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "classfile/bytecodeAssembler.hpp" +#include "classfile/defaultMethods.hpp" +#include "classfile/genericSignatures.hpp" +#include "classfile/symbolTable.hpp" +#include "memory/allocation.hpp" +#include "memory/metadataFactory.hpp" +#include "memory/resourceArea.hpp" +#include "runtime/signature.hpp" +#include "runtime/thread.hpp" +#include "oops/instanceKlass.hpp" +#include "oops/klass.hpp" +#include "oops/method.hpp" +#include "utilities/accessFlags.hpp" +#include "utilities/exceptions.hpp" +#include "utilities/ostream.hpp" +#include "utilities/pair.hpp" +#include "utilities/resourceHash.hpp" + +typedef enum { QUALIFIED, DISQUALIFIED } QualifiedState; + +// Because we use an iterative algorithm when iterating over the type +// hierarchy, we can't use traditional scoped objects which automatically do +// cleanup in the destructor when the scope is exited. PseudoScope (and +// PseudoScopeMark) provides a similar functionality, but for when you want a +// scoped object in non-stack memory (such as in resource memory, as we do +// here). You've just got to remember to call 'destroy()' on the scope when +// leaving it (and marks have to be explicitly added). +class PseudoScopeMark : public ResourceObj { + public: + virtual void destroy() = 0; +}; + +class PseudoScope : public ResourceObj { + private: + GrowableArray _marks; + public: + + static PseudoScope* cast(void* data) { + return static_cast(data); + } + + void add_mark(PseudoScopeMark* psm) { + _marks.append(psm); + } + + void destroy() { + for (int i = 0; i < _marks.length(); ++i) { + _marks.at(i)->destroy(); + } + } +}; + +class ContextMark : public PseudoScopeMark { + private: + generic::Context::Mark _mark; + public: + ContextMark(const generic::Context::Mark& cm) : _mark(cm) {} + virtual void destroy() { _mark.destroy(); } +}; + +#ifndef PRODUCT +static void print_slot(outputStream* str, Symbol* name, Symbol* signature) { + ResourceMark rm; + str->print("%s%s", name->as_C_string(), signature->as_C_string()); +} + +static void print_method(outputStream* str, Method* mo, bool with_class=true) { + ResourceMark rm; + if (with_class) { + str->print("%s.", mo->klass_name()->as_C_string()); + } + print_slot(str, mo->name(), mo->signature()); +} +#endif // ndef PRODUCT + +/** + * Perform a depth-first iteration over the class hierarchy, applying + * algorithmic logic as it goes. + * + * This class is one half of the inheritance hierarchy analysis mechanism. + * It is meant to be used in conjunction with another class, the algorithm, + * which is indicated by the ALGO template parameter. This class can be + * paired with any algorithm class that provides the required methods. + * + * This class contains all the mechanics for iterating over the class hierarchy + * starting at a particular root, without recursing (thus limiting stack growth + * from this point). It visits each superclass (if present) and superinterface + * in a depth-first manner, with callbacks to the ALGO class as each class is + * encountered (visit()), The algorithm can cut-off further exploration of a + * particular branch by returning 'false' from a visit() call. + * + * The ALGO class, must provide a visit() method, which each of which will be + * called once for each node in the inheritance tree during the iteration. In + * addition, it can provide a memory block via new_node_data(InstanceKlass*), + * which it can use for node-specific storage (and access via the + * current_data() and data_at_depth(int) methods). + * + * Bare minimum needed to be an ALGO class: + * class Algo : public HierarchyVisitor { + * void* new_node_data(InstanceKlass* cls) { return NULL; } + * void free_node_data(void* data) { return; } + * bool visit() { return true; } + * }; + */ +template +class HierarchyVisitor : StackObj { + private: + + class Node : public ResourceObj { + public: + InstanceKlass* _class; + bool _super_was_visited; + int _interface_index; + void* _algorithm_data; + + Node(InstanceKlass* cls, void* data, bool visit_super) + : _class(cls), _super_was_visited(!visit_super), + _interface_index(0), _algorithm_data(data) {} + + int number_of_interfaces() { return _class->local_interfaces()->length(); } + int interface_index() { return _interface_index; } + void set_super_visited() { _super_was_visited = true; } + void increment_visited_interface() { ++_interface_index; } + void set_all_interfaces_visited() { + _interface_index = number_of_interfaces(); + } + bool has_visited_super() { return _super_was_visited; } + bool has_visited_all_interfaces() { + return interface_index() >= number_of_interfaces(); + } + InstanceKlass* interface_at(int index) { + return InstanceKlass::cast(_class->local_interfaces()->at(index)); + } + InstanceKlass* next_super() { return _class->java_super(); } + InstanceKlass* next_interface() { + return interface_at(interface_index()); + } + }; + + bool _cancelled; + GrowableArray _path; + + Node* current_top() const { return _path.top(); } + bool has_more_nodes() const { return !_path.is_empty(); } + void push(InstanceKlass* cls, void* data) { + assert(cls != NULL, "Requires a valid instance class"); + Node* node = new Node(cls, data, has_super(cls)); + _path.push(node); + } + void pop() { _path.pop(); } + + void reset_iteration() { + _cancelled = false; + _path.clear(); + } + bool is_cancelled() const { return _cancelled; } + + static bool has_super(InstanceKlass* cls) { + return cls->super() != NULL && !cls->is_interface(); + } + + Node* node_at_depth(int i) const { + return (i >= _path.length()) ? NULL : _path.at(_path.length() - i - 1); + } + + protected: + + // Accessors available to the algorithm + int current_depth() const { return _path.length() - 1; } + + InstanceKlass* class_at_depth(int i) { + Node* n = node_at_depth(i); + return n == NULL ? NULL : n->_class; + } + InstanceKlass* current_class() { return class_at_depth(0); } + + void* data_at_depth(int i) { + Node* n = node_at_depth(i); + return n == NULL ? NULL : n->_algorithm_data; + } + void* current_data() { return data_at_depth(0); } + + void cancel_iteration() { _cancelled = true; } + + public: + + void run(InstanceKlass* root) { + ALGO* algo = static_cast(this); + + reset_iteration(); + + void* algo_data = algo->new_node_data(root); + push(root, algo_data); + bool top_needs_visit = true; + + do { + Node* top = current_top(); + if (top_needs_visit) { + if (algo->visit() == false) { + // algorithm does not want to continue along this path. Arrange + // it so that this state is immediately popped off the stack + top->set_super_visited(); + top->set_all_interfaces_visited(); + } + top_needs_visit = false; + } + + if (top->has_visited_super() && top->has_visited_all_interfaces()) { + algo->free_node_data(top->_algorithm_data); + pop(); + } else { + InstanceKlass* next = NULL; + if (top->has_visited_super() == false) { + next = top->next_super(); + top->set_super_visited(); + } else { + next = top->next_interface(); + top->increment_visited_interface(); + } + assert(next != NULL, "Otherwise we shouldn't be here"); + algo_data = algo->new_node_data(next); + push(next, algo_data); + top_needs_visit = true; + } + } while (!is_cancelled() && has_more_nodes()); + } +}; + +#ifndef PRODUCT +class PrintHierarchy : public HierarchyVisitor { + public: + + bool visit() { + InstanceKlass* cls = current_class(); + streamIndentor si(tty, current_depth() * 2); + tty->indent().print_cr("%s", cls->name()->as_C_string()); + return true; + } + + void* new_node_data(InstanceKlass* cls) { return NULL; } + void free_node_data(void* data) { return; } +}; +#endif // ndef PRODUCT + +// Used to register InstanceKlass objects and all related metadata structures +// (Methods, ConstantPools) as "in-use" by the current thread so that they can't +// be deallocated by class redefinition while we're using them. The classes are +// de-registered when this goes out of scope. +// +// Once a class is registered, we need not bother with methodHandles or +// constantPoolHandles for it's associated metadata. +class KeepAliveRegistrar : public StackObj { + private: + Thread* _thread; + GrowableArray _keep_alive; + + public: + KeepAliveRegistrar(Thread* thread) : _thread(thread), _keep_alive(20) { + assert(thread == Thread::current(), "Must be current thread"); + } + + ~KeepAliveRegistrar() { + for (int i = _keep_alive.length() - 1; i >= 0; --i) { + ConstantPool* cp = _keep_alive.at(i); + int idx = _thread->metadata_handles()->find_from_end(cp); + assert(idx > 0, "Must be in the list"); + _thread->metadata_handles()->remove_at(idx); + } + } + + // Register a class as 'in-use' by the thread. It's fine to register a class + // multiple times (though perhaps inefficient) + void register_class(InstanceKlass* ik) { + ConstantPool* cp = ik->constants(); + _keep_alive.push(cp); + _thread->metadata_handles()->push(cp); + } +}; + +class KeepAliveVisitor : public HierarchyVisitor { + private: + KeepAliveRegistrar* _registrar; + + public: + KeepAliveVisitor(KeepAliveRegistrar* registrar) : _registrar(registrar) {} + + void* new_node_data(InstanceKlass* cls) { return NULL; } + void free_node_data(void* data) { return; } + + bool visit() { + _registrar->register_class(current_class()); + return true; + } +}; + +// A method family contains a set of all methods that implement a single +// language-level method. Because of erasure, these methods may have different +// signatures. As members of the set are collected while walking over the +// hierarchy, they are tagged with a qualification state. The qualification +// state for an erased method is set to disqualified if there exists a path +// from the root of hierarchy to the method that contains an interleaving +// language-equivalent method defined in an interface. +class MethodFamily : public ResourceObj { + private: + + generic::MethodDescriptor* _descriptor; // language-level description + GrowableArray > _members; + ResourceHashtable _member_index; + + Method* _selected_target; // Filled in later, if a unique target exists + Symbol* _exception_message; // If no unique target is found + + bool contains_method(Method* method) { + int* lookup = _member_index.get(method); + return lookup != NULL; + } + + void add_method(Method* method, QualifiedState state) { + Pair entry(method, state); + _member_index.put(method, _members.length()); + _members.append(entry); + } + + void disqualify_method(Method* method) { + int* index = _member_index.get(method); + assert(index != NULL && *index >= 0 && *index < _members.length(), "bad index"); + _members.at(*index).second = DISQUALIFIED; + } + + Symbol* generate_no_defaults_message(TRAPS) const; + Symbol* generate_abstract_method_message(Method* method, TRAPS) const; + Symbol* generate_conflicts_message(GrowableArray* methods, TRAPS) const; + + public: + + MethodFamily(generic::MethodDescriptor* canonical_desc) + : _descriptor(canonical_desc), _selected_target(NULL), + _exception_message(NULL) {} + + generic::MethodDescriptor* descriptor() const { return _descriptor; } + + bool descriptor_matches(generic::MethodDescriptor* md, generic::Context* ctx) { + return descriptor()->covariant_match(md, ctx); + } + + void set_target_if_empty(Method* m) { + if (_selected_target == NULL && !m->is_overpass()) { + _selected_target = m; + } + } + + void record_qualified_method(Method* m) { + // If the method already exists in the set as qualified, this operation is + // redundant. If it already exists as disqualified, then we leave it as + // disqualfied. Thus we only add to the set if it's not already in the + // set. + if (!contains_method(m)) { + add_method(m, QUALIFIED); + } + } + + void record_disqualified_method(Method* m) { + // If not in the set, add it as disqualified. If it's already in the set, + // then set the state to disqualified no matter what the previous state was. + if (!contains_method(m)) { + add_method(m, DISQUALIFIED); + } else { + disqualify_method(m); + } + } + + bool has_target() const { return _selected_target != NULL; } + bool throws_exception() { return _exception_message != NULL; } + + Method* get_selected_target() { return _selected_target; } + Symbol* get_exception_message() { return _exception_message; } + + // Either sets the target or the exception error message + void determine_target(InstanceKlass* root, TRAPS) { + if (has_target() || throws_exception()) { + return; + } + + GrowableArray qualified_methods; + for (int i = 0; i < _members.length(); ++i) { + Pair entry = _members.at(i); + if (entry.second == QUALIFIED) { + qualified_methods.append(entry.first); + } + } + + if (qualified_methods.length() == 0) { + _exception_message = generate_no_defaults_message(CHECK); + } else if (qualified_methods.length() == 1) { + Method* method = qualified_methods.at(0); + if (method->is_abstract()) { + _exception_message = generate_abstract_method_message(method, CHECK); + } else { + _selected_target = qualified_methods.at(0); + } + } else { + _exception_message = generate_conflicts_message(&qualified_methods,CHECK); + } + + assert((has_target() ^ throws_exception()) == 1, + "One and only one must be true"); + } + + bool contains_signature(Symbol* query) { + for (int i = 0; i < _members.length(); ++i) { + if (query == _members.at(i).first->signature()) { + return true; + } + } + return false; + } + +#ifndef PRODUCT + void print_on(outputStream* str) const { + print_on(str, 0); + } + + void print_on(outputStream* str, int indent) const { + streamIndentor si(str, indent * 2); + + generic::Context ctx(NULL); // empty, as _descriptor already canonicalized + TempNewSymbol family = descriptor()->reify_signature(&ctx, Thread::current()); + str->indent().print_cr("Logical Method %s:", family->as_C_string()); + + streamIndentor si2(str); + for (int i = 0; i < _members.length(); ++i) { + str->indent(); + print_method(str, _members.at(i).first); + if (_members.at(i).second == DISQUALIFIED) { + str->print(" (disqualified)"); + } + str->print_cr(""); + } + + if (_selected_target != NULL) { + print_selected(str, 1); + } + } + + void print_selected(outputStream* str, int indent) const { + assert(has_target(), "Should be called otherwise"); + streamIndentor si(str, indent * 2); + str->indent().print("Selected method: "); + print_method(str, _selected_target); + str->print_cr(""); + } + + void print_exception(outputStream* str, int indent) { + assert(throws_exception(), "Should be called otherwise"); + streamIndentor si(str, indent * 2); + str->indent().print_cr("%s", _exception_message->as_C_string()); + } +#endif // ndef PRODUCT +}; + +Symbol* MethodFamily::generate_no_defaults_message(TRAPS) const { + return SymbolTable::new_symbol("No qualifying defaults found", CHECK_NULL); +} + +Symbol* MethodFamily::generate_abstract_method_message(Method* method, TRAPS) const { + Symbol* klass = method->klass_name(); + Symbol* name = method->name(); + Symbol* sig = method->signature(); + stringStream ss; + ss.print("Method "); + ss.write((const char*)klass->bytes(), klass->utf8_length()); + ss.print("."); + ss.write((const char*)name->bytes(), name->utf8_length()); + ss.write((const char*)sig->bytes(), sig->utf8_length()); + ss.print(" is abstract"); + return SymbolTable::new_symbol(ss.base(), (int)ss.size(), CHECK_NULL); +} + +Symbol* MethodFamily::generate_conflicts_message(GrowableArray* methods, TRAPS) const { + stringStream ss; + ss.print("Conflicting default methods:"); + for (int i = 0; i < methods->length(); ++i) { + Method* method = methods->at(i); + Symbol* klass = method->klass_name(); + Symbol* name = method->name(); + ss.print(" "); + ss.write((const char*)klass->bytes(), klass->utf8_length()); + ss.print("."); + ss.write((const char*)name->bytes(), name->utf8_length()); + } + return SymbolTable::new_symbol(ss.base(), (int)ss.size(), CHECK_NULL); +} + +class StateRestorer; + +// StatefulMethodFamily is a wrapper around MethodFamily that maintains the +// qualification state during hierarchy visitation, and applies that state +// when adding members to the MethodFamily. +class StatefulMethodFamily : public ResourceObj { + friend class StateRestorer; + private: + MethodFamily* _method; + QualifiedState _qualification_state; + + void set_qualification_state(QualifiedState state) { + _qualification_state = state; + } + + public: + StatefulMethodFamily(generic::MethodDescriptor* md, generic::Context* ctx) { + _method = new MethodFamily(md->canonicalize(ctx)); + _qualification_state = QUALIFIED; + } + + void set_target_if_empty(Method* m) { _method->set_target_if_empty(m); } + + MethodFamily* get_method_family() { return _method; } + + bool descriptor_matches(generic::MethodDescriptor* md, generic::Context* ctx) { + return _method->descriptor_matches(md, ctx); + } + + StateRestorer* record_method_and_dq_further(Method* mo); +}; + +class StateRestorer : public PseudoScopeMark { + private: + StatefulMethodFamily* _method; + QualifiedState _state_to_restore; + public: + StateRestorer(StatefulMethodFamily* dm, QualifiedState state) + : _method(dm), _state_to_restore(state) {} + ~StateRestorer() { destroy(); } + void restore_state() { _method->set_qualification_state(_state_to_restore); } + virtual void destroy() { restore_state(); } +}; + +StateRestorer* StatefulMethodFamily::record_method_and_dq_further(Method* mo) { + StateRestorer* mark = new StateRestorer(this, _qualification_state); + if (_qualification_state == QUALIFIED) { + _method->record_qualified_method(mo); + } else { + _method->record_disqualified_method(mo); + } + // Everything found "above"??? this method in the hierarchy walk is set to + // disqualified + set_qualification_state(DISQUALIFIED); + return mark; +} + +class StatefulMethodFamilies : public ResourceObj { + private: + GrowableArray _methods; + + public: + StatefulMethodFamily* find_matching( + generic::MethodDescriptor* md, generic::Context* ctx) { + for (int i = 0; i < _methods.length(); ++i) { + StatefulMethodFamily* existing = _methods.at(i); + if (existing->descriptor_matches(md, ctx)) { + return existing; + } + } + return NULL; + } + + StatefulMethodFamily* find_matching_or_create( + generic::MethodDescriptor* md, generic::Context* ctx) { + StatefulMethodFamily* method = find_matching(md, ctx); + if (method == NULL) { + method = new StatefulMethodFamily(md, ctx); + _methods.append(method); + } + return method; + } + + void extract_families_into(GrowableArray* array) { + for (int i = 0; i < _methods.length(); ++i) { + array->append(_methods.at(i)->get_method_family()); + } + } +}; + +// Represents a location corresponding to a vtable slot for methods that +// neither the class nor any of it's ancestors provide an implementaion. +// Default methods may be present to fill this slot. +class EmptyVtableSlot : public ResourceObj { + private: + Symbol* _name; + Symbol* _signature; + int _size_of_parameters; + MethodFamily* _binding; + + public: + EmptyVtableSlot(Method* method) + : _name(method->name()), _signature(method->signature()), + _size_of_parameters(method->size_of_parameters()), _binding(NULL) {} + + Symbol* name() const { return _name; } + Symbol* signature() const { return _signature; } + int size_of_parameters() const { return _size_of_parameters; } + + void bind_family(MethodFamily* lm) { _binding = lm; } + bool is_bound() { return _binding != NULL; } + MethodFamily* get_binding() { return _binding; } + +#ifndef PRODUCT + void print_on(outputStream* str) const { + print_slot(str, name(), signature()); + } +#endif // ndef PRODUCT +}; + +static GrowableArray* find_empty_vtable_slots( + InstanceKlass* klass, GrowableArray* mirandas, TRAPS) { + + assert(klass != NULL, "Must be valid class"); + + GrowableArray* slots = new GrowableArray(); + + // All miranda methods are obvious candidates + for (int i = 0; i < mirandas->length(); ++i) { + EmptyVtableSlot* slot = new EmptyVtableSlot(mirandas->at(i)); + slots->append(slot); + } + + // Also any overpasses in our superclasses, that we haven't implemented. + // (can't use the vtable because it is not guaranteed to be initialized yet) + InstanceKlass* super = klass->java_super(); + while (super != NULL) { + for (int i = 0; i < super->methods()->length(); ++i) { + Method* m = super->methods()->at(i); + if (m->is_overpass()) { + // m is a method that would have been a miranda if not for the + // default method processing that occurred on behalf of our superclass, + // so it's a method we want to re-examine in this new context. That is, + // unless we have a real implementation of it in the current class. + Method* impl = klass->lookup_method(m->name(), m->signature()); + if (impl == NULL || impl->is_overpass()) { + slots->append(new EmptyVtableSlot(m)); + } + } + } + super = super->java_super(); + } + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Slots that need filling:"); + streamIndentor si(tty); + for (int i = 0; i < slots->length(); ++i) { + tty->indent(); + slots->at(i)->print_on(tty); + tty->print_cr(""); + } + } +#endif // ndef PRODUCT + return slots; +} + +// Iterates over the type hierarchy looking for all methods with a specific +// method name. The result of this is a set of method families each of +// which is populated with a set of methods that implement the same +// language-level signature. +class FindMethodsByName : public HierarchyVisitor { + private: + // Context data + Thread* THREAD; + generic::DescriptorCache* _cache; + Symbol* _method_name; + generic::Context* _ctx; + StatefulMethodFamilies _families; + + public: + + FindMethodsByName(generic::DescriptorCache* cache, Symbol* name, + generic::Context* ctx, Thread* thread) : + _cache(cache), _method_name(name), _ctx(ctx), THREAD(thread) {} + + void get_discovered_families(GrowableArray* methods) { + _families.extract_families_into(methods); + } + + void* new_node_data(InstanceKlass* cls) { return new PseudoScope(); } + void free_node_data(void* node_data) { + PseudoScope::cast(node_data)->destroy(); + } + + bool visit() { + PseudoScope* scope = PseudoScope::cast(current_data()); + InstanceKlass* klass = current_class(); + InstanceKlass* sub = current_depth() > 0 ? class_at_depth(1) : NULL; + + ContextMark* cm = new ContextMark(_ctx->mark()); + scope->add_mark(cm); // will restore context when scope is freed + + _ctx->apply_type_arguments(sub, klass, THREAD); + + int start, end = 0; + start = klass->find_method_by_name(_method_name, &end); + if (start != -1) { + for (int i = start; i < end; ++i) { + Method* m = klass->methods()->at(i); + // This gets the method's parameter list with its generic type + // parameters resolved + generic::MethodDescriptor* md = _cache->descriptor_for(m, THREAD); + + // Find all methods on this hierarchy that match this method + // (name, signature). This class collects other families of this + // method name. + StatefulMethodFamily* family = + _families.find_matching_or_create(md, _ctx); + + if (klass->is_interface()) { + // ??? + StateRestorer* restorer = family->record_method_and_dq_further(m); + scope->add_mark(restorer); + } else { + // This is the rule that methods in classes "win" (bad word) over + // methods in interfaces. This works because of single inheritance + family->set_target_if_empty(m); + } + } + } + return true; + } +}; + +#ifndef PRODUCT +static void print_families( + GrowableArray* methods, Symbol* match) { + streamIndentor si(tty, 4); + if (methods->length() == 0) { + tty->indent(); + tty->print_cr("No Logical Method found"); + } + for (int i = 0; i < methods->length(); ++i) { + tty->indent(); + MethodFamily* lm = methods->at(i); + if (lm->contains_signature(match)) { + tty->print_cr(""); + } else { + tty->print_cr(""); + } + lm->print_on(tty, 1); + } +} +#endif // ndef PRODUCT + +static void merge_in_new_methods(InstanceKlass* klass, + GrowableArray* new_methods, TRAPS); +static void create_overpasses( + GrowableArray* slots, InstanceKlass* klass, TRAPS); + +// This is the guts of the default methods implementation. This is called just +// after the classfile has been parsed if some ancestor has default methods. +// +// First if finds any name/signature slots that need any implementation (either +// because they are miranda or a superclass's implementation is an overpass +// itself). For each slot, iterate over the hierarchy, using generic signature +// information to partition any methods that match the name into method families +// where each family contains methods whose signatures are equivalent at the +// language level (i.e., their reified parameters match and return values are +// covariant). Check those sets to see if they contain a signature that matches +// the slot we're looking at (if we're lucky, there might be other empty slots +// that we can fill using the same analysis). +// +// For each slot filled, we generate an overpass method that either calls the +// unique default method candidate using invokespecial, or throws an exception +// (in the case of no default method candidates, or more than one valid +// candidate). These methods are then added to the class's method list. If +// the method set we're using contains methods (qualified or not) with a +// different runtime signature than the method we're creating, then we have to +// create bridges with those signatures too. +void DefaultMethods::generate_default_methods( + InstanceKlass* klass, GrowableArray* mirandas, TRAPS) { + + // This resource mark is the bound for all memory allocation that takes + // place during default method processing. After this goes out of scope, + // all (Resource) objects' memory will be reclaimed. Be careful if adding an + // embedded resource mark under here as that memory can't be used outside + // whatever scope it's in. + ResourceMark rm(THREAD); + + generic::DescriptorCache cache; + + // Keep entire hierarchy alive for the duration of the computation + KeepAliveRegistrar keepAlive(THREAD); + KeepAliveVisitor loadKeepAlive(&keepAlive); + loadKeepAlive.run(klass); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + ResourceMark rm; // be careful with these! + tty->print_cr("Class %s requires default method processing", + klass->name()->as_klass_external_name()); + PrintHierarchy printer; + printer.run(klass); + } +#endif // ndef PRODUCT + + GrowableArray* empty_slots = + find_empty_vtable_slots(klass, mirandas, CHECK); + + for (int i = 0; i < empty_slots->length(); ++i) { + EmptyVtableSlot* slot = empty_slots->at(i); +#ifndef PRODUCT + if (TraceDefaultMethods) { + streamIndentor si(tty, 2); + tty->indent().print("Looking for default methods for slot "); + slot->print_on(tty); + tty->print_cr(""); + } +#endif // ndef PRODUCT + if (slot->is_bound()) { +#ifndef PRODUCT + if (TraceDefaultMethods) { + streamIndentor si(tty, 4); + tty->indent().print_cr("Already bound to logical method:"); + slot->get_binding()->print_on(tty, 1); + } +#endif // ndef PRODUCT + continue; // covered by previous processing + } + + generic::Context ctx(&cache); + FindMethodsByName visitor(&cache, slot->name(), &ctx, CHECK); + visitor.run(klass); + + GrowableArray discovered_families; + visitor.get_discovered_families(&discovered_families); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + print_families(&discovered_families, slot->signature()); + } +#endif // ndef PRODUCT + + // Find and populate any other slots that match the discovered families + for (int j = i; j < empty_slots->length(); ++j) { + EmptyVtableSlot* open_slot = empty_slots->at(j); + + if (slot->name() == open_slot->name()) { + for (int k = 0; k < discovered_families.length(); ++k) { + MethodFamily* lm = discovered_families.at(k); + + if (lm->contains_signature(open_slot->signature())) { + lm->determine_target(klass, CHECK); + open_slot->bind_family(lm); + } + } + } + } + } + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Creating overpasses..."); + } +#endif // ndef PRODUCT + + create_overpasses(empty_slots, klass, CHECK); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Default method processing complete"); + } +#endif // ndef PRODUCT +} + + +/** + * Generic analysis was used upon interface '_target' and found a unique + * default method candidate with generic signature '_method_desc'. This + * method is only viable if it would also be in the set of default method + * candidates if we ran a full analysis on the current class. + * + * The only reason that the method would not be in the set of candidates for + * the current class is if that there's another covariantly matching method + * which is "more specific" than the found method -- i.e., one could find a + * path in the interface hierarchy in which the matching method appears + * before we get to '_target'. + * + * In order to determine this, we examine all of the implemented + * interfaces. If we find path that leads to the '_target' interface, then + * we examine that path to see if there are any methods that would shadow + * the selected method along that path. + */ +class ShadowChecker : public HierarchyVisitor { + private: + generic::DescriptorCache* _cache; + Thread* THREAD; + + InstanceKlass* _target; + + Symbol* _method_name; + InstanceKlass* _method_holder; + generic::MethodDescriptor* _method_desc; + bool _found_shadow; + + bool path_has_shadow() { + generic::Context ctx(_cache); + + for (int i = current_depth() - 1; i > 0; --i) { + InstanceKlass* ik = class_at_depth(i); + InstanceKlass* sub = class_at_depth(i + 1); + ctx.apply_type_arguments(sub, ik, THREAD); + + if (ik->is_interface()) { + int end; + int start = ik->find_method_by_name(_method_name, &end); + if (start != -1) { + for (int j = start; j < end; ++j) { + Method* mo = ik->methods()->at(j); + generic::MethodDescriptor* md = _cache->descriptor_for(mo, THREAD); + if (_method_desc->covariant_match(md, &ctx)) { + return true; + } + } + } + } + } + return false; + } + + public: + + ShadowChecker(generic::DescriptorCache* cache, Thread* thread, + Symbol* name, InstanceKlass* holder, generic::MethodDescriptor* desc, + InstanceKlass* target) + : _cache(cache), THREAD(thread), _method_name(name), _method_holder(holder), + _method_desc(desc), _target(target), _found_shadow(false) {} + + void* new_node_data(InstanceKlass* cls) { return NULL; } + void free_node_data(void* data) { return; } + + bool visit() { + InstanceKlass* ik = current_class(); + if (ik == _target && current_depth() == 1) { + return false; // This was the specified super -- no need to search it + } + if (ik == _method_holder || ik == _target) { + // We found a path that should be examined to see if it shadows _method + if (path_has_shadow()) { + _found_shadow = true; + cancel_iteration(); + } + return false; // no need to continue up hierarchy + } + return true; + } + + bool found_shadow() { return _found_shadow; } +}; + +// This is called during linktime when we find an invokespecial call that +// refers to a direct superinterface. It indicates that we should find the +// default method in the hierarchy of that superinterface, and if that method +// would have been a candidate from the point of view of 'this' class, then we +// return that method. +Method* DefaultMethods::find_super_default( + Klass* cls, Klass* super, Symbol* method_name, Symbol* sig, TRAPS) { + + ResourceMark rm(THREAD); + + assert(cls != NULL && super != NULL, "Need real classes"); + + InstanceKlass* current_class = InstanceKlass::cast(cls); + InstanceKlass* direction = InstanceKlass::cast(super); + + // Keep entire hierarchy alive for the duration of the computation + KeepAliveRegistrar keepAlive(THREAD); + KeepAliveVisitor loadKeepAlive(&keepAlive); + loadKeepAlive.run(current_class); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Finding super default method %s.%s%s from %s", + direction->name()->as_C_string(), + method_name->as_C_string(), sig->as_C_string(), + current_class->name()->as_C_string()); + } +#endif // ndef PRODUCT + + if (!direction->is_interface()) { + // We should not be here + return NULL; + } + + generic::DescriptorCache cache; + generic::Context ctx(&cache); + + // Prime the initial generic context for current -> direction + ctx.apply_type_arguments(current_class, direction, CHECK_NULL); + + FindMethodsByName visitor(&cache, method_name, &ctx, CHECK_NULL); + visitor.run(direction); + + GrowableArray families; + visitor.get_discovered_families(&families); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + print_families(&families, sig); + } +#endif // ndef PRODUCT + + MethodFamily* selected_family = NULL; + + for (int i = 0; i < families.length(); ++i) { + MethodFamily* lm = families.at(i); + if (lm->contains_signature(sig)) { + lm->determine_target(current_class, CHECK_NULL); + selected_family = lm; + } + } + + if (selected_family->has_target()) { + Method* target = selected_family->get_selected_target(); + InstanceKlass* holder = InstanceKlass::cast(target->method_holder()); + + // Verify that the identified method is valid from the context of + // the current class + ShadowChecker checker(&cache, THREAD, target->name(), + holder, selected_family->descriptor(), direction); + checker.run(current_class); + + if (checker.found_shadow()) { +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr(" Only candidate found was shadowed."); + } +#endif // ndef PRODUCT + THROW_MSG_(vmSymbols::java_lang_AbstractMethodError(), + "Accessible default method not found", NULL); + } else { +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print(" Returning "); + print_method(tty, target, true); + tty->print_cr(""); + } +#endif // ndef PRODUCT + return target; + } + } else { + assert(selected_family->throws_exception(), "must have target or throw"); + THROW_MSG_(vmSymbols::java_lang_AbstractMethodError(), + selected_family->get_exception_message()->as_C_string(), NULL); + } +} + + +static int assemble_redirect( + BytecodeConstantPool* cp, BytecodeBuffer* buffer, + Symbol* incoming, Method* target, TRAPS) { + + BytecodeAssembler assem(buffer, cp); + + SignatureStream in(incoming, true); + SignatureStream out(target->signature(), true); + u2 parameter_count = 0; + + assem.aload(parameter_count++); // load 'this' + + while (!in.at_return_type()) { + assert(!out.at_return_type(), "Parameter counts do not match"); + BasicType bt = in.type(); + assert(out.type() == bt, "Parameter types are not compatible"); + assem.load(bt, parameter_count); + if (in.is_object() && in.as_symbol(THREAD) != out.as_symbol(THREAD)) { + assem.checkcast(out.as_symbol(THREAD)); + } else if (bt == T_LONG || bt == T_DOUBLE) { + ++parameter_count; // longs and doubles use two slots + } + ++parameter_count; + in.next(); + out.next(); + } + assert(out.at_return_type(), "Parameter counts do not match"); + assert(in.type() == out.type(), "Return types are not compatible"); + + if (parameter_count == 1 && (in.type() == T_LONG || in.type() == T_DOUBLE)) { + ++parameter_count; // need room for return value + } + if (target->method_holder()->is_interface()) { + assem.invokespecial(target); + } else { + assem.invokevirtual(target); + } + + if (in.is_object() && in.as_symbol(THREAD) != out.as_symbol(THREAD)) { + assem.checkcast(in.as_symbol(THREAD)); + } + assem._return(in.type()); + return parameter_count; +} + +static int assemble_abstract_method_error( + BytecodeConstantPool* cp, BytecodeBuffer* buffer, Symbol* message, TRAPS) { + + Symbol* errorName = vmSymbols::java_lang_AbstractMethodError(); + Symbol* init = vmSymbols::object_initializer_name(); + Symbol* sig = vmSymbols::string_void_signature(); + + BytecodeAssembler assem(buffer, cp); + + assem._new(errorName); + assem.dup(); + assem.load_string(message); + assem.invokespecial(errorName, init, sig); + assem.athrow(); + + return 3; // max stack size: [ exception, exception, string ] +} + +static Method* new_method( + BytecodeConstantPool* cp, BytecodeBuffer* bytecodes, Symbol* name, + Symbol* sig, AccessFlags flags, int max_stack, int params, + ConstMethod::MethodType mt, TRAPS) { + + address code_start = static_cast
(bytecodes->adr_at(0)); + int code_length = bytecodes->length(); + + Method* m = Method::allocate(cp->pool_holder()->class_loader_data(), + code_length, flags, 0, 0, 0, 0, mt, CHECK_NULL); + + m->set_constants(NULL); // This will get filled in later + m->set_name_index(cp->utf8(name)); + m->set_signature_index(cp->utf8(sig)); + m->set_generic_signature_index(0); +#ifdef CC_INTERP + ResultTypeFinder rtf(sig); + m->set_result_index(rtf.type()); +#endif + m->set_size_of_parameters(params); + m->set_max_stack(max_stack); + m->set_max_locals(params); + m->constMethod()->set_stackmap_data(NULL); + m->set_code(code_start); + m->set_force_inline(true); + + return m; +} + +static void switchover_constant_pool(BytecodeConstantPool* bpool, + InstanceKlass* klass, GrowableArray* new_methods, TRAPS) { + + if (new_methods->length() > 0) { + ConstantPool* cp = bpool->create_constant_pool(CHECK); + if (cp != klass->constants()) { + klass->class_loader_data()->add_to_deallocate_list(klass->constants()); + klass->set_constants(cp); + cp->set_pool_holder(klass); + + for (int i = 0; i < new_methods->length(); ++i) { + new_methods->at(i)->set_constants(cp); + } + for (int i = 0; i < klass->methods()->length(); ++i) { + Method* mo = klass->methods()->at(i); + mo->set_constants(cp); + } + } + } +} + +// A "bridge" is a method created by javac to bridge the gap between +// an implementation and a generically-compatible, but different, signature. +// Bridges have actual bytecode implementation in classfiles. +// An "overpass", on the other hand, performs the same function as a bridge +// but does not occur in a classfile; the VM creates overpass itself, +// when it needs a path to get from a call site to an default method, and +// a bridge doesn't exist. +static void create_overpasses( + GrowableArray* slots, + InstanceKlass* klass, TRAPS) { + + GrowableArray overpasses; + BytecodeConstantPool bpool(klass->constants()); + + for (int i = 0; i < slots->length(); ++i) { + EmptyVtableSlot* slot = slots->at(i); + + if (slot->is_bound()) { + MethodFamily* method = slot->get_binding(); + int max_stack = 0; + BytecodeBuffer buffer; + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print("for slot: "); + slot->print_on(tty); + tty->print_cr(""); + if (method->has_target()) { + method->print_selected(tty, 1); + } else { + method->print_exception(tty, 1); + } + } +#endif // ndef PRODUCT + if (method->has_target()) { + Method* selected = method->get_selected_target(); + max_stack = assemble_redirect( + &bpool, &buffer, slot->signature(), selected, CHECK); + } else if (method->throws_exception()) { + max_stack = assemble_abstract_method_error( + &bpool, &buffer, method->get_exception_message(), CHECK); + } + AccessFlags flags = accessFlags_from( + JVM_ACC_PUBLIC | JVM_ACC_SYNTHETIC | JVM_ACC_BRIDGE); + Method* m = new_method(&bpool, &buffer, slot->name(), slot->signature(), + flags, max_stack, slot->size_of_parameters(), + ConstMethod::OVERPASS, CHECK); + if (m != NULL) { + overpasses.push(m); + } + } + } + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Created %d overpass methods", overpasses.length()); + } +#endif // ndef PRODUCT + + switchover_constant_pool(&bpool, klass, &overpasses, CHECK); + merge_in_new_methods(klass, &overpasses, CHECK); +} + +static void sort_methods(GrowableArray* methods) { + // Note that this must sort using the same key as is used for sorting + // methods in InstanceKlass. + bool sorted = true; + for (int i = methods->length() - 1; i > 0; --i) { + for (int j = 0; j < i; ++j) { + Method* m1 = methods->at(j); + Method* m2 = methods->at(j + 1); + if ((uintptr_t)m1->name() > (uintptr_t)m2->name()) { + methods->at_put(j, m2); + methods->at_put(j + 1, m1); + sorted = false; + } + } + if (sorted) break; + sorted = true; + } +#ifdef ASSERT + uintptr_t prev = 0; + for (int i = 0; i < methods->length(); ++i) { + Method* mh = methods->at(i); + uintptr_t nv = (uintptr_t)mh->name(); + assert(nv >= prev, "Incorrect overpass method ordering"); + prev = nv; + } +#endif +} + +static void merge_in_new_methods(InstanceKlass* klass, + GrowableArray* new_methods, TRAPS) { + + enum { ANNOTATIONS, PARAMETERS, DEFAULTS, NUM_ARRAYS }; + + Array* original_annots[NUM_ARRAYS]; + + Array* original_methods = klass->methods(); + Annotations* annots = klass->annotations(); + original_annots[ANNOTATIONS] = annots->methods_annotations(); + original_annots[PARAMETERS] = annots->methods_parameter_annotations(); + original_annots[DEFAULTS] = annots->methods_default_annotations(); + + Array* original_ordering = klass->method_ordering(); + Array* merged_ordering = Universe::the_empty_int_array(); + + int new_size = klass->methods()->length() + new_methods->length(); + + Array* merged_annots[NUM_ARRAYS]; + + Array* merged_methods = MetadataFactory::new_array( + klass->class_loader_data(), new_size, NULL, CHECK); + for (int i = 0; i < NUM_ARRAYS; ++i) { + if (original_annots[i] != NULL) { + merged_annots[i] = MetadataFactory::new_array( + klass->class_loader_data(), new_size, CHECK); + } else { + merged_annots[i] = NULL; + } + } + if (original_ordering != NULL && original_ordering->length() > 0) { + merged_ordering = MetadataFactory::new_array( + klass->class_loader_data(), new_size, CHECK); + } + int method_order_index = klass->methods()->length(); + + sort_methods(new_methods); + + // Perform grand merge of existing methods and new methods + int orig_idx = 0; + int new_idx = 0; + + for (int i = 0; i < new_size; ++i) { + Method* orig_method = NULL; + Method* new_method = NULL; + if (orig_idx < original_methods->length()) { + orig_method = original_methods->at(orig_idx); + } + if (new_idx < new_methods->length()) { + new_method = new_methods->at(new_idx); + } + + if (orig_method != NULL && + (new_method == NULL || orig_method->name() < new_method->name())) { + merged_methods->at_put(i, orig_method); + original_methods->at_put(orig_idx, NULL); + for (int j = 0; j < NUM_ARRAYS; ++j) { + if (merged_annots[j] != NULL) { + merged_annots[j]->at_put(i, original_annots[j]->at(orig_idx)); + original_annots[j]->at_put(orig_idx, NULL); + } + } + if (merged_ordering->length() > 0) { + merged_ordering->at_put(i, original_ordering->at(orig_idx)); + } + ++orig_idx; + } else { + merged_methods->at_put(i, new_method); + if (merged_ordering->length() > 0) { + merged_ordering->at_put(i, method_order_index++); + } + ++new_idx; + } + // update idnum for new location + merged_methods->at(i)->set_method_idnum(i); + } + + // Verify correct order +#ifdef ASSERT + uintptr_t prev = 0; + for (int i = 0; i < merged_methods->length(); ++i) { + Method* mo = merged_methods->at(i); + uintptr_t nv = (uintptr_t)mo->name(); + assert(nv >= prev, "Incorrect method ordering"); + prev = nv; + } +#endif + + // Replace klass methods with new merged lists + klass->set_methods(merged_methods); + annots->set_methods_annotations(merged_annots[ANNOTATIONS]); + annots->set_methods_parameter_annotations(merged_annots[PARAMETERS]); + annots->set_methods_default_annotations(merged_annots[DEFAULTS]); + + ClassLoaderData* cld = klass->class_loader_data(); + MetadataFactory::free_array(cld, original_methods); + for (int i = 0; i < NUM_ARRAYS; ++i) { + MetadataFactory::free_array(cld, original_annots[i]); + } + if (original_ordering->length() > 0) { + klass->set_method_ordering(merged_ordering); + MetadataFactory::free_array(cld, original_ordering); + } +} + diff --git a/hotspot/src/share/vm/classfile/defaultMethods.hpp b/hotspot/src/share/vm/classfile/defaultMethods.hpp new file mode 100644 index 00000000000..8a31eee6b45 --- /dev/null +++ b/hotspot/src/share/vm/classfile/defaultMethods.hpp @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_CLASSFILE_DEFAULTMETHODS_HPP +#define SHARE_VM_CLASSFILE_DEFAULTMETHODS_HPP + +#include "runtime/handles.hpp" +#include "utilities/growableArray.hpp" +#include "utilities/exceptions.hpp" + +class InstanceKlass; +class Symbol; +class Method; + +class DefaultMethods : AllStatic { + public: + + // Analyzes class and determines which default methods are inherited + // from interfaces (and has no other implementation). For each method + // (and each different signature the method could have), create an + // "overpass" method that is an instance method that redirects to the + // default method. Overpass methods are added to the methods lists for + // the class. + static void generate_default_methods( + InstanceKlass* klass, GrowableArray* mirandas, TRAPS); + + + // Called during linking when an invokespecial to an direct interface + // method is found. Selects and returns a method if there is a unique + // default method in the 'super_iface' part of the hierarchy which is + // also a candidate default for 'this_klass'. Otherwise throws an AME. + static Method* find_super_default( + Klass* this_klass, Klass* super_iface, + Symbol* method_name, Symbol* method_sig, TRAPS); +}; + +#endif // SHARE_VM_CLASSFILE_DEFAULTMETHODS_HPP diff --git a/hotspot/src/share/vm/classfile/genericSignatures.cpp b/hotspot/src/share/vm/classfile/genericSignatures.cpp new file mode 100644 index 00000000000..3b0ffbd3349 --- /dev/null +++ b/hotspot/src/share/vm/classfile/genericSignatures.cpp @@ -0,0 +1,1272 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" + +#include "classfile/genericSignatures.hpp" +#include "classfile/symbolTable.hpp" +#include "classfile/systemDictionary.hpp" +#include "memory/resourceArea.hpp" + +namespace generic { + +// Helper class for parsing the generic signature Symbol in klass and methods +class DescriptorStream : public ResourceObj { + private: + Symbol* _symbol; + int _offset; + int _mark; + const char* _parse_error; + + void set_parse_error(const char* error) { + assert(error != NULL, "Can't set NULL error string"); + _parse_error = error; + } + + public: + DescriptorStream(Symbol* sym) + : _symbol(sym), _offset(0), _mark(-1), _parse_error(NULL) {} + + const char* parse_error() const { + return _parse_error; + } + + bool at_end() { return _offset >= _symbol->utf8_length(); } + + char peek() { + if (at_end()) { + set_parse_error("Peeking past end of signature"); + return '\0'; + } else { + return _symbol->byte_at(_offset); + } + } + + char read() { + if (at_end()) { + set_parse_error("Reading past end of signature"); + return '\0'; + } else { + return _symbol->byte_at(_offset++); + } + } + + void read(char expected) { + char c = read(); + assert_char(c, expected, 0); + } + + void assert_char(char c, char expected, int pos = -1) { + if (c != expected) { + const char* fmt = "Parse error at %d: expected %c but got %c"; + size_t len = strlen(fmt) + 5; + char* buffer = NEW_RESOURCE_ARRAY(char, len); + jio_snprintf(buffer, len, fmt, _offset + pos, expected, c); + set_parse_error(buffer); + } + } + + void push(char c) { + assert(c == _symbol->byte_at(_offset - 1), "Pushing back wrong value"); + --_offset; + } + + void expect_end() { + if (!at_end()) { + set_parse_error("Unexpected data trailing signature"); + } + } + + bool has_mark() { return _mark != -1; } + + void set_mark() { + _mark = _offset; + } + + Identifier* identifier_from_mark() { + assert(has_mark(), "Mark should be set"); + if (!has_mark()) { + set_parse_error("Expected mark to be set"); + return NULL; + } else { + Identifier* id = new Identifier(_symbol, _mark, _offset - 1); + _mark = -1; + return id; + } + } +}; + + +#define CHECK_FOR_PARSE_ERROR() \ + if (STREAM->parse_error() != NULL) { \ + if (VerifyGenericSignatures) { \ + fatal(STREAM->parse_error()); \ + } \ + return NULL; \ + } 0 + +#define READ() STREAM->read(); CHECK_FOR_PARSE_ERROR() +#define PEEK() STREAM->peek(); CHECK_FOR_PARSE_ERROR() +#define PUSH(c) STREAM->push(c) +#define EXPECT(c) STREAM->read(c); CHECK_FOR_PARSE_ERROR() +#define EXPECTED(c, ch) STREAM->assert_char(c, ch); CHECK_FOR_PARSE_ERROR() +#define EXPECT_END() STREAM->expect_end(); CHECK_FOR_PARSE_ERROR() + +#define CHECK_STREAM STREAM); CHECK_FOR_PARSE_ERROR(); (0 + +#ifndef PRODUCT +void Identifier::print_on(outputStream* str) const { + for (int i = _begin; i < _end; ++i) { + str->print("%c", (char)_sym->byte_at(i)); + } +} +#endif // ndef PRODUCT + +bool Identifier::equals(Identifier* other) { + if (_sym == other->_sym && _begin == other->_begin && _end == other->_end) { + return true; + } else if (_end - _begin != other->_end - other->_begin) { + return false; + } else { + size_t len = _end - _begin; + char* addr = ((char*)_sym->bytes()) + _begin; + char* oaddr = ((char*)other->_sym->bytes()) + other->_begin; + return strncmp(addr, oaddr, len) == 0; + } +} + +bool Identifier::equals(Symbol* sym) { + Identifier id(sym, 0, sym->utf8_length()); + return equals(&id); +} + +/** + * A formal type parameter may be found in the the enclosing class, but it could + * also come from an enclosing method or outer class, in the case of inner-outer + * classes or anonymous classes. For example: + * + * class Outer { + * class Inner { + * void m(T t, V v, W w); + * } + * } + * + * In this case, the type variables in m()'s signature are not all found in the + * immediate enclosing class (Inner). class Inner has only type parameter W, + * but it's outer_class field will reference Outer's descriptor which contains + * T & V (no outer_method in this case). + * + * If you have an anonymous class, it has both an enclosing method *and* an + * enclosing class where type parameters can be declared: + * + * class MOuter { + * void bar(V v) { + * Runnable r = new Runnable() { + * public void run() {} + * public void foo(T t, V v) { ... } + * }; + * } + * } + * + * In this case, foo will be a member of some class, Runnable$1, which has no + * formal parameters itself, but has an outer_method (bar()) which provides + * type parameter V, and an outer class MOuter with type parameter T. + * + * It is also possible that the outer class is itself an inner class to some + * other class (or an anonymous class with an enclosing method), so we need to + * follow the outer_class/outer_method chain to it's end when looking for a + * type parameter. + */ +TypeParameter* Descriptor::find_type_parameter(Identifier* id, int* depth) { + + int current_depth = 0; + + MethodDescriptor* outer_method = as_method_signature(); + ClassDescriptor* outer_class = as_class_signature(); + + if (outer_class == NULL) { // 'this' is a method signature; use the holder + outer_class = outer_method->outer_class(); + } + + while (outer_method != NULL || outer_class != NULL) { + if (outer_method != NULL) { + for (int i = 0; i < outer_method->type_parameters().length(); ++i) { + TypeParameter* p = outer_method->type_parameters().at(i); + if (p->identifier()->equals(id)) { + *depth = -1; // indicates this this is a method parameter + return p; + } + } + } + if (outer_class != NULL) { + for (int i = 0; i < outer_class->type_parameters().length(); ++i) { + TypeParameter* p = outer_class->type_parameters().at(i); + if (p->identifier()->equals(id)) { + *depth = current_depth; + return p; + } + } + outer_method = outer_class->outer_method(); + outer_class = outer_class->outer_class(); + ++current_depth; + } + } + + if (VerifyGenericSignatures) { + fatal("Could not resolve identifier"); + } + + return NULL; +} + +ClassDescriptor* ClassDescriptor::parse_generic_signature(Klass* klass, TRAPS) { + return parse_generic_signature(klass, NULL, CHECK_NULL); +} + +ClassDescriptor* ClassDescriptor::parse_generic_signature( + Klass* klass, Symbol* original_name, TRAPS) { + + InstanceKlass* ik = InstanceKlass::cast(klass); + Symbol* sym = ik->generic_signature(); + + ClassDescriptor* spec; + + if (sym == NULL || (spec = ClassDescriptor::parse_generic_signature(sym)) == NULL) { + spec = ClassDescriptor::placeholder(ik); + } + + u2 outer_index = get_outer_class_index(ik, CHECK_NULL); + if (outer_index != 0) { + if (original_name == NULL) { + original_name = ik->name(); + } + Handle class_loader = Handle(THREAD, ik->class_loader()); + Handle protection_domain = Handle(THREAD, ik->protection_domain()); + + Symbol* outer_name = ik->constants()->klass_name_at(outer_index); + Klass* outer = SystemDictionary::find( + outer_name, class_loader, protection_domain, CHECK_NULL); + if (outer == NULL && !THREAD->is_Compiler_thread()) { + outer = SystemDictionary::resolve_super_or_fail(original_name, + outer_name, class_loader, protection_domain, false, CHECK_NULL); + } + + InstanceKlass* outer_ik; + ClassDescriptor* outer_spec = NULL; + if (outer == NULL) { + outer_spec = ClassDescriptor::placeholder(ik); + assert(false, "Outer class not loaded and not loadable from here"); + } else { + outer_ik = InstanceKlass::cast(outer); + outer_spec = parse_generic_signature(outer, original_name, CHECK_NULL); + } + spec->set_outer_class(outer_spec); + + u2 encl_method_idx = ik->enclosing_method_method_index(); + if (encl_method_idx != 0 && outer_ik != NULL) { + ConstantPool* cp = ik->constants(); + u2 name_index = cp->name_ref_index_at(encl_method_idx); + u2 sig_index = cp->signature_ref_index_at(encl_method_idx); + Symbol* name = cp->symbol_at(name_index); + Symbol* sig = cp->symbol_at(sig_index); + Method* m = outer_ik->find_method(name, sig); + if (m != NULL) { + Symbol* gsig = m->generic_signature(); + if (gsig != NULL) { + MethodDescriptor* gms = MethodDescriptor::parse_generic_signature(gsig, outer_spec); + spec->set_outer_method(gms); + } + } else if (VerifyGenericSignatures) { + ResourceMark rm; + stringStream ss; + ss.print("Could not find method %s %s in class %s", + name->as_C_string(), sig->as_C_string(), outer_name->as_C_string()); + fatal(ss.as_string()); + } + } + } + + spec->bind_variables_to_parameters(); + return spec; +} + +ClassDescriptor* ClassDescriptor::placeholder(InstanceKlass* klass) { + GrowableArray formals; + GrowableArray interfaces; + ClassType* super_type = NULL; + + Klass* super_klass = klass->super(); + if (super_klass != NULL) { + InstanceKlass* super = InstanceKlass::cast(super_klass); + super_type = ClassType::from_symbol(super->name()); + } + + for (int i = 0; i < klass->local_interfaces()->length(); ++i) { + InstanceKlass* iface = InstanceKlass::cast(klass->local_interfaces()->at(i)); + interfaces.append(ClassType::from_symbol(iface->name())); + } + return new ClassDescriptor(formals, super_type, interfaces); +} + +ClassDescriptor* ClassDescriptor::parse_generic_signature(Symbol* sym) { + + DescriptorStream ds(sym); + DescriptorStream* STREAM = &ds; + + GrowableArray parameters(8); + char c = READ(); + if (c == '<') { + c = READ(); + while (c != '>') { + PUSH(c); + TypeParameter* ftp = TypeParameter::parse_generic_signature(CHECK_STREAM); + parameters.append(ftp); + c = READ(); + } + } else { + PUSH(c); + } + + EXPECT('L'); + ClassType* super = ClassType::parse_generic_signature(CHECK_STREAM); + + GrowableArray signatures(2); + while (!STREAM->at_end()) { + EXPECT('L'); + ClassType* iface = ClassType::parse_generic_signature(CHECK_STREAM); + signatures.append(iface); + } + + EXPECT_END(); + + return new ClassDescriptor(parameters, super, signatures); +} + +#ifndef PRODUCT +void ClassDescriptor::print_on(outputStream* str) const { + str->indent().print_cr("ClassDescriptor {"); + { + streamIndentor si(str); + if (_type_parameters.length() > 0) { + str->indent().print_cr("Formals {"); + { + streamIndentor si(str); + for (int i = 0; i < _type_parameters.length(); ++i) { + _type_parameters.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + if (_super != NULL) { + str->indent().print_cr("Superclass: "); + { + streamIndentor si(str); + _super->print_on(str); + } + } + if (_interfaces.length() > 0) { + str->indent().print_cr("SuperInterfaces: {"); + { + streamIndentor si(str); + for (int i = 0; i < _interfaces.length(); ++i) { + _interfaces.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + if (_outer_method != NULL) { + str->indent().print_cr("Outer Method: {"); + { + streamIndentor si(str); + _outer_method->print_on(str); + } + str->indent().print_cr("}"); + } + if (_outer_class != NULL) { + str->indent().print_cr("Outer Class: {"); + { + streamIndentor si(str); + _outer_class->print_on(str); + } + str->indent().print_cr("}"); + } + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +ClassType* ClassDescriptor::interface_desc(Symbol* sym) { + for (int i = 0; i < _interfaces.length(); ++i) { + if (_interfaces.at(i)->identifier()->equals(sym)) { + return _interfaces.at(i); + } + } + if (VerifyGenericSignatures) { + fatal("Did not find expected interface"); + } + return NULL; +} + +void ClassDescriptor::bind_variables_to_parameters() { + if (_outer_class != NULL) { + _outer_class->bind_variables_to_parameters(); + } + if (_outer_method != NULL) { + _outer_method->bind_variables_to_parameters(); + } + for (int i = 0; i < _type_parameters.length(); ++i) { + _type_parameters.at(i)->bind_variables_to_parameters(this, i); + } + if (_super != NULL) { + _super->bind_variables_to_parameters(this); + } + for (int i = 0; i < _interfaces.length(); ++i) { + _interfaces.at(i)->bind_variables_to_parameters(this); + } +} + +ClassDescriptor* ClassDescriptor::canonicalize(Context* ctx) { + + GrowableArray type_params(_type_parameters.length()); + for (int i = 0; i < _type_parameters.length(); ++i) { + type_params.append(_type_parameters.at(i)->canonicalize(ctx, 0)); + } + + ClassDescriptor* outer = _outer_class == NULL ? NULL : + _outer_class->canonicalize(ctx); + + ClassType* super = _super == NULL ? NULL : _super->canonicalize(ctx, 0); + + GrowableArray interfaces(_interfaces.length()); + for (int i = 0; i < _interfaces.length(); ++i) { + interfaces.append(_interfaces.at(i)->canonicalize(ctx, 0)); + } + + MethodDescriptor* md = _outer_method == NULL ? NULL : + _outer_method->canonicalize(ctx); + + return new ClassDescriptor(type_params, super, interfaces, outer, md); +} + +u2 ClassDescriptor::get_outer_class_index(InstanceKlass* klass, TRAPS) { + int inner_index = InstanceKlass::inner_class_inner_class_info_offset; + int outer_index = InstanceKlass::inner_class_outer_class_info_offset; + int name_offset = InstanceKlass::inner_class_inner_name_offset; + int next_offset = InstanceKlass::inner_class_next_offset; + + if (klass->inner_classes() == NULL || klass->inner_classes()->length() == 0) { + // No inner class info => no declaring class + return 0; + } + + Array* i_icls = klass->inner_classes(); + ConstantPool* i_cp = klass->constants(); + int i_length = i_icls->length(); + + // Find inner_klass attribute + for (int i = 0; i + next_offset < i_length; i += next_offset) { + u2 ioff = i_icls->at(i + inner_index); + u2 ooff = i_icls->at(i + outer_index); + u2 noff = i_icls->at(i + 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(klass, ioff) && ooff != 0) { + return ooff; + } + } + } + + // It may be anonymous; try for that. + u2 encl_method_class_idx = klass->enclosing_method_class_index(); + if (encl_method_class_idx != 0) { + return encl_method_class_idx; + } + + return 0; +} + +MethodDescriptor* MethodDescriptor::parse_generic_signature(Method* m, ClassDescriptor* outer) { + Symbol* generic_sig = m->generic_signature(); + MethodDescriptor* md = NULL; + if (generic_sig == NULL || (md = parse_generic_signature(generic_sig, outer)) == NULL) { + md = parse_generic_signature(m->signature(), outer); + } + assert(md != NULL, "Could not parse method signature"); + md->bind_variables_to_parameters(); + return md; +} + +MethodDescriptor* MethodDescriptor::parse_generic_signature(Symbol* sym, ClassDescriptor* outer) { + + DescriptorStream ds(sym); + DescriptorStream* STREAM = &ds; + + GrowableArray params(8); + char c = READ(); + if (c == '<') { + c = READ(); + while (c != '>') { + PUSH(c); + TypeParameter* ftp = TypeParameter::parse_generic_signature(CHECK_STREAM); + params.append(ftp); + c = READ(); + } + } else { + PUSH(c); + } + + EXPECT('('); + + GrowableArray parameters(8); + c = READ(); + while (c != ')') { + PUSH(c); + Type* arg = Type::parse_generic_signature(CHECK_STREAM); + parameters.append(arg); + c = READ(); + } + + Type* rt = Type::parse_generic_signature(CHECK_STREAM); + + GrowableArray throws; + while (!STREAM->at_end()) { + EXPECT('^'); + Type* spec = Type::parse_generic_signature(CHECK_STREAM); + throws.append(spec); + } + + return new MethodDescriptor(params, outer, parameters, rt, throws); +} + +void MethodDescriptor::bind_variables_to_parameters() { + for (int i = 0; i < _type_parameters.length(); ++i) { + _type_parameters.at(i)->bind_variables_to_parameters(this, i); + } + for (int i = 0; i < _parameters.length(); ++i) { + _parameters.at(i)->bind_variables_to_parameters(this); + } + _return_type->bind_variables_to_parameters(this); + for (int i = 0; i < _throws.length(); ++i) { + _throws.at(i)->bind_variables_to_parameters(this); + } +} + +bool MethodDescriptor::covariant_match(MethodDescriptor* other, Context* ctx) { + + if (_parameters.length() == other->_parameters.length()) { + for (int i = 0; i < _parameters.length(); ++i) { + if (!_parameters.at(i)->covariant_match(other->_parameters.at(i), ctx)) { + return false; + } + } + + if (_return_type->as_primitive() != NULL) { + return _return_type->covariant_match(other->_return_type, ctx); + } else { + // return type is a reference + return other->_return_type->as_class() != NULL || + other->_return_type->as_variable() != NULL || + other->_return_type->as_array() != NULL; + } + } else { + return false; + } +} + +MethodDescriptor* MethodDescriptor::canonicalize(Context* ctx) { + + GrowableArray type_params(_type_parameters.length()); + for (int i = 0; i < _type_parameters.length(); ++i) { + type_params.append(_type_parameters.at(i)->canonicalize(ctx, 0)); + } + + ClassDescriptor* outer = _outer_class == NULL ? NULL : + _outer_class->canonicalize(ctx); + + GrowableArray params(_parameters.length()); + for (int i = 0; i < _parameters.length(); ++i) { + params.append(_parameters.at(i)->canonicalize(ctx, 0)); + } + + Type* rt = _return_type->canonicalize(ctx, 0); + + GrowableArray throws(_throws.length()); + for (int i = 0; i < _throws.length(); ++i) { + throws.append(_throws.at(i)->canonicalize(ctx, 0)); + } + + return new MethodDescriptor(type_params, outer, params, rt, throws); +} + +#ifndef PRODUCT +TempNewSymbol MethodDescriptor::reify_signature(Context* ctx, TRAPS) { + stringStream ss(256); + + ss.print("("); + for (int i = 0; i < _parameters.length(); ++i) { + _parameters.at(i)->reify_signature(&ss, ctx); + } + ss.print(")"); + _return_type->reify_signature(&ss, ctx); + return SymbolTable::new_symbol(ss.base(), (int)ss.size(), THREAD); +} + +void MethodDescriptor::print_on(outputStream* str) const { + str->indent().print_cr("MethodDescriptor {"); + { + streamIndentor si(str); + if (_type_parameters.length() > 0) { + str->indent().print_cr("Formals: {"); + { + streamIndentor si(str); + for (int i = 0; i < _type_parameters.length(); ++i) { + _type_parameters.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + str->indent().print_cr("Parameters: {"); + { + streamIndentor si(str); + for (int i = 0; i < _parameters.length(); ++i) { + _parameters.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + str->indent().print_cr("Return Type: "); + { + streamIndentor si(str); + _return_type->print_on(str); + } + + if (_throws.length() > 0) { + str->indent().print_cr("Throws: {"); + { + streamIndentor si(str); + for (int i = 0; i < _throws.length(); ++i) { + _throws.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +TypeParameter* TypeParameter::parse_generic_signature(DescriptorStream* STREAM) { + STREAM->set_mark(); + char c = READ(); + while (c != ':') { + c = READ(); + } + + Identifier* id = STREAM->identifier_from_mark(); + + ClassType* class_bound = NULL; + GrowableArray interface_bounds(8); + + c = READ(); + if (c != '>') { + if (c != ':') { + EXPECTED(c, 'L'); + class_bound = ClassType::parse_generic_signature(CHECK_STREAM); + c = READ(); + } + + while (c == ':') { + EXPECT('L'); + ClassType* fts = ClassType::parse_generic_signature(CHECK_STREAM); + interface_bounds.append(fts); + c = READ(); + } + } + PUSH(c); + + return new TypeParameter(id, class_bound, interface_bounds); +} + +void TypeParameter::bind_variables_to_parameters(Descriptor* sig, int position) { + if (_class_bound != NULL) { + _class_bound->bind_variables_to_parameters(sig); + } + for (int i = 0; i < _interface_bounds.length(); ++i) { + _interface_bounds.at(i)->bind_variables_to_parameters(sig); + } + _position = position; +} + +Type* TypeParameter::resolve( + Context* ctx, int inner_depth, int ctx_depth) { + + if (inner_depth == -1) { + // This indicates that the parameter is a method type parameter, which + // isn't resolveable using the class hierarchy context + return bound(); + } + + ClassType* provider = ctx->at_depth(ctx_depth); + if (provider != NULL) { + for (int i = 0; i < inner_depth && provider != NULL; ++i) { + provider = provider->outer_class(); + } + if (provider != NULL) { + TypeArgument* arg = provider->type_argument_at(_position); + if (arg != NULL) { + Type* value = arg->lower_bound(); + return value->canonicalize(ctx, ctx_depth + 1); + } + } + } + + return bound(); +} + +TypeParameter* TypeParameter::canonicalize(Context* ctx, int ctx_depth) { + ClassType* bound = _class_bound == NULL ? NULL : + _class_bound->canonicalize(ctx, ctx_depth); + + GrowableArray ifaces(_interface_bounds.length()); + for (int i = 0; i < _interface_bounds.length(); ++i) { + ifaces.append(_interface_bounds.at(i)->canonicalize(ctx, ctx_depth)); + } + + TypeParameter* ret = new TypeParameter(_identifier, bound, ifaces); + ret->_position = _position; + return ret; +} + +ClassType* TypeParameter::bound() { + if (_class_bound != NULL) { + return _class_bound; + } + + if (_interface_bounds.length() == 1) { + return _interface_bounds.at(0); + } + + return ClassType::java_lang_Object(); // TODO: investigate this case +} + +#ifndef PRODUCT +void TypeParameter::print_on(outputStream* str) const { + str->indent().print_cr("Formal: {"); + { + streamIndentor si(str); + + str->indent().print("Identifier: "); + _identifier->print_on(str); + str->print_cr(""); + if (_class_bound != NULL) { + str->indent().print_cr("Class Bound: "); + streamIndentor si(str); + _class_bound->print_on(str); + } + if (_interface_bounds.length() > 0) { + str->indent().print_cr("Interface Bounds: {"); + { + streamIndentor si(str); + for (int i = 0; i < _interface_bounds.length(); ++i) { + _interface_bounds.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + str->indent().print_cr("Ordinal Position: %d", _position); + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +Type* Type::parse_generic_signature(DescriptorStream* STREAM) { + char c = READ(); + switch (c) { + case 'L': + return ClassType::parse_generic_signature(CHECK_STREAM); + case 'T': + return TypeVariable::parse_generic_signature(CHECK_STREAM); + case '[': + return ArrayType::parse_generic_signature(CHECK_STREAM); + default: + return new PrimitiveType(c); + } +} + +Identifier* ClassType::parse_generic_signature_simple(GrowableArray* args, + bool* has_inner, DescriptorStream* STREAM) { + STREAM->set_mark(); + + char c = READ(); + while (c != ';' && c != '.' && c != '<') { c = READ(); } + Identifier* id = STREAM->identifier_from_mark(); + + if (c == '<') { + c = READ(); + while (c != '>') { + PUSH(c); + TypeArgument* arg = TypeArgument::parse_generic_signature(CHECK_STREAM); + args->append(arg); + c = READ(); + } + c = READ(); + } + + *has_inner = (c == '.'); + if (!(*has_inner)) { + EXPECTED(c, ';'); + } + + return id; +} + +ClassType* ClassType::parse_generic_signature(DescriptorStream* STREAM) { + return parse_generic_signature(NULL, CHECK_STREAM); +} + +ClassType* ClassType::parse_generic_signature(ClassType* outer, DescriptorStream* STREAM) { + GrowableArray args; + ClassType* gct = NULL; + bool has_inner = false; + + Identifier* id = parse_generic_signature_simple(&args, &has_inner, STREAM); + if (id != NULL) { + gct = new ClassType(id, args, outer); + + if (has_inner) { + gct = parse_generic_signature(gct, CHECK_STREAM); + } + } + return gct; +} + +ClassType* ClassType::from_symbol(Symbol* sym) { + assert(sym != NULL, "Must not be null"); + GrowableArray args; + Identifier* id = new Identifier(sym, 0, sym->utf8_length()); + return new ClassType(id, args, NULL); +} + +ClassType* ClassType::java_lang_Object() { + return from_symbol(vmSymbols::java_lang_Object()); +} + +void ClassType::bind_variables_to_parameters(Descriptor* sig) { + for (int i = 0; i < _type_arguments.length(); ++i) { + _type_arguments.at(i)->bind_variables_to_parameters(sig); + } + if (_outer_class != NULL) { + _outer_class->bind_variables_to_parameters(sig); + } +} + +TypeArgument* ClassType::type_argument_at(int i) { + if (i >= 0 && i < _type_arguments.length()) { + return _type_arguments.at(i); + } else { + return NULL; + } +} + +#ifndef PRODUCT +void ClassType::reify_signature(stringStream* ss, Context* ctx) { + ss->print("L"); + _identifier->print_on(ss); + ss->print(";"); +} + +void ClassType::print_on(outputStream* str) const { + str->indent().print_cr("Class {"); + { + streamIndentor si(str); + str->indent().print("Name: "); + _identifier->print_on(str); + str->print_cr(""); + if (_type_arguments.length() != 0) { + str->indent().print_cr("Type Arguments: {"); + { + streamIndentor si(str); + for (int j = 0; j < _type_arguments.length(); ++j) { + _type_arguments.at(j)->print_on(str); + } + } + str->indent().print_cr("}"); + } + if (_outer_class != NULL) { + str->indent().print_cr("Outer Class: "); + streamIndentor sir(str); + _outer_class->print_on(str); + } + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +bool ClassType::covariant_match(Type* other, Context* ctx) { + + if (other == this) { + return true; + } + + TypeVariable* variable = other->as_variable(); + if (variable != NULL) { + other = variable->resolve(ctx, 0); + } + + ClassType* outer = outer_class(); + ClassType* other_class = other->as_class(); + + if (other_class == NULL || + (outer == NULL) != (other_class->outer_class() == NULL)) { + return false; + } + + if (!_identifier->equals(other_class->_identifier)) { + return false; + } + + if (outer != NULL && !outer->covariant_match(other_class->outer_class(), ctx)) { + return false; + } + + return true; +} + +ClassType* ClassType::canonicalize(Context* ctx, int ctx_depth) { + + GrowableArray args(_type_arguments.length()); + for (int i = 0; i < _type_arguments.length(); ++i) { + args.append(_type_arguments.at(i)->canonicalize(ctx, ctx_depth)); + } + + ClassType* outer = _outer_class == NULL ? NULL : + _outer_class->canonicalize(ctx, ctx_depth); + + return new ClassType(_identifier, args, outer); +} + +TypeVariable* TypeVariable::parse_generic_signature(DescriptorStream* STREAM) { + STREAM->set_mark(); + char c = READ(); + while (c != ';') { + c = READ(); + } + Identifier* id = STREAM->identifier_from_mark(); + + return new TypeVariable(id); +} + +void TypeVariable::bind_variables_to_parameters(Descriptor* sig) { + _parameter = sig->find_type_parameter(_id, &_inner_depth); + if (VerifyGenericSignatures && _parameter == NULL) { + fatal("Could not find formal parameter"); + } +} + +Type* TypeVariable::resolve(Context* ctx, int ctx_depth) { + if (parameter() != NULL) { + return parameter()->resolve(ctx, inner_depth(), ctx_depth); + } else { + if (VerifyGenericSignatures) { + fatal("Type variable matches no parameter"); + } + return NULL; + } +} + +bool TypeVariable::covariant_match(Type* other, Context* ctx) { + + if (other == this) { + return true; + } + + Context my_context(NULL); // empty, results in erasure + Type* my_type = resolve(&my_context, 0); + if (my_type == NULL) { + return false; + } + + return my_type->covariant_match(other, ctx); +} + +Type* TypeVariable::canonicalize(Context* ctx, int ctx_depth) { + return resolve(ctx, ctx_depth); +} + +#ifndef PRODUCT +void TypeVariable::reify_signature(stringStream* ss, Context* ctx) { + Type* type = resolve(ctx, 0); + if (type != NULL) { + type->reify_signature(ss, ctx); + } +} + +void TypeVariable::print_on(outputStream* str) const { + str->indent().print_cr("Type Variable {"); + { + streamIndentor si(str); + str->indent().print("Name: "); + _id->print_on(str); + str->print_cr(""); + str->indent().print_cr("Inner depth: %d", _inner_depth); + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +ArrayType* ArrayType::parse_generic_signature(DescriptorStream* STREAM) { + Type* base = Type::parse_generic_signature(CHECK_STREAM); + return new ArrayType(base); +} + +void ArrayType::bind_variables_to_parameters(Descriptor* sig) { + assert(_base != NULL, "Invalid base"); + _base->bind_variables_to_parameters(sig); +} + +bool ArrayType::covariant_match(Type* other, Context* ctx) { + assert(_base != NULL, "Invalid base"); + + if (other == this) { + return true; + } + + ArrayType* other_array = other->as_array(); + return (other_array != NULL && _base->covariant_match(other_array->_base, ctx)); +} + +ArrayType* ArrayType::canonicalize(Context* ctx, int ctx_depth) { + assert(_base != NULL, "Invalid base"); + return new ArrayType(_base->canonicalize(ctx, ctx_depth)); +} + +#ifndef PRODUCT +void ArrayType::reify_signature(stringStream* ss, Context* ctx) { + assert(_base != NULL, "Invalid base"); + ss->print("["); + _base->reify_signature(ss, ctx); +} + +void ArrayType::print_on(outputStream* str) const { + str->indent().print_cr("Array {"); + { + streamIndentor si(str); + _base->print_on(str); + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +bool PrimitiveType::covariant_match(Type* other, Context* ctx) { + + PrimitiveType* other_prim = other->as_primitive(); + return (other_prim != NULL && _type == other_prim->_type); +} + +PrimitiveType* PrimitiveType::canonicalize(Context* ctx, int ctxd) { + return this; +} + +#ifndef PRODUCT +void PrimitiveType::reify_signature(stringStream* ss, Context* ctx) { + ss->print("%c", _type); +} + +void PrimitiveType::print_on(outputStream* str) const { + str->indent().print_cr("Primitive: '%c'", _type); +} +#endif // ndef PRODUCT + +void PrimitiveType::bind_variables_to_parameters(Descriptor* sig) { +} + +TypeArgument* TypeArgument::parse_generic_signature(DescriptorStream* STREAM) { + char c = READ(); + Type* type = NULL; + + switch (c) { + case '*': + return new TypeArgument(ClassType::java_lang_Object(), NULL); + break; + default: + PUSH(c); + // fall-through + case '+': + case '-': + type = Type::parse_generic_signature(CHECK_STREAM); + if (c == '+') { + return new TypeArgument(type, NULL); + } else if (c == '-') { + return new TypeArgument(ClassType::java_lang_Object(), type); + } else { + return new TypeArgument(type, type); + } + } +} + +void TypeArgument::bind_variables_to_parameters(Descriptor* sig) { + assert(_lower_bound != NULL, "Invalid lower bound"); + _lower_bound->bind_variables_to_parameters(sig); + if (_upper_bound != NULL && _upper_bound != _lower_bound) { + _upper_bound->bind_variables_to_parameters(sig); + } +} + +bool TypeArgument::covariant_match(TypeArgument* other, Context* ctx) { + assert(_lower_bound != NULL, "Invalid lower bound"); + + if (other == this) { + return true; + } + + if (!_lower_bound->covariant_match(other->lower_bound(), ctx)) { + return false; + } + return true; +} + +TypeArgument* TypeArgument::canonicalize(Context* ctx, int ctx_depth) { + assert(_lower_bound != NULL, "Invalid lower bound"); + Type* lower = _lower_bound->canonicalize(ctx, ctx_depth); + Type* upper = NULL; + + if (_upper_bound == _lower_bound) { + upper = lower; + } else if (_upper_bound != NULL) { + upper = _upper_bound->canonicalize(ctx, ctx_depth); + } + + return new TypeArgument(lower, upper); +} + +#ifndef PRODUCT +void TypeArgument::print_on(outputStream* str) const { + str->indent().print_cr("TypeArgument {"); + { + streamIndentor si(str); + if (_lower_bound != NULL) { + str->indent().print("Lower bound: "); + _lower_bound->print_on(str); + } + if (_upper_bound != NULL) { + str->indent().print("Upper bound: "); + _upper_bound->print_on(str); + } + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +void Context::Mark::destroy() { + if (is_active()) { + _context->reset_to_mark(_marked_size); + } + deactivate(); +} + +void Context::apply_type_arguments( + InstanceKlass* current, InstanceKlass* super, TRAPS) { + assert(_cache != NULL, "Cannot use an empty context"); + ClassType* spec = NULL; + if (current != NULL) { + ClassDescriptor* descriptor = _cache->descriptor_for(current, CHECK); + if (super == current->super()) { + spec = descriptor->super(); + } else { + spec = descriptor->interface_desc(super->name()); + } + if (spec != NULL) { + _type_arguments.push(spec); + } + } +} + +void Context::reset_to_mark(int size) { + _type_arguments.trunc_to(size); +} + +ClassType* Context::at_depth(int i) const { + if (i < _type_arguments.length()) { + return _type_arguments.at(_type_arguments.length() - 1 - i); + } + return NULL; +} + +#ifndef PRODUCT +void Context::print_on(outputStream* str) const { + str->indent().print_cr("Context {"); + for (int i = 0; i < _type_arguments.length(); ++i) { + streamIndentor si(str); + str->indent().print("leval %d: ", i); + ClassType* ct = at_depth(i); + if (ct == NULL) { + str->print_cr(""); + continue; + } else { + str->print_cr("{"); + } + + for (int j = 0; j < ct->type_arguments_length(); ++j) { + streamIndentor si(str); + TypeArgument* ta = ct->type_argument_at(j); + Type* bound = ta->lower_bound(); + bound->print_on(str); + } + str->indent().print_cr("}"); + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +ClassDescriptor* DescriptorCache::descriptor_for(InstanceKlass* ik, TRAPS) { + + ClassDescriptor** existing = _class_descriptors.get(ik); + if (existing == NULL) { + ClassDescriptor* cd = ClassDescriptor::parse_generic_signature(ik, CHECK_NULL); + _class_descriptors.put(ik, cd); + return cd; + } else { + return *existing; + } +} + +MethodDescriptor* DescriptorCache::descriptor_for( + Method* mh, ClassDescriptor* cd, TRAPS) { + assert(mh != NULL && cd != NULL, "Should not be NULL"); + MethodDescriptor** existing = _method_descriptors.get(mh); + if (existing == NULL) { + MethodDescriptor* md = MethodDescriptor::parse_generic_signature(mh, cd); + _method_descriptors.put(mh, md); + return md; + } else { + return *existing; + } +} +MethodDescriptor* DescriptorCache::descriptor_for(Method* mh, TRAPS) { + ClassDescriptor* cd = descriptor_for( + InstanceKlass::cast(mh->method_holder()), CHECK_NULL); + return descriptor_for(mh, cd, THREAD); +} + +} // namespace generic diff --git a/hotspot/src/share/vm/classfile/genericSignatures.hpp b/hotspot/src/share/vm/classfile/genericSignatures.hpp new file mode 100644 index 00000000000..07eb4759357 --- /dev/null +++ b/hotspot/src/share/vm/classfile/genericSignatures.hpp @@ -0,0 +1,467 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_CLASSFILE_GENERICSIGNATURES_HPP +#define SHARE_VM_CLASSFILE_GENERICSIGNATURES_HPP + +#include "classfile/symbolTable.hpp" +#include "memory/allocation.hpp" +#include "runtime/signature.hpp" +#include "utilities/growableArray.hpp" +#include "utilities/resourceHash.hpp" + +class stringStream; + +namespace generic { + +class Identifier; +class ClassDescriptor; +class MethodDescriptor; + +class TypeParameter; // a formal type parameter declared in generic signatures +class TypeArgument; // The "type value" passed to fill parameters in supertypes +class TypeVariable; // A usage of a type parameter as a value +/** + * Example: + * + * class Foo extends Bar { int m(V v) {} } + * ^^^^^^ ^^^^^^ ^^ + * type parameters type argument type variable + * + * Note that a type variable could be passed as an argument too: + * class Foo extends Bar { int m(V v) {} } + * ^^^ + * type argument's value is a type variable + */ + + +class Type; +class ClassType; +class ArrayType; +class PrimitiveType; +class Context; +class DescriptorCache; + +class DescriptorStream; + +class Identifier : public ResourceObj { + private: + Symbol* _sym; + int _begin; + int _end; + + public: + Identifier(Symbol* sym, int begin, int end) : + _sym(sym), _begin(begin), _end(end) {} + + bool equals(Identifier* other); + bool equals(Symbol* sym); + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif // ndef PRODUCT +}; + +class Descriptor : public ResourceObj { + protected: + GrowableArray _type_parameters; + ClassDescriptor* _outer_class; + + Descriptor(GrowableArray& params, + ClassDescriptor* outer) + : _type_parameters(params), _outer_class(outer) {} + + public: + + ClassDescriptor* outer_class() { return _outer_class; } + void set_outer_class(ClassDescriptor* sig) { _outer_class = sig; } + + virtual ClassDescriptor* as_class_signature() { return NULL; } + virtual MethodDescriptor* as_method_signature() { return NULL; } + + bool is_class_signature() { return as_class_signature() != NULL; } + bool is_method_signature() { return as_method_signature() != NULL; } + + GrowableArray& type_parameters() { + return _type_parameters; + } + + TypeParameter* find_type_parameter(Identifier* id, int* param_depth); + + virtual void bind_variables_to_parameters() = 0; + +#ifndef PRODUCT + virtual void print_on(outputStream* str) const = 0; +#endif +}; + +class ClassDescriptor : public Descriptor { + private: + ClassType* _super; + GrowableArray _interfaces; + MethodDescriptor* _outer_method; + + ClassDescriptor(GrowableArray& ftp, ClassType* scs, + GrowableArray& sis, ClassDescriptor* outer_class = NULL, + MethodDescriptor* outer_method = NULL) + : Descriptor(ftp, outer_class), _super(scs), _interfaces(sis), + _outer_method(outer_method) {} + + static u2 get_outer_class_index(InstanceKlass* k, TRAPS); + static ClassDescriptor* parse_generic_signature(Klass* k, Symbol* original_name, TRAPS); + + public: + + virtual ClassDescriptor* as_class_signature() { return this; } + + MethodDescriptor* outer_method() { return _outer_method; } + void set_outer_method(MethodDescriptor* m) { _outer_method = m; } + + ClassType* super() { return _super; } + ClassType* interface_desc(Symbol* sym); + + static ClassDescriptor* parse_generic_signature(Klass* k, TRAPS); + static ClassDescriptor* parse_generic_signature(Symbol* sym); + + // For use in superclass chains in positions where this is no generic info + static ClassDescriptor* placeholder(InstanceKlass* klass); + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif + + ClassDescriptor* canonicalize(Context* ctx); + + // Linking sets the position index in any contained TypeVariable type + // to correspond to the location of that identifier in the formal type + // parameters. + void bind_variables_to_parameters(); +}; + +class MethodDescriptor : public Descriptor { + private: + GrowableArray _parameters; + Type* _return_type; + GrowableArray _throws; + + MethodDescriptor(GrowableArray& ftp, ClassDescriptor* outer, + GrowableArray& sigs, Type* rt, GrowableArray& throws) + : Descriptor(ftp, outer), _parameters(sigs), _return_type(rt), + _throws(throws) {} + + public: + + static MethodDescriptor* parse_generic_signature(Method* m, ClassDescriptor* outer); + static MethodDescriptor* parse_generic_signature(Symbol* sym, ClassDescriptor* outer); + + MethodDescriptor* as_method_signature() { return this; } + + // Performs generic analysis on the method parameters to determine + // if both methods refer to the same argument types. + bool covariant_match(MethodDescriptor* other, Context* ctx); + + // Returns a new method descriptor with all generic variables + // removed and replaced with whatever is indicated using the Context. + MethodDescriptor* canonicalize(Context* ctx); + + void bind_variables_to_parameters(); + +#ifndef PRODUCT + TempNewSymbol reify_signature(Context* ctx, TRAPS); + void print_on(outputStream* str) const; +#endif +}; + +class TypeParameter : public ResourceObj { + private: + Identifier* _identifier; + ClassType* _class_bound; + GrowableArray _interface_bounds; + + // The position is the ordinal location of the parameter within the + // formal parameter list (excluding outer classes). It is only set for + // formal type parameters that are associated with a class -- method + // type parameters are left as -1. When resolving a generic variable to + // find the actual type, this index is used to access the generic type + // argument in the provided context object. + int _position; // Assigned during variable linking + + TypeParameter(Identifier* id, ClassType* class_bound, + GrowableArray& interface_bounds) : + _identifier(id), _class_bound(class_bound), + _interface_bounds(interface_bounds), _position(-1) {} + + public: + static TypeParameter* parse_generic_signature(DescriptorStream* str); + + ClassType* bound(); + int position() { return _position; } + + void bind_variables_to_parameters(Descriptor* sig, int position); + Identifier* identifier() { return _identifier; } + + Type* resolve(Context* ctx, int inner_depth, int ctx_depth); + TypeParameter* canonicalize(Context* ctx, int ctx_depth); + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif +}; + +class Type : public ResourceObj { + public: + static Type* parse_generic_signature(DescriptorStream* str); + + virtual ClassType* as_class() { return NULL; } + virtual TypeVariable* as_variable() { return NULL; } + virtual ArrayType* as_array() { return NULL; } + virtual PrimitiveType* as_primitive() { return NULL; } + + virtual bool covariant_match(Type* gt, Context* ctx) = 0; + virtual Type* canonicalize(Context* ctx, int ctx_depth) = 0; + + virtual void bind_variables_to_parameters(Descriptor* sig) = 0; + +#ifndef PRODUCT + virtual void reify_signature(stringStream* ss, Context* ctx) = 0; + virtual void print_on(outputStream* str) const = 0; +#endif +}; + +class ClassType : public Type { + friend class ClassDescriptor; + protected: + Identifier* _identifier; + GrowableArray _type_arguments; + ClassType* _outer_class; + + ClassType(Identifier* identifier, + GrowableArray& args, + ClassType* outer) + : _identifier(identifier), _type_arguments(args), _outer_class(outer) {} + + // Returns true if there are inner classes to read + static Identifier* parse_generic_signature_simple( + GrowableArray* args, + bool* has_inner, DescriptorStream* str); + + static ClassType* parse_generic_signature(ClassType* outer, + DescriptorStream* str); + static ClassType* from_symbol(Symbol* sym); + + public: + ClassType* as_class() { return this; } + + static ClassType* parse_generic_signature(DescriptorStream* str); + static ClassType* java_lang_Object(); + + Identifier* identifier() { return _identifier; } + int type_arguments_length() { return _type_arguments.length(); } + TypeArgument* type_argument_at(int i); + + virtual ClassType* outer_class() { return _outer_class; } + + bool covariant_match(Type* gt, Context* ctx); + ClassType* canonicalize(Context* ctx, int context_depth); + + void bind_variables_to_parameters(Descriptor* sig); + +#ifndef PRODUCT + void reify_signature(stringStream* ss, Context* ctx); + void print_on(outputStream* str) const; +#endif +}; + +class TypeVariable : public Type { + private: + Identifier* _id; + TypeParameter* _parameter; // assigned during linking + + // how many steps "out" from inner classes, -1 if method + int _inner_depth; + + TypeVariable(Identifier* id) + : _id(id), _parameter(NULL), _inner_depth(0) {} + + public: + TypeVariable* as_variable() { return this; } + + static TypeVariable* parse_generic_signature(DescriptorStream* str); + + Identifier* identifier() { return _id; } + TypeParameter* parameter() { return _parameter; } + int inner_depth() { return _inner_depth; } + + void bind_variables_to_parameters(Descriptor* sig); + + Type* resolve(Context* ctx, int ctx_depth); + bool covariant_match(Type* gt, Context* ctx); + Type* canonicalize(Context* ctx, int ctx_depth); + +#ifndef PRODUCT + void reify_signature(stringStream* ss, Context* ctx); + void print_on(outputStream* str) const; +#endif +}; + +class ArrayType : public Type { + private: + Type* _base; + + ArrayType(Type* base) : _base(base) {} + + public: + ArrayType* as_array() { return this; } + + static ArrayType* parse_generic_signature(DescriptorStream* str); + + bool covariant_match(Type* gt, Context* ctx); + ArrayType* canonicalize(Context* ctx, int ctx_depth); + + void bind_variables_to_parameters(Descriptor* sig); + +#ifndef PRODUCT + void reify_signature(stringStream* ss, Context* ctx); + void print_on(outputStream* str) const; +#endif +}; + +class PrimitiveType : public Type { + friend class Type; + private: + char _type; // includes V for void + + PrimitiveType(char& type) : _type(type) {} + + public: + PrimitiveType* as_primitive() { return this; } + + bool covariant_match(Type* gt, Context* ctx); + PrimitiveType* canonicalize(Context* ctx, int ctx_depth); + + void bind_variables_to_parameters(Descriptor* sig); + +#ifndef PRODUCT + void reify_signature(stringStream* ss, Context* ctx); + void print_on(outputStream* str) const; +#endif +}; + +class TypeArgument : public ResourceObj { + private: + Type* _lower_bound; + Type* _upper_bound; // may be null or == _lower_bound + + TypeArgument(Type* lower_bound, Type* upper_bound) + : _lower_bound(lower_bound), _upper_bound(upper_bound) {} + + public: + + static TypeArgument* parse_generic_signature(DescriptorStream* str); + + Type* lower_bound() { return _lower_bound; } + Type* upper_bound() { return _upper_bound; } + + void bind_variables_to_parameters(Descriptor* sig); + TypeArgument* canonicalize(Context* ctx, int ctx_depth); + + bool covariant_match(TypeArgument* a, Context* ctx); + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif +}; + + +class Context : public ResourceObj { + private: + DescriptorCache* _cache; + GrowableArray _type_arguments; + + void reset_to_mark(int size); + + public: + // When this object goes out of scope or 'destroy' is + // called, then the application of the type to the + // context is wound-back (unless it's been deactivated). + class Mark : public StackObj { + private: + mutable Context* _context; + int _marked_size; + + bool is_active() const { return _context != NULL; } + void deactivate() const { _context = NULL; } + + public: + Mark() : _context(NULL), _marked_size(0) {} + Mark(Context* ctx, int sz) : _context(ctx), _marked_size(sz) {} + Mark(const Mark& m) : _context(m._context), _marked_size(m._marked_size) { + m.deactivate(); // Ownership is transferred + } + + Mark& operator=(const Mark& cm) { + destroy(); + _context = cm._context; + _marked_size = cm._marked_size; + cm.deactivate(); + return *this; + } + + void destroy(); + ~Mark() { destroy(); } + }; + + Context(DescriptorCache* cache) : _cache(cache) {} + + Mark mark() { return Mark(this, _type_arguments.length()); } + void apply_type_arguments(InstanceKlass* current, InstanceKlass* super,TRAPS); + + ClassType* at_depth(int i) const; + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif +}; + +/** + * Contains a cache of descriptors for classes and methods so they can be + * looked-up instead of reparsing each time they are needed. + */ +class DescriptorCache : public ResourceObj { + private: + ResourceHashtable _class_descriptors; + ResourceHashtable _method_descriptors; + + public: + ClassDescriptor* descriptor_for(InstanceKlass* ikh, TRAPS); + + MethodDescriptor* descriptor_for(Method* mh, ClassDescriptor* cd, TRAPS); + // Class descriptor derived from method holder + MethodDescriptor* descriptor_for(Method* mh, TRAPS); +}; + +} // namespace generic + +#endif // SHARE_VM_CLASSFILE_GENERICSIGNATURES_HPP + diff --git a/hotspot/src/share/vm/classfile/systemDictionary.hpp b/hotspot/src/share/vm/classfile/systemDictionary.hpp index 19ddbe9c9f8..21967f6d810 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.hpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp @@ -137,6 +137,7 @@ class SymbolPropertyTable; /* NOTE: needed too early in bootstrapping process to have checks based on JDK version */ \ /* Universe::is_gte_jdk14x_version() is not set up by this point. */ \ /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \ + do_klass(lambda_MagicLambdaImpl_klass, java_lang_invoke_MagicLambdaImpl, Opt ) \ do_klass(reflect_MagicAccessorImpl_klass, sun_reflect_MagicAccessorImpl, Opt ) \ do_klass(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Opt_Only_JDK14NewRef) \ do_klass(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \ diff --git a/hotspot/src/share/vm/classfile/verifier.cpp b/hotspot/src/share/vm/classfile/verifier.cpp index 3cb08c50bb9..27c135c0f04 100644 --- a/hotspot/src/share/vm/classfile/verifier.cpp +++ b/hotspot/src/share/vm/classfile/verifier.cpp @@ -555,9 +555,10 @@ void ClassVerifier::verify_class(TRAPS) { if (was_recursively_verified()) return; Method* m = methods->at(index); - if (m->is_native() || m->is_abstract()) { + if (m->is_native() || m->is_abstract() || m->is_overpass()) { // If m is native or abstract, skip it. It is checked in class file - // parser that methods do not override a final method. + // parser that methods do not override a final method. Overpass methods + // are trusted since the VM generates them. continue; } verify_method(methodHandle(THREAD, m), CHECK_VERIFY(this)); @@ -2304,11 +2305,21 @@ void ClassVerifier::verify_invoke_instructions( // Make sure the constant pool item is the right type u2 index = bcs->get_index_u2(); Bytecodes::Code opcode = bcs->raw_code(); - unsigned int types = (opcode == Bytecodes::_invokeinterface - ? 1 << JVM_CONSTANT_InterfaceMethodref - : opcode == Bytecodes::_invokedynamic - ? 1 << JVM_CONSTANT_InvokeDynamic - : 1 << JVM_CONSTANT_Methodref); + unsigned int types; + switch (opcode) { + case Bytecodes::_invokeinterface: + types = 1 << JVM_CONSTANT_InterfaceMethodref; + break; + case Bytecodes::_invokedynamic: + types = 1 << JVM_CONSTANT_InvokeDynamic; + break; + case Bytecodes::_invokespecial: + types = (1 << JVM_CONSTANT_InterfaceMethodref) | + (1 << JVM_CONSTANT_Methodref); + break; + default: + types = 1 << JVM_CONSTANT_Methodref; + } verify_cp_type(bcs->bci(), index, cp, types, CHECK_VERIFY(this)); // Get method name and signature diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 13819915ebd..218052da56c 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -258,6 +258,7 @@ template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \ template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \ template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \ + template(java_lang_invoke_MagicLambdaImpl, "java/lang/invoke/MagicLambdaImpl") \ /* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */ \ template(findMethodHandleType_name, "findMethodHandleType") \ template(findMethodHandleType_signature, "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \ diff --git a/hotspot/src/share/vm/code/dependencies.cpp b/hotspot/src/share/vm/code/dependencies.cpp index 4cdb499fe27..d5bd9fe9446 100644 --- a/hotspot/src/share/vm/code/dependencies.cpp +++ b/hotspot/src/share/vm/code/dependencies.cpp @@ -1160,7 +1160,11 @@ bool Dependencies::is_concrete_method(Method* m) { // We could also return false if m does not yet appear to be // executed, if the VM version supports this distinction also. - return !m->is_abstract(); + return !m->is_abstract() && + !InstanceKlass::cast(m->method_holder())->is_interface(); + // TODO: investigate whether default methods should be + // considered as "concrete" in this situation. For now they + // are not. } diff --git a/hotspot/src/share/vm/interpreter/linkResolver.cpp b/hotspot/src/share/vm/interpreter/linkResolver.cpp index c794f06e175..34232d7e64f 100644 --- a/hotspot/src/share/vm/interpreter/linkResolver.cpp +++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "classfile/defaultMethods.hpp" #include "classfile/systemDictionary.hpp" #include "classfile/vmSymbols.hpp" #include "compiler/compileBroker.hpp" @@ -404,21 +405,13 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) { - // 1. check if klass is not interface - if (resolved_klass->is_interface()) { - ResourceMark rm(THREAD); - char buf[200]; - jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name()); - THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); - } - Handle nested_exception; - // 2. lookup method in resolved klass and its super klasses + // 1. lookup method in resolved klass and its super klasses lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK); if (resolved_method.is_null()) { // not found in the class hierarchy - // 3. lookup method in all the interfaces implemented by the resolved klass + // 2. lookup method in all the interfaces implemented by the resolved klass lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK); if (resolved_method.is_null()) { @@ -432,7 +425,7 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res } if (resolved_method.is_null()) { - // 4. method lookup failed + // 3. method lookup failed ResourceMark rm(THREAD); THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(), Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()), @@ -442,6 +435,15 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res } } + // 4. check if klass is not interface + if (resolved_klass->is_interface() && resolved_method->is_abstract()) { + ResourceMark rm(THREAD); + char buf[200]; + jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", + resolved_klass()->external_name()); + THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); + } + // 5. check if method is concrete if (resolved_method->is_abstract() && !resolved_klass->is_abstract()) { ResourceMark rm(THREAD); @@ -743,6 +745,27 @@ void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) { + if (resolved_klass->is_interface() && current_klass() != NULL) { + // If the target class is a direct interface, treat this as a "super" + // default call. + // + // If the current method is an overpass that happens to call a direct + // super-interface's method, then we'll end up rerunning the default method + // analysis even though we don't need to, but that's ok since it will end + // up with the same answer. + InstanceKlass* ik = InstanceKlass::cast(current_klass()); + Array* interfaces = ik->local_interfaces(); + int num_interfaces = interfaces->length(); + for (int index = 0; index < num_interfaces; index++) { + if (interfaces->at(index) == resolved_klass()) { + Method* method = DefaultMethods::find_super_default(current_klass(), + resolved_klass(), method_name, method_signature, CHECK); + resolved_method = methodHandle(THREAD, method); + return; + } + } + } + resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK); // check if method name is , that it is found in same klass as static type @@ -784,11 +807,17 @@ void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle { KlassHandle method_klass = KlassHandle(THREAD, resolved_method->method_holder()); - if (check_access && + const bool direct_calling_default_method = + resolved_klass() != NULL && resolved_method() != NULL && + resolved_klass->is_interface() && !resolved_method->is_abstract(); + + if (!direct_calling_default_method && + check_access && // a) check if ACC_SUPER flag is set for the current class current_klass->is_super() && // b) check if the method class is a superclass of the current class (superclass relation is not reflexive!) - current_klass->is_subtype_of(method_klass()) && current_klass() != method_klass() && + current_klass->is_subtype_of(method_klass()) && + current_klass() != method_klass() && // c) check if the method is not resolved_method->name() != vmSymbols::object_initializer_name()) { // Lookup super method diff --git a/hotspot/src/share/vm/oops/constMethod.cpp b/hotspot/src/share/vm/oops/constMethod.cpp index bccb3e6f180..9a953e40501 100644 --- a/hotspot/src/share/vm/oops/constMethod.cpp +++ b/hotspot/src/share/vm/oops/constMethod.cpp @@ -34,29 +34,30 @@ const u2 ConstMethod::MAX_IDNUM = 0xFFFE; const u2 ConstMethod::UNSET_IDNUM = 0xFFFF; ConstMethod* ConstMethod::allocate(ClassLoaderData* loader_data, - int byte_code_size, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - TRAPS) { + int byte_code_size, + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + MethodType method_type, + TRAPS) { int size = ConstMethod::size(byte_code_size, compressed_line_number_size, localvariable_table_length, exception_table_length, checked_exceptions_length); return new (loader_data, size, true, THREAD) ConstMethod( - byte_code_size, compressed_line_number_size, - localvariable_table_length, exception_table_length, - checked_exceptions_length, size); + byte_code_size, compressed_line_number_size, localvariable_table_length, + exception_table_length, checked_exceptions_length, method_type, size); } ConstMethod::ConstMethod(int byte_code_size, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - int size) { + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + MethodType method_type, + int size) { No_Safepoint_Verifier no_safepoint; set_interpreter_kind(Interpreter::invalid); @@ -69,6 +70,7 @@ ConstMethod::ConstMethod(int byte_code_size, compressed_line_number_size, localvariable_table_length, exception_table_length); + set_method_type(method_type); assert(this->size() == size, "wrong size for object"); } diff --git a/hotspot/src/share/vm/oops/constMethod.hpp b/hotspot/src/share/vm/oops/constMethod.hpp index 026b4e53588..9712eee57eb 100644 --- a/hotspot/src/share/vm/oops/constMethod.hpp +++ b/hotspot/src/share/vm/oops/constMethod.hpp @@ -108,12 +108,17 @@ class ExceptionTableElement VALUE_OBJ_CLASS_SPEC { class ConstMethod : public MetaspaceObj { friend class VMStructs; + +public: + typedef enum { NORMAL, OVERPASS } MethodType; + private: enum { _has_linenumber_table = 1, _has_checked_exceptions = 2, _has_localvariable_table = 4, - _has_exception_table = 8 + _has_exception_table = 8, + _is_overpass = 16 }; // Bit vector of signature @@ -145,19 +150,22 @@ private: // Constructor ConstMethod(int byte_code_size, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - int size); + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + MethodType is_overpass, + int size); public: + static ConstMethod* allocate(ClassLoaderData* loader_data, - int byte_code_size, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - TRAPS); + int byte_code_size, + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + MethodType mt, + TRAPS); bool is_constMethod() const { return true; } @@ -179,6 +187,19 @@ public: bool has_exception_handler() const { return (_flags & _has_exception_table) != 0; } + MethodType method_type() const { + return ((_flags & _is_overpass) == 0) ? NORMAL : OVERPASS; + } + + void set_method_type(MethodType mt) { + if (mt == NORMAL) { + _flags &= ~(_is_overpass); + } else { + _flags |= _is_overpass; + } + } + + void set_interpreter_kind(int kind) { _interpreter_kind = kind; } int interpreter_kind(void) const { return _interpreter_kind; } diff --git a/hotspot/src/share/vm/oops/constantPool.cpp b/hotspot/src/share/vm/oops/constantPool.cpp index 7f81ca696af..094151d9d0b 100644 --- a/hotspot/src/share/vm/oops/constantPool.cpp +++ b/hotspot/src/share/vm/oops/constantPool.cpp @@ -1143,16 +1143,21 @@ void ConstantPool::copy_cp_to_impl(constantPoolHandle from_cp, int start_i, int int from_oplen = operand_array_length(from_cp->operands()); int old_oplen = operand_array_length(to_cp->operands()); if (from_oplen != 0) { + ClassLoaderData* loader_data = to_cp->pool_holder()->class_loader_data(); // append my operands to the target's operands array if (old_oplen == 0) { - to_cp->set_operands(from_cp->operands()); // reuse; do not merge + // Can't just reuse from_cp's operand list because of deallocation issues + int len = from_cp->operands()->length(); + Array* new_ops = MetadataFactory::new_array(loader_data, len, CHECK); + Copy::conjoint_memory_atomic( + from_cp->operands()->adr_at(0), new_ops->adr_at(0), len * sizeof(u2)); + to_cp->set_operands(new_ops); } else { int old_len = to_cp->operands()->length(); int from_len = from_cp->operands()->length(); int old_off = old_oplen * sizeof(u2); int from_off = from_oplen * sizeof(u2); // Use the metaspace for the destination constant pool - ClassLoaderData* loader_data = to_cp->pool_holder()->class_loader_data(); Array* new_operands = MetadataFactory::new_array(loader_data, old_len + from_len, CHECK); int fillp = 0, len = 0; // first part of dest diff --git a/hotspot/src/share/vm/oops/instanceKlass.cpp b/hotspot/src/share/vm/oops/instanceKlass.cpp index 89452acdcaa..c5b20d8ffd0 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.cpp +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp @@ -743,6 +743,35 @@ void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) { } } + if (this_oop->has_default_methods()) { + // Step 7.5: initialize any interfaces which have default methods + for (int i = 0; i < this_oop->local_interfaces()->length(); ++i) { + Klass* iface = this_oop->local_interfaces()->at(i); + InstanceKlass* ik = InstanceKlass::cast(iface); + if (ik->has_default_methods() && ik->should_be_initialized()) { + ik->initialize(THREAD); + + if (HAS_PENDING_EXCEPTION) { + Handle e(THREAD, PENDING_EXCEPTION); + CLEAR_PENDING_EXCEPTION; + { + EXCEPTION_MARK; + // Locks object, set state, and notify all waiting threads + this_oop->set_initialization_state_and_notify( + initialization_error, THREAD); + + // ignore any exception thrown, superclass initialization error is + // thrown below + CLEAR_PENDING_EXCEPTION; + } + DTRACE_CLASSINIT_PROBE_WAIT( + super__failed, InstanceKlass::cast(this_oop()), -1, wait); + THROW_OOP(e()); + } + } + } + } + // Step 8 { assert(THREAD->is_Java_thread(), "non-JavaThread in initialize_impl"); @@ -1252,11 +1281,7 @@ static int linear_search(Array* methods, Symbol* name, Symbol* signatur } #endif -Method* InstanceKlass::find_method(Symbol* name, Symbol* signature) const { - return InstanceKlass::find_method(methods(), name, signature); -} - -Method* InstanceKlass::find_method(Array* methods, Symbol* name, Symbol* signature) { +static int binary_search(Array* methods, Symbol* name) { int len = methods->length(); // methods are sorted, so do binary search int l = 0; @@ -1267,43 +1292,70 @@ Method* InstanceKlass::find_method(Array* methods, Symbol* name, Symbol assert(m->is_method(), "must be method"); int res = m->name()->fast_compare(name); if (res == 0) { - // found matching name; do linear search to find matching signature - // first, quick check for common case - if (m->signature() == signature) return m; - // search downwards through overloaded methods - int i; - for (i = mid - 1; i >= l; i--) { - Method* m = methods->at(i); - assert(m->is_method(), "must be method"); - if (m->name() != name) break; - if (m->signature() == signature) return m; - } - // search upwards - for (i = mid + 1; i <= h; i++) { - Method* m = methods->at(i); - assert(m->is_method(), "must be method"); - if (m->name() != name) break; - if (m->signature() == signature) return m; - } - // not found -#ifdef ASSERT - int index = linear_search(methods, name, signature); - assert(index == -1, err_msg("binary search should have found entry %d", index)); -#endif - return NULL; + return mid; } else if (res < 0) { l = mid + 1; } else { h = mid - 1; } } + return -1; +} + +Method* InstanceKlass::find_method(Symbol* name, Symbol* signature) const { + return InstanceKlass::find_method(methods(), name, signature); +} + +Method* InstanceKlass::find_method( + Array* methods, Symbol* name, Symbol* signature) { + int hit = binary_search(methods, name); + if (hit != -1) { + Method* m = methods->at(hit); + // Do linear search to find matching signature. First, quick check + // for common case + if (m->signature() == signature) return m; + // search downwards through overloaded methods + int i; + for (i = hit - 1; i >= 0; --i) { + Method* m = methods->at(i); + assert(m->is_method(), "must be method"); + if (m->name() != name) break; + if (m->signature() == signature) return m; + } + // search upwards + for (i = hit + 1; i < methods->length(); ++i) { + Method* m = methods->at(i); + assert(m->is_method(), "must be method"); + if (m->name() != name) break; + if (m->signature() == signature) return m; + } + // not found #ifdef ASSERT - int index = linear_search(methods, name, signature); - assert(index == -1, err_msg("binary search should have found entry %d", index)); + int index = linear_search(methods, name, signature); + assert(index == -1, err_msg("binary search should have found entry %d", index)); #endif + } return NULL; } +int InstanceKlass::find_method_by_name(Symbol* name, int* end) { + return find_method_by_name(methods(), name, end); +} + +int InstanceKlass::find_method_by_name( + Array* methods, Symbol* name, int* end_ptr) { + assert(end_ptr != NULL, "just checking"); + int start = binary_search(methods, name); + int end = start + 1; + if (start != -1) { + while (start - 1 >= 0 && (methods->at(start - 1))->name() == name) --start; + while (end < methods->length() && (methods->at(end))->name() == name) ++end; + *end_ptr = end; + return start; + } + return -1; +} + Method* InstanceKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const { Klass* klass = const_cast(this); while (klass != NULL) { diff --git a/hotspot/src/share/vm/oops/instanceKlass.hpp b/hotspot/src/share/vm/oops/instanceKlass.hpp index 937cd6cc092..f427f338c02 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.hpp +++ b/hotspot/src/share/vm/oops/instanceKlass.hpp @@ -245,6 +245,10 @@ class InstanceKlass: public Klass { unsigned char * _cached_class_file_bytes; // JVMTI: cached class file, before retransformable agent modified it in CFLH jint _cached_class_file_len; // JVMTI: length of above JvmtiCachedClassFieldMap* _jvmti_cached_class_field_map; // JVMTI: used during heap iteration + + // true if class, superclass, or implemented interfaces have default methods + bool _has_default_methods; + volatile u2 _idnum_allocated_count; // JNI/JVMTI: increments with the addition of methods, old ids don't change // Method array. Array* _methods; @@ -492,6 +496,13 @@ class InstanceKlass: public Klass { // (returns NULL if not found) Method* lookup_method_in_all_interfaces(Symbol* name, Symbol* signature) const; + // Find method indices by name. If a method with the specified name is + // found the index to the first method is returned, and 'end' is filled in + // with the index of first non-name-matching method. If no method is found + // -1 is returned. + int find_method_by_name(Symbol* name, int* end); + static int find_method_by_name(Array* methods, Symbol* name, int* end); + // constant pool ConstantPool* constants() const { return _constants; } void set_constants(ConstantPool* c) { _constants = c; } @@ -592,6 +603,9 @@ class InstanceKlass: public Klass { return _jvmti_cached_class_field_map; } + bool has_default_methods() const { return _has_default_methods; } + void set_has_default_methods(bool b) { _has_default_methods = b; } + // for adding methods, ConstMethod::UNSET_IDNUM means no more ids available inline u2 next_method_idnum(); void set_initial_method_idnum(u2 value) { _idnum_allocated_count = value; } @@ -728,7 +742,6 @@ class InstanceKlass: public Klass { GrowableArray* compute_secondary_supers(int num_extra_slots); bool compute_is_subtype_of(Klass* k); bool can_be_primary_super_slow() const; - Klass* java_super() const { return super(); } int oop_size(oop obj) const { return size_helper(); } bool oop_is_instance_slow() const { return true; } @@ -750,6 +763,10 @@ class InstanceKlass: public Klass { return (InstanceKlass*) k; } + InstanceKlass* java_super() const { + return (super() == NULL) ? NULL : cast(super()); + } + // Sizing (in words) static int header_size() { return align_object_offset(sizeof(InstanceKlass)/HeapWordSize); } static int size(int vtable_length, int itable_length, diff --git a/hotspot/src/share/vm/oops/klassVtable.cpp b/hotspot/src/share/vm/oops/klassVtable.cpp index a522ab5152a..efaf20c124e 100644 --- a/hotspot/src/share/vm/oops/klassVtable.cpp +++ b/hotspot/src/share/vm/oops/klassVtable.cpp @@ -54,22 +54,16 @@ inline InstanceKlass* klassVtable::ik() const { // the same name and signature as m), then m is a Miranda method which is // entered as a public abstract method in C's vtable. From then on it should // treated as any other public method in C for method over-ride purposes. -void klassVtable::compute_vtable_size_and_num_mirandas(int &vtable_length, - int &num_miranda_methods, - Klass* super, - Array* methods, - AccessFlags class_flags, - Handle classloader, - Symbol* classname, - Array* local_interfaces, - TRAPS - ) { - +void klassVtable::compute_vtable_size_and_num_mirandas( + int* vtable_length_ret, int* num_new_mirandas, + GrowableArray* all_mirandas, Klass* super, + Array* methods, AccessFlags class_flags, + Handle classloader, Symbol* classname, Array* local_interfaces, + TRAPS) { No_Safepoint_Verifier nsv; // set up default result values - vtable_length = 0; - num_miranda_methods = 0; + int vtable_length = 0; // start off with super's vtable length InstanceKlass* sk = (InstanceKlass*)super; @@ -86,9 +80,12 @@ void klassVtable::compute_vtable_size_and_num_mirandas(int &vtable_length, } } + GrowableArray new_mirandas(20); // compute the number of mirandas methods that must be added to the end - num_miranda_methods = get_num_mirandas(super, methods, local_interfaces); - vtable_length += (num_miranda_methods * vtableEntry::size()); + get_mirandas(&new_mirandas, all_mirandas, super, methods, local_interfaces); + *num_new_mirandas = new_mirandas.length(); + + vtable_length += *num_new_mirandas * vtableEntry::size(); if (Universe::is_bootstrapping() && vtable_length == 0) { // array classes don't have their superclass set correctly during @@ -109,6 +106,8 @@ void klassVtable::compute_vtable_size_and_num_mirandas(int &vtable_length, "bad vtable size for class Object"); assert(vtable_length % vtableEntry::size() == 0, "bad vtable length"); assert(vtable_length >= Universe::base_vtable_size(), "vtable too small"); + + *vtable_length_ret = vtable_length; } int klassVtable::index_of(Method* m, int len) const { @@ -191,7 +190,7 @@ void klassVtable::initialize_vtable(bool checkconstraints, TRAPS) { } // add miranda methods; it will also update the value of initialized - fill_in_mirandas(initialized); + fill_in_mirandas(&initialized); // In class hierarchies where the accessibility is not increasing (i.e., going from private -> // package_private -> publicprotected), the vtable might actually be smaller than our initial @@ -249,6 +248,11 @@ InstanceKlass* klassVtable::find_transitive_override(InstanceKlass* initialsuper return superk; } +// Methods that are "effectively" final don't need vtable entries. +bool method_is_effectively_final( + AccessFlags klass_flags, methodHandle target) { + return target->is_final() || klass_flags.is_final() && !target->is_overpass(); +} // Update child's copy of super vtable for overrides // OR return true if a new vtable entry is required @@ -269,7 +273,7 @@ bool klassVtable::update_inherited_vtable(InstanceKlass* klass, methodHandle tar return false; } - if (klass->is_final() || target_method()->is_final()) { + if (method_is_effectively_final(klass->access_flags(), target_method)) { // a final method never needs a new entry; final methods can be statically // resolved and they have to be present in the vtable only if they override // a super's method, in which case they re-use its entry @@ -406,7 +410,8 @@ bool klassVtable::needs_new_vtable_entry(methodHandle target_method, Symbol* classname, AccessFlags class_flags, TRAPS) { - if ((class_flags.is_final() || target_method()->is_final()) || + + if (method_is_effectively_final(class_flags, target_method) || // a final method never needs a new entry; final methods can be statically // resolved and they have to be present in the vtable only if they override // a super's method, in which case they re-use its entry @@ -502,7 +507,7 @@ bool klassVtable::is_miranda_entry_at(int i) { // miranda methods are interface methods in a class's vtable if (mhk->is_interface()) { - assert(m->is_public() && m->is_abstract(), "should be public and abstract"); + assert(m->is_public(), "should be public"); assert(ik()->implements_interface(method_holder) , "this class should implement the interface"); assert(is_miranda(m, ik()->methods(), ik()->super()), "should be a miranda_method"); return true; @@ -532,19 +537,19 @@ bool klassVtable::is_miranda(Method* m, Array* class_methods, Klass* su return false; } -void klassVtable::add_new_mirandas_to_list(GrowableArray* list_of_current_mirandas, - Array* current_interface_methods, - Array* class_methods, - Klass* super) { +void klassVtable::add_new_mirandas_to_lists( + GrowableArray* new_mirandas, GrowableArray* all_mirandas, + Array* current_interface_methods, Array* class_methods, + Klass* super) { // iterate thru the current interface's method to see if it a miranda int num_methods = current_interface_methods->length(); for (int i = 0; i < num_methods; i++) { Method* im = current_interface_methods->at(i); bool is_duplicate = false; - int num_of_current_mirandas = list_of_current_mirandas->length(); + int num_of_current_mirandas = new_mirandas->length(); // check for duplicate mirandas in different interfaces we implement for (int j = 0; j < num_of_current_mirandas; j++) { - Method* miranda = list_of_current_mirandas->at(j); + Method* miranda = new_mirandas->at(j); if ((im->name() == miranda->name()) && (im->signature() == miranda->signature())) { is_duplicate = true; @@ -557,51 +562,47 @@ void klassVtable::add_new_mirandas_to_list(GrowableArray* list_of_curre InstanceKlass *sk = InstanceKlass::cast(super); // check if it is a duplicate of a super's miranda if (sk->lookup_method_in_all_interfaces(im->name(), im->signature()) == NULL) { - list_of_current_mirandas->append(im); + new_mirandas->append(im); + } + if (all_mirandas != NULL) { + all_mirandas->append(im); } } } } } -void klassVtable::get_mirandas(GrowableArray* mirandas, +void klassVtable::get_mirandas(GrowableArray* new_mirandas, + GrowableArray* all_mirandas, Klass* super, Array* class_methods, Array* local_interfaces) { - assert((mirandas->length() == 0) , "current mirandas must be 0"); + assert((new_mirandas->length() == 0) , "current mirandas must be 0"); // iterate thru the local interfaces looking for a miranda int num_local_ifs = local_interfaces->length(); for (int i = 0; i < num_local_ifs; i++) { InstanceKlass *ik = InstanceKlass::cast(local_interfaces->at(i)); - add_new_mirandas_to_list(mirandas, ik->methods(), class_methods, super); + add_new_mirandas_to_lists(new_mirandas, all_mirandas, + ik->methods(), class_methods, super); // iterate thru each local's super interfaces Array* super_ifs = ik->transitive_interfaces(); int num_super_ifs = super_ifs->length(); for (int j = 0; j < num_super_ifs; j++) { InstanceKlass *sik = InstanceKlass::cast(super_ifs->at(j)); - add_new_mirandas_to_list(mirandas, sik->methods(), class_methods, super); + add_new_mirandas_to_lists(new_mirandas, all_mirandas, + sik->methods(), class_methods, super); } } } -// get number of mirandas -int klassVtable::get_num_mirandas(Klass* super, Array* class_methods, Array* local_interfaces) { - ResourceMark rm; - GrowableArray* mirandas = new GrowableArray(20); - get_mirandas(mirandas, super, class_methods, local_interfaces); - return mirandas->length(); -} - // fill in mirandas -void klassVtable::fill_in_mirandas(int& initialized) { - ResourceMark rm; - GrowableArray* mirandas = new GrowableArray(20); - InstanceKlass *this_ik = ik(); - get_mirandas(mirandas, this_ik->super(), this_ik->methods(), this_ik->local_interfaces()); - int num_mirandas = mirandas->length(); - for (int i = 0; i < num_mirandas; i++) { - put_method_at(mirandas->at(i), initialized); - initialized++; +void klassVtable::fill_in_mirandas(int* initialized) { + GrowableArray mirandas(20); + get_mirandas(&mirandas, NULL, ik()->super(), ik()->methods(), + ik()->local_interfaces()); + for (int i = 0; i < mirandas.length(); i++) { + put_method_at(mirandas.at(i), *initialized); + ++(*initialized); } } diff --git a/hotspot/src/share/vm/oops/klassVtable.hpp b/hotspot/src/share/vm/oops/klassVtable.hpp index ca0ba34bdd6..c2c0c5cf177 100644 --- a/hotspot/src/share/vm/oops/klassVtable.hpp +++ b/hotspot/src/share/vm/oops/klassVtable.hpp @@ -84,11 +84,11 @@ class klassVtable : public ResourceObj { bool is_initialized(); // computes vtable length (in words) and the number of miranda methods - static void compute_vtable_size_and_num_mirandas(int &vtable_length, int &num_miranda_methods, - Klass* super, Array* methods, - AccessFlags class_flags, Handle classloader, - Symbol* classname, Array* local_interfaces, - TRAPS); + static void compute_vtable_size_and_num_mirandas( + int* vtable_length, int* num_new_mirandas, + GrowableArray* all_mirandas, Klass* super, + Array* methods, AccessFlags class_flags, Handle classloader, + Symbol* classname, Array* local_interfaces, TRAPS); // RedefineClasses() API support: // If any entry of this vtable points to any of old_methods, @@ -125,12 +125,17 @@ class klassVtable : public ResourceObj { // support for miranda methods bool is_miranda_entry_at(int i); - void fill_in_mirandas(int& initialized); + void fill_in_mirandas(int* initialized); static bool is_miranda(Method* m, Array* class_methods, Klass* super); - static void add_new_mirandas_to_list(GrowableArray* list_of_current_mirandas, Array* current_interface_methods, Array* class_methods, Klass* super); - static void get_mirandas(GrowableArray* mirandas, Klass* super, Array* class_methods, Array* local_interfaces); - static int get_num_mirandas(Klass* super, Array* class_methods, Array* local_interfaces); - + static void add_new_mirandas_to_lists( + GrowableArray* new_mirandas, + GrowableArray* all_mirandas, + Array* current_interface_methods, Array* class_methods, + Klass* super); + static void get_mirandas( + GrowableArray* new_mirandas, + GrowableArray* all_mirandas, Klass* super, + Array* class_methods, Array* local_interfaces); void verify_against(outputStream* st, klassVtable* vt, int index); inline InstanceKlass* ik() const; diff --git a/hotspot/src/share/vm/oops/method.cpp b/hotspot/src/share/vm/oops/method.cpp index 5a1032f771e..19d0e1b81a7 100644 --- a/hotspot/src/share/vm/oops/method.cpp +++ b/hotspot/src/share/vm/oops/method.cpp @@ -35,6 +35,7 @@ #include "memory/generation.hpp" #include "memory/metadataFactory.hpp" #include "memory/oopFactory.hpp" +#include "oops/constMethod.hpp" #include "oops/methodData.hpp" #include "oops/method.hpp" #include "oops/oop.inline.hpp" @@ -57,22 +58,24 @@ // Implementation of Method Method* Method::allocate(ClassLoaderData* loader_data, - int byte_code_size, - AccessFlags access_flags, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - TRAPS) { + int byte_code_size, + AccessFlags access_flags, + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + ConstMethod::MethodType method_type, + TRAPS) { assert(!access_flags.is_native() || byte_code_size == 0, "native methods should not contain byte codes"); ConstMethod* cm = ConstMethod::allocate(loader_data, - byte_code_size, - compressed_line_number_size, - localvariable_table_length, - exception_table_length, - checked_exceptions_length, - CHECK_NULL); + byte_code_size, + compressed_line_number_size, + localvariable_table_length, + exception_table_length, + checked_exceptions_length, + method_type, + CHECK_NULL); int size = Method::size(access_flags.is_native()); @@ -1031,7 +1034,7 @@ methodHandle Method::make_method_handle_intrinsic(vmIntrinsics::ID iid, methodHandle m; { Method* m_oop = Method::allocate(loader_data, 0, accessFlags_from(flags_bits), - 0, 0, 0, 0, CHECK_(empty)); + 0, 0, 0, 0, ConstMethod::NORMAL, CHECK_(empty)); m = methodHandle(THREAD, m_oop); } m->set_constants(cp()); @@ -1083,15 +1086,16 @@ methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int n int localvariable_len = m->localvariable_table_length(); int exception_table_len = m->exception_table_length(); - ClassLoaderData* loader_data = m()->method_holder()->class_loader_data(); + ClassLoaderData* loader_data = m->method_holder()->class_loader_data(); Method* newm_oop = Method::allocate(loader_data, - new_code_length, - flags, - new_compressed_linenumber_size, - localvariable_len, - exception_table_len, - checked_exceptions_len, - CHECK_(methodHandle())); + new_code_length, + flags, + new_compressed_linenumber_size, + localvariable_len, + exception_table_len, + checked_exceptions_len, + m->method_type(), + CHECK_(methodHandle())); methodHandle newm (THREAD, newm_oop); int new_method_size = newm->method_size(); diff --git a/hotspot/src/share/vm/oops/method.hpp b/hotspot/src/share/vm/oops/method.hpp index 5e779a57cc1..1ab0c3e3584 100644 --- a/hotspot/src/share/vm/oops/method.hpp +++ b/hotspot/src/share/vm/oops/method.hpp @@ -30,7 +30,6 @@ #include "compiler/oopMap.hpp" #include "interpreter/invocationCounter.hpp" #include "oops/annotations.hpp" -#include "oops/constMethod.hpp" #include "oops/constantPool.hpp" #include "oops/instanceKlass.hpp" #include "oops/oop.hpp" @@ -104,6 +103,7 @@ class CheckedExceptionElement; class LocalVariableTableElement; class AdapterHandlerEntry; class MethodData; +class ConstMethod; class Method : public Metadata { friend class VMStructs; @@ -158,14 +158,16 @@ class Method : public Metadata { // Constructor Method(ConstMethod* xconst, AccessFlags access_flags, int size); public: + static Method* allocate(ClassLoaderData* loader_data, - int byte_code_size, - AccessFlags access_flags, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - TRAPS); + int byte_code_size, + AccessFlags access_flags, + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + ConstMethod::MethodType method_type, + TRAPS); Method() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } @@ -725,6 +727,10 @@ class Method : public Metadata { void set_dont_inline(bool x) { _dont_inline = x; } bool is_hidden() { return _hidden; } void set_hidden(bool x) { _hidden = x; } + ConstMethod::MethodType method_type() const { + return _constMethod->method_type(); + } + bool is_overpass() const { return method_type() == ConstMethod::OVERPASS; } // On-stack replacement support bool has_osr_nmethod(int level, bool match_level) { diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index ad48aa1ae24..5089743d1ff 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -3590,6 +3590,15 @@ class CommandLineFlags { product(uintx, StringTableSize, 1009, \ "Number of buckets in the interned String table") \ \ + develop(bool, TraceDefaultMethods, false, \ + "Trace the default method processing steps") \ + \ + develop(bool, ParseAllGenericSignatures, false, \ + "Parse all generic signatures while classloading") \ + \ + develop(bool, VerifyGenericSignatures, false, \ + "Abort VM on erroneous or inconsistent generic signatures") \ + \ product(bool, UseVMInterruptibleIO, false, \ "(Unstable, Solaris-specific) Thread interrupt before or with " \ "EINTR for I/O operations results in OS_INTRPT. The default value"\ diff --git a/hotspot/src/share/vm/runtime/reflection.cpp b/hotspot/src/share/vm/runtime/reflection.cpp index a999eadb254..d87c7ae085a 100644 --- a/hotspot/src/share/vm/runtime/reflection.cpp +++ b/hotspot/src/share/vm/runtime/reflection.cpp @@ -472,6 +472,12 @@ bool Reflection::verify_class_access(Klass* current_class, Klass* new_class, boo return true; } + // Also allow all accesses from + // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially. + if (current_class->is_subclass_of(SystemDictionary::lambda_MagicLambdaImpl_klass())) { + return true; + } + return can_relax_access_check_for(current_class, new_class, classloader_only); } @@ -564,6 +570,12 @@ bool Reflection::verify_field_access(Klass* current_class, return true; } + // Also allow all accesses from + // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially. + if (current_class->is_subclass_of(SystemDictionary::lambda_MagicLambdaImpl_klass())) { + return true; + } + return can_relax_access_check_for( current_class, field_class, classloader_only); } diff --git a/hotspot/src/share/vm/utilities/growableArray.hpp b/hotspot/src/share/vm/utilities/growableArray.hpp index 5ecb3e4a270..932d0a20260 100644 --- a/hotspot/src/share/vm/utilities/growableArray.hpp +++ b/hotspot/src/share/vm/utilities/growableArray.hpp @@ -217,7 +217,12 @@ template class GrowableArray : public GenericGrowableArray { return missed; } - E at(int i) const { + E& at(int i) { + assert(0 <= i && i < _len, "illegal index"); + return _data[i]; + } + + E const& at(int i) const { assert(0 <= i && i < _len, "illegal index"); return _data[i]; } diff --git a/hotspot/src/share/vm/utilities/pair.hpp b/hotspot/src/share/vm/utilities/pair.hpp new file mode 100644 index 00000000000..d0bb5d65c4b --- /dev/null +++ b/hotspot/src/share/vm/utilities/pair.hpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_UTILITIES_PAIR_HPP +#define SHARE_VM_UTILITIES_PAIR_HPP + +#include "memory/allocation.hpp" +#include "utilities/top.hpp" + +template +class Pair : public ALLOC_BASE { + public: + T first; + V second; + + Pair() {} + Pair(T t, V v) : first(t), second(v) {} +}; + + +#endif // SHARE_VM_UTILITIES_PAIR_HPP diff --git a/hotspot/src/share/vm/utilities/resourceHash.hpp b/hotspot/src/share/vm/utilities/resourceHash.hpp new file mode 100644 index 00000000000..87cc8ffdb34 --- /dev/null +++ b/hotspot/src/share/vm/utilities/resourceHash.hpp @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_UTILITIES_RESOURCEHASH_HPP +#define SHARE_VM_UTILITIES_RESOURCEHASH_HPP + +#include "memory/allocation.hpp" +#include "utilities/top.hpp" + +template struct ResourceHashtableFns { + typedef unsigned (*hash_fn)(K const&); + typedef bool (*equals_fn)(K const&, K const&); +}; + +template unsigned primitive_hash(const K& k) { + unsigned hash = (unsigned)((uintptr_t)k); + return hash ^ (hash > 3); // just in case we're dealing with aligned ptrs +} + +template bool primitive_equals(const K& k0, const K& k1) { + return k0 == k1; +} + +template< + typename K, typename V, + typename ResourceHashtableFns::hash_fn HASH = primitive_hash, + typename ResourceHashtableFns::equals_fn EQUALS = primitive_equals, + unsigned SIZE = 256 + > +class ResourceHashtable : public ResourceObj { + private: + + class Node : public ResourceObj { + public: + unsigned _hash; + K _key; + V _value; + Node* _next; + + Node(unsigned hash, K const& key, V const& value) : + _hash(hash), _key(key), _value(value), _next(NULL) {} + }; + + Node* _table[SIZE]; + + // Returns a pointer to where the node where the value would reside if + // it's in the table. + Node** lookup_node(unsigned hash, K const& key) { + unsigned index = hash % SIZE; + Node** ptr = &_table[index]; + while (*ptr != NULL) { + Node* node = *ptr; + if (node->_hash == hash && EQUALS(key, node->_key)) { + break; + } + ptr = &(node->_next); + } + return ptr; + } + + Node const** lookup_node(unsigned hash, K const& key) const { + return const_cast( + const_cast(this)->lookup_node(hash, key)); + } + + public: + ResourceHashtable() { memset(_table, 0, SIZE * sizeof(Node*)); } + + bool contains(K const& key) const { + return get(key) != NULL; + } + + V* get(K const& key) const { + unsigned hv = HASH(key); + Node const** ptr = lookup_node(hv, key); + if (*ptr != NULL) { + return const_cast(&(*ptr)->_value); + } else { + return NULL; + } + } + + // Inserts or replaces a value in the table + void put(K const& key, V const& value) { + unsigned hv = HASH(key); + Node** ptr = lookup_node(hv, key); + if (*ptr != NULL) { + (*ptr)->_value = value; + } else { + *ptr = new Node(hv, key, value); + } + } + + // ITER contains bool do_entry(K const&, V const&), which will be + // called for each entry in the table. If do_entry() returns false, + // the iteration is cancelled. + template + void iterate(ITER* iter) const { + Node* const* bucket = _table; + while (bucket < &_table[SIZE]) { + Node* node = *bucket; + while (node != NULL) { + bool cont = iter->do_entry(node->_key, node->_value); + if (!cont) { return; } + node = node->_next; + } + ++bucket; + } + } +}; + + +#endif // SHARE_VM_UTILITIES_RESOURCEHASH_HPP From a9c40e9df41ee06adcd7fff951dd36b6c093a24b Mon Sep 17 00:00:00 2001 From: Yumin Qi Date: Fri, 2 Nov 2012 13:30:47 -0700 Subject: [PATCH 030/241] 8000489: older builds of hsdis don't work anymore after 6879063 The old function not defined properly, need a definition for export in dll. Also changes made to let new jvm work with old hsdis. Reviewed-by: jrose, sspitsyn, kmo --- hotspot/src/share/tools/hsdis/hsdis-demo.c | 63 +++++++++++++------ hotspot/src/share/tools/hsdis/hsdis.c | 13 ++-- hotspot/src/share/tools/hsdis/hsdis.h | 40 +++++++++--- .../src/share/vm/compiler/disassembler.cpp | 44 ++++++++++--- .../src/share/vm/compiler/disassembler.hpp | 15 ++++- 5 files changed, 131 insertions(+), 44 deletions(-) diff --git a/hotspot/src/share/tools/hsdis/hsdis-demo.c b/hotspot/src/share/tools/hsdis/hsdis-demo.c index 2f7b67d3649..b9586ee32e8 100644 --- a/hotspot/src/share/tools/hsdis/hsdis-demo.c +++ b/hotspot/src/share/tools/hsdis/hsdis-demo.c @@ -85,9 +85,11 @@ void end_of_file() { } #include "dlfcn.h" -#define DECODE_INSTRUCTIONS_NAME "decode_instructions_virtual" +#define DECODE_INSTRUCTIONS_VIRTUAL_NAME "decode_instructions_virtual" +#define DECODE_INSTRUCTIONS_NAME "decode_instructions" #define HSDIS_NAME "hsdis" static void* decode_instructions_pv = 0; +static void* decode_instructions_sv = 0; static const char* hsdis_path[] = { HSDIS_NAME"-"LIBARCH LIB_EXT, "./" HSDIS_NAME"-"LIBARCH LIB_EXT, @@ -101,11 +103,12 @@ static const char* load_decode_instructions() { void* dllib = NULL; const char* *next_in_path = hsdis_path; while (1) { - decode_instructions_pv = dlsym(dllib, DECODE_INSTRUCTIONS_NAME); - if (decode_instructions_pv != NULL) + decode_instructions_pv = dlsym(dllib, DECODE_INSTRUCTIONS_VIRTUAL_NAME); + decode_instructions_sv = dlsym(dllib, DECODE_INSTRUCTIONS_NAME); + if (decode_instructions_pv != NULL || decode_instructions_sv != NULL) return NULL; if (dllib != NULL) - return "plugin does not defined "DECODE_INSTRUCTIONS_NAME; + return "plugin does not defined "DECODE_INSTRUCTIONS_VIRTUAL_NAME" and "DECODE_INSTRUCTIONS_NAME; for (dllib = NULL; dllib == NULL; ) { const char* next_lib = (*next_in_path++); if (next_lib == NULL) @@ -213,20 +216,44 @@ void disassemble(uintptr_t from, uintptr_t to) { printf("%s: %s\n", err, dlerror()); exit(1); } - printf("Decoding from %p to %p...\n", from, to); - decode_instructions_ftype decode_instructions - = (decode_instructions_ftype) decode_instructions_pv; + decode_func_vtype decode_instructions_v + = (decode_func_vtype) decode_instructions_pv; + decode_func_stype decode_instructions_s + = (decode_func_stype) decode_instructions_sv; void* res; - if (raw && xml) { - res = (*decode_instructions)(from, to, (unsigned char*)from, to - from, simple_handle_event, stdout, NULL, stdout, options); - } else if (raw) { - res = (*decode_instructions)(from, to, (unsigned char*)from, to - from, simple_handle_event, stdout, NULL, stdout, options); - } else { - res = (*decode_instructions)(from, to, (unsigned char*)from, to - from, - handle_event, (void*) event_cookie, - fprintf_callback, stdout, - options); + if (decode_instructions_pv != NULL) { + printf("\nDecoding from %p to %p...with %s\n", from, to, DECODE_INSTRUCTIONS_VIRTUAL_NAME); + if (raw) { + res = (*decode_instructions_v)(from, to, + (unsigned char*)from, to - from, + simple_handle_event, stdout, + NULL, stdout, + options, 0); + } else { + res = (*decode_instructions_v)(from, to, + (unsigned char*)from, to - from, + handle_event, (void*) event_cookie, + fprintf_callback, stdout, + options, 0); + } + if (res != (void*)to) + printf("*** Result was %p!\n", res); + } + void* sres; + if (decode_instructions_sv != NULL) { + printf("\nDecoding from %p to %p...with old decode_instructions\n", from, to, DECODE_INSTRUCTIONS_NAME); + if (raw) { + sres = (*decode_instructions_s)(from, to, + simple_handle_event, stdout, + NULL, stdout, + options); + } else { + sres = (*decode_instructions_s)(from, to, + handle_event, (void*) event_cookie, + fprintf_callback, stdout, + options); + } + if (sres != (void *)to) + printf("*** Result of decode_instructions %p!\n", sres); } - if (res != (void*)to) - printf("*** Result was %p!\n", res); } diff --git a/hotspot/src/share/tools/hsdis/hsdis.c b/hotspot/src/share/tools/hsdis/hsdis.c index 251344e0ce8..397793021c0 100644 --- a/hotspot/src/share/tools/hsdis/hsdis.c +++ b/hotspot/src/share/tools/hsdis/hsdis.c @@ -99,7 +99,7 @@ decode_instructions_virtual(uintptr_t start_va, uintptr_t end_va, unsigned char* buffer, uintptr_t length, event_callback_t event_callback_arg, void* event_stream_arg, printf_callback_t printf_callback_arg, void* printf_stream_arg, - const char* options) { + const char* options, int newline) { struct hsdis_app_data app_data; memset(&app_data, 0, sizeof(app_data)); app_data.start_va = start_va; @@ -110,7 +110,7 @@ decode_instructions_virtual(uintptr_t start_va, uintptr_t end_va, app_data.event_stream = event_stream_arg; app_data.printf_callback = printf_callback_arg; app_data.printf_stream = printf_stream_arg; - app_data.do_newline = false; + app_data.do_newline = newline == 0 ? false : true; return decode(&app_data, options); } @@ -132,7 +132,7 @@ decode_instructions(void* start_pv, void* end_pv, event_stream_arg, printf_callback_arg, printf_stream_arg, - options); + options, false); } static void* decode(struct hsdis_app_data* app_data, const char* options) { @@ -173,7 +173,7 @@ static void* decode(struct hsdis_app_data* app_data, const char* options) { if (!app_data->losing) { const char* insn_close = format_insn_close("/insn", &app_data->dinfo, buf, sizeof(buf)); - (*event_callback)(event_stream, insn_close, (void*) p) != NULL; + (*event_callback)(event_stream, insn_close, (void*) p); if (app_data->do_newline) { /* follow each complete insn by a nice newline */ @@ -182,13 +182,14 @@ static void* decode(struct hsdis_app_data* app_data, const char* options) { } } - (*event_callback)(event_stream, "/insns", (void*) p); + if (app_data->losing) (*event_callback)(event_stream, "/insns", (void*) p); return (void*) p; } } /* take the address of the function, for luck, and also test the typedef: */ -const decode_instructions_ftype decode_instructions_address = &decode_instructions_virtual; +const decode_func_vtype decode_func_virtual_address = &decode_instructions_virtual; +const decode_func_stype decode_func_address = &decode_instructions; static const char* format_insn_close(const char* close, disassemble_info* dinfo, diff --git a/hotspot/src/share/tools/hsdis/hsdis.h b/hotspot/src/share/tools/hsdis/hsdis.h index 5ab26ef086c..ca712e6fa29 100644 --- a/hotspot/src/share/tools/hsdis/hsdis.h +++ b/hotspot/src/share/tools/hsdis/hsdis.h @@ -47,6 +47,9 @@ where tag is a simple identifier, signifying (as in XML) a element start, element end, and standalone element. (To render as XML, add angle brackets.) */ +#ifndef SHARED_TOOLS_HSDIS_H +#define SHARED_TOOLS_HSDIS_H + extern #ifdef DLL_EXPORT DLL_EXPORT @@ -57,16 +60,37 @@ void* decode_instructions_virtual(uintptr_t start_va, uintptr_t end_va, void* event_stream, int (*printf_callback)(void*, const char*, ...), void* printf_stream, - const char* options); + const char* options, + int newline /* bool value for nice new line */); + +/* This is the compatability interface for older versions of hotspot */ +extern +#ifdef DLL_ENTRY + DLL_ENTRY +#endif +void* decode_instructions(void* start_pv, void* end_pv, + void* (*event_callback)(void*, const char*, void*), + void* event_stream, + int (*printf_callback)(void*, const char*, ...), + void* printf_stream, + const char* options); /* convenience typedefs */ typedef void* (*decode_instructions_event_callback_ftype) (void*, const char*, void*); typedef int (*decode_instructions_printf_callback_ftype) (void*, const char*, ...); -typedef void* (*decode_instructions_ftype) (uintptr_t start_va, uintptr_t end_va, - unsigned char* buffer, uintptr_t length, - decode_instructions_event_callback_ftype event_callback, - void* event_stream, - decode_instructions_printf_callback_ftype printf_callback, - void* printf_stream, - const char* options); +typedef void* (*decode_func_vtype) (uintptr_t start_va, uintptr_t end_va, + unsigned char* buffer, uintptr_t length, + decode_instructions_event_callback_ftype event_callback, + void* event_stream, + decode_instructions_printf_callback_ftype printf_callback, + void* printf_stream, + const char* options, + int newline); +typedef void* (*decode_func_stype) (void* start_pv, void* end_pv, + decode_instructions_event_callback_ftype event_callback, + void* event_stream, + decode_instructions_printf_callback_ftype printf_callback, + void* printf_stream, + const char* options); +#endif /* SHARED_TOOLS_HSDIS_H */ diff --git a/hotspot/src/share/vm/compiler/disassembler.cpp b/hotspot/src/share/vm/compiler/disassembler.cpp index e1fed2e4d23..676440c14cc 100644 --- a/hotspot/src/share/vm/compiler/disassembler.cpp +++ b/hotspot/src/share/vm/compiler/disassembler.cpp @@ -55,16 +55,18 @@ void* Disassembler::_library = NULL; bool Disassembler::_tried_to_load_library = false; // This routine is in the shared library: +Disassembler::decode_func_virtual Disassembler::_decode_instructions_virtual = NULL; Disassembler::decode_func Disassembler::_decode_instructions = NULL; static const char hsdis_library_name[] = "hsdis-"HOTSPOT_LIB_ARCH; -static const char decode_instructions_name[] = "decode_instructions_virtual"; - +static const char decode_instructions_virtual_name[] = "decode_instructions_virtual"; +static const char decode_instructions_name[] = "decode_instructions"; +static bool use_new_version = true; #define COMMENT_COLUMN 40 LP64_ONLY(+8) /*could be an option*/ #define BYTES_COMMENT ";..." /* funky byte display comment */ bool Disassembler::load_library() { - if (_decode_instructions != NULL) { + if (_decode_instructions_virtual != NULL || _decode_instructions != NULL) { // Already succeeded. return true; } @@ -123,11 +125,19 @@ bool Disassembler::load_library() { _library = os::dll_load(buf, ebuf, sizeof ebuf); } if (_library != NULL) { + _decode_instructions_virtual = CAST_TO_FN_PTR(Disassembler::decode_func_virtual, + os::dll_lookup(_library, decode_instructions_virtual_name)); + } + if (_decode_instructions_virtual == NULL) { + // could not spot in new version, try old version _decode_instructions = CAST_TO_FN_PTR(Disassembler::decode_func, os::dll_lookup(_library, decode_instructions_name)); + use_new_version = false; + } else { + use_new_version = true; } _tried_to_load_library = true; - if (_decode_instructions == NULL) { + if (_decode_instructions_virtual == NULL && _decode_instructions == NULL) { tty->print_cr("Could not load %s; %s; %s", buf, ((_library != NULL) ? "entry point is missing" @@ -450,17 +460,31 @@ address decode_env::decode_instructions(address start, address end) { // This is mainly for debugging the library itself. FILE* out = stdout; FILE* xmlout = (_print_raw > 1 ? out : NULL); - return (address) - (*Disassembler::_decode_instructions)((uintptr_t)start, (uintptr_t)end, - start, end - start, + return use_new_version ? + (address) + (*Disassembler::_decode_instructions_virtual)((uintptr_t)start, (uintptr_t)end, + start, end - start, + NULL, (void*) xmlout, + NULL, (void*) out, + options(), 0/*nice new line*/) + : + (address) + (*Disassembler::_decode_instructions)(start, end, NULL, (void*) xmlout, NULL, (void*) out, options()); } - return (address) - (*Disassembler::_decode_instructions)((uintptr_t)start, (uintptr_t)end, - start, end - start, + return use_new_version ? + (address) + (*Disassembler::_decode_instructions_virtual)((uintptr_t)start, (uintptr_t)end, + start, end - start, + &event_to_env, (void*) this, + &printf_to_env, (void*) this, + options(), 0/*nice new line*/) + : + (address) + (*Disassembler::_decode_instructions)(start, end, &event_to_env, (void*) this, &printf_to_env, (void*) this, options()); diff --git a/hotspot/src/share/vm/compiler/disassembler.hpp b/hotspot/src/share/vm/compiler/disassembler.hpp index 053b4689fbb..fd1f52eee1b 100644 --- a/hotspot/src/share/vm/compiler/disassembler.hpp +++ b/hotspot/src/share/vm/compiler/disassembler.hpp @@ -49,8 +49,16 @@ class Disassembler { friend class decode_env; private: // this is the type of the dll entry point: - typedef void* (*decode_func)(uintptr_t start_va, uintptr_t end_va, + typedef void* (*decode_func_virtual)(uintptr_t start_va, uintptr_t end_va, unsigned char* buffer, uintptr_t length, + void* (*event_callback)(void*, const char*, void*), + void* event_stream, + int (*printf_callback)(void*, const char*, ...), + void* printf_stream, + const char* options, + int newline); + // this is the type of the dll entry point for old version: + typedef void* (*decode_func)(void* start_va, void* end_va, void* (*event_callback)(void*, const char*, void*), void* event_stream, int (*printf_callback)(void*, const char*, ...), @@ -61,6 +69,7 @@ class Disassembler { // bailout static bool _tried_to_load_library; // points to the decode function. + static decode_func_virtual _decode_instructions_virtual; static decode_func _decode_instructions; // tries to load library and return whether it succedded. static bool load_library(); @@ -85,7 +94,9 @@ class Disassembler { public: static bool can_decode() { - return (_decode_instructions != NULL) || load_library(); + return (_decode_instructions_virtual != NULL) || + (_decode_instructions != NULL) || + load_library(); } static void decode(CodeBlob *cb, outputStream* st = NULL); static void decode(nmethod* nm, outputStream* st = NULL); From c1df1d96590ceecfafa564b967c0d62cb432704a Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Mon, 5 Nov 2012 15:30:22 -0500 Subject: [PATCH 031/241] 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp NMT should allow overlapping committed regions as long as they belong to the same reserved region Reviewed-by: dholmes, coleenp --- hotspot/src/share/vm/services/memPtr.hpp | 11 ++ hotspot/src/share/vm/services/memSnapshot.cpp | 114 ++++++++++++++---- 2 files changed, 104 insertions(+), 21 deletions(-) diff --git a/hotspot/src/share/vm/services/memPtr.hpp b/hotspot/src/share/vm/services/memPtr.hpp index 0618a3c806a..3f888d968a6 100644 --- a/hotspot/src/share/vm/services/memPtr.hpp +++ b/hotspot/src/share/vm/services/memPtr.hpp @@ -311,6 +311,17 @@ public: inline bool contains_address(address add) const { return (addr() <= add && addr() + size() > add); } + + // if this memory region overlaps another region + inline bool overlaps_region(const MemPointerRecord* other) const { + assert(other != NULL, "Just check"); + assert(size() > 0 && other->size() > 0, "empty range"); + return contains_address(other->addr()) || + contains_address(other->addr() + other->size() - 1) || // exclude end address + other->contains_address(addr()) || + other->contains_address(addr() + size() - 1); // exclude end address + } + }; // MemPointerRecordEx also records callsite pc, from where diff --git a/hotspot/src/share/vm/services/memSnapshot.cpp b/hotspot/src/share/vm/services/memSnapshot.cpp index 20e1ce61fa4..936df1985ac 100644 --- a/hotspot/src/share/vm/services/memSnapshot.cpp +++ b/hotspot/src/share/vm/services/memSnapshot.cpp @@ -31,6 +31,69 @@ #include "services/memSnapshot.hpp" #include "services/memTracker.hpp" +#ifdef ASSERT + +void decode_pointer_record(MemPointerRecord* rec) { + tty->print("Pointer: [" PTR_FORMAT " - " PTR_FORMAT "] size = %d bytes", rec->addr(), + rec->addr() + rec->size(), (int)rec->size()); + tty->print(" type = %s", MemBaseline::type2name(FLAGS_TO_MEMORY_TYPE(rec->flags()))); + if (rec->is_vm_pointer()) { + if (rec->is_allocation_record()) { + tty->print_cr(" (reserve)"); + } else if (rec->is_commit_record()) { + tty->print_cr(" (commit)"); + } else if (rec->is_uncommit_record()) { + tty->print_cr(" (uncommit)"); + } else if (rec->is_deallocation_record()) { + tty->print_cr(" (release)"); + } else { + tty->print_cr(" (tag)"); + } + } else { + if (rec->is_arena_size_record()) { + tty->print_cr(" (arena size)"); + } else if (rec->is_allocation_record()) { + tty->print_cr(" (malloc)"); + } else { + tty->print_cr(" (free)"); + } + } + if (MemTracker::track_callsite()) { + char buf[1024]; + address pc = ((MemPointerRecordEx*)rec)->pc(); + if (pc != NULL && os::dll_address_to_function_name(pc, buf, sizeof(buf), NULL)) { + tty->print_cr("\tfrom %s", buf); + } else { + tty->print_cr("\tcould not decode pc = " PTR_FORMAT "", pc); + } + } +} + +void decode_vm_region_record(VMMemRegion* rec) { + tty->print("VM Region [" PTR_FORMAT " - " PTR_FORMAT "]", rec->addr(), + rec->addr() + rec->size()); + tty->print(" type = %s", MemBaseline::type2name(FLAGS_TO_MEMORY_TYPE(rec->flags()))); + if (rec->is_allocation_record()) { + tty->print_cr(" (reserved)"); + } else if (rec->is_commit_record()) { + tty->print_cr(" (committed)"); + } else { + ShouldNotReachHere(); + } + if (MemTracker::track_callsite()) { + char buf[1024]; + address pc = ((VMMemRegionEx*)rec)->pc(); + if (pc != NULL && os::dll_address_to_function_name(pc, buf, sizeof(buf), NULL)) { + tty->print_cr("\tfrom %s", buf); + } else { + tty->print_cr("\tcould not decode pc = " PTR_FORMAT "", pc); + } + + } +} + +#endif + bool VMMemPointerIterator::insert_record(MemPointerRecord* rec) { VMMemRegionEx new_rec; @@ -73,52 +136,61 @@ bool VMMemPointerIterator::add_reserved_region(MemPointerRecord* rec) { return true; } assert(cur->base() > rec->addr(), "Just check: locate()"); - assert(rec->addr() + rec->size() <= cur->base(), "Can not overlap"); + assert(!cur->overlaps_region(rec), "overlapping reserved regions"); return insert_record(rec); } // we do consolidate committed regions bool VMMemPointerIterator::add_committed_region(MemPointerRecord* rec) { assert(rec->is_commit_record(), "Sanity check"); - VMMemRegion* cur; - cur = (VMMemRegion*)current(); - assert(cur->is_reserved_region() && cur->contains_region(rec), + VMMemRegion* reserved_rgn = (VMMemRegion*)current(); + assert(reserved_rgn->is_reserved_region() && reserved_rgn->contains_region(rec), "Sanity check"); // thread's native stack is always marked as "committed", ignore // the "commit" operation for creating stack guard pages - if (FLAGS_TO_MEMORY_TYPE(cur->flags()) == mtThreadStack && + if (FLAGS_TO_MEMORY_TYPE(reserved_rgn->flags()) == mtThreadStack && FLAGS_TO_MEMORY_TYPE(rec->flags()) != mtThreadStack) { return true; } - cur = (VMMemRegion*)next(); - while (cur != NULL && cur->is_committed_region()) { + // if the reserved region has any committed regions + VMMemRegion* committed_rgn = (VMMemRegion*)next(); + while (committed_rgn != NULL && committed_rgn->is_committed_region()) { // duplicated commit records - if(cur->contains_region(rec)) { + if(committed_rgn->contains_region(rec)) { return true; - } - if (cur->base() > rec->addr()) { - // committed regions can not overlap - assert(rec->addr() + rec->size() <= cur->base(), "Can not overlap"); - if (rec->addr() + rec->size() == cur->base()) { - cur->expand_region(rec->addr(), rec->size()); - return true; + } else if (committed_rgn->overlaps_region(rec)) { + // overlaps front part + if (rec->addr() < committed_rgn->addr()) { + committed_rgn->expand_region(rec->addr(), + committed_rgn->addr() - rec->addr()); } else { - return insert_record(rec); + // overlaps tail part + address committed_rgn_end = committed_rgn->addr() + + committed_rgn->size(); + assert(committed_rgn_end < rec->addr() + rec->size(), + "overlap tail part"); + committed_rgn->expand_region(committed_rgn_end, + (rec->addr() + rec->size()) - committed_rgn_end); } - } else if (cur->base() + cur->size() == rec->addr()) { - cur->expand_region(rec->addr(), rec->size()); + } else if (committed_rgn->base() + committed_rgn->size() == rec->addr()) { + // adjunct each other + committed_rgn->expand_region(rec->addr(), rec->size()); VMMemRegion* next_reg = (VMMemRegion*)next(); // see if we can consolidate next committed region if (next_reg != NULL && next_reg->is_committed_region() && - next_reg->base() == cur->base() + cur->size()) { - cur->expand_region(next_reg->base(), next_reg->size()); + next_reg->base() == committed_rgn->base() + committed_rgn->size()) { + committed_rgn->expand_region(next_reg->base(), next_reg->size()); + // delete merged region remove(); } return true; + } else if (committed_rgn->base() > rec->addr()) { + // found the location, insert this committed region + return insert_record(rec); } - cur = (VMMemRegion*)next(); + committed_rgn = (VMMemRegion*)next(); } return insert_record(rec); } From e1d995ab8693d61b4e7245380022d347b1692b8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20B=C3=A4ckman?= Date: Thu, 4 Oct 2012 14:55:57 +0200 Subject: [PATCH 032/241] 7127792: Add the ability to change an existing PeriodicTask's execution interval Enables dynamic enrollment / disenrollment from the PeriodicTasks in WatcherThread. Reviewed-by: dholmes, mgronlun --- hotspot/src/share/vm/runtime/mutexLocker.cpp | 2 + hotspot/src/share/vm/runtime/mutexLocker.hpp | 1 + hotspot/src/share/vm/runtime/task.cpp | 73 +++++++---- hotspot/src/share/vm/runtime/task.hpp | 43 ++----- hotspot/src/share/vm/runtime/thread.cpp | 127 +++++++++++++------ hotspot/src/share/vm/runtime/thread.hpp | 8 ++ 6 files changed, 162 insertions(+), 92 deletions(-) diff --git a/hotspot/src/share/vm/runtime/mutexLocker.cpp b/hotspot/src/share/vm/runtime/mutexLocker.cpp index b1d92def249..0be262268bb 100644 --- a/hotspot/src/share/vm/runtime/mutexLocker.cpp +++ b/hotspot/src/share/vm/runtime/mutexLocker.cpp @@ -140,6 +140,7 @@ Monitor* JfrQuery_lock = NULL; Monitor* JfrMsg_lock = NULL; Mutex* JfrBuffer_lock = NULL; Mutex* JfrStream_lock = NULL; +Monitor* PeriodicTask_lock = NULL; #define MAX_NUM_MUTEX 128 static Monitor * _mutex_array[MAX_NUM_MUTEX]; @@ -285,6 +286,7 @@ void mutex_init() { def(JfrMsg_lock , Monitor, nonleaf+2, true); def(JfrBuffer_lock , Mutex, nonleaf+3, true); def(JfrStream_lock , Mutex, nonleaf+4, true); + def(PeriodicTask_lock , Monitor, nonleaf+5, true); } GCMutexLocker::GCMutexLocker(Monitor * mutex) { diff --git a/hotspot/src/share/vm/runtime/mutexLocker.hpp b/hotspot/src/share/vm/runtime/mutexLocker.hpp index 846b2d42738..7fae11b6467 100644 --- a/hotspot/src/share/vm/runtime/mutexLocker.hpp +++ b/hotspot/src/share/vm/runtime/mutexLocker.hpp @@ -142,6 +142,7 @@ extern Monitor* JfrQuery_lock; // protects JFR use extern Monitor* JfrMsg_lock; // protects JFR messaging extern Mutex* JfrBuffer_lock; // protects JFR buffer operations extern Mutex* JfrStream_lock; // protects JFR stream access +extern Monitor* PeriodicTask_lock; // protects the periodic task structure // A MutexLocker provides mutual exclusion with respect to a given mutex // for the scope which contains the locker. The lock is an OS lock, not diff --git a/hotspot/src/share/vm/runtime/task.cpp b/hotspot/src/share/vm/runtime/task.cpp index bd45d65fec0..689f3857c97 100644 --- a/hotspot/src/share/vm/runtime/task.cpp +++ b/hotspot/src/share/vm/runtime/task.cpp @@ -61,7 +61,7 @@ void PeriodicTask::print_intervals() { } #endif -void PeriodicTask::real_time_tick(size_t delay_time) { +void PeriodicTask::real_time_tick(int delay_time) { #ifndef PRODUCT if (ProfilerCheckIntervals) { _ticks++; @@ -73,19 +73,39 @@ void PeriodicTask::real_time_tick(size_t delay_time) { _intervalHistogram[ms]++; } #endif - int orig_num_tasks = _num_tasks; - for(int index = 0; index < _num_tasks; index++) { - _tasks[index]->execute_if_pending(delay_time); - if (_num_tasks < orig_num_tasks) { // task dis-enrolled itself - index--; // re-do current slot as it has changed - orig_num_tasks = _num_tasks; + + { + MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + int orig_num_tasks = _num_tasks; + + for(int index = 0; index < _num_tasks; index++) { + _tasks[index]->execute_if_pending(delay_time); + if (_num_tasks < orig_num_tasks) { // task dis-enrolled itself + index--; // re-do current slot as it has changed + orig_num_tasks = _num_tasks; + } } } } +int PeriodicTask::time_to_wait() { + MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? + NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + + if (_num_tasks == 0) { + return 0; // sleep until shutdown or a task is enrolled + } + + int delay = _tasks[0]->time_to_next_interval(); + for (int index = 1; index < _num_tasks; index++) { + delay = MIN2(delay, _tasks[index]->time_to_next_interval()); + } + return delay; +} + PeriodicTask::PeriodicTask(size_t interval_time) : - _counter(0), _interval(interval_time) { + _counter(0), _interval((int) interval_time) { // Sanity check the interval time assert(_interval >= PeriodicTask::min_interval && _interval <= PeriodicTask::max_interval && @@ -94,33 +114,40 @@ PeriodicTask::PeriodicTask(size_t interval_time) : } PeriodicTask::~PeriodicTask() { - if (is_enrolled()) - disenroll(); -} - -bool PeriodicTask::is_enrolled() const { - for(int index = 0; index < _num_tasks; index++) - if (_tasks[index] == this) return true; - return false; + disenroll(); } void PeriodicTask::enroll() { - assert(WatcherThread::watcher_thread() == NULL, "dynamic enrollment of tasks not yet supported"); + MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? + NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag); - if (_num_tasks == PeriodicTask::max_tasks) + if (_num_tasks == PeriodicTask::max_tasks) { fatal("Overflow in PeriodicTask table"); + } _tasks[_num_tasks++] = this; + + WatcherThread* thread = WatcherThread::watcher_thread(); + if (thread) { + thread->unpark(); + } else { + WatcherThread::start(); + } } void PeriodicTask::disenroll() { - assert(WatcherThread::watcher_thread() == NULL || - Thread::current() == WatcherThread::watcher_thread(), - "dynamic disenrollment currently only handled from WatcherThread from within task() method"); + MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? + NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag); int index; - for(index = 0; index < _num_tasks && _tasks[index] != this; index++); - if (index == _num_tasks) return; + for(index = 0; index < _num_tasks && _tasks[index] != this; index++) + ; + + if (index == _num_tasks) { + return; + } + _num_tasks--; + for (; index < _num_tasks; index++) { _tasks[index] = _tasks[index+1]; } diff --git a/hotspot/src/share/vm/runtime/task.hpp b/hotspot/src/share/vm/runtime/task.hpp index 4bdcad54c3e..5fc8c16e2a4 100644 --- a/hotspot/src/share/vm/runtime/task.hpp +++ b/hotspot/src/share/vm/runtime/task.hpp @@ -49,12 +49,12 @@ class PeriodicTask: public CHeapObj { static int num_tasks() { return _num_tasks; } private: - size_t _counter; - const size_t _interval; + int _counter; + const int _interval; static int _num_tasks; static PeriodicTask* _tasks[PeriodicTask::max_tasks]; - static void real_time_tick(size_t delay_time); + static void real_time_tick(int delay_time); #ifndef PRODUCT static elapsedTimer _timer; // measures time between ticks @@ -69,51 +69,36 @@ class PeriodicTask: public CHeapObj { PeriodicTask(size_t interval_time); // interval is in milliseconds of elapsed time ~PeriodicTask(); - // Tells whether is enrolled - bool is_enrolled() const; - // Make the task active - // NOTE: this may only be called before the WatcherThread has been started + // For dynamic enrollment at the time T, the task will execute somewhere + // between T and T + interval_time. void enroll(); // Make the task deactive - // NOTE: this may only be called either while the WatcherThread is - // inactive or by a task from within its task() method. One-shot or - // several-shot tasks may be implemented this way. void disenroll(); - void execute_if_pending(size_t delay_time) { - _counter += delay_time; - if (_counter >= _interval) { + void execute_if_pending(int delay_time) { + // make sure we don't overflow + jlong tmp = (jlong) _counter + (jlong) delay_time; + + if (tmp >= (jlong) _interval) { _counter = 0; task(); + } else { + _counter += delay_time; } } // Returns how long (time in milliseconds) before the next time we should // execute this task. - size_t time_to_next_interval() const { + int time_to_next_interval() const { assert(_interval > _counter, "task counter greater than interval?"); return _interval - _counter; } // Calculate when the next periodic task will fire. // Called by the WatcherThread's run method. - // This assumes that periodic tasks aren't entering the system - // dynamically, except for during startup. - static size_t time_to_wait() { - if (_num_tasks == 0) { - // Don't wait any more; shut down the thread since we don't - // currently support dynamic enrollment. - return 0; - } - - size_t delay = _tasks[0]->time_to_next_interval(); - for (int index = 1; index < _num_tasks; index++) { - delay = MIN2(delay, _tasks[index]->time_to_next_interval()); - } - return delay; - } + static int time_to_wait(); // The task to perform at each period virtual void task() = 0; diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp index 615ca40ab6e..a3656dcda4f 100644 --- a/hotspot/src/share/vm/runtime/thread.cpp +++ b/hotspot/src/share/vm/runtime/thread.cpp @@ -1217,6 +1217,7 @@ void NamedThread::set_name(const char* format, ...) { // timer interrupts exists on the platform. WatcherThread* WatcherThread::_watcher_thread = NULL; +bool WatcherThread::_startable = false; volatile bool WatcherThread::_should_terminate = false; WatcherThread::WatcherThread() : Thread() { @@ -1237,6 +1238,55 @@ WatcherThread::WatcherThread() : Thread() { } } +int WatcherThread::sleep() const { + MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + + // remaining will be zero if there are no tasks, + // causing the WatcherThread to sleep until a task is + // enrolled + int remaining = PeriodicTask::time_to_wait(); + int time_slept = 0; + + // we expect this to timeout - we only ever get unparked when + // we should terminate or when a new task has been enrolled + OSThreadWaitState osts(this->osthread(), false /* not Object.wait() */); + + jlong time_before_loop = os::javaTimeNanos(); + + for (;;) { + bool timedout = PeriodicTask_lock->wait(Mutex::_no_safepoint_check_flag, remaining); + jlong now = os::javaTimeNanos(); + + if (remaining == 0) { + // if we didn't have any tasks we could have waited for a long time + // consider the time_slept zero and reset time_before_loop + time_slept = 0; + time_before_loop = now; + } else { + // need to recalulate since we might have new tasks in _tasks + time_slept = (int) ((now - time_before_loop) / 1000000); + } + + // Change to task list or spurious wakeup of some kind + if (timedout || _should_terminate) { + break; + } + + remaining = PeriodicTask::time_to_wait(); + if (remaining == 0) { + // Last task was just disenrolled so loop around and wait until + // another task gets enrolled + continue; + } + + remaining -= time_slept; + if (remaining <= 0) + break; + } + + return time_slept; +} + void WatcherThread::run() { assert(this == watcher_thread(), "just checking"); @@ -1249,26 +1299,7 @@ void WatcherThread::run() { // Calculate how long it'll be until the next PeriodicTask work // should be done, and sleep that amount of time. - size_t time_to_wait = PeriodicTask::time_to_wait(); - - // we expect this to timeout - we only ever get unparked when - // we should terminate - { - OSThreadWaitState osts(this->osthread(), false /* not Object.wait() */); - - jlong prev_time = os::javaTimeNanos(); - for (;;) { - int res= _SleepEvent->park(time_to_wait); - if (res == OS_TIMEOUT || _should_terminate) - break; - // spurious wakeup of some kind - jlong now = os::javaTimeNanos(); - time_to_wait -= (now - prev_time) / 1000000; - if (time_to_wait <= 0) - break; - prev_time = now; - } - } + int time_waited = sleep(); if (is_error_reported()) { // A fatal error has happened, the error handler(VMError::report_and_die) @@ -1298,13 +1329,7 @@ void WatcherThread::run() { } } - PeriodicTask::real_time_tick(time_to_wait); - - // If we have no more tasks left due to dynamic disenrollment, - // shut down the thread since we don't currently support dynamic enrollment - if (PeriodicTask::num_tasks() == 0) { - _should_terminate = true; - } + PeriodicTask::real_time_tick(time_waited); } // Signal that it is terminated @@ -1319,22 +1344,33 @@ void WatcherThread::run() { } void WatcherThread::start() { - if (watcher_thread() == NULL) { + assert(PeriodicTask_lock->owned_by_self(), "PeriodicTask_lock required"); + + if (watcher_thread() == NULL && _startable) { _should_terminate = false; // Create the single instance of WatcherThread new WatcherThread(); } } +void WatcherThread::make_startable() { + assert(PeriodicTask_lock->owned_by_self(), "PeriodicTask_lock required"); + _startable = true; +} + void WatcherThread::stop() { + { + MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + _should_terminate = true; + OrderAccess::fence(); // ensure WatcherThread sees update in main loop + + WatcherThread* watcher = watcher_thread(); + if (watcher != NULL) + watcher->unpark(); + } + // it is ok to take late safepoints here, if needed MutexLocker mu(Terminator_lock); - _should_terminate = true; - OrderAccess::fence(); // ensure WatcherThread sees update in main loop - - Thread* watcher = watcher_thread(); - if (watcher != NULL) - watcher->_SleepEvent->unpark(); while(watcher_thread() != NULL) { // This wait should make safepoint checks, wait without a timeout, @@ -1352,6 +1388,11 @@ void WatcherThread::stop() { } } +void WatcherThread::unpark() { + MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + PeriodicTask_lock->notify(); +} + void WatcherThread::print_on(outputStream* st) const { st->print("\"%s\" ", name()); Thread::print_on(st); @@ -3658,12 +3699,18 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { } } - // Start up the WatcherThread if there are any periodic tasks - // NOTE: All PeriodicTasks should be registered by now. If they - // aren't, late joiners might appear to start slowly (we might - // take a while to process their first tick). - if (PeriodicTask::num_tasks() > 0) { - WatcherThread::start(); + { + MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + // Make sure the watcher thread can be started by WatcherThread::start() + // or by dynamic enrollment. + WatcherThread::make_startable(); + // Start up the WatcherThread if there are any periodic tasks + // NOTE: All PeriodicTasks should be registered by now. If they + // aren't, late joiners might appear to start slowly (we might + // take a while to process their first tick). + if (PeriodicTask::num_tasks() > 0) { + WatcherThread::start(); + } } // Give os specific code one last chance to start diff --git a/hotspot/src/share/vm/runtime/thread.hpp b/hotspot/src/share/vm/runtime/thread.hpp index ed747fb6cdd..3ccbf487e99 100644 --- a/hotspot/src/share/vm/runtime/thread.hpp +++ b/hotspot/src/share/vm/runtime/thread.hpp @@ -722,6 +722,7 @@ class WatcherThread: public Thread { private: static WatcherThread* _watcher_thread; + static bool _startable; volatile static bool _should_terminate; // updated without holding lock public: enum SomeConstants { @@ -738,6 +739,7 @@ class WatcherThread: public Thread { char* name() const { return (char*)"VM Periodic Task Thread"; } void print_on(outputStream* st) const; void print() const { print_on(tty); } + void unpark(); // Returns the single instance of WatcherThread static WatcherThread* watcher_thread() { return _watcher_thread; } @@ -745,6 +747,12 @@ class WatcherThread: public Thread { // Create and start the single instance of WatcherThread, or stop it on shutdown static void start(); static void stop(); + // Only allow start once the VM is sufficiently initialized + // Otherwise the first task to enroll will trigger the start + static void make_startable(); + + private: + int sleep() const; }; From fd15ca5e44fd8e2a88905449ea29146dc8c97470 Mon Sep 17 00:00:00 2001 From: Kaushik Srenevasan Date: Sat, 6 Oct 2012 01:17:44 -0700 Subject: [PATCH 033/241] 7127708: G1: change task num types from int to uint in concurrent mark Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc --- .../gc_implementation/g1/concurrentMark.cpp | 244 +++++++++--------- .../gc_implementation/g1/concurrentMark.hpp | 34 +-- .../g1/concurrentMark.inline.hpp | 26 +- .../g1/g1OopClosures.inline.hpp | 4 +- 4 files changed, 154 insertions(+), 154 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp index a06b01cae37..2684be80872 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp @@ -426,11 +426,11 @@ ConcurrentMark::ConcurrentMark(ReservedSpace rs, uint max_regions) : _markStack(this), // _finger set in set_non_marking_state - _max_task_num(MAX2((uint)ParallelGCThreads, 1U)), + _max_worker_id(MAX2((uint)ParallelGCThreads, 1U)), // _active_tasks set in set_non_marking_state // _tasks set inside the constructor - _task_queues(new CMTaskQueueSet((int) _max_task_num)), - _terminator(ParallelTaskTerminator((int) _max_task_num, _task_queues)), + _task_queues(new CMTaskQueueSet((int) _max_worker_id)), + _terminator(ParallelTaskTerminator((int) _max_worker_id, _task_queues)), _has_overflown(false), _concurrent(false), @@ -481,17 +481,17 @@ ConcurrentMark::ConcurrentMark(ReservedSpace rs, uint max_regions) : _root_regions.init(_g1h, this); - _tasks = NEW_C_HEAP_ARRAY(CMTask*, _max_task_num, mtGC); - _accum_task_vtime = NEW_C_HEAP_ARRAY(double, _max_task_num, mtGC); + _tasks = NEW_C_HEAP_ARRAY(CMTask*, _max_worker_id, mtGC); + _accum_task_vtime = NEW_C_HEAP_ARRAY(double, _max_worker_id, mtGC); - _count_card_bitmaps = NEW_C_HEAP_ARRAY(BitMap, _max_task_num, mtGC); - _count_marked_bytes = NEW_C_HEAP_ARRAY(size_t*, _max_task_num, mtGC); + _count_card_bitmaps = NEW_C_HEAP_ARRAY(BitMap, _max_worker_id, mtGC); + _count_marked_bytes = NEW_C_HEAP_ARRAY(size_t*, _max_worker_id, mtGC); BitMap::idx_t card_bm_size = _card_bm.size(); // so that the assertion in MarkingTaskQueue::task_queue doesn't fail - _active_tasks = _max_task_num; - for (int i = 0; i < (int) _max_task_num; ++i) { + _active_tasks = _max_worker_id; + for (uint i = 0; i < _max_worker_id; ++i) { CMTaskQueue* task_queue = new CMTaskQueue(); task_queue->initialize(); _task_queues->register_queue(i, task_queue); @@ -638,7 +638,7 @@ void ConcurrentMark::reset() { // We do reset all of them, since different phases will use // different number of active threads. So, it's easiest to have all // of them ready. - for (int i = 0; i < (int) _max_task_num; ++i) { + for (uint i = 0; i < _max_worker_id; ++i) { _tasks[i]->reset(_nextMarkBitMap); } @@ -648,7 +648,7 @@ void ConcurrentMark::reset() { } void ConcurrentMark::set_phase(uint active_tasks, bool concurrent) { - assert(active_tasks <= _max_task_num, "we should not have more"); + assert(active_tasks <= _max_worker_id, "we should not have more"); _active_tasks = active_tasks; // Need to update the three data structures below according to the @@ -659,7 +659,7 @@ void ConcurrentMark::set_phase(uint active_tasks, bool concurrent) { _concurrent = concurrent; // We propagate this to all tasks, not just the active ones. - for (int i = 0; i < (int) _max_task_num; ++i) + for (uint i = 0; i < _max_worker_id; ++i) _tasks[i]->set_concurrent(concurrent); if (concurrent) { @@ -818,9 +818,9 @@ void ConcurrentMark::checkpointRootsInitialPost() { * doesn't manipulate any data structures afterwards. */ -void ConcurrentMark::enter_first_sync_barrier(int task_num) { +void ConcurrentMark::enter_first_sync_barrier(uint worker_id) { if (verbose_low()) { - gclog_or_tty->print_cr("[%d] entering first barrier", task_num); + gclog_or_tty->print_cr("[%u] entering first barrier", worker_id); } if (concurrent()) { @@ -834,11 +834,11 @@ void ConcurrentMark::enter_first_sync_barrier(int task_num) { // more work if (verbose_low()) { - gclog_or_tty->print_cr("[%d] leaving first barrier", task_num); + gclog_or_tty->print_cr("[%u] leaving first barrier", worker_id); } - // let task 0 do this - if (task_num == 0) { + // let the task associated with with worker 0 do this + if (worker_id == 0) { // task 0 is responsible for clearing the global data structures // We should be here because of an overflow. During STW we should // not clear the overflow flag since we rely on it being true when @@ -858,9 +858,9 @@ void ConcurrentMark::enter_first_sync_barrier(int task_num) { // then go into the second barrier } -void ConcurrentMark::enter_second_sync_barrier(int task_num) { +void ConcurrentMark::enter_second_sync_barrier(uint worker_id) { if (verbose_low()) { - gclog_or_tty->print_cr("[%d] entering second barrier", task_num); + gclog_or_tty->print_cr("[%u] entering second barrier", worker_id); } if (concurrent()) { @@ -873,7 +873,7 @@ void ConcurrentMark::enter_second_sync_barrier(int task_num) { // at this point everything should be re-initialised and ready to go if (verbose_low()) { - gclog_or_tty->print_cr("[%d] leaving second barrier", task_num); + gclog_or_tty->print_cr("[%u] leaving second barrier", worker_id); } } @@ -2113,9 +2113,9 @@ class G1CMParKeepAliveAndDrainClosure: public OopClosure { if (!_cm->has_overflown()) { oop obj = oopDesc::load_decode_heap_oop(p); if (_cm->verbose_high()) { - gclog_or_tty->print_cr("\t[%d] we're looking at location " + gclog_or_tty->print_cr("\t[%u] we're looking at location " "*"PTR_FORMAT" = "PTR_FORMAT, - _task->task_id(), p, (void*) obj); + _task->worker_id(), p, (void*) obj); } _task->deal_with_reference(obj); @@ -2144,7 +2144,7 @@ class G1CMParKeepAliveAndDrainClosure: public OopClosure { } } else { if (_cm->verbose_high()) { - gclog_or_tty->print_cr("\t[%d] CM Overflow", _task->task_id()); + gclog_or_tty->print_cr("\t[%u] CM Overflow", _task->worker_id()); } } } @@ -2160,8 +2160,8 @@ class G1CMParDrainMarkingStackClosure: public VoidClosure { void do_void() { do { if (_cm->verbose_high()) { - gclog_or_tty->print_cr("\t[%d] Drain: Calling do marking_step", - _task->task_id()); + gclog_or_tty->print_cr("\t[%u] Drain: Calling do marking_step", + _task->worker_id()); } // We call CMTask::do_marking_step() to completely drain the local and @@ -2300,7 +2300,7 @@ void ConcurrentMark::weakRefsWork(bool clear_all_soft_refs) { // We use the work gang from the G1CollectedHeap and we utilize all // the worker threads. uint active_workers = g1h->workers() ? g1h->workers()->active_workers() : 1U; - active_workers = MAX2(MIN2(active_workers, _max_task_num), 1U); + active_workers = MAX2(MIN2(active_workers, _max_worker_id), 1U); G1CMRefProcTaskExecutor par_task_executor(g1h, this, g1h->workers(), active_workers); @@ -2619,7 +2619,7 @@ void ConcurrentMark::clearRangeBothBitmaps(MemRegion mr) { } HeapRegion* -ConcurrentMark::claim_region(int task_num) { +ConcurrentMark::claim_region(uint worker_id) { // "checkpoint" the finger HeapWord* finger = _finger; @@ -2657,10 +2657,10 @@ ConcurrentMark::claim_region(int task_num) { HeapWord* limit = curr_region->next_top_at_mark_start(); if (verbose_low()) { - gclog_or_tty->print_cr("[%d] curr_region = "PTR_FORMAT" " + gclog_or_tty->print_cr("[%u] curr_region = "PTR_FORMAT" " "["PTR_FORMAT", "PTR_FORMAT"), " "limit = "PTR_FORMAT, - task_num, curr_region, bottom, end, limit); + worker_id, curr_region, bottom, end, limit); } // Is the gap between reading the finger and doing the CAS too long? @@ -2673,22 +2673,22 @@ ConcurrentMark::claim_region(int task_num) { assert(_finger >= end, "the finger should have moved forward"); if (verbose_low()) { - gclog_or_tty->print_cr("[%d] we were successful with region = " - PTR_FORMAT, task_num, curr_region); + gclog_or_tty->print_cr("[%u] we were successful with region = " + PTR_FORMAT, worker_id, curr_region); } if (limit > bottom) { if (verbose_low()) { - gclog_or_tty->print_cr("[%d] region "PTR_FORMAT" is not empty, " - "returning it ", task_num, curr_region); + gclog_or_tty->print_cr("[%u] region "PTR_FORMAT" is not empty, " + "returning it ", worker_id, curr_region); } return curr_region; } else { assert(limit == bottom, "the region limit should be at bottom"); if (verbose_low()) { - gclog_or_tty->print_cr("[%d] region "PTR_FORMAT" is empty, " - "returning NULL", task_num, curr_region); + gclog_or_tty->print_cr("[%u] region "PTR_FORMAT" is empty, " + "returning NULL", worker_id, curr_region); } // we return NULL and the caller should try calling // claim_region() again. @@ -2697,10 +2697,10 @@ ConcurrentMark::claim_region(int task_num) { } else { assert(_finger > finger, "the finger should have moved forward"); if (verbose_low()) { - gclog_or_tty->print_cr("[%d] somebody else moved the finger, " + gclog_or_tty->print_cr("[%u] somebody else moved the finger, " "global finger = "PTR_FORMAT", " "our finger = "PTR_FORMAT, - task_num, _finger, finger); + worker_id, _finger, finger); } // read it again @@ -2783,7 +2783,7 @@ void ConcurrentMark::verify_no_cset_oops(bool verify_stacks, _markStack.oops_do(&cl); // Verify entries on the task queues - for (int i = 0; i < (int) _max_task_num; i += 1) { + for (uint i = 0; i < _max_worker_id; i += 1) { cl.set_phase(VerifyNoCSetOopsQueues, i); OopTaskQueue* queue = _task_queues->queue(i); queue->oops_do(&cl); @@ -2822,7 +2822,7 @@ void ConcurrentMark::verify_no_cset_oops(bool verify_stacks, } // Verify the task fingers - assert(parallel_marking_threads() <= _max_task_num, "sanity"); + assert(parallel_marking_threads() <= _max_worker_id, "sanity"); for (int i = 0; i < (int) parallel_marking_threads(); i += 1) { CMTask* task = _tasks[i]; HeapWord* task_finger = task->finger(); @@ -2849,7 +2849,7 @@ void ConcurrentMark::clear_marking_state(bool clear_overflow) { } _finger = _heap_start; - for (int i = 0; i < (int)_max_task_num; ++i) { + for (uint i = 0; i < _max_worker_id; ++i) { OopTaskQueue* queue = _task_queues->queue(i); queue->set_empty(); } @@ -2862,15 +2862,15 @@ class AggregateCountDataHRClosure: public HeapRegionClosure { ConcurrentMark* _cm; CardTableModRefBS* _ct_bs; BitMap* _cm_card_bm; - size_t _max_task_num; + uint _max_worker_id; public: AggregateCountDataHRClosure(G1CollectedHeap* g1h, BitMap* cm_card_bm, - size_t max_task_num) : + uint max_worker_id) : _g1h(g1h), _cm(g1h->concurrent_mark()), _ct_bs((CardTableModRefBS*) (g1h->barrier_set())), - _cm_card_bm(cm_card_bm), _max_task_num(max_task_num) { } + _cm_card_bm(cm_card_bm), _max_worker_id(max_worker_id) { } bool doHeapRegion(HeapRegion* hr) { if (hr->continuesHumongous()) { @@ -2927,7 +2927,7 @@ class AggregateCountDataHRClosure: public HeapRegionClosure { uint hrs_index = hr->hrs_index(); size_t marked_bytes = 0; - for (int i = 0; (size_t)i < _max_task_num; i += 1) { + for (uint i = 0; i < _max_worker_id; i += 1) { size_t* marked_bytes_array = _cm->count_marked_bytes_array_for(i); BitMap* task_card_bm = _cm->count_card_bitmap_for(i); @@ -2935,7 +2935,7 @@ class AggregateCountDataHRClosure: public HeapRegionClosure { // add it to the running total for this region. marked_bytes += marked_bytes_array[hrs_index]; - // Now union the bitmaps[0,max_task_num)[start_idx..limit_idx) + // Now union the bitmaps[0,max_worker_id)[start_idx..limit_idx) // into the global card bitmap. BitMap::idx_t scan_idx = task_card_bm->get_next_one_offset(start_idx, limit_idx); @@ -2967,22 +2967,22 @@ protected: G1CollectedHeap* _g1h; ConcurrentMark* _cm; BitMap* _cm_card_bm; - size_t _max_task_num; + uint _max_worker_id; int _active_workers; public: G1AggregateCountDataTask(G1CollectedHeap* g1h, ConcurrentMark* cm, BitMap* cm_card_bm, - size_t max_task_num, + uint max_worker_id, int n_workers) : AbstractGangTask("Count Aggregation"), _g1h(g1h), _cm(cm), _cm_card_bm(cm_card_bm), - _max_task_num(max_task_num), + _max_worker_id(max_worker_id), _active_workers(n_workers) { } void work(uint worker_id) { - AggregateCountDataHRClosure cl(_g1h, _cm_card_bm, _max_task_num); + AggregateCountDataHRClosure cl(_g1h, _cm_card_bm, _max_worker_id); if (G1CollectedHeap::use_parallel_gc_threads()) { _g1h->heap_region_par_iterate_chunked(&cl, worker_id, @@ -3001,7 +3001,7 @@ void ConcurrentMark::aggregate_count_data() { 1); G1AggregateCountDataTask g1_par_agg_task(_g1h, this, &_card_bm, - _max_task_num, n_workers); + _max_worker_id, n_workers); if (G1CollectedHeap::use_parallel_gc_threads()) { assert(_g1h->check_heap_region_claim_values(HeapRegion::InitialClaimValue), @@ -3030,9 +3030,9 @@ void ConcurrentMark::clear_all_count_data() { _region_bm.clear(); uint max_regions = _g1h->max_regions(); - assert(_max_task_num != 0, "unitialized"); + assert(_max_worker_id > 0, "uninitialized"); - for (int i = 0; (size_t) i < _max_task_num; i += 1) { + for (uint i = 0; i < _max_worker_id; i += 1) { BitMap* task_card_bm = count_card_bitmap_for(i); size_t* marked_bytes_array = count_marked_bytes_array_for(i); @@ -3062,7 +3062,7 @@ void ConcurrentMark::abort() { clear_all_count_data(); // Empty mark stack clear_marking_state(); - for (int i = 0; i < (int)_max_task_num; ++i) { + for (uint i = 0; i < _max_worker_id; ++i) { _tasks[i]->clear_region_fields(); } _has_aborted = true; @@ -3154,8 +3154,8 @@ bool ConcurrentMark::containing_cards_are_marked(void* start, void ConcurrentMark::print_finger() { gclog_or_tty->print_cr("heap ["PTR_FORMAT", "PTR_FORMAT"), global finger = "PTR_FORMAT, _heap_start, _heap_end, _finger); - for (int i = 0; i < (int) _max_task_num; ++i) { - gclog_or_tty->print(" %d: "PTR_FORMAT, i, _tasks[i]->finger()); + for (uint i = 0; i < _max_worker_id; ++i) { + gclog_or_tty->print(" %u: "PTR_FORMAT, i, _tasks[i]->finger()); } gclog_or_tty->print_cr(""); } @@ -3165,8 +3165,8 @@ void CMTask::scan_object(oop obj) { assert(_nextMarkBitMap->isMarked((HeapWord*) obj), "invariant"); if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] we're scanning object "PTR_FORMAT, - _task_id, (void*) obj); + gclog_or_tty->print_cr("[%u] we're scanning object "PTR_FORMAT, + _worker_id, (void*) obj); } size_t obj_size = obj->size(); @@ -3245,8 +3245,8 @@ void CMTask::setup_for_region(HeapRegion* hr) { "claim_region() should have filtered out continues humongous regions"); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] setting up for region "PTR_FORMAT, - _task_id, hr); + gclog_or_tty->print_cr("[%u] setting up for region "PTR_FORMAT, + _worker_id, hr); } _curr_region = hr; @@ -3261,9 +3261,9 @@ void CMTask::update_region_limit() { if (limit == bottom) { if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] found an empty region " + gclog_or_tty->print_cr("[%u] found an empty region " "["PTR_FORMAT", "PTR_FORMAT")", - _task_id, bottom, limit); + _worker_id, bottom, limit); } // The region was collected underneath our feet. // We set the finger to bottom to ensure that the bitmap @@ -3294,8 +3294,8 @@ void CMTask::update_region_limit() { void CMTask::giveup_current_region() { assert(_curr_region != NULL, "invariant"); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] giving up region "PTR_FORMAT, - _task_id, _curr_region); + gclog_or_tty->print_cr("[%u] giving up region "PTR_FORMAT, + _worker_id, _curr_region); } clear_region_fields(); } @@ -3321,7 +3321,7 @@ void CMTask::reset(CMBitMap* nextMarkBitMap) { guarantee(nextMarkBitMap != NULL, "invariant"); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] resetting", _task_id); + gclog_or_tty->print_cr("[%u] resetting", _worker_id); } _nextMarkBitMap = nextMarkBitMap; @@ -3415,9 +3415,9 @@ void CMTask::regular_clock_call() { _all_clock_intervals_ms.add(last_interval_ms); if (_cm->verbose_medium()) { - gclog_or_tty->print_cr("[%d] regular clock, interval = %1.2lfms, " + gclog_or_tty->print_cr("[%u] regular clock, interval = %1.2lfms, " "scanned = %d%s, refs reached = %d%s", - _task_id, last_interval_ms, + _worker_id, last_interval_ms, _words_scanned, (_words_scanned >= _words_scanned_limit) ? " (*)" : "", _refs_reached, @@ -3449,8 +3449,8 @@ void CMTask::regular_clock_call() { SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set(); if (!_draining_satb_buffers && satb_mq_set.process_completed_buffers()) { if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] aborting to deal with pending SATB buffers", - _task_id); + gclog_or_tty->print_cr("[%u] aborting to deal with pending SATB buffers", + _worker_id); } // we do need to process SATB buffers, we'll abort and restart // the marking task to do so @@ -3475,7 +3475,7 @@ void CMTask::decrease_limits() { // scanning limit so that the clock is called earlier. if (_cm->verbose_medium()) { - gclog_or_tty->print_cr("[%d] decreasing limits", _task_id); + gclog_or_tty->print_cr("[%u] decreasing limits", _worker_id); } _words_scanned_limit = _real_words_scanned_limit - @@ -3503,16 +3503,16 @@ void CMTask::move_entries_to_global_stack() { if (!_cm->mark_stack_push(buffer, n)) { if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] aborting due to global stack overflow", - _task_id); + gclog_or_tty->print_cr("[%u] aborting due to global stack overflow", + _worker_id); } set_has_aborted(); } else { // the transfer was successful if (_cm->verbose_medium()) { - gclog_or_tty->print_cr("[%d] pushed %d entries to the global stack", - _task_id, n); + gclog_or_tty->print_cr("[%u] pushed %d entries to the global stack", + _worker_id, n); } statsOnly( int tmp_size = _cm->mark_stack_size(); if (tmp_size > _global_max_size) { @@ -3539,8 +3539,8 @@ void CMTask::get_entries_from_global_stack() { statsOnly( ++_global_transfers_from; _global_pops += n ); if (_cm->verbose_medium()) { - gclog_or_tty->print_cr("[%d] popped %d entries from the global stack", - _task_id, n); + gclog_or_tty->print_cr("[%u] popped %d entries from the global stack", + _worker_id, n); } for (int i = 0; i < n; ++i) { bool success = _task_queue->push(buffer[i]); @@ -3575,8 +3575,8 @@ void CMTask::drain_local_queue(bool partially) { if (_task_queue->size() > target_size) { if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] draining local queue, target size = %d", - _task_id, target_size); + gclog_or_tty->print_cr("[%u] draining local queue, target size = %d", + _worker_id, target_size); } oop obj; @@ -3585,7 +3585,7 @@ void CMTask::drain_local_queue(bool partially) { statsOnly( ++_local_pops ); if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] popped "PTR_FORMAT, _task_id, + gclog_or_tty->print_cr("[%u] popped "PTR_FORMAT, _worker_id, (void*) obj); } @@ -3603,8 +3603,8 @@ void CMTask::drain_local_queue(bool partially) { } if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] drained local queue, size = %d", - _task_id, _task_queue->size()); + gclog_or_tty->print_cr("[%u] drained local queue, size = %d", + _worker_id, _task_queue->size()); } } } @@ -3631,8 +3631,8 @@ void CMTask::drain_global_stack(bool partially) { if (_cm->mark_stack_size() > target_size) { if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] draining global_stack, target size %d", - _task_id, target_size); + gclog_or_tty->print_cr("[%u] draining global_stack, target size %d", + _worker_id, target_size); } while (!has_aborted() && _cm->mark_stack_size() > target_size) { @@ -3641,8 +3641,8 @@ void CMTask::drain_global_stack(bool partially) { } if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] drained global stack, size = %d", - _task_id, _cm->mark_stack_size()); + gclog_or_tty->print_cr("[%u] drained global stack, size = %d", + _worker_id, _cm->mark_stack_size()); } } } @@ -3663,7 +3663,7 @@ void CMTask::drain_satb_buffers() { CMObjectClosure oc(this); SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set(); if (G1CollectedHeap::use_parallel_gc_threads()) { - satb_mq_set.set_par_closure(_task_id, &oc); + satb_mq_set.set_par_closure(_worker_id, &oc); } else { satb_mq_set.set_closure(&oc); } @@ -3672,9 +3672,9 @@ void CMTask::drain_satb_buffers() { // until we run out of buffers or we need to abort. if (G1CollectedHeap::use_parallel_gc_threads()) { while (!has_aborted() && - satb_mq_set.par_apply_closure_to_completed_buffer(_task_id)) { + satb_mq_set.par_apply_closure_to_completed_buffer(_worker_id)) { if (_cm->verbose_medium()) { - gclog_or_tty->print_cr("[%d] processed an SATB buffer", _task_id); + gclog_or_tty->print_cr("[%u] processed an SATB buffer", _worker_id); } statsOnly( ++_satb_buffers_processed ); regular_clock_call(); @@ -3683,7 +3683,7 @@ void CMTask::drain_satb_buffers() { while (!has_aborted() && satb_mq_set.apply_closure_to_completed_buffer()) { if (_cm->verbose_medium()) { - gclog_or_tty->print_cr("[%d] processed an SATB buffer", _task_id); + gclog_or_tty->print_cr("[%u] processed an SATB buffer", _worker_id); } statsOnly( ++_satb_buffers_processed ); regular_clock_call(); @@ -3693,7 +3693,7 @@ void CMTask::drain_satb_buffers() { if (!concurrent() && !has_aborted()) { // We should only do this during remark. if (G1CollectedHeap::use_parallel_gc_threads()) { - satb_mq_set.par_iterate_closure_all_threads(_task_id); + satb_mq_set.par_iterate_closure_all_threads(_worker_id); } else { satb_mq_set.iterate_closure_all_threads(); } @@ -3706,7 +3706,7 @@ void CMTask::drain_satb_buffers() { satb_mq_set.completed_buffers_num() == 0, "invariant"); if (G1CollectedHeap::use_parallel_gc_threads()) { - satb_mq_set.set_par_closure(_task_id, NULL); + satb_mq_set.set_par_closure(_worker_id, NULL); } else { satb_mq_set.set_closure(NULL); } @@ -3717,8 +3717,8 @@ void CMTask::drain_satb_buffers() { } void CMTask::print_stats() { - gclog_or_tty->print_cr("Marking Stats, task = %d, calls = %d", - _task_id, _calls); + gclog_or_tty->print_cr("Marking Stats, task = %u, calls = %d", + _worker_id, _calls); gclog_or_tty->print_cr(" Elapsed time = %1.2lfms, Termination time = %1.2lfms", _elapsed_time_ms, _termination_time_ms); gclog_or_tty->print_cr(" Step Times (cum): num = %d, avg = %1.2lfms, sd = %1.2lfms", @@ -3866,7 +3866,7 @@ void CMTask::do_marking_step(double time_target_ms, G1CollectorPolicy* g1_policy = _g1h->g1_policy(); assert(_task_queues != NULL, "invariant"); assert(_task_queue != NULL, "invariant"); - assert(_task_queues->queue(_task_id) == _task_queue, "invariant"); + assert(_task_queues->queue(_worker_id) == _task_queue, "invariant"); assert(!_claimed, "only one thread should claim this task at any one time"); @@ -3898,9 +3898,9 @@ void CMTask::do_marking_step(double time_target_ms, ++_calls; if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] >>>>>>>>>> START, call = %d, " + gclog_or_tty->print_cr("[%u] >>>>>>>>>> START, call = %d, " "target = %1.2lfms >>>>>>>>>>", - _task_id, _calls, _time_target_ms); + _worker_id, _calls, _time_target_ms); } // Set up the bitmap and oop closures. Anything that uses them is @@ -3948,10 +3948,10 @@ void CMTask::do_marking_step(double time_target_ms, MemRegion mr = MemRegion(_finger, _region_limit); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] we're scanning part " + gclog_or_tty->print_cr("[%u] we're scanning part " "["PTR_FORMAT", "PTR_FORMAT") " "of region "PTR_FORMAT, - _task_id, _finger, _region_limit, _curr_region); + _worker_id, _finger, _region_limit, _curr_region); } // Let's iterate over the bitmap of the part of the @@ -4007,17 +4007,17 @@ void CMTask::do_marking_step(double time_target_ms, assert(_finger == NULL, "invariant"); assert(_region_limit == NULL, "invariant"); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] trying to claim a new region", _task_id); + gclog_or_tty->print_cr("[%u] trying to claim a new region", _worker_id); } - HeapRegion* claimed_region = _cm->claim_region(_task_id); + HeapRegion* claimed_region = _cm->claim_region(_worker_id); if (claimed_region != NULL) { // Yes, we managed to claim one statsOnly( ++_regions_claimed ); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] we successfully claimed " + gclog_or_tty->print_cr("[%u] we successfully claimed " "region "PTR_FORMAT, - _task_id, claimed_region); + _worker_id, claimed_region); } setup_for_region(claimed_region); @@ -4044,7 +4044,7 @@ void CMTask::do_marking_step(double time_target_ms, "at this point we should be out of regions"); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] all regions claimed", _task_id); + gclog_or_tty->print_cr("[%u] all regions claimed", _worker_id); } // Try to reduce the number of available SATB buffers so that @@ -4068,17 +4068,17 @@ void CMTask::do_marking_step(double time_target_ms, "only way to reach here"); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] starting to steal", _task_id); + gclog_or_tty->print_cr("[%u] starting to steal", _worker_id); } while (!has_aborted()) { oop obj; statsOnly( ++_steal_attempts ); - if (_cm->try_stealing(_task_id, &_hash_seed, obj)) { + if (_cm->try_stealing(_worker_id, &_hash_seed, obj)) { if (_cm->verbose_medium()) { - gclog_or_tty->print_cr("[%d] stolen "PTR_FORMAT" successfully", - _task_id, (void*) obj); + gclog_or_tty->print_cr("[%u] stolen "PTR_FORMAT" successfully", + _worker_id, (void*) obj); } statsOnly( ++_steals ); @@ -4116,7 +4116,7 @@ void CMTask::do_marking_step(double time_target_ms, assert(_task_queue->size() == 0, "only way to reach here"); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] starting termination protocol", _task_id); + gclog_or_tty->print_cr("[%u] starting termination protocol", _worker_id); } _termination_start_time_ms = os::elapsedVTime() * 1000.0; @@ -4131,7 +4131,7 @@ void CMTask::do_marking_step(double time_target_ms, if (finished) { // We're all done. - if (_task_id == 0) { + if (_worker_id == 0) { // let's allow task 0 to do this if (concurrent()) { assert(_cm->concurrent_marking_in_progress(), "invariant"); @@ -4153,15 +4153,15 @@ void CMTask::do_marking_step(double time_target_ms, guarantee(!_cm->mark_stack_overflow(), "only way to reach here"); if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] all tasks terminated", _task_id); + gclog_or_tty->print_cr("[%u] all tasks terminated", _worker_id); } } else { // Apparently there's more work to do. Let's abort this task. It // will restart it and we can hopefully find more things to do. if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] apparently there is more work to do", - _task_id); + gclog_or_tty->print_cr("[%u] apparently there is more work to do", + _worker_id); } set_has_aborted(); @@ -4200,10 +4200,10 @@ void CMTask::do_marking_step(double time_target_ms, // will achieve this with the use of two barrier sync points. if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] detected overflow", _task_id); + gclog_or_tty->print_cr("[%u] detected overflow", _worker_id); } - _cm->enter_first_sync_barrier(_task_id); + _cm->enter_first_sync_barrier(_worker_id); // When we exit this sync barrier we know that all tasks have // stopped doing marking work. So, it's now safe to // re-initialise our data structures. At the end of this method, @@ -4215,39 +4215,39 @@ void CMTask::do_marking_step(double time_target_ms, clear_region_fields(); // ...and enter the second barrier. - _cm->enter_second_sync_barrier(_task_id); + _cm->enter_second_sync_barrier(_worker_id); // At this point everything has bee re-initialised and we're // ready to restart. } if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] <<<<<<<<<< ABORTING, target = %1.2lfms, " + gclog_or_tty->print_cr("[%u] <<<<<<<<<< ABORTING, target = %1.2lfms, " "elapsed = %1.2lfms <<<<<<<<<<", - _task_id, _time_target_ms, elapsed_time_ms); + _worker_id, _time_target_ms, elapsed_time_ms); if (_cm->has_aborted()) { - gclog_or_tty->print_cr("[%d] ========== MARKING ABORTED ==========", - _task_id); + gclog_or_tty->print_cr("[%u] ========== MARKING ABORTED ==========", + _worker_id); } } } else { if (_cm->verbose_low()) { - gclog_or_tty->print_cr("[%d] <<<<<<<<<< FINISHED, target = %1.2lfms, " + gclog_or_tty->print_cr("[%u] <<<<<<<<<< FINISHED, target = %1.2lfms, " "elapsed = %1.2lfms <<<<<<<<<<", - _task_id, _time_target_ms, elapsed_time_ms); + _worker_id, _time_target_ms, elapsed_time_ms); } } _claimed = false; } -CMTask::CMTask(int task_id, +CMTask::CMTask(uint worker_id, ConcurrentMark* cm, size_t* marked_bytes, BitMap* card_bm, CMTaskQueue* task_queue, CMTaskQueueSet* task_queues) : _g1h(G1CollectedHeap::heap()), - _task_id(task_id), _cm(cm), + _worker_id(worker_id), _cm(cm), _claimed(false), _nextMarkBitMap(NULL), _hash_seed(17), _task_queue(task_queue), diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp index abb46e1065c..5bac7a6b34d 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp @@ -399,9 +399,9 @@ protected: // last claimed region // marking tasks - uint _max_task_num; // maximum task number + uint _max_worker_id;// maximum worker id uint _active_tasks; // task num currently active - CMTask** _tasks; // task queue array (max_task_num len) + CMTask** _tasks; // task queue array (max_worker_id len) CMTaskQueueSet* _task_queues; // task queue set ParallelTaskTerminator _terminator; // for termination @@ -492,10 +492,10 @@ protected: ParallelTaskTerminator* terminator() { return &_terminator; } // It claims the next available region to be scanned by a marking - // task. It might return NULL if the next region is empty or we have - // run out of regions. In the latter case, out_of_regions() + // task/thread. It might return NULL if the next region is empty or + // we have run out of regions. In the latter case, out_of_regions() // determines whether we've really run out of regions or the task - // should call claim_region() again. This might seem a bit + // should call claim_region() again. This might seem a bit // awkward. Originally, the code was written so that claim_region() // either successfully returned with a non-empty region or there // were no more regions to be claimed. The problem with this was @@ -505,7 +505,7 @@ protected: // method. So, this way, each task will spend very little time in // claim_region() and is allowed to call the regular clock method // frequently. - HeapRegion* claim_region(int task); + HeapRegion* claim_region(uint worker_id); // It determines whether we've run out of regions to scan. bool out_of_regions() { return _finger == _heap_end; } @@ -537,8 +537,8 @@ protected: bool has_aborted() { return _has_aborted; } // Methods to enter the two overflow sync barriers - void enter_first_sync_barrier(int task_num); - void enter_second_sync_barrier(int task_num); + void enter_first_sync_barrier(uint worker_id); + void enter_second_sync_barrier(uint worker_id); ForceOverflowSettings* force_overflow_conc() { return &_force_overflow_conc; @@ -626,14 +626,14 @@ public: double all_task_accum_vtime() { double ret = 0.0; - for (int i = 0; i < (int)_max_task_num; ++i) + for (uint i = 0; i < _max_worker_id; ++i) ret += _accum_task_vtime[i]; return ret; } // Attempts to steal an object from the task queues of other tasks - bool try_stealing(int task_num, int* hash_seed, oop& obj) { - return _task_queues->steal(task_num, hash_seed, obj); + bool try_stealing(uint worker_id, int* hash_seed, oop& obj) { + return _task_queues->steal(worker_id, hash_seed, obj); } ConcurrentMark(ReservedSpace rs, uint max_regions); @@ -823,7 +823,7 @@ public: // Returns the card bitmap for a given task or worker id. BitMap* count_card_bitmap_for(uint worker_id) { - assert(0 <= worker_id && worker_id < _max_task_num, "oob"); + assert(0 <= worker_id && worker_id < _max_worker_id, "oob"); assert(_count_card_bitmaps != NULL, "uninitialized"); BitMap* task_card_bm = &_count_card_bitmaps[worker_id]; assert(task_card_bm->size() == _card_bm.size(), "size mismatch"); @@ -833,7 +833,7 @@ public: // Returns the array containing the marked bytes for each region, // for the given worker or task id. size_t* count_marked_bytes_array_for(uint worker_id) { - assert(0 <= worker_id && worker_id < _max_task_num, "oob"); + assert(0 <= worker_id && worker_id < _max_worker_id, "oob"); assert(_count_marked_bytes != NULL, "uninitialized"); size_t* marked_bytes_array = _count_marked_bytes[worker_id]; assert(marked_bytes_array != NULL, "uninitialized"); @@ -939,7 +939,7 @@ private: global_stack_transfer_size = 16 }; - int _task_id; + uint _worker_id; G1CollectedHeap* _g1h; ConcurrentMark* _cm; CMBitMap* _nextMarkBitMap; @@ -1115,8 +1115,8 @@ public: _elapsed_time_ms = os::elapsedTime() * 1000.0 - _elapsed_time_ms; } - // returns the task ID - int task_id() { return _task_id; } + // returns the worker ID associated with this task. + uint worker_id() { return _worker_id; } // From TerminatorTerminator. It determines whether this task should // exit the termination protocol after it's entered it. @@ -1170,7 +1170,7 @@ public: _finger = new_finger; } - CMTask(int task_num, ConcurrentMark *cm, + CMTask(uint worker_id, ConcurrentMark *cm, size_t* marked_bytes, BitMap* card_bm, CMTaskQueue* task_queue, CMTaskQueueSet* task_queues); diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp index 7f69234a5b7..f084bca5a77 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp @@ -279,7 +279,7 @@ inline void CMTask::push(oop obj) { assert(_nextMarkBitMap->isMarked(objAddr), "invariant"); if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] pushing "PTR_FORMAT, _task_id, (void*) obj); + gclog_or_tty->print_cr("[%u] pushing "PTR_FORMAT, _worker_id, (void*) obj); } if (!_task_queue->push(obj)) { @@ -287,9 +287,9 @@ inline void CMTask::push(oop obj) { // to the global stack. if (_cm->verbose_medium()) { - gclog_or_tty->print_cr("[%d] task queue overflow, " + gclog_or_tty->print_cr("[%u] task queue overflow, " "moving entries to the global stack", - _task_id); + _worker_id); } move_entries_to_global_stack(); @@ -318,8 +318,8 @@ inline void CMTask::push(oop obj) { inline void CMTask::deal_with_reference(oop obj) { if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] we're dealing with reference = "PTR_FORMAT, - _task_id, (void*) obj); + gclog_or_tty->print_cr("[%u] we're dealing with reference = "PTR_FORMAT, + _worker_id, (void*) obj); } ++_refs_reached; @@ -335,8 +335,8 @@ inline void CMTask::deal_with_reference(oop obj) { HeapRegion* hr = _g1h->heap_region_containing_raw(obj); if (!hr->obj_allocated_since_next_marking(obj)) { if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] "PTR_FORMAT" is not considered marked", - _task_id, (void*) obj); + gclog_or_tty->print_cr("[%u] "PTR_FORMAT" is not considered marked", + _worker_id, (void*) obj); } // we need to mark it first @@ -350,8 +350,8 @@ inline void CMTask::deal_with_reference(oop obj) { if (_finger != NULL && objAddr < _finger) { if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] below the local finger ("PTR_FORMAT"), " - "pushing it", _task_id, _finger); + gclog_or_tty->print_cr("[%u] below the local finger ("PTR_FORMAT"), " + "pushing it", _worker_id, _finger); } push(obj); } else if (_curr_region != NULL && objAddr < _region_limit) { @@ -367,9 +367,9 @@ inline void CMTask::deal_with_reference(oop obj) { // correctness problems. if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] below the global finger " + gclog_or_tty->print_cr("[%u] below the global finger " "("PTR_FORMAT"), pushing it", - _task_id, global_finger); + _worker_id, global_finger); } push(obj); } else { @@ -382,9 +382,9 @@ inline void CMTask::deal_with_reference(oop obj) { // see long comment above if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] below the global finger " + gclog_or_tty->print_cr("[%u] below the global finger " "("PTR_FORMAT"), pushing it", - _task_id, global_finger); + _worker_id, global_finger); } push(obj); } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp index c84de6e9e68..e26d2a6951d 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp @@ -111,9 +111,9 @@ inline void G1CMOopClosure::do_oop_nv(T* p) { oop obj = oopDesc::load_decode_heap_oop(p); if (_cm->verbose_high()) { - gclog_or_tty->print_cr("[%d] we're looking at location " + gclog_or_tty->print_cr("[%u] we're looking at location " "*"PTR_FORMAT" = "PTR_FORMAT, - _task->task_id(), p, (void*) obj); + _task->worker_id(), p, (void*) obj); } _task->deal_with_reference(obj); } From 845106af1373d54cd9ad0cac5e1927348267da16 Mon Sep 17 00:00:00 2001 From: Mikael Gerdin Date: Mon, 8 Oct 2012 09:12:31 -0700 Subject: [PATCH 034/241] 8000358: G1: metaspace information not printed in PrintHeapAtGC output nor in hs_err file Missing call to MetaspaceAux::print_on() in G1CollectedHeap::print_on(). Reviewed-by: azeemj, jmasa --- hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index f023f932ab8..471e638de19 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -3388,6 +3388,7 @@ void G1CollectedHeap::print_on(outputStream* st) const { st->print("%u survivors (" SIZE_FORMAT "K)", survivor_regions, (size_t) survivor_regions * HeapRegion::GrainBytes / K); st->cr(); + MetaspaceAux::print_on(st); } void G1CollectedHeap::print_extended_on(outputStream* st) const { From b807a9bf598cb86c34b3005d1c1efb38f323c193 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Tue, 9 Oct 2012 13:25:27 +0100 Subject: [PATCH 035/241] 7173494: some jdk tests are not run in test/Makefile Reviewed-by: chegar, mchung, mduigou, iris --- make/jprt.properties | 14 ++++++-------- test/Makefile | 10 ++++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/make/jprt.properties b/make/jprt.properties index 2b044f0a174..984c2b1b4e8 100644 --- a/make/jprt.properties +++ b/make/jprt.properties @@ -79,20 +79,18 @@ jprt.make.rule.core.test.targets= \ ${jprt.my.test.target.set:TESTNAME=jdk_util}, \ ${jprt.my.test.target.set:TESTNAME=jdk_io}, \ ${jprt.my.test.target.set:TESTNAME=jdk_net}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_nio1}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_nio2}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_nio3}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_nio}, \ ${jprt.my.test.target.set:TESTNAME=jdk_security1}, \ ${jprt.my.test.target.set:TESTNAME=jdk_security2}, \ ${jprt.my.test.target.set:TESTNAME=jdk_security3}, \ ${jprt.my.test.target.set:TESTNAME=jdk_rmi}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_management1}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_management2}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_management}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_jmx}, \ ${jprt.my.test.target.set:TESTNAME=jdk_text}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_tools1}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_tools2}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_tools}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_jdi}, \ ${jprt.my.test.target.set:TESTNAME=jdk_jfr}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_misc} + ${jprt.my.test.target.set:TESTNAME=jdk_other} # All vm test targets (testset=all) jprt.vm.all.test.targets= \ diff --git a/test/Makefile b/test/Makefile index f1dfe1dbd3c..9e4d509b550 100644 --- a/test/Makefile +++ b/test/Makefile @@ -58,9 +58,9 @@ JDK_DEFAULT_TEST_LIST = \ jdk_io \ jdk_lang \ jdk_math \ - jdk_misc \ + jdk_other \ jdk_net \ - jdk_nio1 jdk_nio2 jdk_nio3 \ + jdk_nio \ jdk_security1 \ jdk_text \ jdk_util @@ -69,12 +69,14 @@ JDK_DEFAULT_TEST_LIST = \ JDK_NONDEFAULT_TEST_LIST = \ jdk_awt \ jdk_beans2 jdk_beans3 \ - jdk_management1 jdk_management2 \ + jdk_management \ + jdk_jmx \ jdk_security2 jdk_security3 \ jdk_rmi \ jdk_sound \ jdk_swing \ - jdk_tools1 jdk_tools2 \ + jdk_tools \ + jdk_jdi \ jdk_jfr # All jdk tests From 63a30e32686c9967154c841eeaaecd5d408b147c Mon Sep 17 00:00:00 2001 From: Leonid Romanov Date: Tue, 9 Oct 2012 18:00:58 +0400 Subject: [PATCH 036/241] 7185280: Jre7cert: focusgained does not get called for all focus req when do alt + tab Reviewed-by: anthony --- .../windows/native/sun/windows/awt_Window.cpp | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/jdk/src/windows/native/sun/windows/awt_Window.cpp b/jdk/src/windows/native/sun/windows/awt_Window.cpp index 5c5f53dba40..b4110ece075 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp @@ -1559,21 +1559,8 @@ void AwtWindow::SendWindowEvent(jint id, HWND opposite, BOOL AwtWindow::AwtSetActiveWindow(BOOL isMouseEventCause, UINT hittest) { - // Fix for 6458497. - // Retreat if current foreground window is out of both our and embedder process. - // The exception is when activation is requested due to a mouse event. - if (!isMouseEventCause) { - HWND fgWindow = ::GetForegroundWindow(); - if (NULL != fgWindow) { - DWORD fgProcessID; - ::GetWindowThreadProcessId(fgWindow, &fgProcessID); - if (fgProcessID != ::GetCurrentProcessId() - && !AwtToolkit::GetInstance().IsEmbedderProcessId(fgProcessID)) - { - return FALSE; - } - } - } + // We used to reject non mouse window activation if our app wasn't active. + // This code since has been removed as the fix for 7185280 HWND proxyContainerHWnd = GetProxyToplevelContainer(); HWND proxyHWnd = GetProxyFocusOwner(); From 743e5c0d91b90231822411769c092220205e8e72 Mon Sep 17 00:00:00 2001 From: Leonid Romanov Date: Tue, 9 Oct 2012 20:59:41 +0400 Subject: [PATCH 037/241] 7124321: [macosx] TrayIcon MouseListener is never triggered Reviewed-by: anthony --- .../classes/sun/lwawt/macosx/CTrayIcon.java | 86 ++++++++++++- jdk/src/macosx/native/sun/awt/CTrayIcon.h | 2 + jdk/src/macosx/native/sun/awt/CTrayIcon.m | 118 ++++++++++++++---- 3 files changed, 179 insertions(+), 27 deletions(-) diff --git a/jdk/src/macosx/classes/sun/lwawt/macosx/CTrayIcon.java b/jdk/src/macosx/classes/sun/lwawt/macosx/CTrayIcon.java index fac844e4229..4a19e5a064d 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CTrayIcon.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CTrayIcon.java @@ -26,6 +26,7 @@ package sun.lwawt.macosx; import sun.awt.SunToolkit; +import sun.lwawt.macosx.event.NSEvent; import javax.swing.*; import java.awt.*; @@ -42,6 +43,16 @@ public class CTrayIcon extends CFRetainedResource implements TrayIconPeer { private JDialog messageDialog; private DialogEventHandler handler; + // In order to construct MouseEvent object, we need to specify a + // Component target. Because TrayIcon isn't Component's subclass, + // we use this dummy frame instead + private final Frame dummyFrame; + + // A bitmask that indicates what mouse buttons produce MOUSE_CLICKED events + // on MOUSE_RELEASE. Click events are only generated if there were no drag + // events between MOUSE_PRESSED and MOUSE_RELEASED for particular button + private static int mouseClickButtons = 0; + CTrayIcon(TrayIcon target) { super(0, true); @@ -49,6 +60,7 @@ public class CTrayIcon extends CFRetainedResource implements TrayIconPeer { this.handler = null; this.target = target; this.popup = target.getPopupMenu(); + this.dummyFrame = new Frame(); setPtr(createModel()); //if no one else is creating the peer. @@ -119,6 +131,8 @@ public class CTrayIcon extends CFRetainedResource implements TrayIconPeer { disposeMessageDialog(); } + dummyFrame.dispose(); + LWCToolkit.targetDisposedPeer(target, this); target = null; @@ -161,17 +175,78 @@ public class CTrayIcon extends CFRetainedResource implements TrayIconPeer { private native void setNativeImage(final long model, final long nsimage, final boolean autosize); - //invocation from the AWTTrayIcon.m - public void performAction() { + private void postEvent(final AWTEvent event) { SunToolkit.executeOnEventHandlerThread(target, new Runnable() { public void run() { - final String cmd = target.getActionCommand(); - final ActionEvent event = new ActionEvent(target, ActionEvent.ACTION_PERFORMED, cmd); SunToolkit.postEvent(SunToolkit.targetToAppContext(target), event); } }); } + //invocation from the AWTTrayIcon.m + private void handleMouseEvent(NSEvent nsEvent) { + int buttonNumber = nsEvent.getButtonNumber(); + final SunToolkit tk = (SunToolkit)Toolkit.getDefaultToolkit(); + if ((buttonNumber > 2 && !tk.areExtraMouseButtonsEnabled()) + || buttonNumber > tk.getNumberOfButtons() - 1) { + return; + } + + int jeventType = NSEvent.nsToJavaEventType(nsEvent.getType()); + + int jbuttonNumber = MouseEvent.NOBUTTON; + int jclickCount = 0; + if (jeventType != MouseEvent.MOUSE_MOVED) { + jbuttonNumber = NSEvent.nsToJavaButton(buttonNumber); + jclickCount = nsEvent.getClickCount(); + } + + int jmodifiers = NSEvent.nsToJavaMouseModifiers(buttonNumber, + nsEvent.getModifierFlags()); + boolean isPopupTrigger = NSEvent.isPopupTrigger(jmodifiers); + + int eventButtonMask = (jbuttonNumber > 0)? + MouseEvent.getMaskForButton(jbuttonNumber) : 0; + long when = System.currentTimeMillis(); + + if (jeventType == MouseEvent.MOUSE_PRESSED) { + mouseClickButtons |= eventButtonMask; + } else if (jeventType == MouseEvent.MOUSE_DRAGGED) { + mouseClickButtons = 0; + } + + // The MouseEvent's coordinates are relative to screen + int absX = nsEvent.getAbsX(); + int absY = nsEvent.getAbsY(); + + MouseEvent mouseEvent = new MouseEvent(dummyFrame, jeventType, when, + jmodifiers, absX, absY, absX, absY, jclickCount, isPopupTrigger, + jbuttonNumber); + mouseEvent.setSource(target); + postEvent(mouseEvent); + + // fire ACTION event + if (jeventType == MouseEvent.MOUSE_PRESSED && isPopupTrigger) { + final String cmd = target.getActionCommand(); + final ActionEvent event = new ActionEvent(target, + ActionEvent.ACTION_PERFORMED, cmd); + postEvent(event); + } + + // synthesize CLICKED event + if (jeventType == MouseEvent.MOUSE_RELEASED) { + if ((mouseClickButtons & eventButtonMask) != 0) { + MouseEvent clickEvent = new MouseEvent(dummyFrame, + MouseEvent.MOUSE_CLICKED, when, jmodifiers, absX, absY, + absX, absY, jclickCount, isPopupTrigger, jbuttonNumber); + clickEvent.setSource(target); + postEvent(clickEvent); + } + + mouseClickButtons &= ~eventButtonMask; + } + } + private native Point2D nativeGetIconLocation(long trayIconModel); public void displayMessageOnEDT(String caption, String text, @@ -256,6 +331,9 @@ public class CTrayIcon extends CFRetainedResource implements TrayIconPeer { dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); dialog.setModal(false); + dialog.setModalExclusionType(Dialog.ModalExclusionType.TOOLKIT_EXCLUDE); + dialog.setAlwaysOnTop(true); + dialog.setAutoRequestFocus(false); dialog.setResizable(false); dialog.setContentPane(op); diff --git a/jdk/src/macosx/native/sun/awt/CTrayIcon.h b/jdk/src/macosx/native/sun/awt/CTrayIcon.h index c5ceebf3414..9501e7ddde4 100644 --- a/jdk/src/macosx/native/sun/awt/CTrayIcon.h +++ b/jdk/src/macosx/native/sun/awt/CTrayIcon.h @@ -53,6 +53,7 @@ extern "C" { - (jobject) peer; - (void) setImage:(NSImage *) imagePtr sizing:(BOOL)autosize; - (NSPoint) getLocationOnScreen; +- (void) deliverJavaMouseEvent:(NSEvent*) event; @end //AWTTrayIcon @@ -68,6 +69,7 @@ extern "C" { -(id)initWithTrayIcon:(AWTTrayIcon *)theTrayIcon; -(void)setHighlighted:(BOOL)aFlag; -(void)setImage:(NSImage*)anImage; +-(void)setTrayIcon:(AWTTrayIcon*)theTrayIcon; @end //AWTTrayIconView diff --git a/jdk/src/macosx/native/sun/awt/CTrayIcon.m b/jdk/src/macosx/native/sun/awt/CTrayIcon.m index b9c2942f1b7..a69995f84aa 100644 --- a/jdk/src/macosx/native/sun/awt/CTrayIcon.m +++ b/jdk/src/macosx/native/sun/awt/CTrayIcon.m @@ -29,6 +29,7 @@ #import "CTrayIcon.h" #import "ThreadUtilities.h" #include "GeomUtilities.h" +#import "LWCToolkit.h" #define kImageInset 4.0 @@ -76,8 +77,9 @@ static NSSize ScaledImageSizeForStatusBar(NSSize imageSize) { // Its a bad idea to force the item to release our view by setting // the item's view to nil: it can lead to a crash in some scenarios. // The item will release the view later on, so just set the view's image - // to nil since we are done with it. + // and tray icon to nil since we are done with it. [view setImage: nil]; + [view setTrayIcon: nil]; [view release]; [theItem release]; @@ -115,6 +117,45 @@ static NSSize ScaledImageSizeForStatusBar(NSSize imageSize) { return [[view window] convertBaseToScreen: NSZeroPoint]; } +-(void) deliverJavaMouseEvent: (NSEvent *) event { + [AWTToolkit eventCountPlusPlus]; + + JNIEnv *env = [ThreadUtilities getJNIEnv]; + + NSPoint eventLocation = [event locationInWindow]; + NSPoint localPoint = [view convertPoint: eventLocation fromView: nil]; + localPoint.y = [view bounds].size.height - localPoint.y; + + NSPoint absP = [NSEvent mouseLocation]; + NSEventType type = [event type]; + + NSRect screenRect = [[NSScreen mainScreen] frame]; + absP.y = screenRect.size.height - absP.y; + jint clickCount; + + clickCount = [event clickCount]; + + static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/event/NSEvent"); + static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IIIIIIIIDD)V"); + jobject jEvent = JNFNewObject(env, jctor_NSEvent, + [event type], + [event modifierFlags], + clickCount, + [event buttonNumber], + (jint)localPoint.x, (jint)localPoint.y, + (jint)absP.x, (jint)absP.y, + [event deltaY], + [event deltaX]); + if (jEvent == nil) { + // Unable to create event by some reason. + return; + } + + static JNF_CLASS_CACHE(jc_TrayIcon, "sun/lwawt/macosx/CTrayIcon"); + static JNF_MEMBER_CACHE(jm_handleMouseEvent, jc_TrayIcon, "handleMouseEvent", "(Lsun/lwawt/macosx/event/NSEvent;)V"); + JNFCallVoidMethod(env, peer, jm_handleMouseEvent, jEvent); +} + @end //AWTTrayIcon //================================================ @@ -123,7 +164,7 @@ static NSSize ScaledImageSizeForStatusBar(NSSize imageSize) { -(id)initWithTrayIcon:(AWTTrayIcon *)theTrayIcon { self = [super initWithFrame:NSMakeRect(0, 0, 1, 1)]; - trayIcon = theTrayIcon; + [self setTrayIcon: theTrayIcon]; isHighlighted = NO; image = nil; @@ -153,6 +194,10 @@ static NSSize ScaledImageSizeForStatusBar(NSSize imageSize) { } } +-(void)setTrayIcon:(AWTTrayIcon*)theTrayIcon { + trayIcon = theTrayIcon; +} + - (void)menuWillOpen:(NSMenu *)menu { [self setHighlighted:YES]; @@ -191,30 +236,57 @@ static NSSize ScaledImageSizeForStatusBar(NSSize imageSize) { ]; } -- (void) mouseDown:(NSEvent *)e { - //find CTrayIcon.getPopupMenuModel method and call it to get popup menu ptr. - JNIEnv *env = [ThreadUtilities getJNIEnv]; - static JNF_CLASS_CACHE(jc_CTrayIcon, "sun/lwawt/macosx/CTrayIcon"); - static JNF_MEMBER_CACHE(jm_getPopupMenuModel, jc_CTrayIcon, "getPopupMenuModel", "()J"); - static JNF_MEMBER_CACHE(jm_performAction, jc_CTrayIcon, "performAction", "()V"); - jlong res = JNFCallLongMethod(env, trayIcon.peer, jm_getPopupMenuModel); - if (res != 0) { - CPopupMenu *cmenu = jlong_to_ptr(res); - NSMenu* menu = [cmenu menu]; - [menu setDelegate:self]; - [trayIcon.theItem popUpStatusItemMenu:menu]; - [self setNeedsDisplay:YES]; - } else { - JNFCallVoidMethod(env, trayIcon.peer, jm_performAction); +- (void)mouseDown:(NSEvent *)event { + [trayIcon deliverJavaMouseEvent: event]; + + // don't show the menu on ctrl+click: it triggers ACTION event, like right click + if (([event modifierFlags] & NSControlKeyMask) == 0) { + //find CTrayIcon.getPopupMenuModel method and call it to get popup menu ptr. + JNIEnv *env = [ThreadUtilities getJNIEnv]; + static JNF_CLASS_CACHE(jc_CTrayIcon, "sun/lwawt/macosx/CTrayIcon"); + static JNF_MEMBER_CACHE(jm_getPopupMenuModel, jc_CTrayIcon, "getPopupMenuModel", "()J"); + jlong res = JNFCallLongMethod(env, trayIcon.peer, jm_getPopupMenuModel); + + if (res != 0) { + CPopupMenu *cmenu = jlong_to_ptr(res); + NSMenu* menu = [cmenu menu]; + [menu setDelegate:self]; + [trayIcon.theItem popUpStatusItemMenu:menu]; + [self setNeedsDisplay:YES]; + } } } -- (void) rightMouseDown:(NSEvent *)e { - // Call CTrayIcon.performAction() method on right mouse press - JNIEnv *env = [ThreadUtilities getJNIEnv]; - static JNF_CLASS_CACHE(jc_CTrayIcon, "sun/lwawt/macosx/CTrayIcon"); - static JNF_MEMBER_CACHE(jm_performAction, jc_CTrayIcon, "performAction", "()V"); - JNFCallVoidMethod(env, trayIcon.peer, jm_performAction); +- (void) mouseUp:(NSEvent *)event { + [trayIcon deliverJavaMouseEvent: event]; +} + +- (void) mouseDragged:(NSEvent *)event { + [trayIcon deliverJavaMouseEvent: event]; +} + +- (void) rightMouseDown:(NSEvent *)event { + [trayIcon deliverJavaMouseEvent: event]; +} + +- (void) rightMouseUp:(NSEvent *)event { + [trayIcon deliverJavaMouseEvent: event]; +} + +- (void) rightMouseDragged:(NSEvent *)event { + [trayIcon deliverJavaMouseEvent: event]; +} + +- (void) otherMouseDown:(NSEvent *)event { + [trayIcon deliverJavaMouseEvent: event]; +} + +- (void) otherMouseUp:(NSEvent *)event { + [trayIcon deliverJavaMouseEvent: event]; +} + +- (void) otherMouseDragged:(NSEvent *)event { + [trayIcon deliverJavaMouseEvent: event]; } From 63128f0e6d1073f7b0e990b959cd6e8f372af795 Mon Sep 17 00:00:00 2001 From: Sean Coffey Date: Tue, 9 Oct 2012 20:14:36 +0100 Subject: [PATCH 038/241] 7196086: update copyright years for files in corba repository (JDK 8) Reviewed-by: lancea --- corba/make/common/Defs-bsd.gmk | 2 +- corba/make/common/internal/Resources.gmk | 2 +- corba/make/common/shared/Defs-bsd.gmk | 2 +- corba/make/common/shared/Defs-utils.gmk | 2 +- .../src/build/tools/stripproperties/StripPropertiesCorba.java | 2 +- corba/make/tools/strip_properties/Makefile | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/corba/make/common/Defs-bsd.gmk b/corba/make/common/Defs-bsd.gmk index 44b5011e09d..99b3737d486 100644 --- a/corba/make/common/Defs-bsd.gmk +++ b/corba/make/common/Defs-bsd.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/corba/make/common/internal/Resources.gmk b/corba/make/common/internal/Resources.gmk index d9bc99bf2ca..e7ccb1bd066 100644 --- a/corba/make/common/internal/Resources.gmk +++ b/corba/make/common/internal/Resources.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/corba/make/common/shared/Defs-bsd.gmk b/corba/make/common/shared/Defs-bsd.gmk index 2869149ebc5..2d48947f414 100644 --- a/corba/make/common/shared/Defs-bsd.gmk +++ b/corba/make/common/shared/Defs-bsd.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/corba/make/common/shared/Defs-utils.gmk b/corba/make/common/shared/Defs-utils.gmk index 40bf4687263..555d98f5e4d 100644 --- a/corba/make/common/shared/Defs-utils.gmk +++ b/corba/make/common/shared/Defs-utils.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/corba/make/tools/src/build/tools/stripproperties/StripPropertiesCorba.java b/corba/make/tools/src/build/tools/stripproperties/StripPropertiesCorba.java index 4ff1ca13d8b..b5c7ecb253b 100644 --- a/corba/make/tools/src/build/tools/stripproperties/StripPropertiesCorba.java +++ b/corba/make/tools/src/build/tools/stripproperties/StripPropertiesCorba.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/corba/make/tools/strip_properties/Makefile b/corba/make/tools/strip_properties/Makefile index 75eb2f1ffe6..e74d44c09c8 100644 --- a/corba/make/tools/strip_properties/Makefile +++ b/corba/make/tools/strip_properties/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it From 724e5ecfb34c6080d9e044111f3b3d2a96b294fd Mon Sep 17 00:00:00 2001 From: Stefan Karlsson Date: Tue, 9 Oct 2012 22:12:25 +0200 Subject: [PATCH 039/241] 8000659: NPG: ClassCastExceptions are unexpectedly thrown when testing nashorn Treat the oops in invoke_method_table() as strong roots when ClassUnloading is enabled. Reviewed-by: kamg, coleenp --- hotspot/src/share/vm/classfile/systemDictionary.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp index 081007c4eb9..5c0d99258b2 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.cpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp @@ -1749,6 +1749,9 @@ void SystemDictionary::always_strong_oops_do(OopClosure* blk) { blk->do_oop(&_system_loader_lock_obj); dictionary()->always_strong_oops_do(blk); + + // Visit extra methods + invoke_method_table()->oops_do(blk); } void SystemDictionary::always_strong_classes_do(KlassClosure* closure) { From 0b25975fcdb01c1fb40217e5b6710849d386a634 Mon Sep 17 00:00:00 2001 From: Joe Wang Date: Tue, 9 Oct 2012 14:19:11 -0700 Subject: [PATCH 040/241] 8000172: 2 SAX features does not work properly When external dtd is not loaded, skippedEntity event should be reported for entity references. Reviewed-by: lancea --- .../internal/impl/XMLDocumentFragmentScannerImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java index d6680eceb05..8a2b5948c3f 100644 --- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java +++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java @@ -806,6 +806,7 @@ public class XMLDocumentFragmentScannerImpl * where the entity encoding is not auto-detected (e.g. * internal entities or a document entity that is * parsed from a java.io.Reader). + * @param augs Additional information that may include infoset augmentations * * @throws XNIException Thrown by handler to signal an error. */ @@ -833,7 +834,7 @@ public class XMLDocumentFragmentScannerImpl // call handler if (fDocumentHandler != null && !fScanningAttribute) { if (!name.equals("[xml]")) { - fDocumentHandler.startGeneralEntity(name, identifier, encoding, null); + fDocumentHandler.startGeneralEntity(name, identifier, encoding, augs); } } @@ -845,6 +846,7 @@ public class XMLDocumentFragmentScannerImpl * are just specified by their name. * * @param name The name of the entity. + * @param augs Additional information that may include infoset augmentations * * @throws XNIException Thrown by handler to signal an error. */ @@ -869,7 +871,7 @@ public class XMLDocumentFragmentScannerImpl // call handler if (fDocumentHandler != null && !fScanningAttribute) { if (!name.equals("[xml]")) { - fDocumentHandler.endGeneralEntity(name, null); + fDocumentHandler.endGeneralEntity(name, augs); } } From 36c391525784477a651f339878d8647b0e6e85b6 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 9 Oct 2012 19:10:00 -0700 Subject: [PATCH 041/241] 8000663: clean up langtools imports Reviewed-by: darcy --- .../sun/source/tree/CompilationUnitTree.java | 3 +- .../classes/com/sun/source/tree/Scope.java | 4 +- .../com/sun/source/util/TaskEvent.java | 5 ++- .../classes/com/sun/source/util/TreePath.java | 5 ++- .../sun/tools/classfile/ClassTranslator.java | 5 ++- .../com/sun/tools/classfile/Dependencies.java | 5 +-- .../formats/html/AbstractIndexWriter.java | 4 +- .../formats/html/AbstractMemberWriter.java | 7 ++-- .../formats/html/AbstractTreeWriter.java | 9 +++-- .../formats/html/AllClassesFrameWriter.java | 4 +- .../html/AnnotationTypeWriterImpl.java | 8 ++-- .../doclets/formats/html/ClassUseWriter.java | 3 +- .../doclets/formats/html/ClassWriterImpl.java | 6 +-- .../formats/html/ConfigurationImpl.java | 10 ++--- .../html/ConstantsSummaryWriterImpl.java | 5 ++- .../formats/html/DeprecatedListWriter.java | 8 ++-- .../formats/html/FrameOutputWriter.java | 7 ++-- .../doclets/formats/html/HelpWriter.java | 5 ++- .../doclets/formats/html/HtmlDoclet.java | 10 ++--- .../formats/html/HtmlDocletWriter.java | 2 +- .../formats/html/HtmlSerialFieldWriter.java | 4 +- .../formats/html/HtmlSerialMethodWriter.java | 4 +- .../doclets/formats/html/LinkFactoryImpl.java | 4 +- .../formats/html/PackageFrameWriter.java | 7 ++-- .../formats/html/PackageIndexFrameWriter.java | 5 ++- .../formats/html/PackageIndexWriter.java | 5 ++- .../formats/html/PackageTreeWriter.java | 4 +- .../formats/html/PackageUseWriter.java | 5 ++- .../formats/html/PackageWriterImpl.java | 5 ++- .../formats/html/SingleIndexWriter.java | 5 ++- .../formats/html/SplitIndexWriter.java | 5 ++- .../formats/html/SubWriterHolderWriter.java | 5 ++- .../doclets/formats/html/TreeWriter.java | 4 +- .../formats/html/WriterFactoryImpl.java | 4 +- .../internal/toolkit/AbstractDoclet.java | 8 ++-- .../internal/toolkit/Configuration.java | 9 +++-- .../toolkit/ConstantsSummaryWriter.java | 5 ++- .../toolkit/PackageSummaryWriter.java | 5 ++- .../internal/toolkit/WriterFactory.java | 4 +- .../toolkit/builders/AbstractBuilder.java | 7 ++-- .../builders/AbstractMemberBuilder.java | 3 +- .../builders/AnnotationTypeBuilder.java | 7 ++-- .../AnnotationTypeOptionalMemberBuilder.java | 7 ++-- .../AnnotationTypeRequiredMemberBuilder.java | 7 ++-- .../toolkit/builders/BuilderFactory.java | 4 +- .../toolkit/builders/ClassBuilder.java | 5 ++- .../builders/ConstantsSummaryBuilder.java | 5 ++- .../toolkit/builders/ConstructorBuilder.java | 7 ++-- .../toolkit/builders/EnumConstantBuilder.java | 7 ++-- .../toolkit/builders/FieldBuilder.java | 7 ++-- .../toolkit/builders/LayoutParser.java | 11 +++-- .../builders/MemberSummaryBuilder.java | 7 ++-- .../toolkit/builders/MethodBuilder.java | 7 ++-- .../builders/PackageSummaryBuilder.java | 5 ++- .../builders/SerializedFormBuilder.java | 5 ++- .../internal/toolkit/taglets/BaseTaglet.java | 3 +- .../internal/toolkit/taglets/ParamTaglet.java | 5 ++- .../toolkit/taglets/ReturnTaglet.java | 4 +- .../internal/toolkit/taglets/SeeTaglet.java | 4 +- .../toolkit/taglets/TagletManager.java | 6 +-- .../toolkit/taglets/TagletWriter.java | 4 +- .../toolkit/taglets/ThrowsTaglet.java | 5 ++- .../internal/toolkit/taglets/ValueTaglet.java | 5 ++- .../internal/toolkit/util/ClassTree.java | 7 ++-- .../internal/toolkit/util/ClassUseMapper.java | 5 ++- .../util/DeprecatedAPIListBuilder.java | 5 ++- .../internal/toolkit/util/DocFinder.java | 5 ++- .../doclets/internal/toolkit/util/Extern.java | 12 +++--- .../doclets/internal/toolkit/util/Group.java | 7 ++-- .../toolkit/util/ImplementedMethods.java | 5 ++- .../internal/toolkit/util/IndexBuilder.java | 7 ++-- .../toolkit/util/MessageRetriever.java | 7 ++-- .../internal/toolkit/util/MetaKeywords.java | 7 ++-- .../toolkit/util/PackageListWriter.java | 7 ++-- .../toolkit/util/VisibleMemberMap.java | 5 ++- .../sun/tools/javac/api/BasicJavacTask.java | 2 +- .../com/sun/tools/javac/api/JavacTrees.java | 2 +- .../javac/api/WrappingJavaFileManager.java | 5 ++- .../com/sun/tools/javac/code/Annotations.java | 4 +- .../tools/javac/code/DeferredLintHandler.java | 4 +- .../com/sun/tools/javac/code/Flags.java | 3 +- .../com/sun/tools/javac/code/Kinds.java | 5 +-- .../com/sun/tools/javac/code/Printer.java | 11 ++--- .../com/sun/tools/javac/code/Scope.java | 5 ++- .../com/sun/tools/javac/code/Source.java | 4 +- .../com/sun/tools/javac/code/Symbol.java | 6 +-- .../com/sun/tools/javac/code/Symtab.java | 12 +++--- .../com/sun/tools/javac/code/TargetType.java | 6 +-- .../com/sun/tools/javac/code/Type.java | 6 +-- .../com/sun/tools/javac/code/Types.java | 14 +++---- .../com/sun/tools/javac/comp/Attr.java | 40 +++++++++---------- .../sun/tools/javac/comp/DeferredAttr.java | 1 - .../com/sun/tools/javac/comp/Infer.java | 1 - .../com/sun/tools/javac/comp/TransTypes.java | 2 - .../sun/tools/javac/file/ZipFileIndex.java | 1 - .../javac/model/AnnotationProxyMaker.java | 7 ++-- .../sun/tools/javac/nio/PathFileObject.java | 3 +- .../com/sun/tools/javac/tree/Pretty.java | 2 - .../tools/javac/util/DiagnosticSource.java | 2 - .../sun/tools/javac/util/JCDiagnostic.java | 1 - .../sun/tools/javadoc/AbstractTypeImpl.java | 3 +- .../sun/tools/javadoc/AnnotationDescImpl.java | 3 +- .../tools/javadoc/AnnotationTypeDocImpl.java | 3 +- .../javadoc/AnnotationTypeElementDocImpl.java | 6 +-- .../tools/javadoc/AnnotationValueImpl.java | 1 - .../com/sun/tools/javadoc/ClassDocImpl.java | 4 +- .../com/sun/tools/javadoc/DocImpl.java | 8 ++-- .../com/sun/tools/javadoc/DocLocale.java | 7 ++-- .../com/sun/tools/javadoc/DocletInvoker.java | 14 +++---- .../com/sun/tools/javadoc/FieldDocImpl.java | 2 - .../com/sun/tools/javadoc/JavadocEnter.java | 1 - .../com/sun/tools/javadoc/Messager.java | 10 ++--- .../com/sun/tools/javadoc/MethodDocImpl.java | 7 ++-- .../com/sun/tools/javadoc/PackageDocImpl.java | 6 +-- .../com/sun/tools/javadoc/ParameterImpl.java | 3 +- .../com/sun/tools/javadoc/PrimitiveType.java | 9 +---- .../tools/javadoc/ProgramElementDocImpl.java | 20 ++++------ .../com/sun/tools/javadoc/SeeTagImpl.java | 5 +-- .../com/sun/tools/javadoc/SerializedForm.java | 7 ++-- .../classes/com/sun/tools/javadoc/Start.java | 17 ++++---- .../com/sun/tools/javadoc/TypeMaker.java | 6 +-- .../sun/tools/javadoc/TypeVariableImpl.java | 3 +- .../sun/tools/javadoc/WildcardTypeImpl.java | 3 +- .../annotation/processing/Completions.java | 4 +- .../annotation/processing/FilerException.java | 3 +- .../processing/ProcessingEnvironment.java | 4 +- .../lang/model/element/AnnotationValue.java | 6 +-- .../javax/lang/model/element/Element.java | 1 - .../lang/model/element/ExecutableElement.java | 3 +- .../lang/model/element/VariableElement.java | 3 +- .../model/type/MirroredTypeException.java | 3 +- .../model/type/MirroredTypesException.java | 3 +- .../util/AbstractAnnotationValueVisitor6.java | 4 +- .../util/AbstractAnnotationValueVisitor7.java | 4 -- .../util/AbstractAnnotationValueVisitor8.java | 6 +-- .../model/util/AbstractElementVisitor6.java | 9 ++--- .../model/util/AbstractElementVisitor7.java | 7 +--- .../model/util/AbstractElementVisitor8.java | 7 +--- .../javax/lang/model/util/ElementFilter.java | 6 +-- .../lang/model/util/ElementKindVisitor7.java | 7 ++-- .../lang/model/util/ElementKindVisitor8.java | 1 - .../lang/model/util/ElementScanner6.java | 3 +- .../lang/model/util/ElementScanner7.java | 3 +- .../lang/model/util/ElementScanner8.java | 3 +- .../util/SimpleAnnotationValueVisitor7.java | 10 ++--- .../util/SimpleAnnotationValueVisitor8.java | 10 ++--- .../model/util/SimpleElementVisitor6.java | 3 +- .../model/util/SimpleElementVisitor7.java | 3 +- .../model/util/SimpleElementVisitor8.java | 4 +- .../lang/model/util/SimpleTypeVisitor8.java | 3 +- .../lang/model/util/TypeKindVisitor6.java | 8 ++-- .../lang/model/util/TypeKindVisitor7.java | 3 +- .../lang/model/util/TypeKindVisitor8.java | 7 ++-- .../tools/ForwardingJavaFileManager.java | 3 +- .../classes/javax/tools/JavaFileObject.java | 8 +--- 155 files changed, 398 insertions(+), 479 deletions(-) diff --git a/langtools/src/share/classes/com/sun/source/tree/CompilationUnitTree.java b/langtools/src/share/classes/com/sun/source/tree/CompilationUnitTree.java index 66b585cf347..e6ff1aad67c 100644 --- a/langtools/src/share/classes/com/sun/source/tree/CompilationUnitTree.java +++ b/langtools/src/share/classes/com/sun/source/tree/CompilationUnitTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package com.sun.source.tree; import java.util.List; import javax.tools.JavaFileObject; -import com.sun.source.tree.LineMap; /** * Represents the abstract syntax tree for compilation units (source diff --git a/langtools/src/share/classes/com/sun/source/tree/Scope.java b/langtools/src/share/classes/com/sun/source/tree/Scope.java index 441f337f836..5d86fc8bf24 100644 --- a/langtools/src/share/classes/com/sun/source/tree/Scope.java +++ b/langtools/src/share/classes/com/sun/source/tree/Scope.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,9 @@ package com.sun.source.tree; -import com.sun.source.tree.Tree; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; -import javax.lang.model.type.DeclaredType; /** * Interface for determining locally available program elements, such as diff --git a/langtools/src/share/classes/com/sun/source/util/TaskEvent.java b/langtools/src/share/classes/com/sun/source/util/TaskEvent.java index 7f4514964f7..9ade21f229d 100644 --- a/langtools/src/share/classes/com/sun/source/util/TaskEvent.java +++ b/langtools/src/share/classes/com/sun/source/util/TaskEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,11 @@ package com.sun.source.util; -import com.sun.source.tree.CompilationUnitTree; import javax.lang.model.element.TypeElement; import javax.tools.JavaFileObject; +import com.sun.source.tree.CompilationUnitTree; + /** * Provides details about work that has been done by the JDK Java Compiler, javac. * diff --git a/langtools/src/share/classes/com/sun/source/util/TreePath.java b/langtools/src/share/classes/com/sun/source/util/TreePath.java index 103f6240567..eef400abc2e 100644 --- a/langtools/src/share/classes/com/sun/source/util/TreePath.java +++ b/langtools/src/share/classes/com/sun/source/util/TreePath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.source.util; -import com.sun.source.tree.*; import java.util.Iterator; +import com.sun.source.tree.*; + /** * A path of tree nodes, typically used to represent the sequence of ancestor * nodes of a tree node up to the top level CompilationUnitTree node. diff --git a/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java b/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java index f40a8d5e6e9..6a5bd8ccf86 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,8 @@ package com.sun.tools.classfile; +import java.util.Map; + import com.sun.tools.classfile.ConstantPool.CONSTANT_Class_info; import com.sun.tools.classfile.ConstantPool.CONSTANT_Double_info; import com.sun.tools.classfile.ConstantPool.CONSTANT_Fieldref_info; @@ -40,7 +42,6 @@ import com.sun.tools.classfile.ConstantPool.CONSTANT_NameAndType_info; import com.sun.tools.classfile.ConstantPool.CONSTANT_String_info; import com.sun.tools.classfile.ConstantPool.CONSTANT_Utf8_info; import com.sun.tools.classfile.ConstantPool.CPInfo; -import java.util.Map; /** * Rewrites a class file using a map of translations. diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java b/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java index cffa7780350..2aa711de65f 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,8 +33,8 @@ import java.util.Map; import java.util.Set; import java.util.regex.Pattern; -import com.sun.tools.classfile.Dependency.Finder; import com.sun.tools.classfile.Dependency.Filter; +import com.sun.tools.classfile.Dependency.Finder; import com.sun.tools.classfile.Dependency.Location; import com.sun.tools.classfile.Type.ArrayType; import com.sun.tools.classfile.Type.ClassSigType; @@ -43,7 +43,6 @@ import com.sun.tools.classfile.Type.MethodType; import com.sun.tools.classfile.Type.SimpleType; import com.sun.tools.classfile.Type.TypeParamType; import com.sun.tools.classfile.Type.WildcardType; - import static com.sun.tools.classfile.ConstantPool.*; /** 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 0284f8a1f9f..343df3f345a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,9 +29,9 @@ import java.io.*; import java.util.*; import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate Index for all the Member Names with Indexing in 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 27ca14fab60..0bd5ee7eb3e 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,14 @@ package com.sun.tools.doclets.formats.html; -import java.util.*; import java.lang.reflect.Modifier; +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.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * The base class for member writers. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java index 2b1b352942c..a4b1497b0f2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,10 +27,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.formats.html.markup.*; + 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.*; /** * Abstract class to print the class hierarchy page for all the Classes. This diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java index b68af0445cc..202b8a2c95f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,9 +29,9 @@ import java.io.*; 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.formats.html.markup.*; /** * Generate the file with list of all the classes in this run. This page will be 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 83886defa9c..1b1d1039d88 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,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.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.builders.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the Class Information Page. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java index d0cea943d6a..0c4f9304688 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java @@ -27,10 +27,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate class usage information. 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 cc8411ee7cd..e74a272798a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,11 +28,11 @@ package com.sun.tools.doclets.formats.html; 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.builders.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; -import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the Class Information Page. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java index 7985d9341dd..bd4f377ed73 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java @@ -25,13 +25,13 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; - -import com.sun.javadoc.*; -import java.util.*; import java.io.*; import java.net.*; +import java.util.*; + +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Configure the output based on the command line options. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java index 4d38ad9778c..977cab001c8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,10 +27,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; 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.formats.html.markup.*; /** * Write the Constants Summary Page in HTML format. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java index ed9805b58c1..2f44e5e3042 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,10 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.DeprecatedAPIListBuilder; -import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate File to list all the deprecated classes and class members with the diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java index 1d7ac273338..6a02d6015c2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the documentation in the Html "frame" format in the browser. The diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java index 7f15c842276..6e8c5d42bde 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java @@ -26,9 +26,10 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the Help File for the generated API documentation. The help file diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java index 89af9ab5d80..e445d4a7e9f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,14 +24,14 @@ */ 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.builders.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - /** * The class with "start" method, calls individual Writers. * 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 59d776106d1..a1cec57b995 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 @@ -32,8 +32,8 @@ 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.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for the Html Format Code Generation specific to JavaDoc. 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 8f32789444c..476f3f3f7ca 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,9 +28,9 @@ package com.sun.tools.doclets.formats.html; 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.taglets.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Generate serialized form for serializable fields. 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 6ce01209cf9..57169964021 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,9 @@ package com.sun.tools.doclets.formats.html; 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.taglets.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Generate serialized form for Serializable/Externalizable methods. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java index 3e4b96886d9..1f9ad721b2d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,10 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.util.links.*; 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.util.links.*; /** * A factory that returns a link given the information about it. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java index 27414e0a276..8434106b3e7 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,10 +27,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class to generate file for each package contents in the left-hand bottom diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java index 3ac4b98fee1..7e33931f02e 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; + 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.formats.html.markup.*; /** * Generate the package index for the left-hand frame in the generated output. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java index 7b9be91ddcc..b3a8ed77380 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,10 +27,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; 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.formats.html.markup.*; /** * Generate the package index page "overview-summary.html" for the right-hand 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 7996655559b..04c036aa181 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,9 +28,9 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class to generate Tree page for a package. The name of the file generated is diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java index 579aee25a93..19d7a57ede8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,10 +27,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate package usage information. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java index bc3531803b4..560f23b89bb 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,10 +27,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; 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.formats.html.markup.*; /** * Class to generate file for each package contents in the right-hand diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java index 6bbcae6c14f..a40e2a21893 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate only one index file for all the Member Names with Indexing in diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java index 9d608730654..ae04857f065 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate Separate Index Files for all the member names with Indexing in diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java index 6790b739ef6..37218e8c471 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; + 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.formats.html.markup.*; /** * This abstract class exists to provide functionality needed in the 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 e116fe4e9a7..09ae7d14494 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,9 +28,9 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate Class Hierarchy page for all the Classes in this run. Use diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java index 99c0fb0a983..f5ed2f1aee8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,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.util.*; -import com.sun.javadoc.*; /** * The factory that returns HTML writers. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java index 39f3af891a8..9c6f0a09926 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,11 @@ package com.sun.tools.doclets.internal.toolkit; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.builders.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; +import java.io.File; +import java.util.StringTokenizer; /** * An abstract implementation of a Doclet. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java index e3d15ebd768..4fc735fd854 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java @@ -25,12 +25,13 @@ package com.sun.tools.doclets.internal.toolkit; +import java.io.*; +import java.util.*; + +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.builders.BuilderFactory; import com.sun.tools.doclets.internal.toolkit.taglets.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.builders.BuilderFactory; -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; /** * Configure the output based on the options. Doclets should sub-class diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java index a2eab1b46ec..c39149b7819 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,9 @@ package com.sun.tools.doclets.internal.toolkit; -import java.util.*; import java.io.*; +import java.util.*; + import com.sun.javadoc.*; /** 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 eb8bf7be0d0..4df63fc59fe 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,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 package summary output. * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java index 252a54c561d..62724243c97 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,8 @@ package com.sun.tools.doclets.internal.toolkit; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * The interface for a factory creates writers. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java index c016775a546..da4267ff322 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,13 @@ package com.sun.tools.doclets.internal.toolkit.builders; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import java.io.*; import java.lang.reflect.*; import java.util.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; + /** * The superclass for all builders. A builder is a class that provides * the structure and content of API documentation. A builder is completely diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java index 6a4be60532a..a73aed83066 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package com.sun.tools.doclets.internal.toolkit.builders; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import java.util.*; /** * The superclass for all member builders. Member builders are only executed diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java index a92ea569bcd..6cdbc82f99a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,9 +27,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the summary for a given annotation type. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java index b0abbc305dd..e1295055410 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for optional annotation type members. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java index ec9c4f2a961..b910a186f01 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for required annotation type members. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java index e35be117bb5..189749ebdd3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,9 @@ package com.sun.tools.doclets.internal.toolkit.builders; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; /** * The factory for constructing builders. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java index d050cab700e..96f0b2ecaf3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java @@ -27,9 +27,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the summary for a given class. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java index bded1e85e09..4f2598e40c9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,9 +27,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the Constants Summary Page. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java index 68efe8c124b..7f5d43de290 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a constructor. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java index 868297bc034..4e016693771 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a enum constants. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java index 0416ba98555..d66672d239a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a field. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java index 3445d9617af..23717ae471f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,13 +24,16 @@ */ package com.sun.tools.doclets.internal.toolkit.builders; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import java.io.*; import java.util.*; + +import javax.xml.parsers.*; + import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; -import javax.xml.parsers.*; + +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Parse the XML that specified the order of operation for the builders. This diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java index 8ad4c58f527..54c942664a0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the member summary. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java index 0a28d8928ea..00e68d78f23 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a method. 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 3f4494ae3c8..e121de85272 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the summary for a given package. 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 013120b439b..ce12de87c7e 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,9 +27,10 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the serialized form. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java index c0c6bff552e..bef8ba4efbe 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package com.sun.tools.doclets.internal.toolkit.taglets; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.javadoc.*; /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java index 449bc1fb15d..9e79d1828e1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.tools.doclets.internal.toolkit.taglets; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import java.util.*; /** * A taglet that represents the @param tag. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java index f5e90c8f0e3..fc7163571a5 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,8 @@ package com.sun.tools.doclets.internal.toolkit.taglets; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * A taglet that represents the @return tag. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java index bca2707f20c..0a357b736e9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,8 @@ package com.sun.tools.doclets.internal.toolkit.taglets; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * A taglet that represents the @see tag. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java index 70cee399648..25345fc700b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java @@ -25,14 +25,14 @@ package com.sun.tools.doclets.internal.toolkit.taglets; -import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; - import java.io.*; import java.lang.reflect.*; import java.net.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; + /** * Manages theTaglets used by doclets. * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java index b26845c27e0..13195d7f593 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,9 @@ package com.sun.tools.doclets.internal.toolkit.taglets; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; /** * The interface for the taglet writer. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java index d25618aa119..ea57f004925 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.tools.doclets.internal.toolkit.taglets; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import java.util.*; /** * A taglet that represents the @throws tag. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java index e07bc1500a6..3a5295c5d1d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,11 @@ package com.sun.tools.doclets.internal.toolkit.taglets; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.Configuration; import com.sun.tools.doclets.internal.toolkit.util.*; -import java.util.*; /** * An inline Taglet representing the value tag. This tag should only be used with diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java index 5da917e2c27..7cfbf51585f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,11 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Build Class Hierarchy for all the Classes. This class builds the Class * Tree and the Interface Tree separately. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java index 017ed72833f..a306b53b218 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; + /** * Map all class uses for a given class. * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java index 5c64a8f19aa..126ccb98694 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,9 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.javadoc.*; import java.util.*; + +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.Configuration; /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java index b23e5db3505..c65bd340609 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.tools.doclets.internal.toolkit.util; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; -import java.util.*; /** * Search for the requested documentation. Inherit documentation if necessary. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java index 32a4a0dcf69..be4b08a8b8a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,13 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; - -import com.sun.javadoc.*; -import java.util.Map; -import java.util.HashMap; import java.io.*; import java.net.*; +import java.util.HashMap; +import java.util.Map; + +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; /** * Process and manage "-link" and "-linkoffline" to external packages. The diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java index 5893f302e40..447bcd84b5b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,11 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Process and manage grouping of packages, as specified by "-group" option on * the command line. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java index 37834420aa1..be9f4959faa 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.tools.doclets.internal.toolkit.util; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.Configuration; -import java.util.*; /** * For a given class method, build an array of interface methods which it diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java index 7e62722f513..50fab1caee8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,11 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Build the mapping of each Unicode character with it's member lists * containing members names starting with it. Also build a list for all the diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java index 7e264c8b47b..8a527bbe878 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,10 +24,11 @@ */ package com.sun.tools.doclets.internal.toolkit.util; +import java.text.MessageFormat; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.Configuration; -import java.util.*; -import java.text.MessageFormat; /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java index e9fd61e19dc..f18dd5ae6b8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,11 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Provides methods for creating an array of class, method and * field names to be included as meta keywords in the HTML header diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java index a32f04890e9..3884f7422ff 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,12 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.io.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Write out the package index. * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java index 4d88a7e1734..64ed9e69610 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.tools.doclets.internal.toolkit.util; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; -import java.util.*; /** * A data structure that encapsulates the visible members of a particular diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java b/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java index 01838e9c196..e485804e124 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java @@ -26,6 +26,7 @@ package com.sun.tools.javac.api; import java.io.IOException; +import java.util.Collection; import java.util.Locale; import javax.annotation.processing.Processor; @@ -43,7 +44,6 @@ import com.sun.tools.javac.model.JavacElements; import com.sun.tools.javac.model.JavacTypes; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.util.Context; -import java.util.Collection; /** * Provides basic functionality for implementations of JavacTask. diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java index c446e0a9947..174b3ffa971 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java @@ -60,8 +60,8 @@ import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.comp.MemberEnter; import com.sun.tools.javac.comp.Resolve; import com.sun.tools.javac.model.JavacElements; -import com.sun.tools.javac.tree.EndPosTable; import com.sun.tools.javac.processing.JavacProcessingEnvironment; +import com.sun.tools.javac.tree.EndPosTable; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.tree.TreeCopier; diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/WrappingJavaFileManager.java b/langtools/src/share/classes/com/sun/tools/javac/api/WrappingJavaFileManager.java index 41d987480f5..247283440ed 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/WrappingJavaFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/WrappingJavaFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,8 +31,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; -import javax.tools.JavaFileObject.Kind; + import javax.tools.*; +import javax.tools.JavaFileObject.Kind; /** * Wraps all calls to a given file manager. Subclasses of this class diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java b/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java index 486e9b6a4a4..84d9108b5d3 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java @@ -26,18 +26,18 @@ package com.sun.tools.javac.code; import java.util.Map; + import javax.tools.JavaFileObject; import com.sun.tools.javac.comp.Annotate; import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Env; +import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.Assert; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Pair; - import static com.sun.tools.javac.code.Kinds.PCK; -import com.sun.tools.javac.util.*; /** * Container for all annotations (attributes in javac) on a Symbol. diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java b/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java index 3d8f00eb67f..022681bd8f6 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,8 +30,8 @@ import java.util.Map; import com.sun.tools.javac.util.Assert; import com.sun.tools.javac.util.Context; -import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; +import com.sun.tools.javac.util.ListBuffer; /** * diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java index f9dfc13e970..508937cfdc2 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java @@ -25,10 +25,11 @@ package com.sun.tools.javac.code; -import java.util.EnumSet; import java.util.Collections; +import java.util.EnumSet; import java.util.Map; import java.util.Set; + import javax.lang.model.element.Modifier; /** Access flags and other modifiers for Java classes and members. diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java b/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java index 9495ddf1be4..dc0d52f34b6 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,8 @@ import java.util.Locale; import com.sun.source.tree.MemberReferenceTree; import com.sun.tools.javac.api.Formattable; import com.sun.tools.javac.api.Messages; - -import static com.sun.tools.javac.code.TypeTags.*; import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.code.TypeTags.*; /** Internal symbol kinds, which distinguish between elements of * different subclasses of Symbol. Symbol kinds are organized so they can be 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 index 644955c646a..0cad0db21df 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,18 +28,13 @@ 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.comp.DeferredAttr.DeferredType; -import com.sun.tools.javac.tree.JCTree; -import com.sun.tools.javac.tree.Pretty; -import com.sun.tools.javac.util.Assert; +import com.sun.tools.javac.code.Type.*; 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.*; +import static com.sun.tools.javac.code.TypeTags.*; /** * A combined type/symbol visitor for generating non-trivial localized string diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java b/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java index db96649e99a..e8153da2703 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.tools.javac.code; -import com.sun.tools.javac.util.*; import java.util.Iterator; +import com.sun.tools.javac.util.*; + /** A scope represents an area of visibility in a Java program. The * Scope class is a container for symbols which provides * efficient access to symbols given their names. Scopes are implemented diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java index f83823af270..4584ea4b004 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java @@ -26,12 +26,12 @@ package com.sun.tools.javac.code; import java.util.*; + import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; -import com.sun.tools.javac.util.*; import com.sun.tools.javac.jvm.Target; - +import com.sun.tools.javac.util.*; import static com.sun.tools.javac.main.Option.*; /** The source language version accepted. diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java index 010d441cb71..328cfcf6bfe 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java @@ -27,11 +27,10 @@ package com.sun.tools.javac.code; import java.util.Set; import java.util.concurrent.Callable; + import javax.lang.model.element.*; import javax.tools.JavaFileObject; -import com.sun.tools.javac.util.*; -import com.sun.tools.javac.util.Name; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.comp.Attr; import com.sun.tools.javac.comp.AttrContext; @@ -39,7 +38,8 @@ import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.jvm.*; import com.sun.tools.javac.model.*; import com.sun.tools.javac.tree.JCTree; - +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.Name; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; import static com.sun.tools.javac.code.TypeTags.*; diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java index c09d31eb083..027874b87ab 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java @@ -26,17 +26,17 @@ package com.sun.tools.javac.code; import java.util.*; -import javax.lang.model.type.TypeVisitor; -import javax.lang.model.element.ElementVisitor; -import com.sun.tools.javac.util.*; -import com.sun.tools.javac.util.List; +import javax.lang.model.element.ElementVisitor; +import javax.lang.model.type.TypeVisitor; + import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.jvm.*; - -import static com.sun.tools.javac.jvm.ByteCodes.*; +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.jvm.ByteCodes.*; /** A class that defines all predefined constants and operators * as well as special classes such as java.lang.Object, which need diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java b/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java index 6c242879c57..573f6275ddd 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,11 @@ package com.sun.tools.javac.code; -import static com.sun.tools.javac.code.TargetType.TargetAttribute.*; - import java.util.EnumSet; import java.util.Set; +import static com.sun.tools.javac.code.TargetType.TargetAttribute.*; + /** * Describes the type of program element an extended annotation (or extended * compound attribute) targets. diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java index eefbf90c85d..362bb426488 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java @@ -26,10 +26,6 @@ package com.sun.tools.javac.code; import java.util.Collections; - -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.util.*; - import java.util.EnumMap; import java.util.EnumSet; import java.util.Map; @@ -37,6 +33,8 @@ import java.util.Set; import javax.lang.model.type.*; +import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.util.*; import static com.sun.tools.javac.code.BoundKind.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; 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 0cb2b07b248..fde3ab135b7 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 @@ -28,21 +28,19 @@ package com.sun.tools.javac.code; import java.lang.ref.SoftReference; import java.util.*; -import com.sun.tools.javac.util.*; -import com.sun.tools.javac.util.List; - -import com.sun.tools.javac.jvm.ClassReader; import com.sun.tools.javac.code.Attribute.RetentionPolicy; import com.sun.tools.javac.code.Lint.LintCategory; import com.sun.tools.javac.code.Type.UndetVar.InferenceBound; import com.sun.tools.javac.comp.Check; - +import com.sun.tools.javac.jvm.ClassReader; +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.List; +import static com.sun.tools.javac.code.BoundKind.*; +import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Scope.*; +import static com.sun.tools.javac.code.Symbol.*; import static com.sun.tools.javac.code.Type.*; import static com.sun.tools.javac.code.TypeTags.*; -import static com.sun.tools.javac.code.Symbol.*; -import static com.sun.tools.javac.code.Flags.*; -import static com.sun.tools.javac.code.BoundKind.*; import static com.sun.tools.javac.util.ListBuffer.lb; /** diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java index e11297309c3..fa4a3b539fd 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -25,34 +25,32 @@ package com.sun.tools.javac.comp; -import com.sun.tools.javac.code.*; -import com.sun.tools.javac.comp.DeferredAttr.AttrMode; -import com.sun.tools.javac.comp.Infer.InferenceContext; -import com.sun.tools.javac.comp.Infer.InferenceContext.FreeTypeListener; -import com.sun.tools.javac.jvm.*; -import com.sun.tools.javac.tree.*; -import com.sun.tools.javac.util.*; -import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; -import com.sun.tools.javac.util.List; +import java.util.*; +import java.util.Set; -import com.sun.tools.javac.jvm.Target; -import com.sun.tools.javac.code.Lint.LintCategory; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.tree.JCTree.*; -import com.sun.tools.javac.code.Type.*; -import com.sun.tools.javac.comp.Check.CheckContext; +import javax.lang.model.element.ElementKind; +import javax.tools.JavaFileObject; import com.sun.source.tree.IdentifierTree; import com.sun.source.tree.MemberReferenceTree.ReferenceMode; import com.sun.source.tree.MemberSelectTree; import com.sun.source.tree.TreeVisitor; import com.sun.source.util.SimpleTreeVisitor; - -import java.util.*; -import java.util.Set; -import javax.lang.model.element.ElementKind; -import javax.tools.JavaFileObject; - +import com.sun.tools.javac.code.*; +import com.sun.tools.javac.code.Lint.LintCategory; +import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.code.Type.*; +import com.sun.tools.javac.comp.Check.CheckContext; +import com.sun.tools.javac.comp.DeferredAttr.AttrMode; +import com.sun.tools.javac.comp.Infer.InferenceContext; +import com.sun.tools.javac.comp.Infer.InferenceContext.FreeTypeListener; +import com.sun.tools.javac.jvm.*; +import com.sun.tools.javac.jvm.Target; +import com.sun.tools.javac.tree.*; +import com.sun.tools.javac.tree.JCTree.*; +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; +import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.ANNOTATION; import static com.sun.tools.javac.code.Flags.BLOCK; diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java index 7405ca109a3..2b6d0d72e51 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java @@ -46,7 +46,6 @@ import java.util.WeakHashMap; import static com.sun.tools.javac.code.TypeTags.*; import static com.sun.tools.javac.tree.JCTree.Tag.*; -import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; /** * This is an helper class that is used to perform deferred type-analysis. diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java index 548bb9d8479..bfd3c4eefeb 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java @@ -41,7 +41,6 @@ import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import java.util.HashMap; import java.util.Map; -import java.util.Set; import static com.sun.tools.javac.code.TypeTags.*; diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java index e3afbb757e5..d1c0835f8cc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java @@ -27,8 +27,6 @@ package com.sun.tools.javac.comp; import java.util.*; -import javax.lang.model.element.ElementKind; - import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.tree.*; diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java index 1ca860e95d4..ef47c7759dc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java +++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java @@ -38,7 +38,6 @@ import java.util.Calendar; import java.util.Collections; import java.util.LinkedHashMap; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; diff --git a/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java b/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java index 92e1c1790e1..dd86ec20978 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java @@ -25,9 +25,8 @@ package com.sun.tools.javac.model; -import com.sun.tools.javac.util.*; -import java.io.ObjectInputStream; import java.io.IOException; +import java.io.ObjectInputStream; import java.lang.annotation.*; import java.lang.reflect.Array; import java.lang.reflect.Method; @@ -35,12 +34,14 @@ import java.util.LinkedHashMap; import java.util.Map; import sun.reflect.annotation.*; -import javax.lang.model.type.TypeMirror; import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.MirroredTypesException; +import javax.lang.model.type.TypeMirror; + import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.ArrayType; +import com.sun.tools.javac.util.*; /** diff --git a/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileObject.java b/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileObject.java index a46e639ae16..357fc77f40b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileObject.java +++ b/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,6 @@ import java.nio.charset.CharsetDecoder; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; -import java.nio.file.attribute.BasicFileAttributes; import javax.lang.model.element.Modifier; import javax.lang.model.element.NestingKind; import javax.tools.JavaFileObject; diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java b/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java index 04f4d47c3a9..9fdd9e7ba90 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java @@ -26,12 +26,10 @@ package com.sun.tools.javac.tree; import java.io.*; -import java.util.*; import com.sun.source.tree.MemberReferenceTree.ReferenceMode; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.parser.Tokens.Comment; import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.List; diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java b/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java index d8c94def6ee..7f1bad3b163 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java @@ -28,12 +28,10 @@ package com.sun.tools.javac.util; import java.io.IOException; import java.lang.ref.SoftReference; import java.nio.CharBuffer; -import java.util.Map; import javax.tools.JavaFileObject; import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.tree.EndPosTable; -import com.sun.tools.javac.tree.JCTree; import static com.sun.tools.javac.util.LayoutCharacters.*; diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java b/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java index 770ee0ba18b..b21051d62bc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java @@ -27,7 +27,6 @@ package com.sun.tools.javac.util; import java.util.EnumSet; import java.util.Locale; -import java.util.Map; import java.util.Set; import javax.tools.Diagnostic; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java index deaf6a190ed..85cfa8f79a3 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Type; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java index 8e8f70c0007..17982b03915 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java index 3c2efa3afb2..d4839a9c8a8 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; - import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Scope; import com.sun.tools.javac.code.Symbol.*; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java index e5632dc4998..b040aec2b19 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,12 +27,8 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; -import static com.sun.javadoc.LanguageVersion.*; - import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.tree.JCTree.*; -import com.sun.tools.javac.util.List; -import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Position; /** diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java index 82014ca96fc..98292b57326 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java index a5fed4b059c..2e22d93a516 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,8 +38,6 @@ import javax.tools.StandardLocation; import com.sun.javadoc.*; -import static com.sun.javadoc.LanguageVersion.*; - import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Scope; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java index 0936194d315..12783bf2d5f 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java @@ -26,16 +26,16 @@ package com.sun.tools.javadoc; import java.io.DataInputStream; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; import java.text.CollationKey; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import javax.tools.FileObject; import com.sun.javadoc.*; - import com.sun.tools.javac.util.Position; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * abstract base class of all Doc classes. Doc item's are representations diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java index 6ac6a1ebd5f..1e234576186 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,9 @@ package com.sun.tools.javadoc; -import java.util.Locale; -import java.util.HashSet; -import java.text.Collator; import java.text.BreakIterator; +import java.text.Collator; +import java.util.Locale; /** * This class holds the information about locales. diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java index d9b2e69b9e4..9ceadf2ab0c 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,19 +25,17 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; - -import static com.sun.javadoc.LanguageVersion.*; - -import com.sun.tools.javac.util.List; - import java.io.File; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.net.URLClassLoader; +import com.sun.javadoc.*; +import com.sun.tools.javac.util.List; +import static com.sun.javadoc.LanguageVersion.*; + /** * Class creates, controls and invokes doclets. diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java index c11c84bc7ce..e74b4c5fbae 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java @@ -29,8 +29,6 @@ import java.lang.reflect.Modifier; import com.sun.javadoc.*; -import static com.sun.javadoc.LanguageVersion.*; - import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.VarSymbol; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java index f2c2884b4bc..e16cfcc67c6 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import javax.tools.JavaFileObject; import com.sun.tools.javac.code.Kinds; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java index 5994e76b443..4bbe8c361d3 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,14 @@ package com.sun.tools.javadoc; -import java.io.PrintWriter; +import java.io.PrintWriter; // Access to 'javac' output streams import java.text.MessageFormat; -import java.util.ResourceBundle; import java.util.MissingResourceException; +import java.util.ResourceBundle; import com.sun.javadoc.*; - import com.sun.tools.javac.util.Context; - -import com.sun.tools.javac.util.Log; // Access to 'javac' output streams +import com.sun.tools.javac.util.Log; /** * Utility for integrating with javadoc tools and for localization. diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java index 72ed86dae61..c9d3baf8e4b 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,9 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; +import java.lang.reflect.Modifier; +import com.sun.javadoc.*; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type; @@ -34,8 +35,6 @@ import com.sun.tools.javac.code.TypeTags; import com.sun.tools.javac.tree.JCTree.JCMethodDecl; import com.sun.tools.javac.util.Position; -import java.lang.reflect.Modifier; - /** * Represents a method of a java class. * diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java index 4c7e472275a..c94601c9ac5 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,12 @@ package com.sun.tools.javadoc; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; + import javax.tools.FileObject; import com.sun.javadoc.*; - import com.sun.tools.javac.code.Attribute; import com.sun.tools.javac.code.Scope; import com.sun.tools.javac.code.Symbol.ClassSymbol; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java index 9ac19a13b77..5a5fdca7e35 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,6 @@ import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; import com.sun.tools.javac.code.Symbol.VarSymbol; -import com.sun.tools.javac.code.Type; /** * ParameterImpl information. diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java b/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java index be61228f166..7d0dd9cebfc 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,13 +27,6 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; -import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Symbol.ClassSymbol; - -import com.sun.tools.javac.code.Type; -import com.sun.tools.javac.code.TypeTags; -import com.sun.tools.javac.code.Type.ClassType; - class PrimitiveType implements com.sun.javadoc.Type { private final String name; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java index e6cd0e8c9ba..578461c130e 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,20 +25,16 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; - -import com.sun.tools.javac.code.Attribute; -import com.sun.tools.javac.code.Flags; -import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Symbol.ClassSymbol; - -import com.sun.tools.javac.tree.JCTree; - -import com.sun.tools.javac.util.Position; - import java.lang.reflect.Modifier; import java.text.CollationKey; +import com.sun.javadoc.*; +import com.sun.tools.javac.code.Attribute; +import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Symbol.ClassSymbol; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.util.Position; + /** * Represents a java program element: class, interface, field, * constructor, or method. diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java index f758b16d477..ce343ded122 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,8 @@ package com.sun.tools.javadoc; -import com.sun.tools.javac.util.*; - import com.sun.javadoc.*; +import com.sun.tools.javac.util.*; /** * Represents a see also documentation tag. diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java b/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java index e8b147f9002..0f931ed6762 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,15 +26,14 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; - import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Scope; -import com.sun.tools.javac.code.Symbol.VarSymbol; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.MethodSymbol; -import com.sun.tools.javac.util.Name; +import com.sun.tools.javac.code.Symbol.VarSymbol; import com.sun.tools.javac.util.ListBuffer; +import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Names; /** diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Start.java b/langtools/src/share/classes/com/sun/tools/javadoc/Start.java index 66514f4f07f..9ae8c82230f 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Start.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Start.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,22 +25,19 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.StringTokenizer; +import com.sun.javadoc.*; import com.sun.tools.javac.main.CommandLine; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Options; - -import java.io.IOException; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.PrintWriter; - -import java.util.StringTokenizer; - import static com.sun.tools.javac.code.Flags.*; /** diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java index 8f7f77c43f6..c09157d42b3 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,15 +26,13 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; - import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.code.Type.ClassType; import com.sun.tools.javac.code.Type.TypeVar; -import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.util.List; - import static com.sun.tools.javac.code.TypeTags.*; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java index 55660ac056d..121816feaa0 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Kinds; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java index dace0e8f5f7..e6d079d361e 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Symbol.ClassSymbol; diff --git a/langtools/src/share/classes/javax/annotation/processing/Completions.java b/langtools/src/share/classes/javax/annotation/processing/Completions.java index 3d96204b36a..044ae20d503 100644 --- a/langtools/src/share/classes/javax/annotation/processing/Completions.java +++ b/langtools/src/share/classes/javax/annotation/processing/Completions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,6 @@ package javax.annotation.processing; -import java.util.Arrays; - /** * Utility class for assembling {@link Completion} objects. * diff --git a/langtools/src/share/classes/javax/annotation/processing/FilerException.java b/langtools/src/share/classes/javax/annotation/processing/FilerException.java index d33b631704b..30a13886f04 100644 --- a/langtools/src/share/classes/javax/annotation/processing/FilerException.java +++ b/langtools/src/share/classes/javax/annotation/processing/FilerException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package javax.annotation.processing; import java.io.IOException; -import javax.annotation.processing.Filer; /** * Indicates a {@link Filer} detected an attempt to open a file that diff --git a/langtools/src/share/classes/javax/annotation/processing/ProcessingEnvironment.java b/langtools/src/share/classes/javax/annotation/processing/ProcessingEnvironment.java index 69245648ddf..5ade776487a 100644 --- a/langtools/src/share/classes/javax/annotation/processing/ProcessingEnvironment.java +++ b/langtools/src/share/classes/javax/annotation/processing/ProcessingEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,12 +26,10 @@ package javax.annotation.processing; import java.util.Map; -import java.util.List; import java.util.Locale; import javax.lang.model.SourceVersion; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; -import java.io.File; /** * An annotation processing tool framework will {@linkplain diff --git a/langtools/src/share/classes/javax/lang/model/element/AnnotationValue.java b/langtools/src/share/classes/javax/lang/model/element/AnnotationValue.java index 3b66badf6f3..68b54210c61 100644 --- a/langtools/src/share/classes/javax/lang/model/element/AnnotationValue.java +++ b/langtools/src/share/classes/javax/lang/model/element/AnnotationValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,6 @@ package javax.lang.model.element; - -import java.util.List; -import javax.lang.model.type.*; - /** * Represents a value of an annotation type element. * A value is of one of the following types: diff --git a/langtools/src/share/classes/javax/lang/model/element/Element.java b/langtools/src/share/classes/javax/lang/model/element/Element.java index 6d2743ca324..64fe7eaf33b 100644 --- a/langtools/src/share/classes/javax/lang/model/element/Element.java +++ b/langtools/src/share/classes/javax/lang/model/element/Element.java @@ -32,7 +32,6 @@ import java.lang.annotation.IncompleteAnnotationException; import java.util.List; import java.util.Set; -import javax.lang.model.element.Modifier; import javax.lang.model.type.*; import javax.lang.model.util.*; diff --git a/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java b/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java index 9d514f2d723..138f3584497 100644 --- a/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java +++ b/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package javax.lang.model.element; import java.util.List; -import javax.lang.model.util.Types; import javax.lang.model.type.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/element/VariableElement.java b/langtools/src/share/classes/javax/lang/model/element/VariableElement.java index 77451fab784..cd82efd254b 100644 --- a/langtools/src/share/classes/javax/lang/model/element/VariableElement.java +++ b/langtools/src/share/classes/javax/lang/model/element/VariableElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package javax.lang.model.element; -import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Elements; /** diff --git a/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java b/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java index 8f01bed158a..fd79f04e62d 100644 --- a/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java +++ b/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.type; import java.io.ObjectInputStream; import java.io.IOException; -import java.lang.annotation.Annotation; import javax.lang.model.element.Element; diff --git a/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java b/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java index de3e163d382..96209dff2d6 100644 --- a/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java +++ b/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package javax.lang.model.type; -import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; import java.util.Collections; diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java index e36a00f93c6..109349aa612 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,8 @@ package javax.lang.model.util; -import java.util.List; import javax.lang.model.element.*; -import javax.lang.model.type.TypeMirror; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java index 4a5ac1ccdf2..46fa27f7e35 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java @@ -25,10 +25,6 @@ package javax.lang.model.util; -import java.util.List; -import javax.lang.model.element.*; - -import javax.lang.model.type.TypeMirror; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java index 21294641ccd..c7a0f7be70f 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,6 @@ package javax.lang.model.util; -import java.util.List; -import javax.lang.model.element.*; - -import javax.lang.model.type.TypeMirror; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor6.java b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor6.java index 0e4a3438a81..8e1d65613d5 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor6.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,10 @@ package javax.lang.model.util; - -import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import javax.lang.model.element.*; +import static javax.lang.model.SourceVersion.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor7.java index 94546db872e..0e5d8daeebc 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,9 @@ package javax.lang.model.util; -import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import static javax.lang.model.SourceVersion.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor8.java index 9cf104dd6a3..b4afe113fac 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,9 @@ package javax.lang.model.util; -import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import static javax.lang.model.SourceVersion.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementFilter.java b/langtools/src/share/classes/javax/lang/model/util/ElementFilter.java index c95ff5fec33..59291026a0e 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementFilter.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,18 +25,14 @@ package javax.lang.model.util; -import java.lang.Iterable; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.EnumSet; import java.util.ArrayList; import java.util.LinkedHashSet; -import java.util.NoSuchElementException; import javax.lang.model.element.*; -import javax.lang.model.type.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor7.java index ace1515a71c..25a68a909f7 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,10 @@ package javax.lang.model.util; -import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import javax.lang.model.element.*; +import static javax.lang.model.SourceVersion.*; /** * A visitor of program elements based on their {@linkplain diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor8.java index 5781875744c..e9a983bf19b 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor8.java @@ -26,7 +26,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; import javax.annotation.processing.SupportedSourceVersion; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementScanner6.java b/langtools/src/share/classes/javax/lang/model/util/ElementScanner6.java index 711154f5f96..809b4ddccfc 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementScanner6.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementScanner6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementScanner7.java b/langtools/src/share/classes/javax/lang/model/util/ElementScanner7.java index 119b3d7afda..f4d84d05cd3 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementScanner7.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementScanner7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementScanner8.java b/langtools/src/share/classes/javax/lang/model/util/ElementScanner8.java index daea2325431..5bd0b91c8a2 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementScanner8.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementScanner8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java index eb392847c2e..2e3cfafcc70 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,9 @@ package javax.lang.model.util; -import java.util.List; -import javax.lang.model.element.*; - -import javax.lang.model.type.TypeMirror; -import static javax.lang.model.SourceVersion.*; -import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import static javax.lang.model.SourceVersion.*; /** * A simple visitor for annotation values with default behavior diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java index a69f0fe3b46..30823cdd584 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,9 @@ package javax.lang.model.util; -import java.util.List; -import javax.lang.model.element.*; - -import javax.lang.model.type.TypeMirror; -import static javax.lang.model.SourceVersion.*; -import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import static javax.lang.model.SourceVersion.*; /** * A simple visitor for annotation values with default behavior diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor6.java b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor6.java index 2e92d8fe035..a0055f76cfe 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor6.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor7.java index ec7e92abb87..5d54cff9333 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor8.java index db83a38d410..63cacd00f3c 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,7 @@ package javax.lang.model.util; -import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java index 69889996921..fc023d869c2 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package javax.lang.model.util; -import javax.lang.model.type.*; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor6.java b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor6.java index 7adc993cb6b..9e007fe54f3 100644 --- a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor6.java +++ b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,10 @@ package javax.lang.model.util; - -import javax.lang.model.type.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import javax.lang.model.type.*; +import static javax.lang.model.SourceVersion.*; /** * A visitor of types based on their {@linkplain TypeKind kind} with diff --git a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor7.java index 701b5253e0e..4bbe1d6635a 100644 --- a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.type.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor8.java index 26ac9c13bf3..698364f791e 100644 --- a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,10 @@ package javax.lang.model.util; -import javax.lang.model.type.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import javax.lang.model.type.*; +import static javax.lang.model.SourceVersion.*; /** * A visitor of types based on their {@linkplain TypeKind kind} with diff --git a/langtools/src/share/classes/javax/tools/ForwardingJavaFileManager.java b/langtools/src/share/classes/javax/tools/ForwardingJavaFileManager.java index f875b94d1ab..9bf3405b661 100644 --- a/langtools/src/share/classes/javax/tools/ForwardingJavaFileManager.java +++ b/langtools/src/share/classes/javax/tools/ForwardingJavaFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package javax.tools; import java.io.IOException; -import java.net.URI; import java.util.Iterator; import java.util.Set; import javax.tools.JavaFileObject.Kind; diff --git a/langtools/src/share/classes/javax/tools/JavaFileObject.java b/langtools/src/share/classes/javax/tools/JavaFileObject.java index 9e84b3c5a06..ea9dd75e819 100644 --- a/langtools/src/share/classes/javax/tools/JavaFileObject.java +++ b/langtools/src/share/classes/javax/tools/JavaFileObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,6 @@ package javax.tools; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; -import java.nio.CharBuffer; import javax.lang.model.element.NestingKind; import javax.lang.model.element.Modifier; From b155b54a5e0a5e86a1a9f0a031e0d11207ad9341 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 9 Oct 2012 19:31:58 -0700 Subject: [PATCH 042/241] 8000208: fix langtools javadoc comment issues Reviewed-by: bpatel, mcimadamore --- .../share/classes/com/sun/javadoc/Tag.java | 16 ++-- .../classfile/BootstrapMethods_attribute.java | 6 +- .../com/sun/tools/classfile/Dependencies.java | 2 +- .../com/sun/tools/classfile/Instruction.java | 4 +- .../html/AbstractExecutableMemberWriter.java | 10 +- .../formats/html/AbstractMemberWriter.java | 2 +- .../formats/html/ConfigurationImpl.java | 4 +- .../formats/html/DeprecatedListWriter.java | 2 +- .../formats/html/HtmlDocletWriter.java | 4 +- .../formats/html/HtmlSerialFieldWriter.java | 6 +- .../doclets/formats/html/LinkFactoryImpl.java | 1 - .../formats/html/PackageIndexWriter.java | 2 +- .../html/SerializedFormWriterImpl.java | 3 +- .../doclets/formats/html/markup/HtmlTree.java | 6 +- .../formats/html/markup/HtmlWriter.java | 4 +- .../internal/toolkit/EnumConstantWriter.java | 4 +- .../builders/ConstantsSummaryBuilder.java | 1 - .../builders/MemberSummaryBuilder.java | 1 - .../internal/toolkit/taglets/ParamTaglet.java | 4 +- .../internal/toolkit/taglets/ValueTaglet.java | 2 +- .../toolkit/util/ClassDocCatalog.java | 4 +- .../util/DeprecatedAPIListBuilder.java | 2 +- .../doclets/internal/toolkit/util/Extern.java | 4 +- .../toolkit/util/VisibleMemberMap.java | 4 +- .../tools/javac/api/DiagnosticFormatter.java | 4 +- .../com/sun/tools/javac/api/JavacTool.java | 4 +- .../com/sun/tools/javac/code/Printer.java | 4 +- .../com/sun/tools/javac/code/Symtab.java | 2 +- .../com/sun/tools/javac/code/TypeTags.java | 4 +- .../com/sun/tools/javac/code/Types.java | 6 +- .../com/sun/tools/javac/comp/Attr.java | 2 +- .../com/sun/tools/javac/comp/Check.java | 13 ++- .../com/sun/tools/javac/comp/Flow.java | 2 +- .../com/sun/tools/javac/comp/Lower.java | 4 +- .../com/sun/tools/javac/comp/MemberEnter.java | 6 +- .../com/sun/tools/javac/comp/TransTypes.java | 4 + .../tools/javac/file/JavacFileManager.java | 6 +- .../com/sun/tools/javac/file/Locations.java | 9 +- .../sun/tools/javac/file/ZipFileIndex.java | 2 +- .../classes/com/sun/tools/javac/jvm/Gen.java | 6 +- .../sun/tools/javac/main/JavaCompiler.java | 4 +- .../sun/tools/javac/nio/PathFileManager.java | 5 +- .../sun/tools/javac/parser/JavaTokenizer.java | 3 +- .../com/sun/tools/javac/parser/Scanner.java | 5 +- .../sun/tools/javac/parser/UnicodeReader.java | 15 ++- .../processing/JavacRoundEnvironment.java | 4 +- .../tools/javac/processing/ServiceProxy.java | 4 +- .../com/sun/tools/javac/tree/JCTree.java | 96 +++++++++---------- .../util/AbstractDiagnosticFormatter.java | 4 +- .../com/sun/tools/javac/util/AbstractLog.java | 3 +- .../javac/util/BasicDiagnosticFormatter.java | 8 +- .../com/sun/tools/javac/util/Context.java | 8 +- .../sun/tools/javac/util/JCDiagnostic.java | 5 +- .../com/sun/tools/javac/util/Position.java | 4 +- .../javac/util/RawDiagnosticFormatter.java | 4 +- .../com/sun/tools/javadoc/ClassDocImpl.java | 4 +- .../com/sun/tools/javadoc/DocImpl.java | 2 +- .../com/sun/tools/javadoc/JavadocTool.java | 4 +- .../com/sun/tools/javadoc/ModifierFilter.java | 4 +- .../com/sun/tools/javadoc/ParamTagImpl.java | 6 +- .../com/sun/tools/javadoc/ThrowsTagImpl.java | 6 +- .../com/sun/tools/javah/NativeHeaderTool.java | 4 +- .../com/sun/tools/javap/DisassemblerTool.java | 8 +- 63 files changed, 190 insertions(+), 196 deletions(-) diff --git a/langtools/src/share/classes/com/sun/javadoc/Tag.java b/langtools/src/share/classes/com/sun/javadoc/Tag.java index 96faac5a39d..2e129f50505 100644 --- a/langtools/src/share/classes/com/sun/javadoc/Tag.java +++ b/langtools/src/share/classes/com/sun/javadoc/Tag.java @@ -70,14 +70,14 @@ public interface Tag { * than one tag of a given kind: *

* - * - * - * - * - * - * - * - * + * + * + * + * + * + * + * + * *
kind() name()
@throws @throws
@throws @exception
@see @see
@see @link
@see @linkplain
@serial @serial
@serial @serialData
kind() name()
@throws @throws
@throws @exception
@see @see
@see @link
@see @linkplain
@serial @serial
@serial @serialData
*/ String kind(); diff --git a/langtools/src/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java b/langtools/src/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java index 38043332030..69d034788cc 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,8 +28,8 @@ package com.sun.tools.classfile; import java.io.IOException; /** - * See JVMS - * http://cr.openjdk.java.net/~jrose/pres/indy-javadoc-mlvm/ + * See JVMS 4.7.21 + * http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.21 * *

This is NOT part of any supported API. * If you write code that depends on this, you do so at your own risk. diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java b/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java index 2aa711de65f..a33964369fc 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java @@ -98,7 +98,7 @@ public class Dependencies { * Get the ClassFile object for a specified class. * @param className the name of the class to be returned. * @return the ClassFile for the given class - * @throws Dependencies#ClassFileNotFoundException if the classfile cannot be + * @throws Dependencies.ClassFileNotFoundException if the classfile cannot be * found */ public ClassFile getClassFile(String className) diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java b/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java index a2d36f5dc25..aafb9861994 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -103,7 +103,7 @@ public class Instruction { 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}. */ + /** See {@link Kind#LOCAL_BYTE}. */ 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, P p); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java index 191b392937e..f3abcb42057 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -81,7 +81,7 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite * Add the summary link for the member. * * @param context the id of the context where the link will be printed - * @param classDoc the classDoc that we should link to + * @param cd the classDoc that we should link to * @param member the member being linked to * @param tdSummary the content tree to which the link will be added */ @@ -101,7 +101,7 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite /** * Add the inherited summary link for the member. * - * @param classDoc the classDoc that we should link to + * @param cd the classDoc that we should link to * @param member the member being linked to * @param linksTree the content tree to which the link will be added */ @@ -138,7 +138,7 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite * Add all the parameters for the executable member. * * @param member the member to write parameters for. - * @param tree the content tree to which the parameters information will be added. + * @param htmltree the content tree to which the parameters information will be added. */ protected void addParameters(ExecutableMemberDoc member, Content htmltree) { addParameters(member, true, htmltree); @@ -149,7 +149,7 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite * * @param member the member to write parameters for. * @param includeAnnotations true if annotation information needs to be added. - * @param tree the content tree to which the parameters information will be added. + * @param htmltree the content tree to which the parameters information will be added. */ protected void addParameters(ExecutableMemberDoc member, boolean includeAnnotations, Content htmltree) { 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 0bd5ee7eb3e..d3ba24cb79f 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 @@ -365,7 +365,7 @@ public abstract class AbstractMemberWriter { * Add the comment for the given member. * * @param member the member being documented. - * @param contentTree the content tree to which the comment will be added. + * @param htmltree the content tree to which the comment will be added. */ protected void addComment(ProgramElementDoc member, Content htmltree) { if (member.inlineTags().length > 0) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java index bd4f377ed73..7c214429b7d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java @@ -188,8 +188,8 @@ public class ConfigurationImpl extends Configuration { // ClassWriter. /** - * Constructor. Initialises resource for the - * {@link com.sun.tools.doclets.MessageRetriever}. + * Constructor. Initializes resource for the + * {@link com.sun.tools.doclets.internal.toolkit.util.MessageRetriever MessageRetriever}. */ private ConfigurationImpl() { standardmessage = new MessageRetriever(this, diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java index 2f44e5e3042..cf1b990bf32 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java @@ -208,7 +208,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter { * * @param builder the deprecated list builder * @param type the type of list being documented - * @param contentTree the content tree to which the anchor will be added + * @param htmlTree the content tree to which the anchor will be added */ private void addAnchor(DeprecatedAPIListBuilder builder, int type, Content htmlTree) { if (builder.hasDocumentation(type)) { 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 a1cec57b995..76ec0dd9ebf 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 @@ -1407,7 +1407,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Returns a package name label. * - * @param parsedName the package name + * @param packageName the package name * @return the package name content */ public Content getPackageLabel(String packageName) { @@ -2635,7 +2635,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Adds the annotatation types for the given doc. * - * @param packageDoc the package to write annotations for + * @param doc the package to write annotations for * @param htmltree the content tree to which the annotation types will be added */ public void addAnnotationInfo(ProgramElementDoc doc, Content htmltree) { 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 476f3f3f7ca..4f3396a3501 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 @@ -121,10 +121,10 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl /** * Add the member header. * - * @param fieldsType the class document to be listed - * @param fieldTypeStr the string for the filed type to be documented + * @param fieldType the class document to be listed + * @param fieldTypeStr the string for the field type to be documented * @param fieldDimensions the dimensions of the field string to be added - * @param firldName name of the field to be added + * @param fieldName name of the field to be added * @param contentTree the content tree to which the member header will be added */ public void addMemberHeader(ClassDoc fieldType, String fieldTypeStr, diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java index 1f9ad721b2d..e7574954594 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java @@ -155,7 +155,6 @@ public class LinkFactoryImpl extends LinkFactory { * "../../java/lang/Object.html" * * @param linkInfo the information about the link. - * @param fileName the file name, to which path string is. */ private String pathString(LinkInfoImpl linkInfo) { if (linkInfo.context == LinkInfoImpl.PACKAGE_FRAME) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java index b3a8ed77380..5e2c9aa0bf7 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java @@ -229,7 +229,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { * Adds the lower navigation bar and the bottom text * (from the -bottom option) at the bottom of page. * - * @param the documentation tree to which the navigation bar footer will be added + * @param body the documentation tree to which the navigation bar footer will be added */ protected void addNavigationBarFooter(Content body) { addNavLinks(false, body); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java index 6d39f0a4cc7..ed50a15f0f3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ import java.io.*; 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.DocletAbortException; /** * Generate the Serialized Form Information Page. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java index ba6d623ef22..2225fcd0eaa 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -423,9 +423,9 @@ public class HtmlTree extends Content { /** * Generates a META tag with the http-equiv, content and charset attributes. * - * @param http-equiv http equiv attribute for the META tag + * @param httpEquiv http equiv attribute for the META tag * @param content type of content - * @param charset character set used + * @param charSet character set used * @return an HtmlTree object for the META tag */ public static HtmlTree META(String httpEquiv, String content, String charSet) { 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 166f9ef8c1a..e30050cec6a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -158,7 +158,7 @@ public class HtmlWriter extends PrintWriter { * @param docencoding Encoding to be used for this file. * @exception IOException Exception raised by the FileWriter is passed on * to next level. - * @exception UnSupportedEncodingException Exception raised by the + * @exception UnsupportedEncodingException Exception raised by the * OutputStreamWriter is passed on to next level. */ public HtmlWriter(Configuration configuration, diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java index 8b14267880c..6c345b55ecd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ public interface EnumConstantWriter { * Get the enum constants documentation tree header. * * @param enumConstant the enum constant being documented - * @param enumConstantDetailsTree the content tree representing enum constant details + * @param enumConstantsDetailsTree the content tree representing enum constant details * @return content tree for the enum constant documentation header */ public Content getEnumConstantsTreeHeader(FieldDoc enumConstant, diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java index 4f2598e40c9..c5dcefea781 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java @@ -346,7 +346,6 @@ public class ConstantsSummaryBuilder extends AbstractBuilder { /** * Return the list of visible constant fields for the given classdoc. - * @param cd the classdoc to examine. * @return the list of visible constant fields for the given classdoc. */ protected List members() { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java index 54c942664a0..494c717999f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java @@ -166,7 +166,6 @@ public class MemberSummaryBuilder extends AbstractMemberBuilder { * This information can be used for doclet specific documentation * generation. * - * @param classDoc the {@link ClassDoc} we want to check. * @param type the type of members to return. * @return a list of methods that will be documented. * @see VisibleMemberMap diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java index 9e79d1828e1..fd2ff77b9f8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java @@ -183,7 +183,7 @@ public class ParamTaglet extends BaseTaglet implements InheritableTaglet { * Given an array of ParamTags,return its string representation. * Try to inherit the param tags that are missing. * - * @param doc the doc that holds the param tags. + * @param holder the doc that holds the param tags. * @param writer the TagletWriter that will write this tag. * @param formalParameters The array of parmeters (from type or executable * member) to check. @@ -256,7 +256,7 @@ public class ParamTaglet extends BaseTaglet implements InheritableTaglet { * been documented. * @param rankMap a {@link java.util.Map} which holds ordering * information about the parameters. - * @param nameMap a {@link java.util.Map} which holds a mapping + * @param rankMap a {@link java.util.Map} which holds a mapping * of a rank of a parameter to its name. This is * used to ensure that the right name is used * when parameter documentation is inherited. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java index 3a5295c5d1d..4d59a09b2b9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java @@ -108,7 +108,7 @@ public class ValueTaglet extends BaseInlineTaglet { * @param config the current configuration of the doclet. * @param tag the value tag. * @param name the name of the field to search for. The name should be in - * # format. If the class name is omitted, + * {@code #} format. If the class name is omitted, * it is assumed that the field is in the current class. * * @return the corresponding FieldDoc. If the name is null or empty string, diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java index 529d4fc4432..b25e91164aa 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -184,7 +184,7 @@ import com.sun.tools.doclets.internal.toolkit.Configuration; /** * Return all of the classes specified on the command-line that * belong to the given package. - * @param packageDoc the package to return the classes for. + * @param pkgDoc the package to return the classes for. */ public ClassDoc[] allClasses(PackageDoc pkgDoc) { return pkgDoc.isIncluded() ? diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java index 126ccb98694..d4f144706b3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java @@ -146,7 +146,7 @@ public class DeprecatedAPIListBuilder { /** * Return the list of deprecated Doc objects of a given type. * - * @param the constant representing the type of list being returned. + * @param type the constant representing the type of list being returned. */ public List getList(int type) { return deprecatedLists.get(type); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java index be4b08a8b8a..6a6537f7295 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java @@ -91,7 +91,7 @@ public class Extern { * If the same package name is found in the map, then the first mapped * Item object or offline location will be retained. * - * @param packagename Package name found in the "package-list" file. + * @param packageName Package name found in the "package-list" file. * @param path URL or Directory path from where the "package-list" * file is picked. * @param relative True if path is URL, false if directory path. @@ -179,7 +179,7 @@ public class Extern { /** * Get the Extern Item object associated with this package name. * - * @param pkgname Package name. + * @param pkgName Package name. */ private Item findPackageItem(String pkgName) { if (packageToItemMap == null) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java index 64ed9e69610..27d341b7118 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java @@ -126,7 +126,7 @@ public class VisibleMemberMap { * Return the package private members inherited by the class. Only return * if parent is package private and not documented. * - * @param configuation the current configuration of the doclet. + * @param configuration the current configuration of the doclet. * @return the package private members inherited by the class. */ private List getInheritedPackagePrivateMethods(Configuration configuration) { @@ -149,7 +149,7 @@ public class VisibleMemberMap { * end of the list members that are inherited by inaccessible parents. We * document these members in the child because the parent is not documented. * - * @param configuation the current configuration of the doclet. + * @param configuration the current configuration of the doclet. */ public List getLeafClassMembers(Configuration configuration) { List result = getMembersFor(classdoc); diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/DiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/api/DiagnosticFormatter.java index 18aafee6a15..fab0adae508 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/DiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/DiagnosticFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -138,7 +138,7 @@ public interface DiagnosticFormatter> { /** * Configure the set of diagnostic parts that should be displayed * by the formatter. - * @param options options to set + * @param visibleParts the parts to be set */ public void setVisible(Set visibleParts); diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java index 0be82fb8a27..0a7a4617250 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ public final class JavacTool implements JavaCompiler { * Constructor used by service provider mechanism. The recommended way to * obtain an instance of this class is by using {@link #create} or the * service provider mechanism. - * @see javax.tools.JavaCompilerTool + * @see javax.tools.JavaCompiler * @see javax.tools.ToolProvider * @see #create */ 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 index 0cad0db21df..7ef7dee53d1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java @@ -124,7 +124,7 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi /** * Get a localized string represenation for a given type. * - * @param ts type to be displayed + * @param t type to be displayed * @param locale the locale in which the string is to be rendered * @return localized string representation */ @@ -135,7 +135,7 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi /** * Get a localized string represenation for a given symbol. * - * @param ts symbol to be displayed + * @param s symbol to be displayed * @param locale the locale in which the string is to be rendered * @return localized string representation */ diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java index 027874b87ab..29ce859361d 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java @@ -301,7 +301,7 @@ public class Symtab { } /** Enter a class into symbol table. - * @param The name of the class. + * @param s The name of the class. */ private Type enterClass(String s) { return reader.enterClass(names.fromString(s)).type; diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java index d46286ade81..aecf93bb74f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -106,7 +106,7 @@ public class TypeTags { */ public static final int DEFERRED = FORALL+1; - /** The tag of the bottom type . + /** The tag of the bottom type {@code }. */ public static final int BOT = DEFERRED+1; 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 fde3ab135b7..9bc13e56bbb 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 @@ -1427,8 +1427,8 @@ public class Types { * conservative in that it is allowed to say that two types are * not disjoint, even though they actually are. * - * The type C is castable to C exactly if X and Y are not - * disjoint. + * The type {@code C} is castable to {@code C} exactly if + * {@code X} and {@code Y} are not disjoint. */ public boolean disjointType(Type t, Type s) { return disjointType.visit(t, s); @@ -1523,7 +1523,7 @@ public class Types { * something of type `t' can be a subtype of `s'? This is * different from the question "is `t' not a subtype of `s'?" * when type variables are involved: Integer is not a subtype of T - * where but it is not true that Integer cannot + * where {@code } but it is not true that Integer cannot * possibly be a subtype of T. */ public boolean notSoftSubtype(Type t, Type s) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java index fa4a3b539fd..754624eb4a5 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -740,7 +740,7 @@ public class Attr extends JCTree.Visitor { * @param env The env for the const value * @param initializer The initializer for the const value * @param type The expected type, or null - * @see VarSymbol#setlazyConstValue + * @see VarSymbol#setLazyConstValue */ public Object attribLazyConstantValue(Env env, JCTree.JCExpression initializer, 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 87651481548..73f9c050790 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 @@ -230,7 +230,6 @@ public class Check { /** Warn about unsafe vararg method decl. * @param pos Position to be used for error reporting. - * @param sym The deprecated symbol. */ void warnUnsafeVararg(DiagnosticPosition pos, String key, Object... args) { if (lint.isEnabled(LintCategory.VARARGS) && allowSimplifiedVarargs) @@ -397,7 +396,7 @@ public class Check { **************************************************************************/ /** Return name of local class. - * This is of the form $ n + * This is of the form {@code $ n } * where * enclClass is the flat name of the enclosing class, * classname is the simple name of the local class @@ -600,11 +599,10 @@ public class Check { /** Check that a type is within some bounds. * - * Used in TypeApply to verify that, e.g., X in V is a valid + * Used in TypeApply to verify that, e.g., X in {@code V} is a valid * type argument. - * @param pos Position to be used for error reporting. * @param a The type that should be bounded by bs. - * @param bs The bound. + * @param bound The bound. */ private boolean checkExtends(Type a, Type bound) { if (a.isUnbound()) { @@ -1262,8 +1260,10 @@ public class Check { * their bounds. This must be done in a second phase after type attributon * since a class might have a subclass as type parameter bound. E.g: * + *

{@code
      *  class B { ... }
      *  class C extends B { ... }
+     *  }
* * and we can't make sure that the bound is already attributed because * of possible cycles. @@ -2574,7 +2574,7 @@ public class Check { * 'pos'. * * @param s The (annotation)type declaration annotated with a @ContainedBy - * @param containerAnno the @ContainedBy on 's' + * @param containedBy the @ContainedBy on 's' * @param pos where to report errors */ public void validateContainedBy(TypeSymbol s, Attribute.Compound containedBy, DiagnosticPosition pos) { @@ -3181,7 +3181,6 @@ public class Check { * @param pos Position for error reporting. * @param sym The symbol. * @param s The scope - * @param staticImport Whether or not this was a static import */ boolean checkUniqueStaticImport(DiagnosticPosition pos, Symbol sym, Scope s) { return checkUniqueImport(pos, sym, s, true); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java index 55e2e7144f1..e616097e4f0 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java @@ -148,7 +148,7 @@ import static com.sun.tools.javac.tree.JCTree.Tag.*; * exception to this [no pun intended] is that checked exceptions that * are known to be caught or declared to be caught in the enclosing * method are not recorded in the queue, but instead are recorded in a - * global variable "Set thrown" that records the type of all + * global variable "{@code Set thrown}" that records the type of all * exceptions that can be thrown. * *

Other minor issues the treatment of members of other classes 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 57604cbe557..5a225565f00 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 @@ -671,7 +671,7 @@ public class Lower extends TreeTranslator { }; /** Look up a synthetic name in a given scope. - * @param scope The scope. + * @param s The scope. * @param name The name. */ private Symbol lookupSynthetic(Name name, Scope s) { @@ -747,7 +747,7 @@ public class Lower extends TreeTranslator { * This numbering scheme is used by the backend to decide whether * to issue an invokevirtual or invokespecial call. * - * @see Gen.visitSelect(Select tree) + * @see Gen#visitSelect(JCFieldAccess tree) */ private static final int DEREFcode = 0, diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java index a57f3ba8019..85397fc91b4 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java @@ -128,8 +128,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { /** Import all classes of a class or package on demand. * @param pos Position to be used for error reporting. * @param tsym The class or package the members of which are imported. - * @param toScope The (import) scope in which imported classes - * are entered. + * @param env The env in which the imported classes will be entered. */ private void importAll(int pos, final TypeSymbol tsym, @@ -150,8 +149,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { /** Import all static members of a class or package on demand. * @param pos Position to be used for error reporting. * @param tsym The class or package the members of which are imported. - * @param toScope The (import) scope in which imported classes - * are entered. + * @param env The env in which the imported classes will be entered. */ private void importStaticAll(int pos, final TypeSymbol tsym, diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java index d1c0835f8cc..36f3a25f243 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java @@ -132,17 +132,21 @@ public class TransTypes extends TreeTranslator { * Then, coerce to some given target type unless target type is null. * This operation is used in situations like the following: * + *

{@code
      *  class Cell { A value; }
      *  ...
      *  Cell cell;
      *  Integer x = cell.value;
+     *  }
* * Since the erasure of Cell.value is Object, but the type * of cell.value in the assignment is Integer, we need to * adjust the original type of cell.value to Object, and insert * a cast to Integer. That is, the last assignment becomes: * + *
{@code
      *  Integer x = (Integer)cell.value;
+     *  }
* * @param tree The expression tree whose type might need adjustment. * @param erasedType The expression's type after erasure. diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java index 78774566915..87bbfbcf2c8 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -805,8 +805,8 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil } /** - * Enforces the specification of a "relative" URI as used in - * {@linkplain #getFileForInput(Location,String,URI) + * Enforces the specification of a "relative" name as used in + * {@linkplain #getFileForInput(Location,String,String) * getFileForInput}. This method must follow the rules defined in * that method, do not make any changes without consulting the * specification. diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java b/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java index 1e29f916742..6e0472c97dc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java +++ b/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java @@ -53,13 +53,14 @@ import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Options; import javax.tools.JavaFileManager; +import javax.tools.StandardJavaFileManager; import static javax.tools.StandardLocation.*; import static com.sun.tools.javac.main.Option.*; /** This class converts command line arguments, environment variables * and system properties (in File.pathSeparator-separated String form) * into a boot class path, user class path, and source path (in - * Collection form). + * {@code Collection} form). * *

This is NOT part of any supported API. * If you write code that depends on this, you do so at your own risk. @@ -342,11 +343,11 @@ public class Locations { } } - /** @see JavaFileManager#handleOption. */ + /** @see JavaFileManager#handleOption */ abstract boolean handleOption(Option option, String value); - /** @see JavaFileManager#getLocation. */ + /** @see StandardJavaFileManager#getLocation */ abstract Collection getLocation(); - /** @see JavaFileManager#setLocation. */ + /** @see StandardJavaFileManager#setLocation */ abstract void setLocation(Iterable files) throws IOException; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java index ef47c7759dc..dbb9f68a91f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java +++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java @@ -59,7 +59,7 @@ import com.sun.tools.javac.file.RelativePath.RelativeFile; * the command line.) * * Location where to look for/generate optimized zip index files can be - * provided using "-XDcachezipindexdir=". If this flag is not + * provided using "{@code -XDcachezipindexdir=}". If this flag is not * provided, the default location is the value of the "java.io.tmpdir" system * property. * diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java index 9a59e0de5b6..9f99fb6d66f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java @@ -446,7 +446,7 @@ public class Gen extends JCTree.Visitor { * Normalizing class-members. *************************************************************************/ - /** Distribute member initializer code into constructors and + /** Distribute member initializer code into constructors and {@code } * method. * @param defs The list of class member declarations. * @param c The enclosing class. @@ -689,7 +689,7 @@ public class Gen extends JCTree.Visitor { * should be emitted, if so, put a new entry into CRTable * and call method to generate bytecode. * If not, just call method to generate bytecode. - * @see #genStat(Tree, Env) + * @see #genStat(JCTree, Env) * * @param tree The tree to be visited. * @param env The environment to use. @@ -756,7 +756,7 @@ public class Gen extends JCTree.Visitor { * should be emitted, if so, put a new entry into CRTable * and call method to generate bytecode. * If not, just call method to generate bytecode. - * @see #genCond(Tree,boolean) + * @see #genCond(JCTree,boolean) * * @param tree The tree to be visited. * @param crtFlags The CharacterRangeTable flags 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 65c16f08522..150746a571d 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 @@ -607,7 +607,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { /** Parse contents of input stream. * @param filename The name of the file from which input stream comes. - * @param input The input stream to be parsed. + * @param content The characters to be parsed. */ protected JCCompilationUnit parse(JavaFileObject filename, CharSequence content) { long msec = now(); @@ -755,8 +755,6 @@ public class JavaCompiler implements ClassReader.SourceCompleter { /** Complete compiling a source file that has been accessed * by the class file reader. * @param c The class the source file of which needs to be compiled. - * @param filename The name of the source file. - * @param f An input stream that reads the source file. */ public void complete(ClassSymbol c) throws CompletionFailure { // System.err.println("completing " + c);//DEBUG diff --git a/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileManager.java b/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileManager.java index 4aff5616231..762b8ed21fe 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,13 +27,14 @@ package com.sun.tools.javac.nio; import java.io.IOException; import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.Path; import javax.tools.FileObject; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; /** - * File manager based on {@linkplain File java.nio.file.Path}. + * File manager based on {@link java.nio.file.Path}. * * Eventually, this should be moved to javax.tools. * Also, JavaCompiler might reasonably provide a method getPathFileManager, diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java index 7b6ca57cc34..f6ddfcbeb99 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java @@ -108,8 +108,7 @@ public class JavaTokenizer { * {@code input[input.length -1]} is a white space character. * * @param fac the factory which created this Scanner - * @param input the input, might be modified - * @param inputLength the size of the input. + * @param buf the input, might be modified * Must be positive and less than or equal to input.length. */ protected JavaTokenizer(ScannerFactory fac, CharBuffer buf) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/Scanner.java b/langtools/src/share/classes/com/sun/tools/javac/parser/Scanner.java index 93b2e8adecf..20c49e6cfc2 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/Scanner.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/Scanner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,8 +66,7 @@ public class Scanner implements Lexer { * {@code input[input.length -1]} is a white space character. * * @param fac the factory which created this Scanner - * @param input the input, might be modified - * @param inputLength the size of the input. + * @param buf the input, might be modified * Must be positive and less than or equal to input.length. */ protected Scanner(ScannerFactory fac, CharBuffer buf) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java b/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java index 07b8c5cda8b..84e6792cdd1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java @@ -77,9 +77,8 @@ public class UnicodeReader { * that {@code inputLength < input.length} or * {@code input[input.length -1]} is a white space character. * - * @param fac the factory which created this Scanner - * @param input the input, might be modified - * @param inputLength the size of the input. + * @param sf the factory which created this Scanner + * @param buffer the input, might be modified * Must be positive and less than or equal to input.length. */ protected UnicodeReader(ScannerFactory sf, CharBuffer buffer) { @@ -255,16 +254,16 @@ public class UnicodeReader { /** * Returns a copy of a character array subset of the input buffer. - * The returned array begins at the beginIndex and - * extends to the character at index endIndex - 1. - * Thus the length of the substring is endIndex-beginIndex. + * The returned array begins at the {@code beginIndex} and + * extends to the character at index {@code endIndex - 1}. + * Thus the length of the substring is {@code endIndex-beginIndex}. * This behavior is like - * String.substring(beginIndex, endIndex). + * {@code String.substring(beginIndex, endIndex)}. * Unicode escape sequences are not translated. * * @param beginIndex the beginning index, inclusive. * @param endIndex the ending index, exclusive. - * @throws IndexOutOfBounds if either offset is outside of the + * @throws ArrayIndexOutOfBoundsException if either offset is outside of the * array bounds */ public char[] getRawCharacters(int beginIndex, int endIndex) { 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 18779a25ceb..157f7eb0125 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 (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -105,7 +105,7 @@ public class JavacRoundEnvironment implements RoundEnvironment { * Only type elements included in this round of annotation * processing, or declarations of members, parameters, or type * parameters declared within those, are returned. Included type - * elements are {@linkplain #getSpecifiedTypeElements specified + * elements are {@linkplain #getRootElements specified * types} and any types nested within them. * * @param a annotation type being requested diff --git a/langtools/src/share/classes/com/sun/tools/javac/processing/ServiceProxy.java b/langtools/src/share/classes/com/sun/tools/javac/processing/ServiceProxy.java index e3cd7ade45a..ea6d9a07dae 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/processing/ServiceProxy.java +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/ServiceProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,7 +72,7 @@ class ServiceProxy { * The service class for which providers are being sought; * used to construct error detail strings * - * @param url + * @param u * The URL naming the configuration file to be parsed * * @return true if the name of a service is found diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java index 3494f3b52cf..d8008d716b6 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java @@ -464,32 +464,29 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { } /** - * Everything in one source file is kept in a TopLevel structure. - * @param pid The tree representing the package clause. - * @param sourcefile The source file name. - * @param defs All definitions in this file (ClassDef, Import, and Skip) - * @param packge The package it belongs to. - * @param namedImportScope A scope for all named imports. - * @param starImportScope A scope for all import-on-demands. - * @param lineMap Line starting positions, defined only - * if option -g is set. - * @param docComments A hashtable that stores all documentation comments - * indexed by the tree nodes they refer to. - * defined only if option -s is set. - * @param endPositions An object encapsulating ending positions of source - * ranges indexed by the tree nodes they belong to. - * Defined only if option -Xjcov is set. + * Everything in one source file is kept in a {@linkplain JCCompilationUnit} structure. */ public static class JCCompilationUnit extends JCTree implements CompilationUnitTree { public List packageAnnotations; + /** The tree representing the package clause. */ public JCExpression pid; + /** All definitions in this file (ClassDef, Import, and Skip) */ public List defs; + /* The source file name. */ public JavaFileObject sourcefile; + /** The package to which this compilation unit belongs. */ public PackageSymbol packge; + /** A scope for all named imports. */ public ImportScope namedImportScope; + /** A scope for all import-on-demands. */ public StarImportScope starImportScope; + /** Line starting positions, defined only if option -g is set. */ public Position.LineMap lineMap = null; + /** A table that stores all documentation comments indexed by the tree + * nodes they refer to. defined only if option -s is set. */ public DocCommentTable docComments = null; + /* An object encapsulating ending positions of source ranges indexed by + * the tree nodes they belong to. Defined only if option -Xjcov is set. */ public EndPosTable endPositions = null; protected JCCompilationUnit(List packageAnnotations, JCExpression pid, @@ -550,10 +547,10 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * An import clause. - * @param qualid The imported class(es). */ public static class JCImport extends JCTree implements ImportTree { public boolean staticImport; + /** The imported class(es). */ public JCTree qualid; protected JCImport(JCTree qualid, boolean importStatic) { this.qualid = qualid; @@ -605,21 +602,21 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A class definition. - * @param modifiers the modifiers - * @param name the name of the class - * @param typarams formal class parameters - * @param extending the classes this class extends - * @param implementing the interfaces implemented by this class - * @param defs all variables and methods defined in this class - * @param sym the symbol */ public static class JCClassDecl extends JCStatement implements ClassTree { + /** the modifiers */ public JCModifiers mods; + /** the name of the class */ public Name name; + /** formal class parameters */ public List typarams; + /** the classes this class extends */ public JCExpression extending; + /** the interfaces implemented by this class */ public List implementing; + /** all variables and methods defined in this class */ public List defs; + /** the symbol */ public ClassSymbol sym; protected JCClassDecl(JCModifiers mods, Name name, @@ -676,24 +673,25 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A method definition. - * @param modifiers method modifiers - * @param name method name - * @param restype type of method return value - * @param typarams type parameters - * @param params value parameters - * @param thrown exceptions thrown by this method - * @param stats statements in the method - * @param sym method symbol */ public static class JCMethodDecl extends JCTree implements MethodTree { + /** method modifiers */ public JCModifiers mods; + /** method name */ public Name name; + /** type of method return value */ public JCExpression restype; + /** type parameters */ public List typarams; + /** value parameters */ public List params; + /** exceptions thrown by this method */ public List thrown; + /** statements in the method */ public JCBlock body; - public JCExpression defaultValue; // for annotation types + /** default value, for annotation types */ + public JCExpression defaultValue; + /** method symbol */ public MethodSymbol sym; protected JCMethodDecl(JCModifiers mods, Name name, @@ -748,17 +746,17 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A variable definition. - * @param modifiers variable modifiers - * @param name variable name - * @param vartype type of the variable - * @param init variables initial value - * @param sym symbol */ public static class JCVariableDecl extends JCStatement implements VariableTree { + /** variable modifiers */ public JCModifiers mods; + /** variable name */ public Name name; + /** type of the variable */ public JCExpression vartype; + /** variable's initial value */ public JCExpression init; + /** symbol */ public VarSymbol sym; protected JCVariableDecl(JCModifiers mods, Name name, @@ -815,11 +813,11 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A statement block. - * @param stats statements - * @param flags flags */ public static class JCBlock extends JCStatement implements BlockTree { + /** flags */ public long flags; + /** statements */ public List stats; /** Position of closing brace, optional. */ public int endpos = Position.NOPOS; @@ -1206,9 +1204,9 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * an expression statement - * @param expr expression structure */ public static class JCExpressionStatement extends JCStatement implements ExpressionStatementTree { + /** expression structure */ public JCExpression expr; protected JCExpressionStatement(JCExpression expr) { @@ -1776,13 +1774,13 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * Selects through packages and classes - * @param selected selected Tree hierarchie - * @param selector name of field to select thru - * @param sym symbol of the selected class */ public static class JCFieldAccess extends JCExpression implements MemberSelectTree { + /** selected Tree hierarchy */ public JCExpression selected; + /** name of field to select thru */ public Name name; + /** symbol of the selected class */ public Symbol sym; protected JCFieldAccess(JCExpression selected, Name name, Symbol sym) { this.selected = selected; @@ -1885,11 +1883,11 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * An identifier - * @param idname the name - * @param sym the symbol */ public static class JCIdent extends JCExpression implements IdentifierTree { + /** the name */ public Name name; + /** the symbol */ public Symbol sym; protected JCIdent(Name name, Symbol sym) { this.name = name; @@ -1912,10 +1910,10 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A constant value given literally. - * @param value value representation */ public static class JCLiteral extends JCExpression implements LiteralTree { public int typetag; + /** value representation */ public Object value; protected JCLiteral(int typetag, Object value) { this.typetag = typetag; @@ -1978,10 +1976,10 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * Identifies a basic type. - * @param tag the basic type id * @see TypeTags */ public static class JCPrimitiveTypeTree extends JCExpression implements PrimitiveTypeTree { + /** the basic type id */ public int typetag; protected JCPrimitiveTypeTree(int typetag) { this.typetag = typetag; @@ -2105,11 +2103,11 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A formal class parameter. - * @param name name - * @param bounds bounds */ public static class JCTypeParameter extends JCTree implements TypeParameterTree { + /** name */ public Name name; + /** bounds */ public List bounds; protected JCTypeParameter(Name name, List bounds) { this.name = name; 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 cec43bdd412..06e6e46d76c 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 (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -484,7 +484,7 @@ public abstract class AbstractDiagnosticFormatter implements DiagnosticFormatter /** * Tells whether the caret display is active or not. * - * @param caretEnabled if true the caret is enabled + * @return true if the caret is enabled */ public boolean isCaretEnabled() { return caretEnabled; diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java index ca25a5b3636..07f244a94d2 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -132,7 +132,6 @@ public abstract class AbstractLog { /** Report a warning, unless suppressed by the -nowarn option or the * maximum number of warnings has been reached. - * @param pos The source position at which to report the warning. * @param key The key for the localized warning message. * @param args Fields of the warning message. */ 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 cec4b954b4e..7b12009695a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -69,7 +69,7 @@ public class BasicDiagnosticFormatter extends AbstractDiagnosticFormatter { /** * Create a basic formatter based on the supplied options. * - * @param opts list of command-line options + * @param options list of command-line options * @param msgs JavacMessages object used for i18n */ public BasicDiagnosticFormatter(Options options, JavacMessages msgs) { @@ -329,7 +329,7 @@ public class BasicDiagnosticFormatter extends AbstractDiagnosticFormatter { * Set the indentation level for various element of a given diagnostic - * this might lead to more readable diagnostics * - * @param indentationKind kind of indentation to be set + * @param diagPart * @param nSpaces amount of spaces for the specified diagnostic part */ public void setIndentation(DiagnosticPart diagPart, int nSpaces) { @@ -384,7 +384,7 @@ public class BasicDiagnosticFormatter extends AbstractDiagnosticFormatter { /** * Get a metachar string for a specific format * - * @param sourcePos a positioning value for source line + * @param kind the format kind for which to get the metachar string */ public String getFormat(BasicFormatKind kind) { return availableFormats.get(kind); diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Context.java b/langtools/src/share/classes/com/sun/tools/javac/util/Context.java index 91a4e6340ca..93026633f34 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Context.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Context.java @@ -44,7 +44,7 @@ import java.util.*; * instance method that is overridden in extended components. A base * phase supporting extension would look something like this: * - *

+ * 

{@code
  * public class Phase {
  *     protected static final Context.Key phaseKey =
  *         new Context.Key();
@@ -62,7 +62,7 @@ import java.util.*;
  *         // other intitialization follows...
  *     }
  * }
- * 
+ * }
* *

In the compiler, we simply use Phase.instance(context) to get * the reference to the phase. But in extensions of the compiler, we @@ -70,7 +70,7 @@ import java.util.*; * and this must be done before any reference to the phase is accessed * using Phase.instance(). An extended phase might be declared thus: * - *

+ * 

{@code
  * public class NewPhase extends Phase {
  *     protected NewPhase(Context context) {
  *         super(context);
@@ -83,7 +83,7 @@ import java.util.*;
  *         });
  *     }
  * }
- * 
+ * }
* *

And is registered early in the extended compiler like this * diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java b/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java index b21051d62bc..17ce2319dc1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java @@ -213,7 +213,6 @@ public class JCDiagnostic implements Diagnostic { * Create a new diagnostic of the given kind, which is not mandatory and which has * no lint category. * @param kind The diagnostic kind - * @param ls The lint category, if applicable, or null * @param source The source of the compilation unit, if any, in which to report the message. * @param pos The source position at which to report the message. * @param key The key for the localized message. @@ -228,7 +227,7 @@ public class JCDiagnostic implements Diagnostic { * Create a new diagnostic of the given kind. * @param kind The diagnostic kind * @param lc The lint category, if applicable, or null - * @param isMandatory is diagnostic mandatory? + * @param flags The set of flags for the diagnostic * @param source The source of the compilation unit, if any, in which to report the message. * @param pos The source position at which to report the message. * @param key The key for the localized message. @@ -363,7 +362,7 @@ public class JCDiagnostic implements Diagnostic { /** * Create a diagnostic object. - * @param fomatter the formatter to use for the diagnostic + * @param formatter the formatter to use for the diagnostic * @param dt the type of diagnostic * @param lc the lint category for the diagnostic * @param source the name of the source file, or null if none. diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Position.java b/langtools/src/share/classes/com/sun/tools/javac/util/Position.java index 271467180f0..f5fc39f1250 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Position.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Position.java @@ -80,11 +80,11 @@ public class Position { /** Encode line and column numbers in an integer as: * {@code line-number << LINESHIFT + column-number }. - * {@link Position.NOPOS} represents an undefined position. + * {@link Position#NOPOS} represents an undefined position. * * @param line number of line (first is 1) * @param col number of character on line (first is 1) - * @return an encoded position or {@link Position.NOPOS} + * @return an encoded position or {@link Position#NOPOS} * if the line or column number is too big to * represent in the encoded format * @throws IllegalArgumentException if line or col is less than 1 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 b4f373de1f0..00e0b1f4210 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ public final class RawDiagnosticFormatter extends AbstractDiagnosticFormatter { /** * Create a formatter based on the supplied options. - * @param msgs + * @param options */ public RawDiagnosticFormatter(Options options) { super(null, new SimpleConfiguration(options, diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java index 2e22d93a516..38e9392c7c9 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java @@ -844,7 +844,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { * Note that this is not necessarily what the compiler would do! * * @param methodName the unqualified name to search for. - * @param paramTypeArray the array of Strings for method parameter types. + * @param paramTypes the array of Strings for method parameter types. * @return the first MethodDocImpl which matches, null if not found. */ public MethodDocImpl findMethod(String methodName, String[] paramTypes) { @@ -971,7 +971,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { * Find constructor in this class. * * @param constrName the unqualified name to search for. - * @param paramTypeArray the array of Strings for constructor parameters. + * @param paramTypes the array of Strings for constructor parameters. * @return the first ConstructorDocImpl which matches, null if not found. */ public ConstructorDoc findConstructor(String constrName, diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java index 12783bf2d5f..386c238ea72 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java @@ -262,7 +262,7 @@ public abstract class DocImpl implements Doc, Comparable { *

* Included so that Doc item are java.lang.Comparable. * - * @param o the Object to be compared. + * @param obj the {@code Object} to be compared. * @return a negative integer, zero, or a positive integer as this Object * is less than, equal to, or greater than the given Object. * @exception ClassCastException the specified Object's type prevents it diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java index 81bcdbd3008..5502ffed288 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -386,7 +386,7 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { /** * Return true if given file name is a valid class name * (including "package-info"). - * @param clazzname the name of the class to check. + * @param s the name of the class to check. * @return true if given class name is a valid class name * and false otherwise. */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java b/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java index 5e9637262ae..d46a5272b9b 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,7 +32,7 @@ import static com.sun.tools.javac.code.Flags.*; * Filtering is done by returning boolean values. * Classes, methods and fields can be filtered, or filtering * can be done directly on modifier bits. - * @see com.sun.tools.javac.code.Flags; + * @see com.sun.tools.javac.code.Flags * @author Robert Field */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java index 60809bbb8a1..d1e2f0bcad4 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -101,8 +101,8 @@ class ParamTagImpl extends TagImpl implements ParamTag { * TagImpls consisting of SeeTagImpl(s) and text containing TagImpl(s). * * @return TagImpl[] Array of tags with inline SeeTagImpls. - * @see TagImpl#inlineTagImpls() - * @see ThrowsTagImpl#inlineTagImpls() + * @see TagImpl#inlineTags() + * @see ThrowsTagImpl#inlineTags() */ @Override public Tag[] inlineTags() { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java index f63ffece2b2..a88e1fb2516 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,8 +108,8 @@ class ThrowsTagImpl extends TagImpl implements ThrowsTag { * TagImpls consisting of SeeTagImpl(s) and text containing TagImpl(s). * * @return TagImpl[] Array of tags with inline SeeTagImpls. - * @see TagImpl#inlineTagImpls() - * @see ParamTagImpl#inlineTagImpls() + * @see TagImpl#inlineTags() + * @see ParamTagImpl#inlineTags() */ @Override public Tag[] inlineTags() { diff --git a/langtools/src/share/classes/com/sun/tools/javah/NativeHeaderTool.java b/langtools/src/share/classes/com/sun/tools/javah/NativeHeaderTool.java index 5107dd113c9..1f4adc0c82c 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/NativeHeaderTool.java +++ b/langtools/src/share/classes/com/sun/tools/javah/NativeHeaderTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,11 +29,13 @@ import java.io.Writer; import java.nio.charset.Charset; import java.util.Locale; import java.util.concurrent.Callable; +import javax.tools.Diagnostic; import javax.tools.DiagnosticListener; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.OptionChecker; import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; import javax.tools.Tool; /** diff --git a/langtools/src/share/classes/com/sun/tools/javap/DisassemblerTool.java b/langtools/src/share/classes/com/sun/tools/javap/DisassemblerTool.java index 356fc9a4de6..8f7a588b4da 100644 --- a/langtools/src/share/classes/com/sun/tools/javap/DisassemblerTool.java +++ b/langtools/src/share/classes/com/sun/tools/javap/DisassemblerTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,11 +29,13 @@ import java.io.Writer; import java.nio.charset.Charset; import java.util.Locale; import java.util.concurrent.Callable; +import javax.tools.Diagnostic; import javax.tools.DiagnosticListener; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.OptionChecker; import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; import javax.tools.Tool; /** @@ -69,9 +71,7 @@ public interface DisassemblerTool extends Tool, OptionChecker { * @param options compiler options, {@code null} means no options * @param classes class names (for annotation processing), {@code * null} means no class names - * @param compilationUnits the compilation units to compile, {@code - * null} means no compilation units - * @return an object representing the compilation + * @return a task to perform the disassembly * @throws RuntimeException if an unrecoverable error * occurred in a user supplied component. The * {@linkplain Throwable#getCause() cause} will be the error in From 680ffebcb6014de7b5bfd837c284b2eee5670308 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Wed, 10 Oct 2012 16:48:21 -0700 Subject: [PATCH 043/241] 8000665: fix "internal API" comments on javadoc files Reviewed-by: darcy --- .../formats/html/AbstractExecutableMemberWriter.java | 5 +++++ .../doclets/formats/html/AbstractIndexWriter.java | 5 +++++ .../doclets/formats/html/AbstractMemberWriter.java | 5 +++++ .../formats/html/AbstractPackageIndexWriter.java | 7 ++++++- .../tools/doclets/formats/html/AbstractTreeWriter.java | 5 +++++ .../doclets/formats/html/AllClassesFrameWriter.java | 5 +++++ .../html/AnnotationTypeOptionalMemberWriterImpl.java | 7 ++++++- .../html/AnnotationTypeRequiredMemberWriterImpl.java | 7 ++++++- .../doclets/formats/html/AnnotationTypeWriterImpl.java | 6 ++++++ .../sun/tools/doclets/formats/html/ClassUseWriter.java | 5 +++++ .../tools/doclets/formats/html/ClassWriterImpl.java | 6 ++++++ .../formats/html/ConstantsSummaryWriterImpl.java | 5 +++++ .../doclets/formats/html/ConstructorWriterImpl.java | 7 ++++++- .../doclets/formats/html/DeprecatedListWriter.java | 5 +++++ .../doclets/formats/html/EnumConstantWriterImpl.java | 7 ++++++- .../tools/doclets/formats/html/FieldWriterImpl.java | 7 ++++++- .../tools/doclets/formats/html/FrameOutputWriter.java | 5 +++++ .../com/sun/tools/doclets/formats/html/HelpWriter.java | 5 +++++ .../com/sun/tools/doclets/formats/html/HtmlDoclet.java | 5 +++++ .../tools/doclets/formats/html/HtmlDocletWriter.java | 5 +++++ .../doclets/formats/html/HtmlSerialFieldWriter.java | 5 +++++ .../doclets/formats/html/HtmlSerialMethodWriter.java | 5 +++++ .../tools/doclets/formats/html/LinkFactoryImpl.java | 5 +++++ .../sun/tools/doclets/formats/html/LinkInfoImpl.java | 8 +++++++- .../sun/tools/doclets/formats/html/LinkOutputImpl.java | 7 ++++++- .../tools/doclets/formats/html/MethodWriterImpl.java | 7 ++++++- .../doclets/formats/html/NestedClassWriterImpl.java | 7 ++++++- .../tools/doclets/formats/html/PackageFrameWriter.java | 5 +++++ .../doclets/formats/html/PackageIndexFrameWriter.java | 5 +++++ .../tools/doclets/formats/html/PackageIndexWriter.java | 5 +++++ .../tools/doclets/formats/html/PackageTreeWriter.java | 5 +++++ .../tools/doclets/formats/html/PackageUseWriter.java | 5 +++++ .../tools/doclets/formats/html/PackageWriterImpl.java | 5 +++++ .../doclets/formats/html/SerializedFormWriterImpl.java | 5 +++++ .../tools/doclets/formats/html/SingleIndexWriter.java | 5 +++++ .../doclets/formats/html/SourceToHTMLConverter.java | 9 +++++---- .../tools/doclets/formats/html/SplitIndexWriter.java | 5 +++++ .../doclets/formats/html/SubWriterHolderWriter.java | 5 +++++ .../tools/doclets/formats/html/TagletOutputImpl.java | 7 ++++++- .../tools/doclets/formats/html/TagletWriterImpl.java | 7 ++++++- .../com/sun/tools/doclets/formats/html/TreeWriter.java | 5 +++++ .../tools/doclets/formats/html/WriterFactoryImpl.java | 5 +++++ .../sun/tools/doclets/formats/html/markup/Comment.java | 7 ++++++- .../sun/tools/doclets/formats/html/markup/DocType.java | 7 ++++++- .../tools/doclets/formats/html/markup/HtmlAttr.java | 7 ++++++- .../doclets/formats/html/markup/HtmlConstants.java | 7 ++++++- .../doclets/formats/html/markup/HtmlDocWriter.java | 7 ++++++- .../doclets/formats/html/markup/HtmlDocument.java | 7 ++++++- .../tools/doclets/formats/html/markup/HtmlStyle.java | 7 ++++++- .../sun/tools/doclets/formats/html/markup/HtmlTag.java | 7 ++++++- .../tools/doclets/formats/html/markup/HtmlTree.java | 5 +++++ .../tools/doclets/formats/html/markup/HtmlWriter.java | 5 +++++ .../sun/tools/doclets/formats/html/markup/RawHtml.java | 7 ++++++- .../doclets/formats/html/markup/StringContent.java | 7 ++++++- .../tools/doclets/internal/toolkit/AbstractDoclet.java | 7 ++++--- .../toolkit/AnnotationTypeOptionalMemberWriter.java | 9 +++++---- .../toolkit/AnnotationTypeRequiredMemberWriter.java | 10 ++++++---- .../doclets/internal/toolkit/AnnotationTypeWriter.java | 9 +++++---- .../tools/doclets/internal/toolkit/ClassWriter.java | 9 +++++---- .../tools/doclets/internal/toolkit/Configuration.java | 7 ++++--- .../internal/toolkit/ConstantsSummaryWriter.java | 7 ++++--- .../doclets/internal/toolkit/ConstructorWriter.java | 9 +++++---- .../sun/tools/doclets/internal/toolkit/Content.java | 7 ++++++- .../doclets/internal/toolkit/EnumConstantWriter.java | 7 ++++--- .../tools/doclets/internal/toolkit/FieldWriter.java | 9 +++++---- .../doclets/internal/toolkit/MemberSummaryWriter.java | 9 +++++---- .../tools/doclets/internal/toolkit/MethodWriter.java | 9 +++++---- .../doclets/internal/toolkit/NestedClassWriter.java | 9 +++++---- .../doclets/internal/toolkit/PackageSummaryWriter.java | 7 ++++--- .../doclets/internal/toolkit/SerializedFormWriter.java | 9 +++++---- .../tools/doclets/internal/toolkit/WriterFactory.java | 7 ++++--- .../internal/toolkit/builders/AbstractBuilder.java | 7 ++++--- .../toolkit/builders/AbstractMemberBuilder.java | 7 ++++--- .../toolkit/builders/AnnotationTypeBuilder.java | 7 ++++--- .../builders/AnnotationTypeOptionalMemberBuilder.java | 7 ++++--- .../builders/AnnotationTypeRequiredMemberBuilder.java | 7 ++++--- .../internal/toolkit/builders/BuilderFactory.java | 7 ++++--- .../internal/toolkit/builders/ClassBuilder.java | 7 ++++--- .../toolkit/builders/ConstantsSummaryBuilder.java | 7 ++++--- .../internal/toolkit/builders/ConstructorBuilder.java | 7 ++++--- .../internal/toolkit/builders/EnumConstantBuilder.java | 7 ++++--- .../internal/toolkit/builders/FieldBuilder.java | 7 ++++--- .../internal/toolkit/builders/LayoutParser.java | 5 +++++ .../toolkit/builders/MemberSummaryBuilder.java | 7 ++++--- .../internal/toolkit/builders/MethodBuilder.java | 7 ++++--- .../toolkit/builders/PackageSummaryBuilder.java | 7 ++++--- .../toolkit/builders/SerializedFormBuilder.java | 7 ++++--- .../doclets/internal/toolkit/builders/XMLNode.java | 7 ++++++- .../toolkit/taglets/BaseExecutableMemberTaglet.java | 9 +++++---- .../internal/toolkit/taglets/BaseInlineTaglet.java | 9 +++++---- .../doclets/internal/toolkit/taglets/BaseTaglet.java | 7 ++++--- .../doclets/internal/toolkit/taglets/CodeTaglet.java | 7 ++++++- .../internal/toolkit/taglets/DeprecatedTaglet.java | 9 +++++---- .../internal/toolkit/taglets/DocRootTaglet.java | 9 +++++---- .../internal/toolkit/taglets/InheritDocTaglet.java | 9 +++++---- .../internal/toolkit/taglets/InheritableTaglet.java | 7 ++++++- .../doclets/internal/toolkit/taglets/LegacyTaglet.java | 9 +++++---- .../internal/toolkit/taglets/LiteralTaglet.java | 7 ++++++- .../doclets/internal/toolkit/taglets/ParamTaglet.java | 7 ++++--- .../doclets/internal/toolkit/taglets/ReturnTaglet.java | 7 ++++--- .../doclets/internal/toolkit/taglets/SeeTaglet.java | 7 ++++--- .../doclets/internal/toolkit/taglets/SimpleTaglet.java | 9 +++++---- .../internal/toolkit/taglets/TagletManager.java | 7 ++++--- .../doclets/internal/toolkit/taglets/TagletOutput.java | 7 ++++++- .../doclets/internal/toolkit/taglets/TagletWriter.java | 5 +++++ .../doclets/internal/toolkit/taglets/ThrowsTaglet.java | 7 ++++--- .../doclets/internal/toolkit/taglets/ValueTaglet.java | 7 ++++--- .../doclets/internal/toolkit/util/ClassDocCatalog.java | 7 ++++--- .../tools/doclets/internal/toolkit/util/ClassTree.java | 7 ++++--- .../doclets/internal/toolkit/util/ClassUseMapper.java | 7 ++++--- .../internal/toolkit/util/CommentedMethodFinder.java | 9 +++++---- .../toolkit/util/DeprecatedAPIListBuilder.java | 5 +++++ .../tools/doclets/internal/toolkit/util/DocFinder.java | 5 +++++ .../internal/toolkit/util/DocletAbortException.java | 8 +++++++- .../doclets/internal/toolkit/util/DocletConstants.java | 9 +++++---- .../tools/doclets/internal/toolkit/util/Extern.java | 7 ++++--- .../sun/tools/doclets/internal/toolkit/util/Group.java | 7 ++++--- .../internal/toolkit/util/ImplementedMethods.java | 7 ++++--- .../doclets/internal/toolkit/util/IndexBuilder.java | 7 ++++--- .../internal/toolkit/util/MessageRetriever.java | 7 ++++--- .../doclets/internal/toolkit/util/MetaKeywords.java | 7 ++++--- .../doclets/internal/toolkit/util/MethodFinder.java | 9 +++++---- .../internal/toolkit/util/PackageListWriter.java | 7 ++++--- .../internal/toolkit/util/TaggedMethodFinder.java | 9 +++++---- .../tools/doclets/internal/toolkit/util/TextTag.java | 9 +++++---- .../sun/tools/doclets/internal/toolkit/util/Util.java | 9 +++++---- .../internal/toolkit/util/VisibleMemberMap.java | 7 ++++--- .../internal/toolkit/util/links/LinkFactory.java | 7 ++++++- .../doclets/internal/toolkit/util/links/LinkInfo.java | 7 ++++++- .../internal/toolkit/util/links/LinkOutput.java | 7 ++++++- .../com/sun/tools/javadoc/AbstractTypeImpl.java | 5 +++++ .../com/sun/tools/javadoc/AnnotationDescImpl.java | 5 +++++ .../com/sun/tools/javadoc/AnnotationTypeDocImpl.java | 5 +++++ .../tools/javadoc/AnnotationTypeElementDocImpl.java | 5 +++++ .../com/sun/tools/javadoc/AnnotationValueImpl.java | 5 +++++ .../classes/com/sun/tools/javadoc/ClassDocImpl.java | 5 +++++ .../share/classes/com/sun/tools/javadoc/Comment.java | 5 +++++ .../com/sun/tools/javadoc/ConstructorDocImpl.java | 7 ++++++- .../share/classes/com/sun/tools/javadoc/DocEnv.java | 7 ++++++- .../share/classes/com/sun/tools/javadoc/DocImpl.java | 5 +++++ .../share/classes/com/sun/tools/javadoc/DocLocale.java | 5 +++++ .../classes/com/sun/tools/javadoc/DocletInvoker.java | 6 ++++++ .../com/sun/tools/javadoc/ExecutableMemberDocImpl.java | 7 ++++++- .../classes/com/sun/tools/javadoc/FieldDocImpl.java | 5 +++++ .../com/sun/tools/javadoc/JavadocClassReader.java | 8 +++++++- .../classes/com/sun/tools/javadoc/JavadocEnter.java | 6 ++++++ .../com/sun/tools/javadoc/JavadocMemberEnter.java | 6 ++++++ .../classes/com/sun/tools/javadoc/JavadocTodo.java | 8 +++++++- .../classes/com/sun/tools/javadoc/JavadocTool.java | 6 ++++++ .../src/share/classes/com/sun/tools/javadoc/Main.java | 7 ++++++- .../classes/com/sun/tools/javadoc/MemberDocImpl.java | 7 ++++++- .../share/classes/com/sun/tools/javadoc/Messager.java | 5 +++++ .../classes/com/sun/tools/javadoc/MethodDocImpl.java | 5 +++++ .../classes/com/sun/tools/javadoc/ModifierFilter.java | 6 ++++++ .../classes/com/sun/tools/javadoc/PackageDocImpl.java | 5 +++++ .../classes/com/sun/tools/javadoc/ParamTagImpl.java | 5 +++++ .../classes/com/sun/tools/javadoc/ParameterImpl.java | 5 +++++ .../com/sun/tools/javadoc/ParameterizedTypeImpl.java | 7 ++++++- .../classes/com/sun/tools/javadoc/PrimitiveType.java | 6 ++++++ .../com/sun/tools/javadoc/ProgramElementDocImpl.java | 5 +++++ .../classes/com/sun/tools/javadoc/RootDocImpl.java | 9 +++++++-- .../classes/com/sun/tools/javadoc/SeeTagImpl.java | 5 +++++ .../com/sun/tools/javadoc/SerialFieldTagImpl.java | 7 ++++++- .../classes/com/sun/tools/javadoc/SerializedForm.java | 5 +++++ .../com/sun/tools/javadoc/SourcePositionImpl.java | 7 ++++++- .../src/share/classes/com/sun/tools/javadoc/Start.java | 5 +++++ .../share/classes/com/sun/tools/javadoc/TagImpl.java | 7 ++++++- .../classes/com/sun/tools/javadoc/ThrowsTagImpl.java | 5 +++++ .../share/classes/com/sun/tools/javadoc/TypeMaker.java | 7 ++++++- .../com/sun/tools/javadoc/TypeVariableImpl.java | 5 +++++ .../com/sun/tools/javadoc/WildcardTypeImpl.java | 5 +++++ 171 files changed, 875 insertions(+), 259 deletions(-) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java index f3abcb42057..84a7e68f86e 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java @@ -33,6 +33,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Print method and constructor info. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert Field * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) 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 343df3f345a..2e902b39e77 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 @@ -39,6 +39,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * {@link SplitIndexWriter}. It uses the functionality from * {@link HtmlDocletWriter} to generate the Index Contents. * + *

This is NOT part of any supported API. + * 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 IndexBuilder * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) 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 d3ba24cb79f..63593ace810 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 @@ -37,6 +37,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * The base class for member writers. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert Field * @author Atul M Dambalkar * @author Jamie Ho (Re-write) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java index ef407dfb206..9667b0f1477 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.*; * Frame and Non-Frame format. This will be sub-classed by to * generate overview-frame.html as well as overview-summary.html. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java index a4b1497b0f2..ccf82cf6be9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java @@ -39,6 +39,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * generate the Package Tree and global Tree(for all the classes and packages) * pages. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar */ public abstract class AbstractTreeWriter extends HtmlDocletWriter { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java index 202b8a2c95f..adef39e1415 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java @@ -39,6 +39,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * the left-hand top frame. The name of the generated file is * "allclasses-frame.html". * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar * @author Doug Kramer * @author Bhavesh Patel (Modified) 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 77f23279071..66c51aa2696 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.tools.doclets.internal.toolkit.*; /** * Writes annotation type optional member documentation in HTML format. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @author Bhavesh Patel (Modified) */ 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 f2418e5143d..baa725d1809 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.tools.doclets.internal.toolkit.*; /** * Writes annotation type required member documentation in HTML format. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @author Bhavesh Patel (Modified) */ 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 1b1d1039d88..13ab2260364 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 @@ -33,6 +33,12 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the Class Information Page. + * + *

This is NOT part of any supported API. + * 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 com.sun.javadoc.ClassDoc * @see java.util.Collections * @see java.util.List diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java index 0c4f9304688..69edcde9796 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate class usage information. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert G. Field * @author Bhavesh Patel (Modified) */ 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 e74a272798a..f334b17a18b 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 @@ -36,6 +36,12 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the Class Information Page. + * + *

This is NOT part of any supported API. + * 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 com.sun.javadoc.ClassDoc * @see java.util.Collections * @see java.util.List diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java index 977cab001c8..67e484a4bf4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Write the Constants Summary Page in HTML format. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @author Bhavesh Patel (Modified) * @since 1.4 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 6db2b0d23c3..22a52a41409 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes constructor documentation. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert Field * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java index cf1b990bf32..5d852171964 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * Generate File to list all the deprecated classes and class members with the * appropriate links. * + *

This is NOT part of any supported API. + * 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 java.util.List * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) 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 f567aae7ae1..7e1a977ddb9 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes enum constant documentation in HTML format. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @author Bhavesh Patel (Modified) */ 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 ed442aaf731..3f00063060d 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes field documentation in HTML format. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert Field * @author Atul M Dambalkar * @author Jamie Ho (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java index 6a02d6015c2..76a661654e4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java @@ -41,6 +41,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * right-hand frame will have overview or package summary or class file. Also * take care of browsers which do not support Html frames. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar */ public class FrameOutputWriter extends HtmlDocletWriter { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java index 6e8c5d42bde..bfd3c4df928 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * Generate the Help File for the generated API documentation. The help file * contents are helpful for browsing the generated documentation. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar */ public class HelpWriter extends HtmlDocletWriter { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java index e445d4a7e9f..ef5bb2477de 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * The class with "start" method, calls individual Writers. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar * @author Robert Field * @author Jamie Ho 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 76ec0dd9ebf..aa6d77bcdcd 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 @@ -40,6 +40,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * This Class contains methods related to the Html Code Generation which * are used extensively while generating the entire documentation. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Atul M Dambalkar * @author Robert Field 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 4f3396a3501..127574467da 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 @@ -37,6 +37,11 @@ import com.sun.tools.doclets.internal.toolkit.taglets.*; * Documentation denoted by the tags serial and * serialField is processed. * + *

This is NOT part of any supported API. + * 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. + * * @author Joe Fialli * @author Bhavesh Patel (Modified) */ 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 57169964021..c267cd8d46b 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 @@ -34,6 +34,11 @@ import com.sun.tools.doclets.internal.toolkit.taglets.*; * Generate serialized form for Serializable/Externalizable methods. * Documentation denoted by the serialData tag is processed. * + *

This is NOT part of any supported API. + * 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. + * * @author Joe Fialli * @author Bhavesh Patel (Modified) */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java index e7574954594..9aef86ecc16 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java @@ -33,6 +33,11 @@ import com.sun.tools.doclets.internal.toolkit.util.links.*; /** * A factory that returns a link given the information about it. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java index c9a176c1262..ef5f38f5735 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,12 @@ import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.util.links.*; +/** + *

This is NOT part of any supported API. + * 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 LinkInfoImpl extends LinkInfo { /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java index 788fd685773..76911fd612e 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ import com.sun.tools.doclets.internal.toolkit.util.links.*; /** * Stores output of a link. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 */ 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 87591558482..467859d740b 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes method documentation in HTML format. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert Field * @author Atul M Dambalkar * @author Jamie Ho (rewrite) 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 dda91ced7d6..ec9a50f52fa 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes nested class documentation in HTML format. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert Field * @author Atul M Dambalkar * @author Jamie Ho (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java index 8434106b3e7..6c9f3770b00 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java @@ -38,6 +38,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * frame. This will list all the Class Kinds in the package. A click on any * class-kind will update the right-hand frame with the clicked class-kind page. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java index 7e33931f02e..2928983b61d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java @@ -37,6 +37,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * A click on the package name in this frame will update the page in the bottom * left hand frame with the listing of contents of the clicked package. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar */ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java index 5e2c9aa0bf7..b1400f4bdd1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java @@ -38,6 +38,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * frame. A click on the package name on this page will update the same frame * with the "pacakge-summary.html" file for the clicked package. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ 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 04c036aa181..5895015f210 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 @@ -36,6 +36,11 @@ 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. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java index 19d7a57ede8..1bf61a55ca8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate package usage information. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert G. Field * @author Bhavesh Patel (Modified) */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java index 560f23b89bb..86f104289d4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java @@ -38,6 +38,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * frame. This will list all the Class Kinds in the package. A click on any * class-kind will update the frame with the clicked class-kind page. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java index ed50a15f0f3..f6dc9a068a4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java @@ -34,6 +34,11 @@ import com.sun.tools.doclets.internal.toolkit.util.DocletAbortException; /** * Generate the Serialized Form Information Page. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar */ public class SerializedFormWriterImpl extends SubWriterHolderWriter diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java index a40e2a21893..a0ce80f928b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * Unicode Order. The name of the generated file is "index-all.html" and it is * generated in current or the destination directory. * + *

This is NOT part of any supported API. + * 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 java.lang.Character * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java index 5fd7f887683..c560bb8711c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,9 +35,10 @@ import com.sun.tools.doclets.formats.html.markup.*; /** * Converts Java Source Code to HTML. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java index ae04857f065..e6249f29ddb 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * Unicode Order. This will create "index-files" directory in the current or * destination directory and will generate separate file for each unicode index. * + *

This is NOT part of any supported API. + * 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 java.lang.Character * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java index 37218e8c471..9e27d772ece 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java @@ -40,6 +40,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * can not be used effectively to change formatting. The concrete * class subclass of this class can be subclassed to change formatting. * + *

This is NOT part of any supported API. + * 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 AbstractMemberWriter * @see ClassWriterImpl * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletOutputImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletOutputImpl.java index 9fb3bcdade1..c83fc900ff3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletOutputImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletOutputImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ import com.sun.tools.doclets.internal.toolkit.taglets.*; /** * The output for HTML taglets. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.5 * @author Jamie Ho */ 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 f0b49781e42..d9e104497f1 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * The taglet writer that writes HTML. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.5 * @author Jamie Ho * @author Bhavesh Patel (Modified) 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 09ae7d14494..7dab45c6cb0 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 @@ -38,6 +38,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * the generated file is "overview-tree.html" and it is generated in the * current or the destination directory. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java index f5ed2f1aee8..573abe0462f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java @@ -32,6 +32,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * The factory that returns HTML writers. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java index 86fea133c2b..82a2b87822a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating a comment for HTML pages of javadoc output. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public class Comment extends Content{ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java index 03265d29e6f..5449d4eefbd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating document type for HTML pages of javadoc output. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public class DocType extends Content{ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java index 96895531dd6..62b0f600283 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,11 @@ package com.sun.tools.doclets.formats.html.markup; /** * Enum representing HTML tag attributes. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public enum HtmlAttr { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java index c85927e0b67..8b4b400c819 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ import com.sun.tools.doclets.internal.toolkit.Content; /** * Stores constants for Html Doclet. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public class HtmlConstants { 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 979c72b9211..9870e26e8fe 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,11 @@ import com.sun.tools.doclets.internal.toolkit.*; * are used by the Sub-Classes in the package com.sun.tools.doclets.standard * and com.sun.tools.doclets.oneone. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Atul M Dambalkar * @author Robert Field diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java index 458c174ba46..628eab2365d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating an HTML document for javadoc output. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public class HtmlDocument extends Content { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java index 8d53c464e8d..61bb800cbef 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,11 @@ package com.sun.tools.doclets.formats.html.markup; /** * Enum representing HTML styles. The name map to values in the CSS file. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public enum HtmlStyle { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java index 6a58bb0b3d8..a4ee63d772b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,11 @@ package com.sun.tools.doclets.formats.html.markup; /** * Enum representing HTML tags. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public enum HtmlTag { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java index 2225fcd0eaa..ab78c869206 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java @@ -32,6 +32,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating HTML tree for javadoc output. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public class HtmlTree extends Content { 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 e30050cec6a..c84411f21d6 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 @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * Initilizes PrintWriter with FileWriter, to enable print * related methods to generate the code to the named File through FileWriter. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java index 56c23965534..af4bf4ae8a9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating raw HTML content to be added to HTML pages of javadoc output. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public class RawHtml extends Content{ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java index 2bf4437fb31..338f7f2a645 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating string content for HTML tags of javadoc output. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public class StringContent extends Content{ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java index 9c6f0a09926..7f38f38564c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java @@ -34,9 +34,10 @@ import java.util.StringTokenizer; /** * An abstract implementation of a Doclet. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API. + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java index 64f4b34e10b..18ada19f80b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * The interface for writing annotation type optional member output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java index fb83c2a5688..28a18f9eaad 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,11 @@ import com.sun.javadoc.*; /** * The interface for writing annotation type required member output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. + * * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java index 9ef63b50258..0781742bef8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * The interface for writing annotation type output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API. + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java index c5bfb13e41b..f75f7d3fea4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * The interface for writing class output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java index 4fc735fd854..807edc2fc59 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java @@ -39,9 +39,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * all user options which are supported by the 1.1 doclet and the standard * doclet. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Robert Field. * @author Atul Dambalkar. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java index c39149b7819..b109a2b2230 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java @@ -33,9 +33,10 @@ import com.sun.javadoc.*; /** * The interface for writing constants summary output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java index 8ad48246377..f784b4ae4ec 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,10 @@ import com.sun.javadoc.*; /** * The interface for writing constructor output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java index a7bdf96e0f0..7996f6cd422 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * A class to create content for javadoc output pages. * + *

This is NOT part of any supported API. + * 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. + * * @author Bhavesh Patel */ public abstract class Content { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java index 6c345b55ecd..987c52f07ad 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java @@ -31,9 +31,10 @@ import com.sun.javadoc.*; /** * The interface for writing enum constant output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java index c17ac269b32..554f1999e27 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,10 @@ import com.sun.javadoc.*; /** * The interface for writing field output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java index 76baf59a1cd..53e0b5b260f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * The interface for writing member summary output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java index 1864bf94364..ce4b90e1956 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,10 @@ import com.sun.javadoc.*; /** * The interface for writing method output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java index a5a023a3f8e..4aea9097955 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import java.io.*; /** * The interface for writing class output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) 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 4df63fc59fe..ea4ad44b3c2 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 @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * The interface for writing package summary output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) 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 84454acdf24..aa4d895b2cb 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * The interface for writing serialized form output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java index 62724243c97..6c2fb5bd0f9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java @@ -31,9 +31,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * The interface for a factory creates writers. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java index da4267ff322..ef7b0d99ee3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java @@ -42,9 +42,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * do is implement the ConstantsSummaryWriter interface and pass it to the * builder using a WriterFactory. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java index a73aed83066..b7454d96879 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java @@ -33,9 +33,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * within Class Builders. They essentially build sub-components. For example, * method documentation is a sub-component of class documentation. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java index 6cdbc82f99a..e2582c48268 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java @@ -35,9 +35,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the summary for a given annotation type. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java index e1295055410..edcfbe2094f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for optional annotation type members. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java index b910a186f01..733eac39aa7 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for required annotation type members. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java index 189749ebdd3..71fb5a36b1b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java @@ -32,9 +32,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * The factory for constructing builders. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java index 96f0b2ecaf3..b19cd75ac49 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java @@ -35,9 +35,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the summary for a given class. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java index c5dcefea781..6de9f78920f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java @@ -35,9 +35,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the Constants Summary Page. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java index 7f5d43de290..20f93081562 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a constructor. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java index 4e016693771..36f5d397441 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a enum constants. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java index d66672d239a..4f05027f672 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a field. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java index 23717ae471f..f6e2f339dda 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java @@ -39,6 +39,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * Parse the XML that specified the order of operation for the builders. This * Parser uses SAX parsing. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 * @see SAXParser diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java index 494c717999f..2d81a4caefd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the member summary. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java index 00e68d78f23..ed933351fe1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a method. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) 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 e121de85272..b6dcab6c97c 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 @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the summary for a given package. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) 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 ce12de87c7e..66e8478d940 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 @@ -35,9 +35,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the serialized form. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/XMLNode.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/XMLNode.java index 4b414dadd52..ae335b99cd9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/XMLNode.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/XMLNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,11 @@ import java.util.Map; /** * Simple class to represent the attribute and elements of an XML node. + * + *

This is NOT part of any supported API. + * 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 XMLNode { XMLNode(XMLNode parent, String qname) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseExecutableMemberTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseExecutableMemberTaglet.java index a3b53f32aa4..ce15461cc99 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseExecutableMemberTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseExecutableMemberTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,9 +29,10 @@ package com.sun.tools.doclets.internal.toolkit.taglets; * An abstract class for that implements the {@link Taglet} interface * for tags in ExecutableMembers. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API. + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseInlineTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseInlineTaglet.java index 2dff8417c3c..24383b8a0c2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseInlineTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseInlineTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,9 +28,10 @@ package com.sun.tools.doclets.internal.toolkit.taglets; /** * An abstract inline taglet that outputs HTML. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java index bef8ba4efbe..e83ac8303a1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * An abstract class for that implements the {@link Taglet} interface. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/CodeTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/CodeTaglet.java index 444771be25c..4fec56505d8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/CodeTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/CodeTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,6 +40,11 @@ import com.sun.tools.doclets.Taglet; * displays as: *

The type {@code List

}

* + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DeprecatedTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DeprecatedTaglet.java index b2035b31890..fc7fc2451b0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DeprecatedTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DeprecatedTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * A taglet that represents the @deprecated tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DocRootTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DocRootTaglet.java index f895b676683..8998f26121f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DocRootTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DocRootTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; * used to get the relative path to the document's root output * directory. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @author Doug Kramer diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritDocTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritDocTaglet.java index 554756b5633..e737f9c7698 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritDocTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritDocTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,9 +33,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * be used with a method. It is used to inherit documentation from overriden * and implemented methods. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritableTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritableTaglet.java index 20a265d208f..89518e8f002 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritableTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritableTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import com.sun.tools.doclets.internal.toolkit.util.DocFinder; * A taglet should implement this interface if it supports the inheritDoc * tag or is automatically inherited if it is missing. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LegacyTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LegacyTaglet.java index b8cfa6fcaec..2955406575c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LegacyTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LegacyTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,9 +36,10 @@ import com.sun.javadoc.*; * This taglet is able to wrap most most legacy taglets because * the standard doclet is the only known doclet to use legacy taglets. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @since 1.5 * @author Jamie Ho diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LiteralTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LiteralTaglet.java index 7a465e33bf0..84254f64d1c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LiteralTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LiteralTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,11 @@ import com.sun.tools.doclets.Taglet; * displays as: *

{@literal ac}
* + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java index fd2ff77b9f8..ad4bf8bebdb 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java @@ -33,9 +33,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * A taglet that represents the @param tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java index fc7163571a5..9d98a9691b7 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java @@ -31,9 +31,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * A taglet that represents the @return tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java index 0a357b736e9..4e3e8107c05 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java @@ -31,9 +31,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * A taglet that represents the @see tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java index 3051503ba45..4b21cbd4172 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * A simple single argument custom tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java index 25345fc700b..739a4118ffe 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java @@ -36,9 +36,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Manages theTaglets used by doclets. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletOutput.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletOutput.java index e0dabc2b0c4..c7bbef457c1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletOutput.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletOutput.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ package com.sun.tools.doclets.internal.toolkit.taglets; * different doclets work with different formats of output. A single taglet can * work with any doclet that provides an implementation of taglet output. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java index 13195d7f593..2e594db8e77 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java @@ -32,6 +32,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * The interface for the taglet writer. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.5 * @author Jamie Ho */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java index ea57f004925..7b8b365b165 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java @@ -33,9 +33,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * A taglet that represents the @throws tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java index 4d59a09b2b9..90794bff625 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java @@ -40,9 +40,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * is retrieved for the field that the inline tag appears on. The name is specifed * in the following format: [fully qualified class name]#[constant field name]. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java index b25e91164aa..9e83edffc0b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java @@ -36,9 +36,10 @@ import com.sun.tools.doclets.internal.toolkit.Configuration; * those classes so that we can retrieve all of the classes from a particular * package later. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java index 7cfbf51585f..39f9adf765f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.*; * Build Class Hierarchy for all the Classes. This class builds the Class * Tree and the Interface Tree separately. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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 java.util.HashMap * @see java.util.List diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java index a306b53b218..a7eb4f660f6 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * Map all class uses for a given class. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @since 1.2 * @author Robert G. Field diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/CommentedMethodFinder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/CommentedMethodFinder.java index d74c08ee742..5c8821450fd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/CommentedMethodFinder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/CommentedMethodFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * Find a commented method. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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 CommentedMethodFinder extends MethodFinder { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java index d4f144706b3..8f8a096e019 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java @@ -33,6 +33,11 @@ import com.sun.tools.doclets.internal.toolkit.Configuration; /** * Build list of all the deprecated packages, classes, constructors, fields and methods. * + *

This is NOT part of any supported API. + * 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. + * * @author Atul M Dambalkar */ public class DeprecatedAPIListBuilder { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java index c65bd340609..a0e4015d045 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java @@ -33,6 +33,11 @@ import com.sun.tools.doclets.internal.toolkit.taglets.*; /** * Search for the requested documentation. Inherit documentation if necessary. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java index c93d5bc1093..6261caec4ed 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,12 @@ package com.sun.tools.doclets.internal.toolkit.util; +/** + *

This is NOT part of any supported API. + * 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 DocletAbortException extends RuntimeException { private static final long serialVersionUID = -9131058909576418984L; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java index f962080e4d5..8f0fd4c446e 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,9 +29,10 @@ package com.sun.tools.doclets.internal.toolkit.util; * Stores all constants for a Doclet. Extend this class if you have doclet * specific constants to add. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java index 6a6537f7295..b97b33abb6c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java @@ -40,9 +40,10 @@ import com.sun.tools.doclets.internal.toolkit.*; * documented) file in the current or the destination directory, while * generating the documentation. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Atul M Dambalkar * @author Robert Field diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java index 447bcd84b5b..be5284e91da 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java @@ -49,9 +49,10 @@ import com.sun.tools.doclets.internal.toolkit.*; * will put the package java.lang in the group "Lang" and not in group "Core". *

* - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Atul M Dambalkar */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java index be9f4959faa..c2bfc1359e6 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.Configuration; * For a given class method, build an array of interface methods which it * implements. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Atul M Dambalkar */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java index 50fab1caee8..e6958217be0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java @@ -36,9 +36,10 @@ import com.sun.tools.doclets.internal.toolkit.*; * Unicode characters which start a member name. Member name is * classkind or field or method or constructor name. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @since 1.2 * @see java.lang.Character diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java index 8a527bbe878..d761cfebc69 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.Configuration; /** * Retrieve and format messages stored in a resource. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @since 1.2 * @author Atul M Dambalkar diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java index f18dd5ae6b8..2f814252c2b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java @@ -36,9 +36,10 @@ import com.sun.tools.doclets.internal.toolkit.*; * of class pages. These keywords improve search results * on browsers that look for keywords. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Doug Kramer */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodFinder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodFinder.java index a19e8c1ce1d..68e082701a1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodFinder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,9 +33,10 @@ import com.sun.javadoc.*; * superclasses and interfaces(subsequently super-interfaces also) * recursively. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API. + *

This is NOT part of any supported API. + * 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 abstract class MethodFinder { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java index 3884f7422ff..4586deea9ce 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.*; /** * Write out the package index. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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 com.sun.javadoc.PackageDoc * @author Atul M Dambalkar diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TaggedMethodFinder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TaggedMethodFinder.java index e4c7fbc3b3d..2854b493f1a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TaggedMethodFinder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TaggedMethodFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * Find a tagged method. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Atul M Dambalkar */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TextTag.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TextTag.java index a9e2aa0f0ac..074718f7979 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TextTag.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TextTag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; * A tag that holds nothing but plain text. This is useful for passing * text to methods that only accept inline tags as a parameter. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java index 25b8db94733..7c18e29e047 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,9 +34,10 @@ import com.sun.tools.doclets.internal.toolkit.*; /** * Utilities Class for Doclets. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Atul M Dambalkar * @author Jamie Ho diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java index 27d341b7118..e8004c1af72 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java @@ -37,9 +37,10 @@ import com.sun.tools.doclets.internal.toolkit.*; * or method) and the leaf of the class tree. The data structure will map * all visible members in the leaf and classes above the leaf in the tree. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * 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. * * @author Atul M Dambalkar * @author Jamie Ho (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java index 37855ae2181..e9539a44e15 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ import com.sun.javadoc.*; /** * A factory that constructs links from given link information. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkInfo.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkInfo.java index 4e3517d91f2..53acdd5e5ee 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkInfo.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import com.sun.tools.doclets.internal.toolkit.Configuration; /** * Encapsulates information about a link. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java index 156a0094a9c..cb58ae4667a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,11 @@ package com.sun.tools.doclets.internal.toolkit.util.links; /** * Stores output of a link. * + *

This is NOT part of any supported API. + * 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. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java index 85cfa8f79a3..e589bfa8678 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java @@ -35,6 +35,11 @@ import com.sun.tools.javac.code.Type; * defaults for the methods in Type (and a couple from * ProgramElementDoc). * + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java index 17982b03915..7cfbf52425e 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java @@ -39,6 +39,11 @@ import com.sun.tools.javac.util.Pair; * Sure it ought to be called "Annotation", but that clashes with * java.lang.annotation.Annotation. * + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java index d4839a9c8a8..35ce0dbae60 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java @@ -38,6 +38,11 @@ import com.sun.tools.javac.util.Position; /** * Represents an annotation type. * + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java index b040aec2b19..4c3fad63f42 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java @@ -34,6 +34,11 @@ import com.sun.tools.javac.util.Position; /** * Represents an element of an annotation type. * + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java index 98292b57326..6a8818c47a1 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java @@ -35,6 +35,11 @@ import com.sun.tools.javac.code.TypeTags; /** * Represents a value of an annotation type element. * + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java index 38e9392c7c9..efaf4a49793 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java @@ -74,6 +74,11 @@ import static com.sun.tools.javac.tree.JCTree.Tag.*; * referred to using Type (which can be converted to ClassDocImpl, * if possible). * + *

This is NOT part of any supported API. + * 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 Type * * @since 1.2 diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java b/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java index 2c27e8b450a..59236f3ed6c 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java @@ -33,6 +33,11 @@ import com.sun.tools.javac.util.ListBuffer; * It allows users to get first sentence of this comment, get * comment for different tags... * + *

This is NOT part of any supported API. + * 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. + * * @author Kaiyang Liu (original) * @author Robert Field (rewrite) * @author Atul M Dambalkar diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java index 980bd8b38d7..e1f4678c713 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,11 @@ import com.sun.tools.javac.util.Position; /** * Represents a constructor of a java class. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Robert Field * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java index 5887c50d6c2..5cd43067526 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,6 +46,11 @@ import com.sun.tools.javac.util.Position; * run and not the compiler info that could be GC'ed * or ported. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.4 * @author Robert Field * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java index 386c238ea72..f263123c2a5 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java @@ -43,6 +43,11 @@ import com.sun.tools.javac.util.Position; * comments and have been processed by this run of javadoc. All Doc items * are unique, that is, they are == comparable. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Robert Field * @author Atul M Dambalkar diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java index 1e234576186..0f8ba32f0be 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java @@ -32,6 +32,11 @@ import java.util.Locale; /** * This class holds the information about locales. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.4 * @author Robert Field */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java index 9ceadf2ab0c..308b903c446 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java @@ -39,6 +39,12 @@ import static com.sun.javadoc.LanguageVersion.*; /** * Class creates, controls and invokes doclets. + * + *

This is NOT part of any supported API. + * 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. + * * @author Neal Gafter (rewrite) */ public class DocletInvoker { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java index e024cc01422..600eeb2ee13 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,6 +41,11 @@ import com.sun.tools.javac.util.Position; /** * Represents a method or constructor of a java class. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Robert Field * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java index e74b4c5fbae..c76dd7a87d6 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java @@ -41,6 +41,11 @@ import com.sun.tools.javac.util.Position; /** * Represents a field in a java class. * + *

This is NOT part of any supported API. + * 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 MemberDocImpl * * @since 1.2 diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java index 67fa61d2315..df5272560d6 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,12 @@ import com.sun.tools.javac.jvm.ClassReader; import com.sun.tools.javac.util.Context; /** Javadoc uses an extended class reader that records package.html entries + * + *

This is NOT part of any supported API. + * 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. + * * @author Neal Gafter */ public class JavadocClassReader extends ClassReader { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java index e16cfcc67c6..d914eefc855 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java @@ -39,6 +39,12 @@ import com.sun.tools.javac.util.List; /** * Javadoc's own enter phase does a few things above and beyond that * done by javac. + * + *

This is NOT part of any supported API. + * 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. + * * @author Neal Gafter */ public class JavadocEnter extends Enter { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java index 4e1d31f2124..e29ae005402 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java @@ -37,6 +37,12 @@ import com.sun.tools.javac.util.Position; /** * Javadoc's own memberEnter phase does a few things above and beyond that * done by javac. + * + *

This is NOT part of any supported API. + * 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. + * * @author Neal Gafter */ public class JavadocMemberEnter extends MemberEnter { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java index 6d69172cbac..cbeaf699376 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,12 @@ import com.sun.tools.javac.util.*; /** * Javadoc's own todo queue doesn't queue its inputs, as javadoc * doesn't perform attribution of method bodies or semantic checking. + * + *

This is NOT part of any supported API. + * 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. + * * @author Neal Gafter */ public class JavadocTodo extends Todo { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java index 5502ffed288..4bc1493fa33 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java @@ -54,6 +54,12 @@ import com.sun.tools.javac.util.Position; * component in a larger software system. It provides operations to * construct a new javadoc processor, and to run it on a set of source * files. + * + *

This is NOT part of any supported API. + * 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. + * * @author Neal Gafter */ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Main.java b/langtools/src/share/classes/com/sun/tools/javadoc/Main.java index 086e13d9f49..dfc21b27702 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Main.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import java.io.PrintWriter; * Provides external entry points (tool and programmatic) * for the javadoc program. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.4 */ public class Main { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/MemberDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/MemberDocImpl.java index 8dcd375db1b..88da9c0d68b 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/MemberDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/MemberDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,6 +37,11 @@ import com.sun.tools.javac.util.Position; * method, constructor and field members. Class members of a class * (nested classes) are represented instead by ClassDocImpl. * + *

This is NOT part of any supported API. + * 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 MethodDocImpl * @see FieldDocImpl * @see ClassDocImpl diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java index 4bbe8c361d3..64fa6dbeed8 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java @@ -41,6 +41,11 @@ import com.sun.tools.javac.util.Log; *
* Also provides implementation for DocErrorReporter. * + *

This is NOT part of any supported API. + * 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 java.util.ResourceBundle * @see java.text.MessageFormat * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java index c9d3baf8e4b..f90b1641cc3 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java @@ -38,6 +38,11 @@ import com.sun.tools.javac.util.Position; /** * Represents a method of a java class. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Robert Field * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java b/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java index d46a5272b9b..40a9040971c 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java @@ -32,6 +32,12 @@ import static com.sun.tools.javac.code.Flags.*; * Filtering is done by returning boolean values. * Classes, methods and fields can be filtered, or filtering * can be done directly on modifier bits. + * + *

This is NOT part of any supported API. + * 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 com.sun.tools.javac.code.Flags * @author Robert Field */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java index c94601c9ac5..9a072250eb2 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java @@ -47,6 +47,11 @@ import com.sun.tools.javac.util.Position; * about the package, the package's comment and tags, and the * classes in the package. * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Kaiyang Liu (original) * @author Robert Field (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java index d1e2f0bcad4..8033405365d 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java @@ -33,6 +33,11 @@ import com.sun.javadoc.*; * Represents an @param documentation tag. * Parses and stores the name and comment parts of the parameter tag. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert Field * */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java index 5a5fdca7e35..524a5ead01f 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java @@ -34,6 +34,11 @@ import com.sun.tools.javac.code.Symbol.VarSymbol; * ParameterImpl information. * This includes a parameter type and parameter name. * + *

This is NOT part of any supported API. + * 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. + * * @author Kaiyang Liu (original) * @author Robert Field (rewrite) * @author Scott Seligman (generics, annotations) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java index 838994f096a..1974ec10ad7 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,11 @@ import static com.sun.tools.javac.code.TypeTags.*; * Implementation of ParameterizedType, which * represents an invocation of a generic class or interface. * + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java b/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java index 7d0dd9cebfc..15679a79f46 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java @@ -27,6 +27,12 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; +/** + *

This is NOT part of any supported API. + * 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. + */ class PrimitiveType implements com.sun.javadoc.Type { private final String name; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java index 578461c130e..cdd4a44da15 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java @@ -41,6 +41,11 @@ import com.sun.tools.javac.util.Position; * This is an abstract class dealing with information common to * these elements. * + *

This is NOT part of any supported API. + * 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 MemberDocImpl * @see ClassDocImpl * diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java index 5f107fab1d3..d6eba2e8f3e 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,12 @@ import com.sun.tools.javac.util.Position; /** * This class holds the information from one run of javadoc. * Particularly the packages, classes and options specified - * by the user.. + * by the user. + * + *

This is NOT part of any supported API. + * 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. * * @since 1.2 * @author Robert Field diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java index ce343ded122..4994fe66634 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java @@ -32,6 +32,11 @@ import com.sun.tools.javac.util.*; * Represents a see also documentation tag. * The @see tag can be plain text, or reference a class or member. * + *

This is NOT part of any supported API. + * 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. + * * @author Kaiyang Liu (original) * @author Robert Field (rewrite) * @author Atul M Dambalkar diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java index c429ba7f8c1..e89866d9de9 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,6 +41,11 @@ import com.sun.javadoc.*; * This tag is only allowed in the javadoc for the special member * serialPersistentFields. * + *

This is NOT part of any supported API. + * 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. + * * @author Joe Fialli * @author Neal Gafter * diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java b/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java index 0f931ed6762..559be36a7de 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java @@ -58,6 +58,11 @@ import com.sun.tools.javac.util.Names; * b. For Externalizable, data layout is described by 2(b). * * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Joe Fialli * @author Neal Gafter (rewrite but not too proud) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java index d20b579f65e..89106de0163 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.tools.javac.util.Position; /** * A source position: filename, line number, and column number. * + *

This is NOT part of any supported API. + * 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. + * * @since J2SE1.4 * @author Neal M Gafter * @author Michael Van De Vanter (position representation changed to char offsets) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Start.java b/langtools/src/share/classes/com/sun/tools/javadoc/Start.java index 9ae8c82230f..67f5e4cc40a 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Start.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Start.java @@ -44,6 +44,11 @@ import static com.sun.tools.javac.code.Flags.*; * Main program of Javadoc. * Previously named "Main". * + *

This is NOT part of any supported API. + * 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. + * * @since 1.2 * @author Robert Field * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/TagImpl.java index 10a2764ced4..a106bb68f40 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.javadoc.*; * special processing are handled by subclasses (ParamTagImpl, SeeTagImpl, * and ThrowsTagImpl * + *

This is NOT part of any supported API. + * 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. + * * @author Robert Field * @author Atul M Dambalkar * @author Neal M Gafter diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java index a88e1fb2516..6da454fdbb8 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java @@ -33,6 +33,11 @@ import com.sun.javadoc.*; * The exception name my be the name of a type variable. * Note: @exception is a backwards compatible synonymy for @throws. * + *

This is NOT part of any supported API. + * 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. + * * @author Robert Field * @author Atul M Dambalkar * @see ExecutableMemberDocImpl#throwsTags() diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java index c09157d42b3..63ada2b9b50 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java @@ -35,7 +35,12 @@ import com.sun.tools.javac.code.Type.TypeVar; import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.TypeTags.*; - +/** + *

This is NOT part of any supported API. + * 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 TypeMaker { public static com.sun.javadoc.Type getType(DocEnv env, Type t) { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java index 121816feaa0..85f946c6bf9 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java @@ -41,6 +41,11 @@ import com.sun.tools.javac.util.Names; * Implementation of TypeVariable, which * represents a type variable. * + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java index e6d079d361e..cf458d2335c 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java @@ -36,6 +36,11 @@ import com.sun.tools.javac.util.List; * Implementation of WildcardType, which * represents a wildcard type. * + *

This is NOT part of any supported API. + * 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. + * * @author Scott Seligman * @since 1.5 */ From 9551f94d32b6ad68134b2e5fe0dc0023c622d79f Mon Sep 17 00:00:00 2001 From: Jayashree Viswanathan Date: Wed, 10 Oct 2012 18:08:19 -0700 Subject: [PATCH 044/241] 8000743: docencoding not available to stylesheet Reviewed-by: jjg --- .../doclets/internal/toolkit/util/Util.java | 8 +- .../testDocEncoding/TestDocEncoding.java | 81 +++++++++++++++++++ .../sun/javadoc/testDocEncoding/pkg/Test.java | 31 +++++++ 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java create mode 100644 langtools/test/com/sun/javadoc/testDocEncoding/pkg/Test.java diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java index 7c18e29e047..31789a5f8eb 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java @@ -367,7 +367,13 @@ public class Util { while((n = in.read(buf))>0) out.write(buf,0,n); } else { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); + BufferedWriter writer; + if (configuration.docencoding == null) { + writer = new BufferedWriter(new OutputStreamWriter(out)); + } else { + writer = new BufferedWriter(new OutputStreamWriter(out, + configuration.docencoding)); + } try { String line; while ((line = reader.readLine()) != null) { diff --git a/langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java b/langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java new file mode 100644 index 00000000000..e11976ad861 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * Portions Copyright (c) 2012 IBM Corporation + */ + +/* + * @test + * @bug 8000743 + * @summary Run tests on -docencoding to see if the value is + used for stylesheet as well. + * @author jayashree viswanathan + * @library ../lib/ + * @build JavadocTester TestDocEncoding + * @run main TestDocEncoding + */ + +public class TestDocEncoding extends JavadocTester { + + //Test information. + private static final String BUG_ID = "8000743"; + + //Javadoc arguments. + private static final String[] ARGS = new String[] { + "-d", BUG_ID, "-docencoding", "Cp930", + "-sourcepath", SRC_DIR, "pkg" + }; + + private static final String[][] TEST = NO_TEST; + + private static final String[][] NEGATED_TEST = { + {BUG_ID + FS + "stylesheet.css", + "body {" + NL + " background-color:#ffffff;"} + }; + + /** + * The entry point of the test. + * @param args the array of command line arguments. + */ + public static void main(String[] args) { + TestDocEncoding tester = new TestDocEncoding(); + run(tester, ARGS, 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/testDocEncoding/pkg/Test.java b/langtools/test/com/sun/javadoc/testDocEncoding/pkg/Test.java new file mode 100644 index 00000000000..134fda22906 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testDocEncoding/pkg/Test.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * Portions Copyright (c) 2012 IBM Corporation + */ + +package pkg; + +public class Test {} + From 8b895ea85607a3aeccdd3ddf222d271c7ee6e626 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Wed, 10 Oct 2012 18:34:46 -0700 Subject: [PATCH 045/241] 8000418: javadoc should used a standard "generated by javadoc" string Reviewed-by: bpatel --- .../formats/html/HtmlDocletWriter.java | 63 +--------- .../html/SerializedFormWriterImpl.java | 17 --- .../formats/html/markup/HtmlDocWriter.java | 16 +-- .../javadoc/VersionNumber/VersionNumber.java | 4 +- .../testGeneratedBy/TestGeneratedBy.java | 112 ++++++++++++++++++ .../javadoc/testGeneratedBy/pkg/MyClass.java | 29 +++++ 6 files changed, 149 insertions(+), 92 deletions(-) create mode 100644 langtools/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java create mode 100644 langtools/test/com/sun/javadoc/testGeneratedBy/pkg/MyClass.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 aa6d77bcdcd..90bc350280e 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 @@ -350,66 +350,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return getHyperLink(pathString(pd, "package-summary.html"), "", label, "", target); } - /** - * Print the html file header. Also print Html page title and stylesheet - * default properties. - * - * @param title String window title to go in the <TITLE> tag - * @param metakeywords Array of String keywords for META tag. Each element - * of the array is assigned to a separate META tag. - * Pass in null for no array. - * @param includeScript boolean true if printing windowtitle script. - * False for files that appear in the left-hand frames. - */ - public void printHtmlHeader(String title, String[] metakeywords, - boolean includeScript) { - println(""); - println(""); - html(); - head(); - if (! configuration.notimestamp) { - print(""); - } - if (configuration.charset.length() > 0) { - println(""); - } - if ( configuration.windowtitle.length() > 0 ) { - title += " (" + configuration.windowtitle + ")"; - } - title(title); - println(title); - titleEnd(); - println(""); - if (! configuration.notimestamp) { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - println(""); - } - if ( metakeywords != null ) { - for ( int i=0; i < metakeywords.length; i++ ) { - println(""); - } - } - println(""); - printStyleSheetProperties(); - println(""); - // Don't print windowtitle script for overview-frame, allclasses-frame - // and package-frame - if (includeScript) { - printWinTitleScript(title); - } - println(""); - headEnd(); - println(""); - body("white", includeScript); - } - /** * Generates the HTML document tree and prints it out. * @@ -426,8 +366,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { Content htmlComment = new Comment(configuration.getText("doclet.New_Page")); Content head = new HtmlTree(HtmlTag.HEAD); if (!configuration.notimestamp) { - Content headComment = new Comment("Generated by javadoc (version " + - ConfigurationImpl.BUILD_DATE + ") on " + today()); + Content headComment = new Comment(getGeneratedByString()); head.addContent(headComment); } if (configuration.charset.length() > 0) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java index f6dc9a068a4..bd6ed513076 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java @@ -54,23 +54,6 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter super(ConfigurationImpl.getInstance(), FILE_NAME); } - /** - * Writes the given header. - * - * @param header the header to write. - */ - public void writeHeader(String header) { - printHtmlHeader(header, null, true); - printTop(); - navLinks(true); - hr(); - center(); - h1(); - print(header); - h1End(); - centerEnd(); - } - /** * Get the given header. * 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 9870e26e8fe..4456c2e942d 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 @@ -29,6 +29,7 @@ import java.io.*; import java.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.ConfigurationImpl; import com.sun.tools.doclets.internal.toolkit.*; @@ -329,7 +330,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { Content htmlComment = new Comment(configuration.getText("doclet.New_Page")); Content head = new HtmlTree(HtmlTag.HEAD); if (! noTimeStamp) { - Content headComment = new Comment("Generated by javadoc on " + today()); + Content headComment = new Comment(getGeneratedByString()); head.addContent(headComment); } if (configuration.charset.length() > 0) { @@ -391,16 +392,9 @@ public abstract class HtmlDocWriter extends HtmlWriter { print("          "); } - /** - * Get the day and date information for today, depending upon user option. - * - * @return String Today. - * @see java.util.Calendar - * @see java.util.GregorianCalendar - * @see java.util.TimeZone - */ - public String today() { + protected String getGeneratedByString() { Calendar calendar = new GregorianCalendar(TimeZone.getDefault()); - return calendar.getTime().toString(); + Date today = calendar.getTime(); + return "Generated by javadoc ("+ ConfigurationImpl.BUILD_DATE + ") on " + today; } } diff --git a/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java b/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java index eadf1ca527d..e4cb0107c04 100644 --- a/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java +++ b/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -84,7 +84,7 @@ public class VersionNumber { // Test the proper DOCTYPE element is present: { - "" + DocletConstants.NL); + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + if (!atNewline) + out.write(DocletConstants.NL); + out.write("" + DocletConstants.NL); + return true; } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java index 5449d4eefbd..e923333dba2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java @@ -25,6 +25,9 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; @@ -112,7 +115,9 @@ public class DocType extends Content{ /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { - contentBuilder.append(docType); + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + out.write(docType); + return true; // guaranteed by constructor } } 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 c42586d4aaa..3b481ab815e 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 @@ -325,7 +325,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param frameset the frameset to be added to the HTML document */ public void printFramesetDocument(String title, boolean noTimeStamp, - Content frameset) { + Content frameset) throws IOException { Content htmlDocType = DocType.Frameset(); Content htmlComment = new Comment(configuration.getText("doclet.New_Page")); Content head = new HtmlTree(HtmlTag.HEAD); @@ -345,7 +345,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { head, frameset); Content htmlDocument = new HtmlDocument(htmlDocType, htmlComment, htmlTree); - print(htmlDocument.toString()); + htmlDocument.write(this, true); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java index 628eab2365d..b62fe754309 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java @@ -25,7 +25,10 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; import java.util.*; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; @@ -74,7 +77,7 @@ public class HtmlDocument extends Content { * * @param htmlContent html content to be added */ - public void addContent(Content htmlContent) { + public final void addContent(Content htmlContent) { if (htmlContent.isValid()) docContent.add(htmlContent); } @@ -101,8 +104,9 @@ public class HtmlDocument extends Content { /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { + public boolean write(Writer out, boolean atNewline) throws IOException { for (Content c : docContent) - c.write(contentBuilder); + atNewline = c.write(out, atNewline); + return atNewline; } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java index ab78c869206..99543d1fdf0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java @@ -25,7 +25,10 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; import java.util.*; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; @@ -756,35 +759,41 @@ public class HtmlTree extends Content { /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { - if (!isInline() && !endsWithNewLine(contentBuilder)) - contentBuilder.append(DocletConstants.NL); + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + if (!isInline() && !atNewline) + out.write(DocletConstants.NL); String tagString = htmlTag.toString(); - contentBuilder.append("<"); - contentBuilder.append(tagString); + out.write("<"); + out.write(tagString); Iterator iterator = attrs.keySet().iterator(); HtmlAttr key; String value = ""; while (iterator.hasNext()) { key = iterator.next(); value = attrs.get(key); - contentBuilder.append(" "); - contentBuilder.append(key.toString()); + out.write(" "); + out.write(key.toString()); if (!value.isEmpty()) { - contentBuilder.append("=\""); - contentBuilder.append(value); - contentBuilder.append("\""); + out.write("=\""); + out.write(value); + out.write("\""); } } - contentBuilder.append(">"); + out.write(">"); + boolean nl = false; for (Content c : content) - c.write(contentBuilder); + nl = c.write(out, nl); if (htmlTag.endTagRequired()) { - contentBuilder.append(""); + out.write(""); + } + if (!isInline()) { + out.write(DocletConstants.NL); + return true; + } else { + return false; } - if (!isInline()) - contentBuilder.append(DocletConstants.NL); } } 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 c84411f21d6..3d3f0e084dd 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 @@ -266,7 +266,7 @@ public class HtmlWriter extends PrintWriter { } /** - * Print the script code to be embeded before the </HEAD> tag. + * Print the script code to be embedded before the </HEAD> tag. */ protected void printWinTitleScript(String winTitle){ if(winTitle != null && winTitle.length() > 0) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java index af4bf4ae8a9..8ad3c404023 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java @@ -25,6 +25,9 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; @@ -87,7 +90,16 @@ public class RawHtml extends Content{ /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { - contentBuilder.append(rawHtmlContent); + public String toString() { + return rawHtmlContent; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + out.write(rawHtmlContent); + return rawHtmlContent.endsWith(DocletConstants.NL); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java index 338f7f2a645..adddb32f993 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java @@ -25,6 +25,9 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; @@ -98,7 +101,10 @@ public class StringContent extends Content{ /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { - contentBuilder.append(stringContent); + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + String s = stringContent.toString(); + out.write(s); + return s.endsWith(DocletConstants.NL); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java index 0781742bef8..203303a03f3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java @@ -153,7 +153,7 @@ public interface AnnotationTypeWriter { * * @param contentTree content tree that will be printed as a document */ - public void printDocument(Content contentTree); + public void printDocument(Content contentTree) throws IOException ; /** * Close the writer. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java index f75f7d3fea4..f5904b3aef3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java @@ -180,7 +180,7 @@ public interface ClassWriter { * * @param contentTree content tree that will be printed as a document */ - public void printDocument(Content contentTree); + public void printDocument(Content contentTree) throws IOException; /** * Close the writer. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java index b109a2b2230..1318a130177 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java @@ -139,6 +139,6 @@ public interface ConstantsSummaryWriter { * * @param contentTree content tree which should be printed */ - public abstract void printDocument(Content contentTree); + public abstract void printDocument(Content contentTree) throws IOException; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java index 7996f6cd422..836f7cf9e5f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java @@ -25,6 +25,10 @@ package com.sun.tools.doclets.internal.toolkit; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; + import com.sun.tools.doclets.internal.toolkit.util.*; /** @@ -44,10 +48,16 @@ public abstract class Content { * * @return string representation of the content */ + @Override public String toString() { - StringBuilder contentBuilder = new StringBuilder(); - write(contentBuilder); - return contentBuilder.toString(); + StringWriter out = new StringWriter(); + try { + write(out, true); + } catch (IOException e) { + // cannot happen from StringWriter + throw new DocletAbortException(); + } + return out.toString(); } /** @@ -65,10 +75,10 @@ public abstract class Content { public abstract void addContent(String stringContent); /** - * Writes content to a StringBuilder. + * Writes content to a writer. * */ - public abstract void write(StringBuilder contentBuilder); + public abstract boolean write(Writer writer, boolean atNewline) throws IOException ; /** * Returns true if the content is empty. 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 ea4ad44b3c2..001335168fa 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 @@ -115,7 +115,7 @@ public interface PackageSummaryWriter { * * @param contentTree the content tree that will be printed */ - public abstract void printDocument(Content contentTree); + public abstract void printDocument(Content contentTree) throws IOException; /** * Close the writer. 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 aa4d895b2cb..89add8a363a 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 @@ -151,7 +151,7 @@ public interface SerializedFormWriter { * * @param serializedTree the content tree that will be printed */ - public abstract void printDocument(Content serializedTree); + public abstract void printDocument(Content serializedTree) throws IOException; /** * Write the serialized form for a given field. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java index 31789a5f8eb..c01ac3e58f5 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java @@ -650,9 +650,9 @@ public class Util { fos = new FileOutputStream(filename); } if (docencoding == null) { - return new OutputStreamWriter(fos); + return new BufferedWriter(new OutputStreamWriter(fos)); } else { - return new OutputStreamWriter(fos, docencoding); + return new BufferedWriter(new OutputStreamWriter(fos, docencoding)); } } From 1fd51fa05e4009813dbe772b50c7e507ff7caa22 Mon Sep 17 00:00:00 2001 From: Mikhail Cherkasov Date: Tue, 16 Oct 2012 20:11:19 +0400 Subject: [PATCH 051/241] 6818083: When DISPLAY is bad, InternalError thrown, not AWTError Throw AWTError instead of InternalError if the DISPLAY is bad Reviewed-by: anthony, serb --- .../solaris/native/sun/awt/awt_GraphicsEnv.c | 4 +- .../BadDisplayTest/BadDisplayTest.java | 48 +++++++++++++++++++ .../Toolkit/BadDisplayTest/BadDisplayTest.sh | 42 ++++++++++++++++ 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.java create mode 100644 jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh diff --git a/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c b/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c index 2cc122c3476..7ae4cdd3259 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 (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -753,7 +753,7 @@ awt_init_Display(JNIEnv *env, jobject this) sizeof(errmsg), "Can't connect to X11 window server using '%s' as the value of the DISPLAY variable.", (getenv("DISPLAY") == NULL) ? ":0.0" : getenv("DISPLAY")); - JNU_ThrowInternalError(env, errmsg); + JNU_ThrowByName(env, "java/awt/AWTError", errmsg); return NULL; } diff --git a/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.java b/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.java new file mode 100644 index 00000000000..a5bed9c1331 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +/* + * @test + * @summary Test that Toolkit.getDefaultToolkit throws AWTError exception if bad DISPLAY variable was set + * @bug 6818083 + * + * @run shell/timeout=240 BadDisplayTest.sh + */ + +import java.awt.*; + +public class BadDisplayTest{ + public static void main(String[] args) { + + Throwable th = null; + try { + Toolkit.getDefaultToolkit(); + } catch (Throwable x) { + th = x; + } + if ( !(th instanceof AWTError)) { + System.exit(1); + } + } +} diff --git a/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh b/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh new file mode 100644 index 00000000000..f4a54d300c7 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh @@ -0,0 +1,42 @@ +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. + +${TESTJAVA}/bin/javac -cp ${TESTSRC} -d . ${TESTSRC}/BadDisplayTest.java + + +export DISPLAY= + +OS=`uname -s` +case "$OS" in + SunOS ) + ${TESTJAVA}/bin/java BadDisplayTest + ;; + Linux ) + ${TESTJAVA}/bin/java BadDisplayTest + ;; + * ) + echo "Unsupported System: ${OS}" + exit 0; + ;; +esac + +exit $? + From 4aedf7469a5564dd12e3e8cbba853d39f71b1da8 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 16 Oct 2012 21:03:36 -0700 Subject: [PATCH 052/241] 8000673: remove dead code from HtmlWriter and subtypes Reviewed-by: bpatel --- .../formats/html/AbstractMemberWriter.java | 34 - .../formats/html/HtmlDocletWriter.java | 924 +------------- .../formats/html/HtmlSerialFieldWriter.java | 12 - .../formats/html/HtmlSerialMethodWriter.java | 10 - .../html/SerializedFormWriterImpl.java | 10 - .../formats/html/SubWriterHolderWriter.java | 70 -- .../formats/html/markup/HtmlDocWriter.java | 104 +- .../formats/html/markup/HtmlWriter.java | 1094 +---------------- .../toolkit/AnnotationTypeWriter.java | 2 +- 9 files changed, 43 insertions(+), 2217 deletions(-) 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 692dac1f819..df2e8af8d79 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 @@ -187,23 +187,6 @@ public abstract class AbstractMemberWriter { */ protected abstract void addNavDetailLink(boolean link, Content liNav); - /*** ***/ - - protected void print(String str) { - writer.print(str); - writer.displayLength += str.length(); - } - - protected void print(char ch) { - writer.print(ch); - writer.displayLength++; - } - - protected void strong(String str) { - writer.strong(str); - writer.displayLength += str.length(); - } - /** * Add the member name to the content tree and modifies the display length. * @@ -310,23 +293,6 @@ public abstract class AbstractMemberWriter { tdSummaryType.addContent(code); } - private void printModifier(ProgramElementDoc member) { - if (member.isProtected()) { - print("protected "); - } else if (member.isPrivate()) { - print("private "); - } else if (!member.isPublic()) { // Package private - writer.printText("doclet.Package_private"); - print(" "); - } - if (member.isMethod() && ((MethodDoc)member).isAbstract()) { - print("abstract "); - } - if (member.isStatic()) { - print("static"); - } - } - /** * Add the modifier for the member. * 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 30b2f666a44..c5bd281e82f 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 @@ -205,33 +205,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return buf.toString(); } - /** - * Print Html Hyper Link, with target frame. This - * link will only appear if page is not in a frame. - * - * @param link String name of the file. - * @param where Position in the file - * @param target Name of the target frame. - * @param label Tag for the link. - * @param strong Whether the label should be strong or not? - */ - public void printNoFramesTargetHyperLink(String link, String where, - String target, String label, - boolean strong) { - script(); - println(" "); - scriptEnd(); - noScript(); - println(" " + getHyperLinkString(link, where, label, strong, "", "", target)); - noScriptEnd(); - println(DocletConstants.NL); - } - /** * Get the script to show or hide the All classes link. * @@ -329,14 +302,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return new TagletWriterImpl(this, isFirstSentence); } - protected void printTagsInfoHeader() { - dl(); - } - - protected void printTagsInfoFooter() { - dlEnd(); - } - /** * Get Package link, with target frame. * @@ -391,7 +356,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { head, body); Content htmlDocument = new HtmlDocument(htmlDocType, htmlComment, htmlTree); - htmlDocument.write(this, true); + write(htmlDocument); } /** @@ -407,26 +372,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return title; } - /** - * Print user specified header and the footer. - * - * @param header if true print the user provided header else print the - * user provided footer. - */ - public void printUserHeaderFooter(boolean header) { - em(); - if (header) { - print(replaceDocRootDir(configuration.header)); - } else { - if (configuration.footer.length() != 0) { - print(replaceDocRootDir(configuration.footer)); - } else { - print(replaceDocRootDir(configuration.header)); - } - } - emEnd(); - } - /** * Get user specified header and the footer. * @@ -449,14 +394,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return em; } - /** - * Print the user specified top. - */ - public void printTop() { - print(replaceDocRootDir(configuration.top)); - hr(); - } - /** * Adds the user specified top. * @@ -467,14 +404,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { body.addContent(top); } - /** - * Print the user specified bottom. - */ - public void printBottom() { - hr(); - print(replaceDocRootDir(configuration.bottom)); - } - /** * Adds the user specified bottom. * @@ -487,128 +416,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { body.addContent(p); } - /** - * Print the navigation bar for the Html page at the top and and the bottom. - * - * @param header If true print navigation bar at the top of the page else - * print the nevigation bar at the bottom. - */ - protected void navLinks(boolean header) { - println(""); - if (!configuration.nonavbar) { - if (header) { - println(DocletConstants.NL + ""); - anchor("navbar_top"); - println(); - print(getHyperLinkString("", "skip-navbar_top", "", false, "", - configuration.getText("doclet.Skip_navigation_links"), "")); - } else { - println(DocletConstants.NL + ""); - anchor("navbar_bottom"); - println(); - print(getHyperLinkString("", "skip-navbar_bottom", "", false, "", - configuration.getText("doclet.Skip_navigation_links"), "")); - } - table(0, "100%", 1, 0); - tr(); - tdColspanBgcolorStyle(2, "#EEEEFF", "NavBarCell1"); - println(""); - if (header) { - anchor("navbar_top_firstrow"); - } else { - anchor("navbar_bottom_firstrow"); - } - table(0, 0, 3); - print(" "); - trAlignVAlign("center", "top"); - - if (configuration.createoverview) { - navLinkContents(); - } - - if (configuration.packages.length == 1) { - navLinkPackage(configuration.packages[0]); - } else if (configuration.packages.length > 1) { - navLinkPackage(); - } - - navLinkClass(); - - if(configuration.classuse) { - navLinkClassUse(); - } - if(configuration.createtree) { - navLinkTree(); - } - if(!(configuration.nodeprecated || - configuration.nodeprecatedlist)) { - navLinkDeprecated(); - } - if(configuration.createindex) { - navLinkIndex(); - } - if (!configuration.nohelp) { - navLinkHelp(); - } - print(" "); - trEnd(); - tableEnd(); - tdEnd(); - - tdAlignVAlignRowspan("right", "top", 3); - - printUserHeaderFooter(header); - tdEnd(); - trEnd(); - println(""); - - tr(); - tdBgcolorStyle("white", "NavBarCell2"); - font("-2"); - space(); - navLinkPrevious(); - space(); - println(""); - space(); - navLinkNext(); - fontEnd(); - tdEnd(); - - tdBgcolorStyle("white", "NavBarCell2"); - font("-2"); - print(" "); - navShowLists(); - print(" "); - space(); - println(""); - space(); - navHideLists(filename); - print(" "); - space(); - println(""); - space(); - navLinkClassIndex(); - fontEnd(); - tdEnd(); - - trEnd(); - - printSummaryDetailLinks(); - - tableEnd(); - if (header) { - aName("skip-navbar_top"); - aEnd(); - println(DocletConstants.NL + ""); - } else { - aName("skip-navbar_bottom"); - aEnd(); - println(DocletConstants.NL + ""); - } - println(""); - } - } - /** * Adds the navigation bar for the Html page at the top and and the bottom. * @@ -700,14 +507,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } - /** - * Print the word "NEXT" to indicate that no link is available. Override - * this method to customize next link. - */ - protected void navLinkNext() { - navLinkNext(null); - } - /** * Get the word "NEXT" to indicate that no link is available. Override * this method to customize next link. @@ -718,14 +517,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return getNavLinkNext(null); } - /** - * Print the word "PREV" to indicate that no link is available. Override - * this method to customize prev link. - */ - protected void navLinkPrevious() { - navLinkPrevious(null); - } - /** * Get the word "PREV" to indicate that no link is available. Override * this method to customize prev link. @@ -736,28 +527,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { return getNavLinkPrevious(null); } - /** - * Do nothing. This is the default method. - */ - protected void printSummaryDetailLinks() { - } - /** * Do nothing. This is the default method. */ protected void addSummaryDetailLinks(Content navDiv) { } - /** - * Print link to the "overview-summary.html" page. - */ - protected void navLinkContents() { - navCellStart(); - printHyperLink(relativePath + "overview-summary.html", "", - configuration.getText("doclet.Overview"), true, "NavBarFont1"); - navCellEnd(); - } - /** * Get link to the "overview-summary.html" page. * @@ -770,46 +545,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Description for a cell in the navigation bar. - */ - protected void navCellStart() { - print(" "); - tdBgcolorStyle("#EEEEFF", "NavBarCell1"); - print(" "); - } - - /** - * Description for a cell in the navigation bar, but with reverse - * high-light effect. - */ - protected void navCellRevStart() { - print(" "); - tdBgcolorStyle("#FFFFFF", "NavBarCell1Rev"); - print(" "); - space(); - } - - /** - * Closing tag for navigation bar cell. - */ - protected void navCellEnd() { - space(); - tdEnd(); - } - - /** - * Print link to the "package-summary.html" page for the package passed. - * - * @param pkg Package to which link will be generated. - */ - protected void navLinkPackage(PackageDoc pkg) { - navCellStart(); - printPackageLink(pkg, configuration.getText("doclet.Package"), true, - "NavBarFont1"); - navCellEnd(); - } - /** * Get link to the "package-summary.html" page for the package passed. * @@ -823,18 +558,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print the word "Package" in the navigation bar cell, to indicate that - * link is not available here. - */ - protected void navLinkPackage() { - navCellStart(); - fontStyle("NavBarFont1"); - printText("doclet.Package"); - fontEnd(); - navCellEnd(); - } - /** * Get the word "Package" , to indicate that link is not available here. * @@ -845,18 +568,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print the word "Use" in the navigation bar cell, to indicate that link - * is not available. - */ - protected void navLinkClassUse() { - navCellStart(); - fontStyle("NavBarFont1"); - printText("doclet.navClassUse"); - fontEnd(); - navCellEnd(); - } - /** * Get the word "Use", to indicate that link is not available. * @@ -867,20 +578,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print link for previous file. - * - * @param prev File name for the prev link. - */ - public void navLinkPrevious(String prev) { - String tag = configuration.getText("doclet.Prev"); - if (prev != null) { - printHyperLink(prev, "", tag, true) ; - } else { - print(tag); - } - } - /** * Get link for previous file. * @@ -897,21 +594,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print link for next file. If next is null, just print the label - * without linking it anywhere. - * - * @param next File name for the next link. - */ - public void navLinkNext(String next) { - String tag = configuration.getText("doclet.Next"); - if (next != null) { - printHyperLink(next, "", tag, true); - } else { - print(tag); - } - } - /** * Get link for next file. If next is null, just print the label * without linking it anywhere. @@ -929,16 +611,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print "FRAMES" link, to switch to the frame version of the output. - * - * @param link File to be linked, "index.html". - */ - protected void navShowLists(String link) { - print(getHyperLinkString(link + "?" + path + filename, "", - configuration.getText("doclet.FRAMES"), true, "", "", "_top")); - } - /** * Get "FRAMES" link, to switch to the frame version of the output. * @@ -952,13 +624,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print "FRAMES" link, to switch to the frame version of the output. - */ - protected void navShowLists() { - navShowLists(relativePath + "index.html"); - } - /** * Get "FRAMES" link, to switch to the frame version of the output. * @@ -968,16 +633,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return getNavShowLists(relativePath + "index.html"); } - /** - * Print "NO FRAMES" link, to switch to the non-frame version of the output. - * - * @param link File to be linked. - */ - protected void navHideLists(String link) { - print(getHyperLinkString(link, "", configuration.getText("doclet.NO_FRAMES"), - true, "", "", "_top")); - } - /** * Get "NO FRAMES" link, to switch to the non-frame version of the output. * @@ -990,25 +645,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print "Tree" link in the navigation bar. If there is only one package - * specified on the command line, then the "Tree" link will be to the - * only "package-tree.html" file otherwise it will be to the - * "overview-tree.html" file. - */ - protected void navLinkTree() { - navCellStart(); - PackageDoc[] packages = configuration.root.specifiedPackages(); - if (packages.length == 1 && configuration.root.specifiedClasses().length == 0) { - printHyperLink(pathString(packages[0], "package-tree.html"), "", - configuration.getText("doclet.Tree"), true, "NavBarFont1"); - } else { - printHyperLink(relativePath + "overview-tree.html", "", - configuration.getText("doclet.Tree"), true, "NavBarFont1"); - } - navCellEnd(); - } - /** * Get "Tree" link in the navigation bar. If there is only one package * specified on the command line, then the "Tree" link will be to the @@ -1045,18 +681,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print the word "Class" in the navigation bar cell, to indicate that - * class link is not available. - */ - protected void navLinkClass() { - navCellStart(); - fontStyle("NavBarFont1"); - printText("doclet.Class"); - fontEnd(); - navCellEnd(); - } - /** * Get the word "Class", to indicate that class link is not available. * @@ -1067,16 +691,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print "Deprecated" API link in the navigation bar. - */ - protected void navLinkDeprecated() { - navCellStart(); - printHyperLink(relativePath + "deprecated-list.html", "", - configuration.getText("doclet.navDeprecated"), true, "NavBarFont1"); - navCellEnd(); - } - /** * Get "Deprecated" API link in the navigation bar. * @@ -1089,17 +703,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print link for generated index. If the user has used "-splitindex" - * command line option, then link to file "index-files/index-1.html" is - * generated otherwise link to file "index-all.html" is generated. - */ - protected void navLinkClassIndex() { - printNoFramesTargetHyperLink(relativePath + - AllClassesFrameWriter.OUTPUT_FILE_NAME_NOFRAMES, - "", "", configuration.getText("doclet.All_Classes"), true); - } - /** * Get link for generated index. If the user has used "-splitindex" * command line option, then link to file "index-files/index-1.html" is @@ -1114,20 +717,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { Content li = HtmlTree.LI(allClassesContent); return li; } - /** - * Print link for generated class index. - */ - protected void navLinkIndex() { - navCellStart(); - printHyperLink(relativePath + - (configuration.splitindex? - DirectoryManager.getPath("index-files") + - fileseparator: "") + - (configuration.splitindex? - "index-1.html" : "index-all.html"), "", - configuration.getText("doclet.Index"), true, "NavBarFont1"); - navCellEnd(); - } /** * Get link for generated class index. @@ -1143,27 +732,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print help file link. If user has provided a help file, then generate a - * link to the user given file, which is already copied to current or - * destination directory. - */ - protected void navLinkHelp() { - String helpfilenm = configuration.helpfile; - if (helpfilenm.equals("")) { - helpfilenm = "help-doc.html"; - } else { - int lastsep; - if ((lastsep = helpfilenm.lastIndexOf(File.separatorChar)) != -1) { - helpfilenm = helpfilenm.substring(lastsep + 1); - } - } - navCellStart(); - printHyperLink(relativePath + helpfilenm, "", - configuration.getText("doclet.Help"), true, "NavBarFont1"); - navCellEnd(); - } - /** * Get help file link. If user has provided a help file, then generate a * link to the user given file, which is already copied to current or @@ -1187,87 +755,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print the word "Detail" in the navigation bar. No link is available. - */ - protected void navDetail() { - printText("doclet.Detail"); - } - - /** - * Print the word "Summary" in the navigation bar. No link is available. - */ - protected void navSummary() { - printText("doclet.Summary"); - } - - /** - * Print the Html table tag for the index summary tables. The table tag - * printed is - * {@code } - */ - public void tableIndexSummary() { - table(1, "100%", 3, 0); - } - - /** - * Print the Html table tag for the index summary tables. - * - * @param summary the summary for the table tag summary attribute. - */ - public void tableIndexSummary(String summary) { - table(1, "100%", 3, 0, summary); - } - - /** - * Same as {@link #tableIndexSummary()}. - */ - public void tableIndexDetail() { - table(1, "100%", 3, 0); - } - - /** - * Print Html tag for table elements. The tag printed is - * <TD ALIGN="right" VALIGN="top" WIDTH="1%">. - */ - public void tdIndex() { - print(""); - } - - /** - * Print </TR> tag. Add a newline character at the end. - */ - public void trEnd() { - println(""); - } - - /** - * Print <TD> tag. - */ - public void td() { - print(""); - } - - /** - * Print <LINK str> tag. - * - * @param str String. - */ - public void link(String str) { - println(""); - } - - /** - * Print "<!-- " comment start string. - */ - public void commentStart() { - print(""); - } - - /** - * 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 <TR BGCOLOR="color" CLASS="stylename"> tag. Adds a newline character - * at the end. - * - * @param color String color. - * @param stylename String stylename. - */ - public void trBgcolorStyle(String color, String stylename) { - println(""); - } - - /** - * Print <TR BGCOLOR="color"> tag. Adds a newline character at the end. - * - * @param color String color. - */ - public void trBgcolor(String color) { - println(""); - } - - /** - * Print <TR ALIGN="align" VALIGN="valign"> tag. Adds a newline character - * at the end. - * - * @param align String align. - * @param valign String valign. - */ - public void trAlignVAlign(String align, String valign) { - println(""); - } - - /** - * Print <TH ALIGN="align"> tag. - * - * @param align the align attribute. - */ - public void thAlign(String align) { - print(""); - } - - /** - * Print <TD COLSPAN=i> tag. - * - * @param i integer. - */ - public void tdColspan(int i) { - print("
"); - } - - /** - * Print table caption. - */ - public void tableCaptionStart() { - captionStyle("TableCaption"); - } - - /** - * Print table sub-caption. - */ - public void tableSubCaptionStart() { - captionStyle("TableSubCaption"); - } - - /** - * Print table caption end tags. - */ - public void tableCaptionEnd() { - captionEnd(); - } - - /** - * Print summary table header. - */ - public void summaryTableHeader(String[] header, String scope) { - tr(); - for ( int i=0; i < header.length; i++ ) { - thScopeNoWrap("TableHeader", scope); - print(header[i]); - thEnd(); - } - trEnd(); - } - /** * Get summary table header. * @@ -1396,144 +883,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } - /** - * Prine table header information about color, column span and the font. - * - * @param color Background color. - * @param span Column span. - */ - public void tableHeaderStart(String color, int span) { - trBgcolorStyle(color, "TableHeadingColor"); - thAlignColspan("left", span); - font("+2"); - } - - /** - * Print table header for the inherited members summary tables. Print the - * background color information. - * - * @param color Background color. - */ - public void tableInheritedHeaderStart(String color) { - trBgcolorStyle(color, "TableSubHeadingColor"); - thAlign("left"); - } - - /** - * Print "Use" table header. Print the background color and the column span. - * - * @param color Background color. - */ - public void tableUseInfoHeaderStart(String color) { - trBgcolorStyle(color, "TableSubHeadingColor"); - thAlignColspan("left", 2); - } - - /** - * Print table header with the background color with default column span 2. - * - * @param color Background color. - */ - public void tableHeaderStart(String color) { - tableHeaderStart(color, 2); - } - - /** - * Print table header with the column span, with the default color #CCCCFF. - * - * @param span Column span. - */ - public void tableHeaderStart(int span) { - tableHeaderStart("#CCCCFF", span); - } - - /** - * Print table header with default column span 2 and default color #CCCCFF. - */ - public void tableHeaderStart() { - tableHeaderStart(2); - } - - /** - * Print table header end tags for font, column and row. - */ - public void tableHeaderEnd() { - fontEnd(); - thEnd(); - trEnd(); - } - - /** - * Print table header end tags in inherited tables for column and row. - */ - public void tableInheritedHeaderEnd() { - thEnd(); - trEnd(); - } - - /** - * Print the summary table row cell attribute width. - * - * @param width Width of the table cell. - */ - public void summaryRow(int width) { - if (width != 0) { - tdWidth(width + "%"); - } else { - td(); - } - } - - /** - * Print the summary table row cell end tag. - */ - public void summaryRowEnd() { - tdEnd(); - } - - /** - * Print the heading in Html {@literal

} format. - * - * @param str The Header string. - */ - public void printIndexHeading(String str) { - h2(); - print(str); - h2End(); - } - - /** - * Print Html tag <FRAMESET=arg>. - * - * @param arg Argument for the tag. - */ - public void frameSet(String arg) { - println(""); - } - - /** - * Print Html closing tag </FRAMESET>. - */ - public void frameSetEnd() { - println(""); - } - - /** - * Print Html tag <FRAME=arg>. - * - * @param arg Argument for the tag. - */ - public void frame(String arg) { - println(""); - } - - /** - * Print Html closing tag </FRAME>. - */ - public void frameEnd() { - println(""); - } - /** * Return path to the class page for a classdoc. For example, the class * name is "java.lang.Object" and if the current file getting generated is @@ -1572,30 +921,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return buf.toString(); } - /** - * Print the link to the given package. - * - * @param pkg the package to link to. - * @param label the label for the link. - * @param isStrong true if the label should be strong. - */ - public void printPackageLink(PackageDoc pkg, String label, boolean isStrong) { - print(getPackageLinkString(pkg, label, isStrong)); - } - - /** - * Print the link to the given package. - * - * @param pkg the package to link to. - * @param label the label for the link. - * @param isStrong true if the label should be strong. - * @param style the font of the package link label. - */ - public void printPackageLink(PackageDoc pkg, String label, boolean isStrong, - String style) { - print(getPackageLinkString(pkg, label, isStrong, style)); - } - /** * Return the link to the given package. * @@ -1679,21 +1004,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return (cd.isInterface())? italicsText(name): name; } - public void printSrcLink(ProgramElementDoc d, String label) { - if (d == null) { - return; - } - ClassDoc cd = d.containingClass(); - if (cd == null) { - //d must be a class doc since in has no containing class. - cd = (ClassDoc) d; - } - String href = relativePath + DocletConstants.SOURCE_OUTPUT_DIR_NAME - + DirectoryManager.getDirectoryPath(cd.containingPackage()) - + cd.name() + ".html#" + SourceToHTMLConverter.getAnchorName(d); - printHyperLink(href, "", label, true); - } - /** * Add the link to the content tree. * @@ -1743,13 +1053,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { factory.getTypeParameterLinks(linkInfo, false)).toString(); } - /** - * Print the link to the given class. - */ - public void printLink(LinkInfoImpl linkInfo) { - print(getLink(linkInfo)); - } - /************************************************************* * Return a class cross link to external class documentation. * The name must be fully qualified to determine which package @@ -1773,7 +1076,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { while((periodIndex = packageName.lastIndexOf('.')) != -1) { className = packageName.substring(periodIndex + 1, packageName.length()) + (className.length() > 0 ? "." + className : ""); - String defaultLabel = code ? getCode() + className + getCodeEnd() : className; + String defaultLabel = code ? codeText(className) : className; packageName = packageName.substring(0, periodIndex); if (getCrossPackageLink(packageName) != null) { //The package exists in external documentation, so link to the external @@ -1881,30 +1184,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addPreQualifiedClassLink(context, cd, true, contentTree); } - public void printText(String key) { - print(configuration.getText(key)); - } - - public void printText(String key, String a1) { - print(configuration.getText(key, a1)); - } - - public void printText(String key, String a1, String a2) { - print(configuration.getText(key, a1, a2)); - } - - public void strongText(String key) { - strong(configuration.getText(key)); - } - - public void strongText(String key, String a1) { - strong(configuration.getText(key, a1)); - } - - public void strongText(String key, String a1, String a2) { - strong(configuration.getText(key, a1, a2)); - } - /** * Get the link for the given member. * @@ -1917,22 +1196,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return getDocLink(context, doc.containingClass(), doc, label); } - /** - * Print the link for the given member. - * - * @param context the id of the context where the link will be printed. - * @param classDoc the classDoc that we should link to. This is not - * necessarily equal to doc.containingClass(). We may be - * inheriting comments. - * @param doc the member being linked to. - * @param label the label for the link. - * @param strong true if the link should be strong. - */ - public void printDocLink(int context, ClassDoc classDoc, MemberDoc doc, - String label, boolean strong) { - print(getDocLink(context, classDoc, doc, label, strong)); - } - /** * Return the link for the given member. * @@ -2004,10 +1267,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } - public void anchor(ExecutableMemberDoc emd) { - anchor(getAnchor(emd)); - } - public String getAnchor(ExecutableMemberDoc emd) { StringBuilder signature = new StringBuilder(emd.signature()); StringBuilder signatureParsed = new StringBuilder(); @@ -2030,66 +1289,61 @@ public class HtmlDocletWriter extends HtmlDocWriter { if (! (tagName.startsWith("@link") || tagName.equals("@see"))) { return ""; } - StringBuilder result = new StringBuilder(); - boolean isplaintext = tagName.toLowerCase().equals("@linkplain"); - String label = see.label(); - label = (label.length() > 0)? - ((isplaintext) ? label : - getCode() + label + getCodeEnd()):""; + String seetext = replaceDocRootDir(see.text()); //Check if @see is an href or "string" if (seetext.startsWith("<") || seetext.startsWith("\"")) { - result.append(seetext); - return result.toString(); + return seetext; } + boolean plain = tagName.equalsIgnoreCase("@linkplain"); + String label = plainOrCodeText(plain, see.label()); + //The text from the @see tag. We will output this text when a label is not specified. - String text = (isplaintext) ? seetext : getCode() + seetext + getCodeEnd(); + String text = plainOrCodeText(plain, seetext); ClassDoc refClass = see.referencedClass(); String refClassName = see.referencedClassName(); MemberDoc refMem = see.referencedMember(); String refMemName = see.referencedMemberName(); + if (refClass == null) { //@see is not referencing an included class PackageDoc refPackage = see.referencedPackage(); if (refPackage != null && refPackage.isIncluded()) { //@see is referencing an included package - String packageName = isplaintext ? refPackage.name() : - getCode() + refPackage.name() + getCodeEnd(); - result.append(getPackageLinkString(refPackage, - label.length() == 0 ? packageName : label, false)); + if (label.isEmpty()) + label = plainOrCodeText(plain, refPackage.name()); + return getPackageLinkString(refPackage, label, false); } else { //@see is not referencing an included class or package. Check for cross links. String classCrossLink, packageCrossLink = getCrossPackageLink(refClassName); if (packageCrossLink != null) { //Package cross link found - result.append(getHyperLinkString(packageCrossLink, "", - (label.length() == 0)? text : label, false)); + return getHyperLinkString(packageCrossLink, "", + (label.isEmpty() ? text : label), false); } else if ((classCrossLink = getCrossClassLink(refClassName, - refMemName, label, false, "", ! isplaintext)) != null) { - //Class cross link found (possiblly to a member in the class) - result.append(classCrossLink); + refMemName, label, false, "", !plain)) != null) { + //Class cross link found (possibly to a member in the class) + return classCrossLink; } else { //No cross link found so print warning configuration.getDocletSpecificMsg().warning(see.position(), "doclet.see.class_or_package_not_found", tagName, seetext); - result.append((label.length() == 0)? text: label); + return (label.isEmpty() ? text: label); } } } else if (refMemName == null) { // Must be a class reference since refClass is not null and refMemName is null. - if (label.length() == 0) { - label = (isplaintext) ? refClass.name() : getCode() + refClass.name() + getCodeEnd(); - result.append(getLink(new LinkInfoImpl(refClass, label))); - } else { - result.append(getLink(new LinkInfoImpl(refClass, label))); + if (label.isEmpty()) { + label = plainOrCodeText(plain, refClass.name()); } + return getLink(new LinkInfoImpl(refClass, label)); } else if (refMem == null) { // Must be a member reference since refClass is not null and refMemName is not null. // However, refMem is null, so this referenced member does not exist. - result.append((label.length() == 0)? text: label); + return (label.isEmpty() ? text: label); } else { // Must be a member reference since refClass is not null and refMemName is not null. // refMem is not null, so this @see tag must be referencing a valid member. @@ -2121,17 +1375,16 @@ public class HtmlDocletWriter extends HtmlDocWriter { refMemName += ((ExecutableMemberDoc)refMem).signature(); } } - text = (isplaintext) ? - refMemName : getCode() + Util.escapeHtmlChars(refMemName) + getCodeEnd(); - result.append(getDocLink(LinkInfoImpl.CONTEXT_SEE_TAG, containing, - refMem, (label.length() == 0)? text: label, false)); + text = plainOrCodeText(plain, Util.escapeHtmlChars(refMemName)); + + return getDocLink(LinkInfoImpl.CONTEXT_SEE_TAG, containing, + refMem, (label.isEmpty() ? text: label), false); } - return result.toString(); } - public void printInlineComment(Doc doc, Tag tag) { - printCommentTags(doc, tag.inlineTags(), false, false); + private String plainOrCodeText(boolean plain, String text) { + return (plain || text.isEmpty()) ? text : codeText(text); } /** @@ -2145,10 +1398,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addCommentTags(doc, tag.inlineTags(), false, false, htmltree); } - public void printInlineDeprecatedComment(Doc doc, Tag tag) { - printCommentTags(doc, tag.inlineTags(), true, false); - } - /** * Add the inline deprecated comment. * @@ -2160,10 +1409,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addCommentTags(doc, tag.inlineTags(), true, false, htmltree); } - public void printSummaryComment(Doc doc) { - printSummaryComment(doc, doc.firstSentenceTags()); - } - /** * Adds the summary content. * @@ -2174,10 +1419,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addSummaryComment(doc, doc.firstSentenceTags(), htmltree); } - public void printSummaryComment(Doc doc, Tag[] firstSentenceTags) { - printCommentTags(doc, firstSentenceTags, false, true); - } - /** * Adds the summary content. * @@ -2189,23 +1430,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { addCommentTags(doc, firstSentenceTags, false, true, htmltree); } - public void printSummaryDeprecatedComment(Doc doc) { - printCommentTags(doc, doc.firstSentenceTags(), true, true); - } - - public void printSummaryDeprecatedComment(Doc doc, Tag tag) { - printCommentTags(doc, tag.firstSentenceTags(), true, true); - } - public void addSummaryDeprecatedComment(Doc doc, Tag tag, Content htmltree) { addCommentTags(doc, tag.firstSentenceTags(), true, true, htmltree); } - public void printInlineComment(Doc doc) { - printCommentTags(doc, doc.inlineTags(), false, false); - p(); - } - /** * Adds the inline comment. * @@ -2216,27 +1444,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addCommentTags(doc, doc.inlineTags(), false, false, htmltree); } - public void printInlineDeprecatedComment(Doc doc) { - printCommentTags(doc, doc.inlineTags(), true, false); - } - - private void printCommentTags(Doc doc, Tag[] tags, boolean depr, boolean first) { - if(configuration.nocomment){ - return; - } - if (depr) { - italic(); - } - String result = commentTagsToString(null, doc, tags, first); - print(result); - if (depr) { - italicEnd(); - } - if (tags.length == 0) { - space(); - } - } - /** * Adds the comment tags. * @@ -2501,22 +1708,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } - public void printStyleSheetProperties() { - String filename = configuration.stylesheetfile; - if (filename.length() > 0) { - File stylefile = new File(filename); - String parent = stylefile.getParent(); - filename = (parent == null)? - filename: - filename.substring(parent.length() + 1); - } else { - filename = "stylesheet.css"; - } - filename = relativePath + filename; - link("REL =\"stylesheet\" TYPE=\"text/css\" HREF=\"" + - filename + "\" " + "TITLE=\"Style\""); - } - /** * Returns a link to the stylesheet file. * @@ -2547,15 +1738,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return cd.containingClass() == null || cd.isStatic(); } - /** - * Write the annotatation types for the given packageDoc. - * - * @param packageDoc the package to write annotations for. - */ - public void writeAnnotationInfo(PackageDoc packageDoc) { - writeAnnotationInfo(packageDoc, packageDoc.annotations()); - } - /** * Adds the annotatation types for the given packageDoc. * @@ -2567,15 +1749,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addAnnotationInfo(packageDoc, packageDoc.annotations(), htmltree); } - /** - * Write the annotatation types for the given doc. - * - * @param doc the doc to write annotations for. - */ - public void writeAnnotationInfo(ProgramElementDoc doc) { - writeAnnotationInfo(doc, doc.annotations()); - } - /** * Adds the annotatation types for the given doc. * @@ -2586,17 +1759,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addAnnotationInfo(doc, doc.annotations(), htmltree); } - /** - * Write the annotatation types for the given doc and parameter. - * - * @param indent the number of spaced to indent the parameters. - * @param doc the doc to write annotations for. - * @param param the parameter to write annotations for. - */ - public boolean writeAnnotationInfo(int indent, Doc doc, Parameter param) { - return writeAnnotationInfo(indent, doc, param.annotations(), false); - } - /** * Add the annotatation types for the given doc and parameter. * @@ -2610,16 +1772,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return addAnnotationInfo(indent, doc, param.annotations(), false, tree); } - /** - * Write the annotatation types for the given doc. - * - * @param doc the doc to write annotations for. - * @param descList the array of {@link AnnotationDesc}. - */ - private void writeAnnotationInfo(Doc doc, AnnotationDesc[] descList) { - writeAnnotationInfo(0, doc, descList, true); - } - /** * Adds the annotatation types for the given doc. * @@ -2633,26 +1785,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addAnnotationInfo(0, doc, descList, true, htmltree); } - /** - * Write the annotatation types for the given doc. - * - * @param indent the number of extra spaces to indent the annotations. - * @param doc the doc to write annotations for. - * @param descList the array of {@link AnnotationDesc}. - */ - private boolean writeAnnotationInfo(int indent, Doc doc, AnnotationDesc[] descList, boolean lineBreak) { - List annotations = getAnnotations(indent, descList, lineBreak); - if (annotations.size() == 0) { - return false; - } - fontNoNewLine("-1"); - for (Iterator iter = annotations.iterator(); iter.hasNext();) { - print(iter.next()); - } - fontEnd(); - return true; - } - /** * Adds the annotatation types for the given doc. * 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 127574467da..b735b01f72f 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 @@ -60,18 +60,6 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl return Arrays.asList(cd.serializableFields()); } - protected void printTypeLinkNoDimension(Type type) { - ClassDoc cd = type.asClassDoc(); - //Linking to package private classes in serialized for causes - //broken links. Don't link to them. - if (type.isPrimitive() || cd.isPackagePrivate()) { - print(type.typeName()); - } else { - writer.printLink(new LinkInfoImpl( - LinkInfoImpl.CONTEXT_SERIAL_MEMBER, type)); - } - } - /** * Return the header for serializable fields section. * 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 c267cd8d46b..2b5bdcfe3a4 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 @@ -166,14 +166,4 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements method.containingClass().qualifiedName(), method.name()); } } - - protected void printTypeLinkNoDimension(Type type) { - ClassDoc cd = type.asClassDoc(); - if (type.isPrimitive() || cd.isPackagePrivate()) { - print(type.typeName()); - } else { - writer.printLink(new LinkInfoImpl( - LinkInfoImpl.CONTEXT_SERIAL_MEMBER,type)); - } - } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java index e7a15a1c750..f7cb4feff81 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java @@ -218,16 +218,6 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter printHtmlDocument(null, true, serializedTree); } - private void tableHeader() { - tableIndexSummary(); - trBgcolorStyle("#CCCCFF", "TableSubHeadingColor"); - } - - private void tableFooter() { - fontEnd(); - thEnd(); trEnd(); tableEnd(); - } - /** * Return an instance of a SerialFieldWriter. * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java index 9e27d772ece..424c55dfd8f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java @@ -66,18 +66,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { super(configuration, path, filename, relpath); } - public void printTypeSummaryHeader() { - tdIndex(); - font("-1"); - code(); - } - - public void printTypeSummaryFooter() { - codeEnd(); - fontEnd(); - tdEnd(); - } - /** * Add the summary header. * @@ -105,14 +93,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { return table; } - public void printTableHeadingBackground(String str) { - tableIndexDetail(); - tableHeaderStart("#CCCCFF", 1); - strong(str); - tableHeaderEnd(); - tableEnd(); - } - /** * Add the inherited summary header. * @@ -126,19 +106,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { mw.addInheritedSummaryLabel(cd, inheritedTree); } - public void printSummaryFooter(AbstractMemberWriter mw, ClassDoc cd) { - tableEnd(); - space(); - } - - public void printInheritedSummaryFooter(AbstractMemberWriter mw, ClassDoc cd) { - codeEnd(); - summaryRowEnd(); - trEnd(); - tableEnd(); - space(); - } - /** * Add the index comment. * @@ -149,24 +116,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { addIndexComment(member, member.firstSentenceTags(), contentTree); } - protected void printIndexComment(Doc member, Tag[] firstSentenceTags) { - Tag[] deprs = member.tags("deprecated"); - if (Util.isDeprecated((ProgramElementDoc) member)) { - strongText("doclet.Deprecated"); - space(); - if (deprs.length > 0) { - printInlineDeprecatedComment(member, deprs[0]); - } - return; - } else { - ClassDoc cd = ((ProgramElementDoc)member).containingClass(); - if (cd != null && Util.isDeprecated(cd)) { - strongText("doclet.Deprecated"); space(); - } - } - printSummaryComment(member, firstSentenceTags); - } - /** * Add the index comment. * @@ -223,18 +172,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { addSummaryLinkComment(mw, member, member.firstSentenceTags(), contentTree); } - public void printSummaryLinkComment(AbstractMemberWriter mw, - ProgramElementDoc member, - Tag[] firstSentenceTags) { - codeEnd(); - println(); - br(); - printNbsps(); - printIndexComment(member, firstSentenceTags); - summaryRowEnd(); - trEnd(); - } - /** * Add the summary link comment. * @@ -265,13 +202,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { mw.addInheritedSummaryLink(cd, member, linksTree); } - public void printMemberHeader() { - hr(); - } - - public void printMemberFooter() { - } - /** * Get the document content header tree * 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 3b481ab815e..4af650d601a 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 @@ -82,48 +82,6 @@ public abstract class HtmlDocWriter extends HtmlWriter { */ public abstract Configuration configuration(); - /** - * Print Html Hyper Link. - * - * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. - * @param label Tag for the link. - * @param strong Boolean that sets label to strong. - */ - public void printHyperLink(String link, String where, - String label, boolean strong) { - print(getHyperLinkString(link, where, label, strong, "", "", "")); - } - - /** - * Print Html Hyper Link. - * - * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. - * @param label Tag for the link. - */ - public void printHyperLink(String link, String where, String label) { - printHyperLink(link, where, label, false); - } - - /** - * Print Html Hyper Link. - * - * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. - * @param label Tag for the link. - * @param strong Boolean that sets label to strong. - * @param stylename String style of text defined in style sheet. - */ - public void printHyperLink(String link, String where, - String label, boolean strong, - String stylename) { - print(getHyperLinkString(link, where, label, strong, stylename, "", "")); - } - /** * Return Html Hyper Link string. * @@ -268,15 +226,6 @@ public abstract class HtmlDocWriter extends HtmlWriter { return getHyperLinkString(link, "", label, false); } - /** - * Print the name of the package, this class is in. - * - * @param cd ClassDoc. - */ - public void printPkgName(ClassDoc cd) { - print(getPkgName(cd)); - } - /** * Get the name of the package, this class is in. * @@ -291,27 +240,6 @@ 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; } @@ -345,7 +273,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { head, frameset); Content htmlDocument = new HtmlDocument(htmlDocType, htmlComment, htmlTree); - htmlDocument.write(this, true); + write(htmlDocument); } /** @@ -362,36 +290,6 @@ public abstract class HtmlDocWriter extends HtmlWriter { return space; } - /** - * Print the closing </body> and </html> tags. - */ - public void printBodyHtmlEnd() { - println(); - bodyEnd(); - htmlEnd(); - } - - /** - * Calls {@link #printBodyHtmlEnd()} method. - */ - public void printFooter() { - printBodyHtmlEnd(); - } - - /** - * Print closing </html> tag. - */ - public void printFrameFooter() { - htmlEnd(); - } - - /** - * Print ten non-breaking spaces("&nbsp;"). - */ - public void printNbsps() { - print("          "); - } - protected String getGeneratedByString() { Calendar calendar = new GregorianCalendar(TimeZone.getDefault()); Date today = calendar.getTime(); 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 3d3f0e084dd..64ea8760612 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 @@ -32,7 +32,7 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for the Html format code generation. - * Initilizes PrintWriter with FileWriter, to enable print + * Initializes PrintWriter with FileWriter, to enable print * related methods to generate the code to the named File through FileWriter. * *

This is NOT part of any supported API. @@ -44,7 +44,7 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ -public class HtmlWriter extends PrintWriter { +public class HtmlWriter { /** * Name of the file, to which this writer is writing to. @@ -153,6 +153,8 @@ public class HtmlWriter extends PrintWriter { public final Content descfrmInterfaceLabel; + private final Writer writer; + /** * Constructor. * @@ -169,7 +171,7 @@ public class HtmlWriter extends PrintWriter { public HtmlWriter(Configuration configuration, String path, String filename, String docencoding) throws IOException, UnsupportedEncodingException { - super(Util.genWriter(configuration, path, filename, docencoding)); + writer = Util.genWriter(configuration, path, filename, docencoding); this.configuration = configuration; htmlFilename = filename; this.memberDetailsListPrinted = false; @@ -218,6 +220,14 @@ public class HtmlWriter extends PrintWriter { descfrmInterfaceLabel = getResource("doclet.Description_From_Interface"); } + public void write(Content c) throws IOException { + c.write(writer, true); + } + + public void close() throws IOException { + writer.close(); + } + /** * Get the configuration string as a content. * @@ -251,38 +261,6 @@ public class HtmlWriter extends PrintWriter { return new RawHtml(configuration.getText(key, a1, a2)); } - /** - * Print <HTML> tag. Add a newline character at the end. - */ - public void html() { - println(""); - } - - /** - * Print </HTML> tag. Add a newline character at the end. - */ - public void htmlEnd() { - println(""); - } - - /** - * Print the script code to be embedded before the </HEAD> tag. - */ - protected void printWinTitleScript(String winTitle){ - if(winTitle != null && winTitle.length() > 0) { - script(); - println("function windowTitle()"); - println("{"); - println(" if (location.href.indexOf('is-external=true') == -1) {"); - println(" parent.document.title=\"" + winTitle + "\";"); - println(" }"); - println("}"); - scriptEnd(); - noScript(); - noScriptEnd(); - } - } - /** * Returns an HtmlTree for the SCRIPT tag. * @@ -325,64 +303,6 @@ public class HtmlWriter extends PrintWriter { return script; } - /** - * Print the Javascript <SCRIPT> start tag with its type - * attribute. - */ - public void script() { - println(""); - } - - /** - * Print the Javascript <NOSCRIPT> start tag. - */ - public void noScript() { - println(""); - } - - /** - * Return the Javascript call to be embedded in the <BODY> tag. - * Return nothing if winTitle is empty. - * @return the Javascript call to be embedded in the <BODY> tag. - */ - protected String getWindowTitleOnload(){ - if(winTitle != null && winTitle.length() > 0) { - return " onload=\"windowTitle();\""; - } else { - return ""; - } - } - - /** - * Print <BODY BGCOLOR="bgcolor">, including JavaScript - * "onload" call to load windowtitle script. This script shows the name - * of the document in the window title bar when frames are on. - * - * @param bgcolor Background color. - * @param includeScript boolean set true if printing windowtitle script - */ - public void body(String bgcolor, boolean includeScript) { - print(""); - } - /** * Returns an HtmlTree for the BODY tag. * @@ -405,31 +325,6 @@ public class HtmlWriter extends PrintWriter { return body; } - /** - * Print </BODY> tag. Add a newline character at the end. - */ - public void bodyEnd() { - println(""); - } - - /** - * Print <TITLE> tag. Add a newline character at the end. - */ - public void title() { - println(""); - } - - /** - * Print <TITLE> tag. Add a newline character at the end. - * - * @param winTitle The title of this document. - */ - public void title(String winTitle) { - // Set window title string which is later printed - this.winTitle = winTitle; - title(); - } - /** * Returns an HtmlTree for the TITLE tag. * @@ -440,295 +335,6 @@ public class HtmlWriter extends PrintWriter { return title; } - /** - * Print </TITLE> tag. Add a newline character at the end. - */ - public void titleEnd() { - println(""); - } - - /** - * Print <UL> tag. Add a newline character at the end. - */ - public void ul() { - println("

    "); - } - - /** - * Print </UL> tag. Add a newline character at the end. - */ - public void ulEnd() { - println("
"); - } - - /** - * Print <LI> tag. - */ - public void li() { - print("
  • "); - } - - /** - * Print <LI TYPE="type"> tag. - * - * @param type Type string. - */ - public void li(String type) { - print("
  • "); - } - - /** - * Print <H1> tag. Add a newline character at the end. - */ - public void h1() { - println("

    "); - } - - /** - * Print </H1> tag. Add a newline character at the end. - */ - public void h1End() { - println("

    "); - } - - /** - * Print text with <H1> tag. Also adds </H1> tag. Add a newline character - * at the end of the text. - * - * @param text Text to be printed with <H1> format. - */ - public void h1(String text) { - h1(); - println(text); - h1End(); - } - - /** - * Print <H2> tag. Add a newline character at the end. - */ - public void h2() { - println("

    "); - } - - /** - * Print text with <H2> tag. Also adds </H2> tag. Add a newline character - * at the end of the text. - * - * @param text Text to be printed with <H2> format. - */ - public void h2(String text) { - h2(); - println(text); - h2End(); - } - - /** - * Print </H2> tag. Add a newline character at the end. - */ - public void h2End() { - println("

    "); - } - - /** - * Print <H3> tag. Add a newline character at the end. - */ - public void h3() { - println("

    "); - } - - /** - * Print text with <H3> tag. Also adds </H3> tag. Add a newline character - * at the end of the text. - * - * @param text Text to be printed with <H3> format. - */ - public void h3(String text) { - h3(); - println(text); - h3End(); - } - - /** - * Print </H3> tag. Add a newline character at the end. - */ - public void h3End() { - println("

    "); - } - - /** - * Print <H4> tag. Add a newline character at the end. - */ - public void h4() { - println("

    "); - } - - /** - * Print </H4> tag. Add a newline character at the end. - */ - public void h4End() { - println("

    "); - } - - /** - * Print text with <H4> tag. Also adds </H4> tag. Add a newline character - * at the end of the text. - * - * @param text Text to be printed with <H4> format. - */ - public void h4(String text) { - h4(); - println(text); - h4End(); - } - - /** - * Print <H5> tag. Add a newline character at the end. - */ - public void h5() { - println("
    "); - } - - /** - * Print </H5> tag. Add a newline character at the end. - */ - public void h5End() { - println("
    "); - } - - /** - * Print HTML <IMG SRC="imggif" WIDTH="width" HEIGHT="height" ALT="imgname> - * tag. It prepends the "images" directory name to the "imggif". This - * method is used for oneone format generation. Add a newline character - * at the end. - * - * @param imggif Image GIF file. - * @param imgname Image name. - * @param width Width of the image. - * @param height Height of the image. - */ - public void img(String imggif, String imgname, int width, int height) { - println("\"""); - } - - /** - * Print <MENU> tag. Add a newline character at the end. - */ - public void menu() { - println(""); - } - - /** - * Print </MENU> tag. Add a newline character at the end. - */ - public void menuEnd() { - println(""); - } - - /** - * Print <PRE> tag. Add a newline character at the end. - */ - public void pre() { - println("
    ");
    -    }
    -
    -    /**
    -     * Print <PRE> tag without adding new line character at th eend.
    -     */
    -    public void preNoNewLine() {
    -        print("
    ");
    -    }
    -
    -    /**
    -     * Print </PRE> tag. Add a newline character at the end.
    -     */
    -    public void preEnd() {
    -        println("
    "); - } - - /** - * Print <HR> tag. Add a newline character at the end. - */ - public void hr() { - println("
    "); - } - - /** - * Print <HR SIZE="size" WIDTH="widthpercent%"> tag. Add a newline - * character at the end. - * - * @param size Size of the ruler. - * @param widthPercent Percentage Width of the ruler - */ - public void hr(int size, int widthPercent) { - println("
    "); - } - - /** - * Print <HR SIZE="size" NOSHADE> tag. Add a newline character at the end. - * - * @param size Size of the ruler. - * @param noshade noshade string. - */ - public void hr(int size, String noshade) { - println("
    "); - } - - /** - * Get the "<STRONG>" string. - * - * @return String Return String "<STRONG>"; - */ - public String getStrong() { - return ""; - } - - /** - * Get the "</STRONG>" string. - * - * @return String Return String "</STRONG>"; - */ - public String getStrongEnd() { - return ""; - } - - /** - * Print <STRONG> tag. - */ - public void strong() { - print(""); - } - - /** - * Print </STRONG> tag. - */ - public void strongEnd() { - print(""); - } - - /** - * Print text passed, in strong format using <STRONG> and </STRONG> tags. - * - * @param text String to be printed in between <STRONG> and </STRONG> tags. - */ - public void strong(String text) { - strong(); - print(text); - strongEnd(); - } - - /** - * Print text passed, in Italics using <I> and </I> tags. - * - * @param text String to be printed in between <I> and </I> tags. - */ - public void italics(String text) { - print(""); - print(text); - println(""); - } - /** * Return, text passed, with Italics <i> and </i> tags, surrounding it. * So if the text passed is "Hi", then string returned will be "<i>Hi</i>". @@ -743,13 +349,6 @@ public class HtmlWriter extends PrintWriter { return "" + text + ""; } - /** - * Print "&nbsp;", non-breaking space. - */ - public void space() { - print(" "); - } - /** * Return "&nbsp;", non-breaking space. */ @@ -757,677 +356,10 @@ public class HtmlWriter extends PrintWriter { return RawHtml.nbsp; } - /** - * Print <DL> tag. Add a newline character at the end. - */ - public void dl() { - println("
    "); - } - - /** - * Print </DL> tag. Add a newline character at the end. - */ - public void dlEnd() { - println("
    "); - } - - /** - * Print <DT> tag. - */ - public void dt() { - print("
    "); - } - - /** - * Print </DT> tag. - */ - public void dtEnd() { - print("
    "); - } - - /** - * Print <DD> tag. - */ - public void dd() { - print("
    "); - } - - /** - * Print </DD> tag. Add a newline character at the end. - */ - public void ddEnd() { - println("
    "); - } - - /** - * Print <SUP> tag. Add a newline character at the end. - */ - public void sup() { - println(""); - } - - /** - * Print </SUP> tag. Add a newline character at the end. - */ - public void supEnd() { - println(""); - } - - /** - * Print <FONT SIZE="size"> tag. Add a newline character at the end. - * - * @param size String size. - */ - public void font(String size) { - println(""); - } - - /** - * Print <FONT SIZE="size"> tag. - * - * @param size String size. - */ - public void fontNoNewLine(String size) { - print(""); - } - - /** - * Print <FONT CLASS="stylename"> tag. Add a newline character at the end. - * - * @param stylename String stylename. - */ - public void fontStyle(String stylename) { - print(""); - } - - /** - * Print <FONT SIZE="size" CLASS="stylename"> tag. Add a newline character - * at the end. - * - * @param size String size. - * @param stylename String stylename. - */ - public void fontSizeStyle(String size, String stylename) { - println(""); - } - - /** - * Print </FONT> tag. - */ - public void fontEnd() { - print(""); - } - - /** - * Get the "<FONT COLOR="color">" string. - * - * @param color String color. - * @return String Return String "<FONT COLOR="color">". - */ - public String getFontColor(String color) { - return ""; - } - - /** - * Get the "</FONT>" string. - * - * @return String Return String "</FONT>"; - */ - public String getFontEnd() { - return ""; - } - - /** - * Print <CENTER> tag. Add a newline character at the end. - */ - public void center() { - println("
    "); - } - - /** - * Print </CENTER> tag. Add a newline character at the end. - */ - public void centerEnd() { - println("
    "); - } - - /** - * Print anchor <A NAME="name"> tag. - * - * @param name Name String. - */ - public void aName(String name) { - print(""); - } - - /** - * Print </A> tag. - */ - public void aEnd() { - print(""); - } - - /** - * Print <I> tag. - */ - public void italic() { - print(""); - } - - /** - * Print </I> tag. - */ - public void italicEnd() { - print(""); - } - - /** - * Print contents within anchor <A NAME="name"> tags. - * - * @param name String name. - * @param content String contents. - */ - public void anchor(String name, String content) { - aName(name); - print(content); - aEnd(); - } - - /** - * Print anchor <A NAME="name"> and </A>tags. Print comment string - * "<!-- -->" within those tags. - * - * @param name String name. - */ - public void anchor(String name) { - anchor(name, ""); - } - - /** - * Print newline and then print <P> tag. Add a newline character at the - * end. - */ - public void p() { - println(); - println("

    "); - } - - /** - * Print newline and then print </P> tag. Add a newline character at the - * end. - */ - public void pEnd() { - println(); - println("

    "); - } - - /** - * Print newline and then print <BR> tag. Add a newline character at the - * end. - */ - public void br() { - println(); - println("
    "); - } - - /** - * Print <ADDRESS> tag. Add a newline character at the end. - */ - public void address() { - println("
    "); - } - - /** - * Print </ADDRESS> tag. Add a newline character at the end. - */ - public void addressEnd() { - println("
    "); - } - - /** - * Print <HEAD> tag. Add a newline character at the end. - */ - public void head() { - println(""); - } - - /** - * Print </HEAD> tag. Add a newline character at the end. - */ - public void headEnd() { - println(""); - } - - /** - * Print <CODE> tag. - */ - public void code() { - print(""); - } - - /** - * Print </CODE> tag. - */ - public void codeEnd() { - print(""); - } - - /** - * Print <EM> tag. Add a newline character at the end. - */ - public void em() { - println(""); - } - - /** - * Print </EM> tag. Add a newline character at the end. - */ - public void emEnd() { - println(""); - } - - /** - * Print HTML <TABLE BORDER="border" WIDTH="width" - * CELLPADDING="cellpadding" CELLSPACING="cellspacing"> tag. - * - * @param border Border size. - * @param width Width of the table. - * @param cellpadding Cellpadding for the table cells. - * @param cellspacing Cellspacing for the table cells. - */ - public void table(int border, String width, int cellpadding, - int cellspacing) { - println(DocletConstants.NL + - ""); - } - - /** - * Print HTML <TABLE BORDER="border" WIDTH="width" - * CELLPADDING="cellpadding" CELLSPACING="cellspacing" SUMMARY="summary"> tag. - * - * @param border Border size. - * @param width Width of the table. - * @param cellpadding Cellpadding for the table cells. - * @param cellspacing Cellspacing for the table cells. - * @param summary Table summary. - */ - public void table(int border, String width, int cellpadding, - int cellspacing, String summary) { - println(DocletConstants.NL + - "
    "); - } - - /** - * Print HTML <TABLE BORDER="border" CELLPADDING="cellpadding" - * CELLSPACING="cellspacing"> tag. - * - * @param border Border size. - * @param cellpadding Cellpadding for the table cells. - * @param cellspacing Cellspacing for the table cells. - */ - public void table(int border, int cellpadding, int cellspacing) { - println(DocletConstants.NL + - "
    "); - } - - /** - * Print HTML <TABLE BORDER="border" CELLPADDING="cellpadding" - * CELLSPACING="cellspacing" SUMMARY="summary"> tag. - * - * @param border Border size. - * @param cellpadding Cellpadding for the table cells. - * @param cellspacing Cellspacing for the table cells. - * @param summary Table summary. - */ - public void table(int border, int cellpadding, int cellspacing, String summary) { - println(DocletConstants.NL + - "
    "); - } - - /** - * Print HTML <TABLE BORDER="border" WIDTH="width"> - * - * @param border Border size. - * @param width Width of the table. - */ - public void table(int border, String width) { - println(DocletConstants.NL + - "
    "); - } - - /** - * Print the HTML table tag with border size 0 and width 100%. - */ - public void table() { - table(0, "100%"); - } - - /** - * Print </TABLE> tag. Add a newline character at the end. - */ - public void tableEnd() { - println("
    "); - } - - /** - * Print <TR> tag. Add a newline character at the end. - */ - public void tr() { - println("
  • "); - } - - /** - * Print <TD NOWRAP> tag. - */ - public void tdNowrap() { - print(""); - } - - /** - * Print <TD WIDTH="width"> tag. - * - * @param width String width. - */ - public void tdWidth(String width) { - print(""); - } - - /** - * Print </TD> tag. Add a newline character at the end. - */ - public void tdEnd() { - println("
    "); - } - - /** - * Print </CAPTION> tag. Add a newline character at the end. - */ - public void captionEnd() { - println("
    "); - } - - /** - * 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. - * - * @param align the align attribute. - * @param i integer. - */ - public void thAlignColspan(String align, int i) { - print(""); - } - - /** - * Print <TH align="align" NOWRAP> tag. - * - * @param align the align attribute. - */ - public void thAlignNowrap(String align) { - print(""); - } - - /** - * Print </TH> tag. Add a newline character at the end. - */ - public void thEnd() { - println(""); - } - - /** - * Print <TD BGCOLOR="color" CLASS="stylename"> tag. - * - * @param color String color. - * @param stylename String stylename. - */ - public void tdBgcolorStyle(String color, String stylename) { - print(""); - } - - /** - * Print <TD COLSPAN=i BGCOLOR="color" CLASS="stylename"> tag. - * - * @param i integer. - * @param color String color. - * @param stylename String stylename. - */ - public void tdColspanBgcolorStyle(int i, String color, String stylename) { - print(""); - } - - /** - * Print <TD ALIGN="align"> tag. Adds a newline character - * at the end. - * - * @param align String align. - */ - public void tdAlign(String align) { - print(""); - } - - /** - * Print <TD ALIGN="align" CLASS="stylename"> tag. - * - * @param align String align. - * @param stylename String stylename. - */ - public void tdVAlignClass(String align, String stylename) { - print(""); - } - - /** - * Print <TD VALIGN="valign"> tag. - * - * @param valign String valign. - */ - public void tdVAlign(String valign) { - print(""); - } - - /** - * Print <TD ALIGN="align" VALIGN="valign"> tag. - * - * @param align String align. - * @param valign String valign. - */ - public void tdAlignVAlign(String align, String valign) { - print(""); - } - - /** - * Print <TD ALIGN="align" ROWSPAN=rowspan> tag. - * - * @param align String align. - * @param rowspan integer rowspan. - */ - public void tdAlignRowspan(String align, int rowspan) { - print(""); - } - - /** - * Print <TD ALIGN="align" VALIGN="valign" ROWSPAN=rowspan> tag. - * - * @param align String align. - * @param valign String valign. - * @param rowspan integer rowspan. - */ - public void tdAlignVAlignRowspan(String align, String valign, - int rowspan) { - print(""); - } - - /** - * Print <BLOCKQUOTE> tag. Add a newline character at the end. - */ - public void blockquote() { - println("
    "); - } - - /** - * Print </BLOCKQUOTE> tag. Add a newline character at the end. - */ - public void blockquoteEnd() { - println("
    "); - } - - /** - * Get the "<code>" string. - * - * @return String Return String "<code>"; - */ - public String getCode() { - return ""; - } - - /** - * Get the "</code>" string. - * - * @return String Return String "</code>"; - */ - public String getCodeEnd() { - return ""; - } - - /** - * Print <NOFRAMES> tag. Add a newline character at the end. - */ - public void noFrames() { - println(""); - } - - /** - * Print &lt;/NOFRAMES&gt; tag. Add a newline character at the end. - */ - public void noFramesEnd() { - println(""); - } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java index 203303a03f3..b65740edf87 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java @@ -153,7 +153,7 @@ public interface AnnotationTypeWriter { * * @param contentTree content tree that will be printed as a document */ - public void printDocument(Content contentTree) throws IOException ; + public void printDocument(Content contentTree) throws IOException; /** * Close the writer. From 336948d5145438df3f96a9bfd61d50d41bf745e2 Mon Sep 17 00:00:00 2001 From: Alexander Zuev Date: Wed, 17 Oct 2012 14:32:15 +0400 Subject: [PATCH 053/241] 7175704: [macosx] "8" PIT: NPE in GetDisplayMode fullscreen test Reviewed-by: serb, leonidr --- jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java b/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java index 431a1e000d4..6cdebce8f09 100644 --- a/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java +++ b/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java @@ -194,6 +194,9 @@ public class CGraphicsDevice extends GraphicsDevice { @Override public void setDisplayMode(DisplayMode dm) { + if (dm == null) { + throw new IllegalArgumentException("Invalid display mode"); + } nativeSetDisplayMode(displayID, dm.getWidth(), dm.getHeight(), dm.getBitDepth(), dm.getRefreshRate()); if (isFullScreenSupported() && getFullScreenWindow() != null) { getFullScreenWindow().setSize(dm.getWidth(), dm.getHeight()); From 721264460ada4f9e32f01fc3da5ed014bb6a4706 Mon Sep 17 00:00:00 2001 From: Alexander Scherbatiy Date: Wed, 17 Oct 2012 17:33:26 +0400 Subject: [PATCH 054/241] 8000969: [macosx] Directories are not deselected when JFileChooser has FILES_ONLY selection mode Reviewed-by: rupashka --- .../classes/com/apple/laf/AquaFileChooserUI.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/jdk/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java b/jdk/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java index f5dba5bd1c5..b7598f99d6d 100644 --- a/jdk/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java +++ b/jdk/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java @@ -379,6 +379,19 @@ public class AquaFileChooserUI extends FileChooserUI { } } updateButtonState(getFileChooser()); + } else if (prop.equals(JFileChooser.SELECTED_FILES_CHANGED_PROPERTY)) { + JFileChooser fileChooser = getFileChooser(); + if (!fileChooser.isDirectorySelectionEnabled()) { + final File[] files = (File[]) e.getNewValue(); + if (files != null) { + for (int selectedRow : fFileList.getSelectedRows()) { + File file = (File) fFileList.getValueAt(selectedRow, 0); + if (fileChooser.isTraversable(file)) { + fFileList.removeSelectedIndex(selectedRow); + } + } + } + } } else if (prop.equals(JFileChooser.DIRECTORY_CHANGED_PROPERTY)) { fFileList.clearSelection(); final File currentDirectory = getFileChooser().getCurrentDirectory(); From 45dd15087f81d87670b075d120c7ef99c65b5f31 Mon Sep 17 00:00:00 2001 From: Alexander Scherbatiy Date: Wed, 17 Oct 2012 10:16:26 -0400 Subject: [PATCH 055/241] 8000626: Implement dead key detection for KeyEvent on Linux Reviewed-by: kizune --- .../solaris/classes/sun/awt/X11/XKeysym.java | 19 +++++++ .../solaris/classes/sun/awt/X11/XWindow.java | 24 ++++++--- .../solaris/classes/sun/awt/X11/keysym2ucs.h | 54 ++++++++++++------- 3 files changed, 71 insertions(+), 26 deletions(-) diff --git a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java index 6ba84a8800e..7d63625d8c6 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java @@ -379,6 +379,25 @@ public class XKeysym { keysym2UCSHash.put( (long)0xFFB8, (char)0x0038); // XK_KP_8 --> DIGIT EIGHT keysym2UCSHash.put( (long)0xFFB9, (char)0x0039); // XK_KP_9 --> DIGIT NINE keysym2UCSHash.put( (long)0xFE20, (char)0x0009); // XK_ISO_Left_Tab --> + keysym2UCSHash.put( (long)0xFE50, (char)0x02CB); // XK_dead_grave --> MODIFIER LETTER GRAVE ACCENT + keysym2UCSHash.put( (long)0xFE51, (char)0x02CA); // XK_dead_acute --> MODIFIER LETTER ACUTE ACCENT + keysym2UCSHash.put( (long)0xFE52, (char)0x02C6); // XK_dead_circumflex --> MODIFIER LETTER CIRCUMFLEX ACCENT + keysym2UCSHash.put( (long)0xFE53, (char)0x02DC); // XK_dead_tilde --> SMALL TILDE + keysym2UCSHash.put( (long)0xFE54, (char)0x02C9); // XK_dead_macron --> MODIFIER LETTER MACRON + keysym2UCSHash.put( (long)0xFE55, (char)0x02D8); // XK_dead_breve --> BREVE + keysym2UCSHash.put( (long)0xFE56, (char)0x02D9); // XK_dead_abovedot --> DOT ABOVE + keysym2UCSHash.put( (long)0xFE57, (char)0x00A8); // XK_dead_diaeresis --> DIAERESIS + keysym2UCSHash.put( (long)0xFE58, (char)0x02DA); // XK_dead_abovering --> RING ABOVE + keysym2UCSHash.put( (long)0xFE59, (char)0x02DD); // XK_dead_doubleacute --> DOUBLE ACUTE ACCENT + keysym2UCSHash.put( (long)0xFE5A, (char)0x02C7); // XK_dead_caron --> CARON + keysym2UCSHash.put( (long)0xFE5B, (char)0x00B8); // XK_dead_cedilla --> CEDILLA + keysym2UCSHash.put( (long)0xFE5C, (char)0x02DB); // XK_dead_ogonek --> OGONEK + keysym2UCSHash.put( (long)0xFE5D, (char)0x0269); // XK_dead_iota --> LATIN SMALL LETTER IOTA + keysym2UCSHash.put( (long)0xFE5E, (char)0x3099); // XK_dead_voiced_sound --> COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + keysym2UCSHash.put( (long)0xFE5F, (char)0x309A); // XK_dead_semivoiced_sound --> COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + keysym2UCSHash.put( (long)0xFE60, (char)0x0323); // XK_dead_belowdot --> COMBINING DOT BELOW + keysym2UCSHash.put( (long)0xFE61, (char)0x0321); // XK_dead_hook --> COMBINING PALATALIZED HOOK BELOW + keysym2UCSHash.put( (long)0xFE62, (char)0x031B); // XK_dead_horn --> COMBINING HORN keysym2UCSHash.put( (long)0x1a1, (char)0x0104); // XK_Aogonek --> LATIN CAPITAL LETTER A WITH OGONEK keysym2UCSHash.put( (long)0x1a2, (char)0x02d8); // XK_breve --> BREVE keysym2UCSHash.put( (long)0x1a3, (char)0x0141); // XK_Lstroke --> LATIN CAPITAL LETTER L WITH STROKE diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java index a4c039c2074..0eebbd45c9a 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java @@ -1115,7 +1115,10 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // (1) either XIM could not handle it or // (2) it was Latin 1:1 mapping. // - XKeysym.Keysym2JavaKeycode jkc = XKeysym.getJavaKeycode(ev); + // Preserve modifiers to get Java key code for dead keys + boolean isDeadKey = isDeadKey(keysym[0]); + XKeysym.Keysym2JavaKeycode jkc = isDeadKey ? XKeysym.getJavaKeycode(keysym[0]) + : XKeysym.getJavaKeycode(ev); if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } @@ -1141,7 +1144,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED, ev.get_time(), - jkeyToReturn, + isDeadKey ? jkeyExtended : jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), @@ -1149,7 +1152,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { jkeyExtended); - if( unicodeKey > 0 ) { + if (unicodeKey > 0 && !isDeadKey) { keyEventLog.fine("fire _TYPED on "+unicodeKey); postKeyEvent( java.awt.event.KeyEvent.KEY_TYPED, ev.get_time(), @@ -1176,9 +1179,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]; int unicodeKey = 0; - keysym[0] = XConstants.NoSymbol; if (keyEventLog.isLoggable(PlatformLogger.FINE)) { logIncomingKeyEvent( ev ); @@ -1187,7 +1188,11 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // and Java KeyEvent keycode should be calculated. // For release we should post released event. // - XKeysym.Keysym2JavaKeycode jkc = XKeysym.getJavaKeycode(ev); + // Preserve modifiers to get Java key code for dead keys + long keysym = xkeycodeToKeysym(ev); + boolean isDeadKey = isDeadKey(keysym); + XKeysym.Keysym2JavaKeycode jkc = isDeadKey ? XKeysym.getJavaKeycode(keysym) + : XKeysym.getJavaKeycode(ev); if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } @@ -1219,7 +1224,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED, ev.get_time(), - jkeyToReturn, + isDeadKey ? jkeyExtended : jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), @@ -1229,6 +1234,11 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } + + private boolean isDeadKey(long keysym){ + return XKeySymConstants.XK_dead_grave <= keysym && keysym <= XKeySymConstants.XK_dead_semivoiced_sound; + } + /* * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are * unreliable, since mapping changes can happen for a virtual desktop diff --git a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h index deb7a8d0864..f8168876f72 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h +++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h @@ -695,25 +695,25 @@ SOFTWARE. 0x0000 #define XK_ISO_Center_Object 0xFE33 0x0000 #define XK_ISO_Enter 0xFE34 -0x0000 #define XK_dead_grave 0xFE50 -0x0000 #define XK_dead_acute 0xFE51 -0x0000 #define XK_dead_circumflex 0xFE52 -0x0000 #define XK_dead_tilde 0xFE53 -0x0000 #define XK_dead_macron 0xFE54 -0x0000 #define XK_dead_breve 0xFE55 -0x0000 #define XK_dead_abovedot 0xFE56 -0x0000 #define XK_dead_diaeresis 0xFE57 -0x0000 #define XK_dead_abovering 0xFE58 -0x0000 #define XK_dead_doubleacute 0xFE59 -0x0000 #define XK_dead_caron 0xFE5A -0x0000 #define XK_dead_cedilla 0xFE5B -0x0000 #define XK_dead_ogonek 0xFE5C -0x0000 #define XK_dead_iota 0xFE5D -0x0000 #define XK_dead_voiced_sound 0xFE5E -0x0000 #define XK_dead_semivoiced_sound 0xFE5F -0x0000 #define XK_dead_belowdot 0xFE60 -0x0000 #define XK_dead_hook 0xFE61 -0x0000 #define XK_dead_horn 0xFE62 +0x02CB #define XK_dead_grave 0xFE50 +0x02CA #define XK_dead_acute 0xFE51 +0x02C6 #define XK_dead_circumflex 0xFE52 +0x02DC #define XK_dead_tilde 0xFE53 +0x02C9 #define XK_dead_macron 0xFE54 +0x02D8 #define XK_dead_breve 0xFE55 +0x02D9 #define XK_dead_abovedot 0xFE56 +0x00A8 #define XK_dead_diaeresis 0xFE57 +0x02DA #define XK_dead_abovering 0xFE58 +0x02DD #define XK_dead_doubleacute 0xFE59 +0x02C7 #define XK_dead_caron 0xFE5A +0x00B8 #define XK_dead_cedilla 0xFE5B +0x02DB #define XK_dead_ogonek 0xFE5C +0x0269 #define XK_dead_iota 0xFE5D +0x3099 #define XK_dead_voiced_sound 0xFE5E +0x309A #define XK_dead_semivoiced_sound 0xFE5F +0x0323 #define XK_dead_belowdot 0xFE60 +0x0321 #define XK_dead_hook 0xFE61 +0x031B #define XK_dead_horn 0xFE62 0x0000 #define XK_First_Virtual_Screen 0xFED0 0x0000 #define XK_Prev_Virtual_Screen 0xFED1 @@ -2466,6 +2466,7 @@ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Alt_ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Meta_L), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_META, java.awt.event.KeyEvent.KEY_LOCATION_LEFT)); tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Meta_R), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_META, java.awt.event.KeyEvent.KEY_LOCATION_RIGHT)); tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Caps_Lock), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CAPS_LOCK, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Shift_Lock), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CAPS_LOCK, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); tojava tojava /* Misc Functions */ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Print), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_PRINTSCREEN, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); @@ -2640,6 +2641,21 @@ tojava /* Type 5c Japanese keyboard: henkan */ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kanji), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CONVERT, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); tojava /* Type 5c Japanese keyboard: nihongo */ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Henkan_Mode), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_INPUT_METHOD_ON_OFF, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Eisu_Shift ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_ALPHANUMERIC , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Eisu_toggle ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_ALPHANUMERIC , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Zenkaku ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_FULL_WIDTH , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Hankaku ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_HALF_WIDTH , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Hiragana ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_HIRAGANA , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Katakana ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KATAKANA , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Romaji ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_JAPANESE_ROMAN , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kana_Shift ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KANA , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kana_Lock ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KANA_LOCK , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Muhenkan ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_NONCONVERT , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Zen_Koho ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_ALL_CANDIDATES , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kanji_Bangou ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CODE_INPUT , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Mae_Koho ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_PREVIOUS_CANDIDATE , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava +tojava tojava /* VK_KANA_LOCK is handled separately because it generates the tojava * same keysym as ALT_GRAPH in spite of its different behavior. tojava */ From 953bec36abbe6a1cf4f291a5f41a03e77a9f13f6 Mon Sep 17 00:00:00 2001 From: Nils Loodin Date: Wed, 17 Oct 2012 17:36:48 +0200 Subject: [PATCH 056/241] 8000617: It should be possible to allocate memory without the VM dying Reviewed-by: coleenp, kamg --- hotspot/src/share/vm/memory/allocation.cpp | 39 ++++++++++++++--- hotspot/src/share/vm/memory/allocation.hpp | 42 ++++++++++++++----- .../src/share/vm/memory/allocation.inline.hpp | 16 ++++--- hotspot/src/share/vm/memory/resourceArea.cpp | 12 +++--- hotspot/src/share/vm/memory/resourceArea.hpp | 4 +- hotspot/src/share/vm/runtime/thread.cpp | 5 ++- hotspot/src/share/vm/runtime/thread.hpp | 2 +- 7 files changed, 87 insertions(+), 33 deletions(-) diff --git a/hotspot/src/share/vm/memory/allocation.cpp b/hotspot/src/share/vm/memory/allocation.cpp index b5067c2f6ea..56c7b63fbe5 100644 --- a/hotspot/src/share/vm/memory/allocation.cpp +++ b/hotspot/src/share/vm/memory/allocation.cpp @@ -92,6 +92,26 @@ void* ResourceObj::operator new(size_t size, allocation_type type, MEMFLAGS flag return res; } +void* ResourceObj::operator new(size_t size, const std::nothrow_t& nothrow_constant, + allocation_type type, MEMFLAGS flags) { + //should only call this with std::nothrow, use other operator new() otherwise + address res; + switch (type) { + case C_HEAP: + res = (address)AllocateHeap(size, flags, CALLER_PC, AllocFailStrategy::RETURN_NULL); + DEBUG_ONLY(if (res!= NULL) set_allocation_type(res, C_HEAP);) + break; + case RESOURCE_AREA: + // new(size) sets allocation type RESOURCE_AREA. + res = (address)operator new(size, std::nothrow); + break; + default: + ShouldNotReachHere(); + } + return res; +} + + void ResourceObj::operator delete(void* p) { assert(((ResourceObj *)p)->allocated_on_C_heap(), "delete only allowed for C_HEAP objects"); @@ -506,7 +526,7 @@ void Arena::signal_out_of_memory(size_t sz, const char* whence) const { } // Grow a new Chunk -void* Arena::grow( size_t x ) { +void* Arena::grow(size_t x, AllocFailType alloc_failmode) { // Get minimal required size. Either real big, or even bigger for giant objs size_t len = MAX2(x, (size_t) Chunk::size); @@ -514,7 +534,10 @@ void* Arena::grow( size_t x ) { _chunk = new (len) Chunk(len); if (_chunk == NULL) { - signal_out_of_memory(len * Chunk::aligned_overhead_size(), "Arena::grow"); + if (alloc_failmode == AllocFailStrategy::EXIT_OOM) { + signal_out_of_memory(len * Chunk::aligned_overhead_size(), "Arena::grow"); + } + return NULL; } if (k) k->set_next(_chunk); // Append new chunk to end of linked list else _first = _chunk; @@ -529,13 +552,16 @@ void* Arena::grow( size_t x ) { // Reallocate storage in Arena. -void *Arena::Arealloc(void* old_ptr, size_t old_size, size_t new_size) { +void *Arena::Arealloc(void* old_ptr, size_t old_size, size_t new_size, AllocFailType alloc_failmode) { assert(new_size >= 0, "bad size"); if (new_size == 0) return NULL; #ifdef ASSERT if (UseMallocOnly) { // always allocate a new object (otherwise we'll free this one twice) - char* copy = (char*)Amalloc(new_size); + char* copy = (char*)Amalloc(new_size, alloc_failmode); + if (copy == NULL) { + return NULL; + } size_t n = MIN2(old_size, new_size); if (n > 0) memcpy(copy, old_ptr, n); Afree(old_ptr,old_size); // Mostly done to keep stats accurate @@ -561,7 +587,10 @@ void *Arena::Arealloc(void* old_ptr, size_t old_size, size_t new_size) { } // Oops, got to relocate guts - void *new_ptr = Amalloc(new_size); + void *new_ptr = Amalloc(new_size, alloc_failmode); + if (new_ptr == NULL) { + return NULL; + } memcpy( new_ptr, c_old, old_size ); Afree(c_old,old_size); // Mostly done to keep stats accurate return new_ptr; diff --git a/hotspot/src/share/vm/memory/allocation.hpp b/hotspot/src/share/vm/memory/allocation.hpp index 6bae79f8133..30662b8e5da 100644 --- a/hotspot/src/share/vm/memory/allocation.hpp +++ b/hotspot/src/share/vm/memory/allocation.hpp @@ -53,6 +53,12 @@ #endif #endif +class AllocFailStrategy { +public: + enum AllocFailEnum { EXIT_OOM, RETURN_NULL }; +}; +typedef AllocFailStrategy::AllocFailEnum AllocFailType; + // All classes in the virtual machine must be subclassed // by one of the following allocation classes: // @@ -315,7 +321,8 @@ protected: Chunk *_first; // First chunk Chunk *_chunk; // current chunk char *_hwm, *_max; // High water mark and max in current chunk - void* grow(size_t x); // Get a new Chunk of at least size x + // Get a new Chunk of at least size x + void* grow(size_t x, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM); size_t _size_in_bytes; // Size of arena (used for native memory tracking) NOT_PRODUCT(static julong _bytes_allocated;) // total #bytes allocated since start @@ -350,14 +357,14 @@ protected: void operator delete(void* p); // Fast allocate in the arena. Common case is: pointer test + increment. - void* Amalloc(size_t x) { + void* Amalloc(size_t x, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) { assert(is_power_of_2(ARENA_AMALLOC_ALIGNMENT) , "should be a power of 2"); x = ARENA_ALIGN(x); debug_only(if (UseMallocOnly) return malloc(x);) check_for_overflow(x, "Arena::Amalloc"); NOT_PRODUCT(inc_bytes_allocated(x);) if (_hwm + x > _max) { - return grow(x); + return grow(x, alloc_failmode); } else { char *old = _hwm; _hwm += x; @@ -365,13 +372,13 @@ protected: } } // Further assume size is padded out to words - void *Amalloc_4(size_t x) { + void *Amalloc_4(size_t x, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) { assert( (x&(sizeof(char*)-1)) == 0, "misaligned size" ); debug_only(if (UseMallocOnly) return malloc(x);) check_for_overflow(x, "Arena::Amalloc_4"); NOT_PRODUCT(inc_bytes_allocated(x);) if (_hwm + x > _max) { - return grow(x); + return grow(x, alloc_failmode); } else { char *old = _hwm; _hwm += x; @@ -381,7 +388,7 @@ protected: // Allocate with 'double' alignment. It is 8 bytes on sparc. // In other cases Amalloc_D() should be the same as Amalloc_4(). - void* Amalloc_D(size_t x) { + void* Amalloc_D(size_t x, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) { assert( (x&(sizeof(char*)-1)) == 0, "misaligned size" ); debug_only(if (UseMallocOnly) return malloc(x);) #if defined(SPARC) && !defined(_LP64) @@ -392,7 +399,7 @@ protected: check_for_overflow(x, "Arena::Amalloc_D"); NOT_PRODUCT(inc_bytes_allocated(x);) if (_hwm + x > _max) { - return grow(x); // grow() returns a result aligned >= 8 bytes. + return grow(x, alloc_failmode); // grow() returns a result aligned >= 8 bytes. } else { char *old = _hwm; _hwm += x; @@ -412,7 +419,8 @@ protected: if (((char*)ptr) + size == _hwm) _hwm = (char*)ptr; } - void *Arealloc( void *old_ptr, size_t old_size, size_t new_size ); + void *Arealloc( void *old_ptr, size_t old_size, size_t new_size, + AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM); // Move contents of this arena into an empty arena Arena *move_contents(Arena *empty_arena); @@ -458,9 +466,12 @@ private: //%note allocation_1 -extern char* resource_allocate_bytes(size_t size); -extern char* resource_allocate_bytes(Thread* thread, size_t size); -extern char* resource_reallocate_bytes( char *old, size_t old_size, size_t new_size); +extern char* resource_allocate_bytes(size_t size, + AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM); +extern char* resource_allocate_bytes(Thread* thread, size_t size, + AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM); +extern char* resource_reallocate_bytes( char *old, size_t old_size, size_t new_size, + AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM); extern void resource_free_bytes( char *old, size_t size ); //---------------------------------------------------------------------- @@ -496,6 +507,8 @@ class ResourceObj ALLOCATION_SUPER_CLASS_SPEC { public: void* operator new(size_t size, allocation_type type, MEMFLAGS flags); + void* operator new(size_t size, const std::nothrow_t& nothrow_constant, + allocation_type type, MEMFLAGS flags); void* operator new(size_t size, Arena *arena) { address res = (address)arena->Amalloc(size); DEBUG_ONLY(set_allocation_type(res, ARENA);) @@ -506,6 +519,13 @@ class ResourceObj ALLOCATION_SUPER_CLASS_SPEC { DEBUG_ONLY(set_allocation_type(res, RESOURCE_AREA);) return res; } + + void* operator new(size_t size, const std::nothrow_t& nothrow_constant) { + address res = (address)resource_allocate_bytes(size, AllocFailStrategy::RETURN_NULL); + DEBUG_ONLY(if (res != NULL) set_allocation_type(res, RESOURCE_AREA);) + return res; + } + void operator delete(void* p); }; diff --git a/hotspot/src/share/vm/memory/allocation.inline.hpp b/hotspot/src/share/vm/memory/allocation.inline.hpp index 804faa2a17a..ead6fb12b21 100644 --- a/hotspot/src/share/vm/memory/allocation.inline.hpp +++ b/hotspot/src/share/vm/memory/allocation.inline.hpp @@ -48,7 +48,8 @@ inline void inc_stat_counter(volatile julong* dest, julong add_value) { #endif // allocate using malloc; will fail if no memory available -inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0) { +inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0, + AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) { if (pc == 0) { pc = CURRENT_PC; } @@ -56,16 +57,17 @@ inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0) { #ifdef ASSERT if (PrintMallocFree) trace_heap_malloc(size, "AllocateHeap", p); #endif - if (p == NULL) vm_exit_out_of_memory(size, "AllocateHeap"); + if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) vm_exit_out_of_memory(size, "AllocateHeap"); return p; } -inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flags) { +inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flags, + AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) { char* p = (char*) os::realloc(old, size, flags, CURRENT_PC); #ifdef ASSERT if (PrintMallocFree) trace_heap_malloc(size, "ReallocateHeap", p); #endif - if (p == NULL) vm_exit_out_of_memory(size, "ReallocateHeap"); + if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) vm_exit_out_of_memory(size, "ReallocateHeap"); return p; } @@ -91,11 +93,13 @@ template void* CHeapObj::operator new(size_t size, template void* CHeapObj::operator new (size_t size, const std::nothrow_t& nothrow_constant, address caller_pc) { #ifdef ASSERT - void* p = os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC)); + void* p = (void*)AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC), + AllocFailStrategy::RETURN_NULL); if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p); return p; #else - return os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC)); + return (void *) AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC), + AllocFailStrategy::RETURN_NULL); #endif } diff --git a/hotspot/src/share/vm/memory/resourceArea.cpp b/hotspot/src/share/vm/memory/resourceArea.cpp index 28d5943b592..12a56d0f4be 100644 --- a/hotspot/src/share/vm/memory/resourceArea.cpp +++ b/hotspot/src/share/vm/memory/resourceArea.cpp @@ -45,15 +45,15 @@ debug_only(int ResourceArea::_warned;) // to suppress multiple warnings // The following routines are declared in allocation.hpp and used everywhere: // Allocation in thread-local resource area -extern char* resource_allocate_bytes(size_t size) { - return Thread::current()->resource_area()->allocate_bytes(size); +extern char* resource_allocate_bytes(size_t size, AllocFailType alloc_failmode) { + return Thread::current()->resource_area()->allocate_bytes(size, alloc_failmode); } -extern char* resource_allocate_bytes(Thread* thread, size_t size) { - return thread->resource_area()->allocate_bytes(size); +extern char* resource_allocate_bytes(Thread* thread, size_t size, AllocFailType alloc_failmode) { + return thread->resource_area()->allocate_bytes(size, alloc_failmode); } -extern char* resource_reallocate_bytes( char *old, size_t old_size, size_t new_size){ - return (char*)Thread::current()->resource_area()->Arealloc(old, old_size, new_size); +extern char* resource_reallocate_bytes( char *old, size_t old_size, size_t new_size, AllocFailType alloc_failmode){ + return (char*)Thread::current()->resource_area()->Arealloc(old, old_size, new_size, alloc_failmode); } extern void resource_free_bytes( char *old, size_t size ) { diff --git a/hotspot/src/share/vm/memory/resourceArea.hpp b/hotspot/src/share/vm/memory/resourceArea.hpp index 567f41d400a..f42c0f62457 100644 --- a/hotspot/src/share/vm/memory/resourceArea.hpp +++ b/hotspot/src/share/vm/memory/resourceArea.hpp @@ -68,7 +68,7 @@ public: debug_only(_nesting = 0;); } - char* allocate_bytes(size_t size) { + char* allocate_bytes(size_t size, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) { #ifdef ASSERT if (_nesting < 1 && !_warned++) fatal("memory leak: allocating without ResourceMark"); @@ -78,7 +78,7 @@ public: return (*save = (char*)os::malloc(size, mtThread)); } #endif - return (char*)Amalloc(size); + return (char*)Amalloc(size, alloc_failmode); } debug_only(int nesting() const { return _nesting; }); diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp index 6c46e129835..0ed9a4b1fee 100644 --- a/hotspot/src/share/vm/runtime/thread.cpp +++ b/hotspot/src/share/vm/runtime/thread.cpp @@ -177,7 +177,8 @@ void* Thread::allocate(size_t size, bool throw_excpt, MEMFLAGS flags) { const int alignment = markOopDesc::biased_lock_alignment; size_t aligned_size = size + (alignment - sizeof(intptr_t)); void* real_malloc_addr = throw_excpt? AllocateHeap(aligned_size, flags, CURRENT_PC) - : os::malloc(aligned_size, flags, CURRENT_PC); + : AllocateHeap(aligned_size, flags, CURRENT_PC, + AllocFailStrategy::RETURN_NULL); void* aligned_addr = (void*) align_size_up((intptr_t) real_malloc_addr, alignment); assert(((uintptr_t) aligned_addr + (uintptr_t) size) <= ((uintptr_t) real_malloc_addr + (uintptr_t) aligned_size), @@ -191,7 +192,7 @@ void* Thread::allocate(size_t size, bool throw_excpt, MEMFLAGS flags) { return aligned_addr; } else { return throw_excpt? AllocateHeap(size, flags, CURRENT_PC) - : os::malloc(size, flags, CURRENT_PC); + : AllocateHeap(size, flags, CURRENT_PC, AllocFailStrategy::RETURN_NULL); } } diff --git a/hotspot/src/share/vm/runtime/thread.hpp b/hotspot/src/share/vm/runtime/thread.hpp index ec2f7852fe0..ed747fb6cdd 100644 --- a/hotspot/src/share/vm/runtime/thread.hpp +++ b/hotspot/src/share/vm/runtime/thread.hpp @@ -110,7 +110,7 @@ class Thread: public ThreadShadow { void* _real_malloc_address; public: void* operator new(size_t size) { return allocate(size, true); } - void* operator new(size_t size, std::nothrow_t& nothrow_constant) { return allocate(size, false); } + void* operator new(size_t size, const std::nothrow_t& nothrow_constant) { return allocate(size, false); } void operator delete(void* p); protected: From 848ec301f2dd57683408d93c289aa87cf304d344 Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Wed, 17 Oct 2012 16:43:26 +0100 Subject: [PATCH 057/241] 7192245: Add parser support for default methods Add support for 'default' keyword in modifier position Reviewed-by: jjg --- .../com/sun/tools/javac/code/Flags.java | 12 +- .../com/sun/tools/javac/code/Source.java | 3 + .../com/sun/tools/javac/comp/Attr.java | 7 +- .../com/sun/tools/javac/comp/Check.java | 16 +- .../sun/tools/javac/parser/JavacParser.java | 13 + .../tools/javac/resources/compiler.properties | 5 + .../com/sun/tools/javac/tree/Pretty.java | 2 +- .../com/sun/tools/javac/tree/TreeInfo.java | 6 +- .../syntax/TestDefaultMethodsSyntax.java | 311 ++++++++++++++++++ .../examples/DefaultMethodNotSupported.java | 29 ++ 10 files changed, 391 insertions(+), 13 deletions(-) create mode 100644 langtools/test/tools/javac/defaultMethods/syntax/TestDefaultMethodsSyntax.java create mode 100644 langtools/test/tools/javac/diags/examples/DefaultMethodNotSupported.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java index 508937cfdc2..d1601572998 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java @@ -67,6 +67,7 @@ public class Flags { if ((mask&NATIVE) != 0) flags.add(Flag.NATIVE); if ((mask&INTERFACE) != 0) flags.add(Flag.INTERFACE); if ((mask&ABSTRACT) != 0) flags.add(Flag.ABSTRACT); + if ((mask&DEFAULT) != 0) flags.add(Flag.DEFAULT); if ((mask&STRICTFP) != 0) flags.add(Flag.STRICTFP); if ((mask&BRIDGE) != 0) flags.add(Flag.BRIDGE); if ((mask&SYNTHETIC) != 0) flags.add(Flag.SYNTHETIC); @@ -252,6 +253,11 @@ public class Flags { */ public static final long CLASH = 1L<<42; + /** + * Flag that marks either a default method or an interface containing default methods + */ + public static final long DEFAULT = 1L<<43; + /** Modifier masks. */ public static final int @@ -267,7 +273,10 @@ public class Flags { MethodFlags = AccessFlags | ABSTRACT | STATIC | NATIVE | SYNCHRONIZED | FINAL | STRICTFP; public static final long - LocalVarFlags = FINAL | PARAMETER; + ExtendedStandardFlags = (long)StandardFlags | DEFAULT, + InterfaceDefaultMethodMask = ABSTRACT | PUBLIC | STRICTFP | SYNCHRONIZED | DEFAULT, + LocalVarFlags = FINAL | PARAMETER; + public static Set asModifierSet(long flags) { Set modifiers = modifierSets.get(flags); @@ -320,6 +329,7 @@ public class Flags { NATIVE("native"), INTERFACE("interface"), ABSTRACT("abstract"), + DEFAULT("default"), STRICTFP("strictfp"), BRIDGE("bridge"), SYNTHETIC("synthetic"), diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java index 4584ea4b004..04a59cec522 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java @@ -203,6 +203,9 @@ public enum Source { public boolean allowMethodReferences() { return compareTo(JDK1_8) >= 0; } + public boolean allowDefaultMethods() { + return compareTo(JDK1_8) >= 0; + } public boolean allowEffectivelyFinalInInnerClasses() { return compareTo(JDK1_8) >= 0; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java index 754624eb4a5..1274431269d 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -873,6 +873,7 @@ public class Attr extends JCTree.Visitor { public void visitMethodDef(JCMethodDecl tree) { MethodSymbol m = tree.sym; + boolean isDefaultMethod = (m.flags() & DEFAULT) != 0; Lint lint = env.info.lint.augment(m.annotations, m.flags()); Lint prevLint = chk.setLint(lint); @@ -952,8 +953,8 @@ public class Attr extends JCTree.Visitor { // Empty bodies are only allowed for // abstract, native, or interface methods, or for methods // in a retrofit signature class. - if ((owner.flags() & INTERFACE) == 0 && - (tree.mods.flags & (ABSTRACT | NATIVE)) == 0 && + if (isDefaultMethod || ((owner.flags() & INTERFACE) == 0 && + (tree.mods.flags & (ABSTRACT | NATIVE)) == 0) && !relax) log.error(tree.pos(), "missing.meth.body.or.decl.abstract"); if (tree.defaultValue != null) { @@ -961,7 +962,7 @@ public class Attr extends JCTree.Visitor { log.error(tree.pos(), "default.allowed.in.intf.annotation.member"); } - } else if ((owner.flags() & INTERFACE) != 0) { + } else if ((owner.flags() & INTERFACE) != 0 && !isDefaultMethod) { log.error(tree.body.pos(), "intf.meth.cant.have.body"); } else if ((tree.mods.flags & ABSTRACT) != 0) { log.error(tree.pos(), "abstract.meth.cant.have.body"); 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 73f9c050790..d1679293569 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 @@ -1121,8 +1121,14 @@ public class Check { mask = PRIVATE; } else mask = ConstructorFlags; - } else if ((sym.owner.flags_field & INTERFACE) != 0) - mask = implicit = InterfaceMethodFlags; + } else if ((sym.owner.flags_field & INTERFACE) != 0) { + if ((flags & DEFAULT) != 0) { + mask = InterfaceDefaultMethodMask; + implicit = PUBLIC; + } else { + mask = implicit = InterfaceMethodFlags; + } + } else { mask = MethodFlags; } @@ -1169,7 +1175,7 @@ public class Check { default: throw new AssertionError(); } - long illegal = flags & StandardFlags & ~mask; + long illegal = flags & ExtendedStandardFlags & ~mask; if (illegal != 0) { if ((illegal & INTERFACE) != 0) { log.error(pos, "intf.not.allowed.here"); @@ -1185,7 +1191,7 @@ public class Check { // in the presence of inner classes. Should it be deleted here? checkDisjoint(pos, flags, ABSTRACT, - PRIVATE | STATIC)) + PRIVATE | STATIC | DEFAULT)) && checkDisjoint(pos, flags, ABSTRACT | INTERFACE, @@ -1209,7 +1215,7 @@ public class Check { STRICTFP))) { // skip } - return flags & (mask | ~StandardFlags) | implicit; + return flags & (mask | ~ExtendedStandardFlags) | implicit; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java index 3576e72b910..616f023dc1f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -116,6 +116,8 @@ public class JavacParser implements Parser { fac.options.isSet("allowLambda"); //pre-lambda guard this.allowMethodReferences = source.allowMethodReferences() && fac.options.isSet("allowMethodReferences"); //pre-lambda guard + this.allowDefaultMethods = source.allowDefaultMethods() && + fac.options.isSet("allowDefaultMethods"); //pre-lambda guard this.keepDocComments = keepDocComments; docComments = newDocCommentTable(keepDocComments); this.keepLineMap = keepLineMap; @@ -185,6 +187,10 @@ public class JavacParser implements Parser { */ boolean allowMethodReferences; + /** Switch: should we allow default methods in interfaces? + */ + boolean allowDefaultMethods; + /** Switch: should we keep docComments? */ boolean keepDocComments; @@ -2311,6 +2317,7 @@ public class JavacParser implements Parser { case SYNCHRONIZED: flag = Flags.SYNCHRONIZED; break; case STRICTFP : flag = Flags.STRICTFP; break; case MONKEYS_AT : flag = Flags.ANNOTATION; break; + case DEFAULT : checkDefaultMethods(); flag = Flags.DEFAULT; break; case ERROR : flag = 0; nextToken(); break; default: break loop; } @@ -3361,6 +3368,12 @@ public class JavacParser implements Parser { allowMethodReferences = true; } } + void checkDefaultMethods() { + if (!allowDefaultMethods) { + log.error(token.pos, "default.methods.not.supported.in.source", source.name); + allowDefaultMethods = true; + } + } /* * a functional source tree and end position mappings 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 5140de268de..f3495045680 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 @@ -2174,6 +2174,11 @@ compiler.err.method.references.not.supported.in.source=\ method references are not supported in -source {0}\n\ (use -source 8 or higher to enable method references) +# 0: string +compiler.err.default.methods.not.supported.in.source=\ + default methods are not supported in -source {0}\n\ + (use -source 8 or higher to enable default methods) + ######################################## # Diagnostics for verbose resolution # used by Resolve (debug only) diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java b/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java index 9fdd9e7ba90..c501f7a2e3a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java @@ -248,7 +248,7 @@ public class Pretty extends JCTree.Visitor { public void printFlags(long flags) throws IOException { if ((flags & SYNTHETIC) != 0) print("/*synthetic*/ "); print(TreeInfo.flagNames(flags)); - if ((flags & StandardFlags) != 0) print(" "); + if ((flags & ExtendedStandardFlags) != 0) print(" "); if ((flags & ANNOTATION) != 0) print("@"); } diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java index 120bf2ae434..3111b6af042 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java @@ -790,8 +790,8 @@ public class TreeInfo { * pre: flags != 0 */ public static long firstFlag(long flags) { - int flag = 1; - while ((flag & StandardFlags) != 0 && (flag & flags) == 0) + long flag = 1; + while ((flag & flags & ExtendedStandardFlags) == 0) flag = flag << 1; return flag; } @@ -799,7 +799,7 @@ public class TreeInfo { /** Return flags as a string, separated by " ". */ public static String flagNames(long flags) { - return Flags.toString(flags & StandardFlags).trim(); + return Flags.toString(flags & ExtendedStandardFlags).trim(); } /** Operator precedences values. diff --git a/langtools/test/tools/javac/defaultMethods/syntax/TestDefaultMethodsSyntax.java b/langtools/test/tools/javac/defaultMethods/syntax/TestDefaultMethodsSyntax.java new file mode 100644 index 00000000000..973e4c6f7f5 --- /dev/null +++ b/langtools/test/tools/javac/defaultMethods/syntax/TestDefaultMethodsSyntax.java @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7192245 + * @summary Automatic test for checking set of allowed modifiers on interface methods + */ + +import com.sun.source.util.JavacTask; +import java.net.URI; +import java.util.Arrays; +import java.util.List; +import javax.tools.Diagnostic; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.ToolProvider; + + +public class TestDefaultMethodsSyntax { + + static int checkCount = 0; + + enum VersionKind { + PRE_LAMBDA("7"), + LAMBDA("8"); + + String versionString; + + VersionKind(String versionString) { + this.versionString = versionString; + } + + List getOptions() { + return Arrays.asList("-XDallowDefaultMethods", "-source", versionString); + } + } + + enum ModifierKind { + NONE(""), + PUBLIC("public"), + PROTECTED("protected"), + PRIVATE("private"), + ABSTRACT("abstract"), + STATIC("static"), + NATIVE("native"), + SYNCHRONIZED("synchronized"), + FINAL("final"), + STRICTFP("strictfp"), + DEFAULT("default"); + + String modStr; + + private ModifierKind(String modStr) { + this.modStr = modStr; + } + + boolean isAllowed(EnclosingKind ek, ModifierKind otherMod) { + if (this == otherMod) return false; + switch (this) { + case NONE: + return true; + case ABSTRACT: + return otherMod != PRIVATE; + case NATIVE: + return otherMod != ABSTRACT && + otherMod != STRICTFP; + case FINAL: + case STATIC: + case SYNCHRONIZED: + case STRICTFP: + return otherMod != ABSTRACT; + case PUBLIC: + return true; + case PROTECTED: + return ek == EnclosingKind.ABSTRACT_CLASS; + case DEFAULT: + return otherMod != ABSTRACT; + default: + return true; + } + } + + static boolean intersect(ModifierKind mk, ModifierKind... mks) { + for (ModifierKind mk2 : mks) { + if (mk == mk2) return true; + } + return false; + } + + static boolean compatible(MethodKind mk, ModifierKind mod1, ModifierKind mod2, EnclosingKind ek) { + if (intersect(ABSTRACT, mod1, mod2) || intersect(NATIVE, mod1, mod2)) { + return mk == MethodKind.NO_BODY; + } else if (intersect(DEFAULT, mod1, mod2)) { + return mk == MethodKind.BODY; + } else { + return ek == EnclosingKind.INTERFACE ? + mk == MethodKind.NO_BODY : mk == MethodKind.BODY; + } + } + + boolean compatible(EnclosingKind ek) { + switch (this) { + case STATIC: + case PRIVATE: + case PROTECTED: + return ek != EnclosingKind.INTERFACE; + default: + return true; + } + } + + static boolean compatible(ModifierKind m1, ModifierKind m2, EnclosingKind ek) { + Result res1 = allowedModifierPairs[m1.ordinal()][m2.ordinal()]; + Result res2 = allowedModifierPairs[m2.ordinal()][m1.ordinal()]; + if (res1 != res2) { + throw new AssertionError(String.format("Ill-formed table: [%s,%s] != [%s,%s]", m1, m2, m2, m1)); + } else { + return res1.compatible(ek, m1, m2); + } + } + + interface Result { + boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2); + } + + static final Result T = new Result() { + @Override + public boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2) { + return true; + } + }; + + static final Result F = new Result() { + @Override + public boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2) { + return false; + } + }; + + static final Result C = new Result() { + @Override + public boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2) { + return ek != EnclosingKind.INTERFACE; + } + }; + + static final Result I = new Result() { + @Override + public boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2) { + return ek == EnclosingKind.INTERFACE; + } + }; + + static Result[][] allowedModifierPairs = { + /* NONE PUBLIC PROTECTED PRIVATE ABSTRACT STATIC NATIVE SYNCHRONIZED FINAL STRICTFP DEFAULT */ + /* NONE */ { T , T , C , C , T , C , C , C , C , C , I }, + /* PUBLIC */ { T , F , F , F , T , C , C , C , C , C , I }, + /* PROTECTED */ { C , F , F , F , C , C , C , C , C , C , F }, + /* PRIVATE */ { C , F , F , F , F , C , C , C , C , C , F }, + /* ABSTRACT */ { T , T , C , F , F , F , F , F , F , F , F }, + /* STATIC */ { C , C , C , C , F , F , C , C , C , C , F }, + /* NATIVE */ { C , C , C , C , F , C , F , C , C , F , F }, + /* SYNCHRONIZED */ { C , C , C , C , F , C , C , F , C , C , I }, + /* FINAL */ { C , C , C , C , F , C , C , C , F , C , F }, + /* STRICTFP */ { C , C , C , C , F , C , F , C , C , F , I }, + /* DEFAULT */ { I , I , F , F , F , F , F , I , F , I , F }}; + } + + enum MethodKind { + NO_BODY("void m();"), + BODY("void m() { }"); + + String methStr; + + private MethodKind(String methStr) { + this.methStr = methStr; + } + } + + enum EnclosingKind { + ABSTRACT_CLASS("abstract class Test "), + INTERFACE("interface Test "); + + String enclStr; + + EnclosingKind(String enclStr) { + this.enclStr = enclStr; + } + } + + public static void main(String... args) throws Exception { + + //create default shared JavaCompiler - reused across multiple compilations + JavaCompiler comp = ToolProvider.getSystemJavaCompiler(); + StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null); + + for (VersionKind vk : VersionKind.values()) { + for (EnclosingKind ek : EnclosingKind.values()) { + for (MethodKind mk : MethodKind.values()) { + for (ModifierKind modk1 : ModifierKind.values()) { + for (ModifierKind modk2 : ModifierKind.values()) { + new TestDefaultMethodsSyntax(vk, ek, mk, modk1, modk2).run(comp, fm); + } + } + } + } + } + System.out.println("Total check executed: " + checkCount); + } + + VersionKind vk; + EnclosingKind ek; + MethodKind mk; + ModifierKind modk1, modk2; + JavaSource source; + DiagnosticChecker diagChecker; + + TestDefaultMethodsSyntax(VersionKind vk, EnclosingKind ek, MethodKind mk, ModifierKind modk1, ModifierKind modk2) { + this.vk = vk; + this.ek = ek; + this.mk = mk; + this.modk1 = modk1; + this.modk2 = modk2; + this.source = new JavaSource(); + this.diagChecker = new DiagnosticChecker(); + } + + class JavaSource extends SimpleJavaFileObject { + + String template = "#EK {\n" + + " #MOD1 #MOD2 #METH\n" + + "}\n"; + + String source; + + public JavaSource() { + super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); + source = template.replaceAll("#EK", ek.enclStr) + .replaceAll("#MOD1", modk1.modStr) + .replaceAll("#MOD2", modk2.modStr) + .replaceAll("#METH", mk.methStr); + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return source; + } + } + + void run(JavaCompiler tool, StandardJavaFileManager fm) throws Exception { + JavacTask ct = (JavacTask)tool.getTask(null, fm, diagChecker, + vk.getOptions(), null, Arrays.asList(source)); + try { + ct.analyze(); + } catch (Throwable ex) { + throw new AssertionError("Error thrown when analyzing the following source:\n" + source.getCharContent(true)); + } + check(); + } + + void check() { + boolean errorExpected = !ModifierKind.compatible(modk1, modk2, ek); + + errorExpected |= !ModifierKind.compatible(mk, modk1, modk2, ek); + + errorExpected |= !modk1.compatible(ek) || !modk2.compatible(ek); + + errorExpected |= ModifierKind.intersect(ModifierKind.DEFAULT, modk1, modk2) && + vk == VersionKind.PRE_LAMBDA; + + checkCount++; + if (diagChecker.errorFound != errorExpected) { + throw new AssertionError("Problem when compiling source:\n" + source.getCharContent(true) + + "\nfound error: " + diagChecker.errorFound); + } + } + + static class DiagnosticChecker implements javax.tools.DiagnosticListener { + + boolean errorFound; + + public void report(Diagnostic diagnostic) { + if (diagnostic.getKind() == Diagnostic.Kind.ERROR) { + errorFound = true; + } + } + } +} diff --git a/langtools/test/tools/javac/diags/examples/DefaultMethodNotSupported.java b/langtools/test/tools/javac/diags/examples/DefaultMethodNotSupported.java new file mode 100644 index 00000000000..6e479993529 --- /dev/null +++ b/langtools/test/tools/javac/diags/examples/DefaultMethodNotSupported.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// key: compiler.err.default.methods.not.supported.in.source +// options: -source 7 -Xlint:-options + +interface DefaultMethodNotSupported { + default void m() { } +} From 2d3b78abcca17803f8cf29ede1d6e43f3eec745c Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Wed, 17 Oct 2012 12:09:32 -0700 Subject: [PATCH 058/241] 8000623: tools/javac/Diagnostics/6769027/T6769027.java crashes in PSPromotionManager::copy_to_survivor_space Fix type of method pointer load from vtable. Reviewed-by: twisti, johnc, roland --- hotspot/src/share/vm/opto/compile.cpp | 2 +- hotspot/src/share/vm/opto/compile.hpp | 2 +- hotspot/src/share/vm/opto/library_call.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp index d870872a9d4..c4da70ee32c 100644 --- a/hotspot/src/share/vm/opto/compile.cpp +++ b/hotspot/src/share/vm/opto/compile.cpp @@ -3047,9 +3047,9 @@ bool Compile::Constant::operator==(const Constant& other) { case T_LONG: case T_DOUBLE: return (_v._value.j == other._v._value.j); case T_OBJECT: - case T_METADATA: return (_v._metadata == other._v._metadata); case T_ADDRESS: return (_v._value.l == other._v._value.l); case T_VOID: return (_v._value.l == other._v._value.l); // jump-table entries + case T_METADATA: return (_v._metadata == other._v._metadata); default: ShouldNotReachHere(); } return false; diff --git a/hotspot/src/share/vm/opto/compile.hpp b/hotspot/src/share/vm/opto/compile.hpp index 6bcf3d3da20..44bf277689c 100644 --- a/hotspot/src/share/vm/opto/compile.hpp +++ b/hotspot/src/share/vm/opto/compile.hpp @@ -149,7 +149,7 @@ class Compile : public Phase { private: BasicType _type; union { - jvalue _value; + jvalue _value; Metadata* _metadata; } _v; int _offset; // offset of this constant (in bytes) relative to the constant table base. diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index f34df79b476..4f24d88f1bf 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -3830,7 +3830,7 @@ Node* LibraryCallKit::generate_virtual_guard(Node* obj_klass, vtable_index*vtableEntry::size()) * wordSize + vtableEntry::method_offset_in_bytes(); Node* entry_addr = basic_plus_adr(obj_klass, entry_offset); - Node* target_call = make_load(NULL, entry_addr, TypeInstPtr::NOTNULL, T_OBJECT); + Node* target_call = make_load(NULL, entry_addr, TypePtr::NOTNULL, T_ADDRESS); // Compare the target method with the expected method (e.g., Object.hashCode). const TypePtr* native_call_addr = TypeMetadataPtr::make(method); From 80d1115eb73f08de58e3c7778d98831db43e62e3 Mon Sep 17 00:00:00 2001 From: Alexander Scherbatiy Date: Thu, 18 Oct 2012 17:50:43 +0400 Subject: [PATCH 059/241] 7199708: FileChooser crashs when opening large folder Reviewed-by: bagiras --- .../classes/sun/awt/shell/Win32ShellFolder2.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java index 06331ba973b..c6cde3c73f4 100644 --- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java +++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java @@ -1099,7 +1099,7 @@ final class Win32ShellFolder2 extends ShellFolder { ? SwingConstants.CENTER : SwingConstants.LEADING); - column.setComparator(new ColumnComparator(getIShellFolder(), i)); + column.setComparator(new ColumnComparator(Win32ShellFolder2.this, i)); notNullColumns.add(column); } @@ -1135,7 +1135,7 @@ final class Win32ShellFolder2 extends ShellFolder { // synchronize the whole code of the sort method once invoke(new Callable() { public Void call() { - Collections.sort(files, new ColumnComparator(getIShellFolder(), 0)); + Collections.sort(files, new ColumnComparator(Win32ShellFolder2.this, 0)); return null; } @@ -1143,12 +1143,12 @@ final class Win32ShellFolder2 extends ShellFolder { } private static class ColumnComparator implements Comparator { - private final long parentIShellFolder; + private final Win32ShellFolder2 shellFolder; private final int columnIdx; - public ColumnComparator(long parentIShellFolder, int columnIdx) { - this.parentIShellFolder = parentIShellFolder; + public ColumnComparator(Win32ShellFolder2 shellFolder, int columnIdx) { + this.shellFolder = shellFolder; this.columnIdx = columnIdx; } @@ -1159,7 +1159,7 @@ final class Win32ShellFolder2 extends ShellFolder { if (o instanceof Win32ShellFolder2 && o1 instanceof Win32ShellFolder2) { // delegates comparison to native method - return compareIDsByColumn(parentIShellFolder, + return compareIDsByColumn(shellFolder.getIShellFolder(), ((Win32ShellFolder2) o).getRelativePIDL(), ((Win32ShellFolder2) o1).getRelativePIDL(), columnIdx); From 247b39e0100a7410c3e5ac23049dd8c3a4e8cc5a Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Thu, 18 Oct 2012 07:06:31 -0700 Subject: [PATCH 060/241] 8001071: Add simple range check into VM implemenation of Unsafe access methods Add simple check in debug version of VM. Reviewed-by: twisti, johnc --- hotspot/src/share/vm/prims/unsafe.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hotspot/src/share/vm/prims/unsafe.cpp b/hotspot/src/share/vm/prims/unsafe.cpp index 051c85975e1..e3750e66f1c 100644 --- a/hotspot/src/share/vm/prims/unsafe.cpp +++ b/hotspot/src/share/vm/prims/unsafe.cpp @@ -124,6 +124,8 @@ inline void* index_oop_from_field_offset_long(oop p, jlong field_offset) { assert((void*)p->obj_field_addr((jint)byte_offset) == ptr_plus_disp, "raw [ptr+disp] must be consistent with oop::field_base"); } + jlong p_size = HeapWordSize * (jlong)(p->size()); + assert(byte_offset < p_size, err_msg("Unsafe access: offset " INT64_FORMAT " > object's size " INT64_FORMAT, byte_offset, p_size)); } #endif if (sizeof(char*) == sizeof(jint)) // (this constant folds!) From 9a39ec25ca05dd62aebbeaa09e9a676e39b418fc Mon Sep 17 00:00:00 2001 From: Alexander Scherbatiy Date: Thu, 18 Oct 2012 18:28:42 +0400 Subject: [PATCH 061/241] 7175707: [macosx] PIT: 8 b43 Not running on AppKit thread issue again Reviewed-by: serb, anthony --- .../sun/lwawt/macosx/CPlatformWindow.java | 4 ++-- jdk/src/macosx/native/sun/awt/AWTWindow.m | 24 +++++++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java index 15502d1f8d7..6146ca25576 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java @@ -65,7 +65,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo private static native void nativeDispose(long nsWindowPtr); private static native CPlatformWindow nativeGetTopmostPlatformWindowUnderMouse(); - private static native int nativeGetNSWindowDisplayID_AppKitThread(long nsWindowPtr); + private static native int nativeGetNSWindowDisplayID(long nsWindowPtr); // Loger to report issues happened during execution but that do not affect functionality private static final PlatformLogger logger = PlatformLogger.getLogger("sun.lwawt.macosx.CPlatformWindow"); @@ -444,7 +444,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo public GraphicsDevice getGraphicsDevice() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); CGraphicsEnvironment cge = (CGraphicsEnvironment)ge; - int displayID = nativeGetNSWindowDisplayID_AppKitThread(getNSWindowPtr()); + int displayID = nativeGetNSWindowDisplayID(getNSWindowPtr()); GraphicsDevice gd = cge.getScreenDevice(displayID); if (gd == null) { // this could possibly happen during device removal diff --git a/jdk/src/macosx/native/sun/awt/AWTWindow.m b/jdk/src/macosx/native/sun/awt/AWTWindow.m index 2e2b854f35b..f2958e38894 100644 --- a/jdk/src/macosx/native/sun/awt/AWTWindow.m +++ b/jdk/src/macosx/native/sun/awt/AWTWindow.m @@ -324,6 +324,13 @@ AWT_ASSERT_APPKIT_THREAD; } } ++ (NSNumber *) getNSWindowDisplayID_AppKitThread:(NSWindow *)window { + AWT_ASSERT_APPKIT_THREAD; + NSScreen *screen = [window screen]; + NSDictionary *deviceDescription = [screen deviceDescription]; + return [deviceDescription objectForKey:@"NSScreenNumber"]; +} + - (void) dealloc { AWT_ASSERT_APPKIT_THREAD; @@ -1113,19 +1120,22 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSynthesizeMou * Signature: (J)I */ JNIEXPORT jint JNICALL -Java_sun_lwawt_macosx_CPlatformWindow_nativeGetNSWindowDisplayID_1AppKitThread +Java_sun_lwawt_macosx_CPlatformWindow_nativeGetNSWindowDisplayID (JNIEnv *env, jclass clazz, jlong windowPtr) { - jint ret; // CGDirectDisplayID + __block jint ret; // CGDirectDisplayID JNF_COCOA_ENTER(env); -AWT_ASSERT_APPKIT_THREAD; NSWindow *window = OBJC(windowPtr); - NSScreen *screen = [window screen]; - NSDictionary *deviceDescription = [screen deviceDescription]; - NSNumber *displayID = [deviceDescription objectForKey:@"NSScreenNumber"]; - ret = (jint)[displayID intValue]; + + if ([NSThread isMainThread]) { + ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue]; + } else { + [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ + ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue]; + }]; + } JNF_COCOA_EXIT(env); From e9755cef6a66cf21f6c97495f9377fa9641b0557 Mon Sep 17 00:00:00 2001 From: Harold Seigel Date: Thu, 18 Oct 2012 13:08:13 -0400 Subject: [PATCH 062/241] 7188233: UseVMInterruptibleIO flag deprecate for JDK8 The -XX:+UseVMInterruptibleIO flag is deprecated for JDK8. The flag will still enable Interruptible IO on Solaris, but users will get a warning. Reviewed-by: dholmes, acorn, alanb --- hotspot/src/share/vm/runtime/arguments.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 3869f1ff8b1..30275ed42c6 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -2771,6 +2771,11 @@ SOLARIS_ONLY( return JNI_EINVAL; } FLAG_SET_CMDLINE(uintx, MaxDirectMemorySize, max_direct_memory_size); + } else if (match_option(option, "-XX:+UseVMInterruptibleIO", &tail)) { + // NOTE! In JDK 9, the UseVMInterruptibleIO flag will completely go + // away and will cause VM initialization failures! + warning("-XX:+UseVMInterruptibleIO is obsolete and will be removed in a future release."); + FLAG_SET_CMDLINE(bool, UseVMInterruptibleIO, true); } else if (match_option(option, "-XX:", &tail)) { // -XX:xxxx // Skip -XX:Flags= since that case has already been handled if (strncmp(tail, "Flags=", strlen("Flags=")) != 0) { @@ -2786,10 +2791,6 @@ SOLARIS_ONLY( // Change the default value for flags which have different default values // when working with older JDKs. - if (JDK_Version::current().compare_major(6) <= 0 && - FLAG_IS_DEFAULT(UseVMInterruptibleIO)) { - FLAG_SET_DEFAULT(UseVMInterruptibleIO, true); - } #ifdef LINUX if (JDK_Version::current().compare_major(6) <= 0 && FLAG_IS_DEFAULT(UseLinuxPosixThreadCPUClocks)) { From 240b5c93297a29de3d176d5c6b2490ddb996c48c Mon Sep 17 00:00:00 2001 From: Harold Seigel Date: Thu, 18 Oct 2012 13:09:47 -0400 Subject: [PATCH 063/241] 7053130: hs_err file does not record specified CLASSPATH Added code to write the value of the java.class.path property to the hs_err file. Reviewed-by: kmo, dholmes, kvn --- hotspot/src/share/vm/runtime/arguments.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 30275ed42c6..6da63245335 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -791,6 +791,10 @@ void Arguments::print_on(outputStream* st) { st->print("jvm_args: "); print_jvm_args_on(st); } st->print_cr("java_command: %s", java_command() ? java_command() : ""); + if (_java_class_path != NULL) { + char* path = _java_class_path->value(); + st->print_cr("java_class_path (initial): %s", strlen(path) == 0 ? "" : path ); + } st->print_cr("Launcher Type: %s", _sun_java_launcher); } From f88b8fb20f8e79da06467ac3435cbafa49b5ebff Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 18 Oct 2012 11:07:40 -0700 Subject: [PATCH 064/241] Added tag jdk8-b61 for changeset 0623a2cf29df --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index dba7899a1e6..7e43143f19e 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -182,3 +182,4 @@ b85b44cced2406792cfb9baab1377ff03e7001d8 jdk8-b55 9367024804874faf8e958adeb333682bab1c0c47 jdk8-b58 dae9821589ccd2611bdf7084269b98e819091770 jdk8-b59 e07f499b9dccb529ecf74172cf6ac11a195ec57a jdk8-b60 +20ff117b509075c3aec4ee3a57990ecd5db5df9c jdk8-b61 From c7df814ec7b99cad14d9b5fcb34742dfbb83cf72 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 18 Oct 2012 11:07:46 -0700 Subject: [PATCH 065/241] Added tag jdk8-b61 for changeset e4251351a6dd --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index 8f91b19e721..68fb9749256 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -182,3 +182,4 @@ f3ab4163ae012965fc8acdfc25ce0fece8d6906d jdk8-b57 18462a19f7bd66d38015f61ea549a5e0c0c889a3 jdk8-b58 d54dc53e223ed9ce7d5f4d2cd02ad9d5def3c2db jdk8-b59 207ef43ba69ead6cbbab415d81834545e4d46747 jdk8-b60 +0e08ba7648fb3faa0986cb217887d7c4990977f3 jdk8-b61 From 3e188b477513166619ca588dfdbcc06146d1d824 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 18 Oct 2012 11:08:05 -0700 Subject: [PATCH 066/241] Added tag jdk8-b61 for changeset 929432f0c3b6 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 4f1b3692f38..29c43257ae4 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -285,3 +285,4 @@ f2e12eb74117c917c0bb264694c02de4a6a15a10 hs25-b03 1cc7a2a11d00832e3d07f81f3744a6883422db7e hs25-b04 3cfd05b2219a29649741a52637696f06acf24a4e jdk8-b60 b261523fe66c40a02968f0aa7e73602491bb3386 hs25-b05 +4547dc71db765276e027b0c2780b724bae0a07d3 jdk8-b61 From 0f95eb5efc3430dc639b82e359cdb6af8d95c132 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 18 Oct 2012 11:08:30 -0700 Subject: [PATCH 067/241] Added tag jdk8-b61 for changeset 877dd5308e32 --- jaxp/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index c07ba52711e..5c329132e45 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -182,3 +182,4 @@ f19d63b2119a0092f016203981ffef5cc31bc3c5 jdk8-b56 1cb19abb3f7b40bf233b349cd2f51f02d37a9f5b jdk8-b58 af9e8b0f1900b631a8a0fcccff9f1514fe58c808 jdk8-b59 2d1dff5310daaf226421a8c92823cb8afcf35f31 jdk8-b60 +6b1db0b41d2f6e2a7b3bdbc8a8db823b47752906 jdk8-b61 From 4dae92ce29c55a688664d8df5aff10e05a3b3096 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 18 Oct 2012 11:08:36 -0700 Subject: [PATCH 068/241] Added tag jdk8-b61 for changeset 3d833bc526da --- jaxws/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxws/.hgtags b/jaxws/.hgtags index f0a4da5c4ba..7d6a6df637a 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -182,3 +182,4 @@ b51b611209f159f94dd2ce3dc2c56daa6d6ac1df jdk8-b57 cac4c393706343df778a13dc6c84cad0f8c237c9 jdk8-b58 ae107401be116f9e384d3a23192f543828e03da5 jdk8-b59 5c5a65ad5291b7cefcdc308f627cf2b195cf2b69 jdk8-b60 +97e5e74e2a341d9142ce28043912a3c255e28e03 jdk8-b61 From d9aab5025ed57d0f721e19731f4482a81338586d Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 18 Oct 2012 11:09:00 -0700 Subject: [PATCH 069/241] Added tag jdk8-b61 for changeset 1a8b3b760f60 --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index 804a1e63a0c..c0a4c320b0f 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -182,3 +182,4 @@ e8569a473cee7f4955bd9e76a9bdf6c6a07ced27 jdk8-b52 d94613ac03d8de375ef60493e2bb76dbd30d875d jdk8-b58 abad1f417bd3df4296631fc943cd3b7f5062c88a jdk8-b59 cec8fa02f15634acd7d02d04b0b2d8c044cdbaaa jdk8-b60 +61ddb3fd000a09ab05bff1940b0ac211661e94cf jdk8-b61 From 8bb18682d47b6001c9a54298946148e44a6772d6 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 18 Oct 2012 11:09:45 -0700 Subject: [PATCH 070/241] Added tag jdk8-b61 for changeset 539f9d08a9e5 --- langtools/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/.hgtags b/langtools/.hgtags index a4299977f60..080bdc4ab61 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -182,3 +182,4 @@ e48e7e1f026b82d921433150180799898c088890 jdk8-b55 804a3fbc86e28a4d9e77c30aa0bd4aa68056f23f jdk8-b58 f299927fc31689385f67ab7322c18eb41d8bd71e jdk8-b59 3d2b98ffcb534b0e5be87bb1f9f68d1518ad7729 jdk8-b60 +26020b247ad3806dbca33e029ee12e1b191f59f9 jdk8-b61 From b61d0d9772bd778c4ccd1ad7827cb4561a95b45c Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Fri, 19 Oct 2012 15:23:14 +0400 Subject: [PATCH 071/241] 7124520: [macosx] re:6373505 Toolkit.getScreenResolution() != GraphicsConfiguration.getNormalizingTransform() Reviewed-by: anthony, kizune --- .../classes/sun/awt/CGraphicsDevice.java | 9 +-- .../classes/sun/lwawt/macosx/LWCToolkit.java | 8 +-- .../NormalizingTransformTest.java | 55 +++++++++++++++++++ 3 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 jdk/test/java/awt/GraphicsConfiguration/NormalizingTransformTest/NormalizingTransformTest.java diff --git a/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java b/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java index 6cdebce8f09..2b884538839 100644 --- a/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java +++ b/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java @@ -33,9 +33,7 @@ import java.awt.DisplayMode; import sun.java2d.opengl.CGLGraphicsConfig; -import sun.awt.FullScreenCapable; - -public class CGraphicsDevice extends GraphicsDevice { +public final class CGraphicsDevice extends GraphicsDevice { // CoreGraphics display ID private final int displayID; @@ -108,11 +106,6 @@ public class CGraphicsDevice extends GraphicsDevice { return nativeGetYResolution(displayID); } - public int getScreenResolution() { - // TODO: report non-72 value when HiDPI is turned on - return 72; - } - private static native double nativeGetXResolution(int displayID); private static native double nativeGetYResolution(int displayID); diff --git a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java index 23df4fbf9eb..32a980898c0 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java @@ -53,7 +53,7 @@ class NamedCursor extends Cursor { /** * Mac OS X Cocoa-based AWT Toolkit. */ -public class LWCToolkit extends LWToolkit { +public final class LWCToolkit extends LWToolkit { // While it is possible to enumerate all mouse devices // and query them for the number of buttons, the code // that does it is rather complex. Instead, we opt for @@ -278,7 +278,6 @@ public class LWCToolkit extends LWToolkit { return new CMouseInfoPeer(); } - @Override protected int getScreenHeight() { return GraphicsEnvironment.getLocalGraphicsEnvironment() @@ -333,8 +332,9 @@ public class LWCToolkit extends LWToolkit { @Override public int getScreenResolution() throws HeadlessException { - return ((CGraphicsDevice) GraphicsEnvironment - .getLocalGraphicsEnvironment().getDefaultScreenDevice()).getScreenResolution(); + return (int) ((CGraphicsDevice) GraphicsEnvironment + .getLocalGraphicsEnvironment().getDefaultScreenDevice()) + .getXResolution(); } @Override diff --git a/jdk/test/java/awt/GraphicsConfiguration/NormalizingTransformTest/NormalizingTransformTest.java b/jdk/test/java/awt/GraphicsConfiguration/NormalizingTransformTest/NormalizingTransformTest.java new file mode 100644 index 00000000000..0e5e46b789b --- /dev/null +++ b/jdk/test/java/awt/GraphicsConfiguration/NormalizingTransformTest/NormalizingTransformTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 6373505 + * @summary Tests that the result of Toolkit.getScreenResolution() is + * consistent with GraphicsConfiguration.getNormalizingTransform(). + * @author Dmitri.Trembovetski@Sun.COM: area=GraphicsConfiguration + * @run main NormalizingTransformTest + */ + +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; +import java.awt.Toolkit; +import java.awt.geom.AffineTransform; + +public class NormalizingTransformTest { + + public static void main(String[] args) { + GraphicsConfiguration gc = + GraphicsEnvironment.getLocalGraphicsEnvironment(). + getDefaultScreenDevice().getDefaultConfiguration(); + AffineTransform normTransform = gc.getNormalizingTransform(); + int dpiX = Toolkit.getDefaultToolkit().getScreenResolution(); + int normDpiX = (int)(normTransform.getScaleX() * 72.0); + if (dpiX != normDpiX) { + throw new RuntimeException( + "Test FAILED. Toolkit.getScreenResolution()=" + dpiX + + " GraphicsConfiguration.getNormalizingTransform()="+normDpiX); + } + System.out.println("Test PASSED. DPI="+normDpiX); + } + +} From 3d8142d5fdf57b2325c4386ecae3260f73225912 Mon Sep 17 00:00:00 2001 From: Yumin Qi Date: Fri, 19 Oct 2012 08:56:57 -0700 Subject: [PATCH 072/241] 8000818: SA constant pool need to reference to reference map after permgen removal After permgen removal, constant pool changed to put _ldc and _ldc_w (fast_ldc and fast_ldcw) index to reference map, no longer calculated via constant pool cache. Reviewed-by: coleenp, sspitsyn, dholmes --- .../jvm/hotspot/interpreter/Bytecodes.java | 19 ++++---- .../hotspot/tools/jcore/ByteCodeRewriter.java | 45 ++++++++++++++++--- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/interpreter/Bytecodes.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/interpreter/Bytecodes.java index 1ba20f79fed..3f09ee30c19 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/interpreter/Bytecodes.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/interpreter/Bytecodes.java @@ -272,9 +272,10 @@ public class Bytecodes { public static final int _fast_aldc = 229; public static final int _fast_aldc_w = 230; public static final int _return_register_finalizer = 231; - public static final int _shouldnotreachhere = 232; // For debugging + public static final int _invokehandle = 232; + public static final int _shouldnotreachhere = 233; // For debugging - public static final int number_of_codes = 233; + public static final int number_of_codes = 234; // Flag bits derived from format strings, can_trap, can_rewrite, etc.: // semantic flags: @@ -787,20 +788,22 @@ public class Bytecodes { def(_fast_aaccess_0 , "fast_aaccess_0" , "b_JJ" , null , BasicType.getTObject() , 1, true , _aload_0 ); def(_fast_faccess_0 , "fast_faccess_0" , "b_JJ" , null , BasicType.getTObject() , 1, true , _aload_0 ); - def(_fast_iload , "fast_iload" , "bi" , null , BasicType.getTInt() , 1, false, _iload); - def(_fast_iload2 , "fast_iload2" , "bi_i" , null , BasicType.getTInt() , 2, false, _iload); - def(_fast_icaload , "fast_icaload" , "bi_" , null , BasicType.getTInt() , 0, false, _iload); + def(_fast_iload , "fast_iload" , "bi" , null , BasicType.getTInt() , 1, false, _iload ); + def(_fast_iload2 , "fast_iload2" , "bi_i" , null , BasicType.getTInt() , 2, false, _iload ); + def(_fast_icaload , "fast_icaload" , "bi_" , null , BasicType.getTInt() , 0, false, _iload ); // Faster method invocation. - def(_fast_invokevfinal , "fast_invokevfinal" , "bJJ" , null , BasicType.getTIllegal(), -1, true, _invokevirtual); + def(_fast_invokevfinal , "fast_invokevfinal" , "bJJ" , null , BasicType.getTIllegal(), -1, true, _invokevirtual ); def(_fast_linearswitch , "fast_linearswitch" , "" , null , BasicType.getTVoid() , -1, false, _lookupswitch ); def(_fast_binaryswitch , "fast_binaryswitch" , "" , null , BasicType.getTVoid() , -1, false, _lookupswitch ); + def(_fast_aldc , "fast_aldc" , "bj" , null , BasicType.getTObject(), 1, true, _ldc ); + def(_fast_aldc_w , "fast_aldc_w" , "bJJ" , null , BasicType.getTObject(), 1, true, _ldc_w ); def(_return_register_finalizer, "return_register_finalizer", "b" , null , BasicType.getTVoid() , 0, true, _return ); - def(_fast_aldc , "fast_aldc" , "bj" , null , BasicType.getTObject(), 1, true, _ldc ); - def(_fast_aldc_w , "fast_aldc_w" , "bJJ" , null , BasicType.getTObject(), 1, true, _ldc_w ); + // special handling of signature-polymorphic methods + def(_invokehandle , "invokehandle" , "bJJ" , null , BasicType.getTIllegal(), -1, true, _invokevirtual ); def(_shouldnotreachhere , "_shouldnotreachhere" , "b" , null , BasicType.getTVoid() , 0, false); diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ByteCodeRewriter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ByteCodeRewriter.java index 2a3fa023699..40dc912fd8e 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ByteCodeRewriter.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ByteCodeRewriter.java @@ -29,6 +29,11 @@ import sun.jvm.hotspot.interpreter.*; import sun.jvm.hotspot.utilities.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.runtime.*; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.AccessControlContext; +import java.security.PrivilegedExceptionAction; +import java.security.PrivilegedActionException; public class ByteCodeRewriter { @@ -38,8 +43,20 @@ public class ByteCodeRewriter private byte[] code; private Bytes bytes; - public static final boolean DEBUG = false; private static final int jintSize = 4; + public static final boolean DEBUG; + + static { + String debug = (String) AccessController.doPrivileged( + new PrivilegedAction() { + public Object run() { + return System.getProperty("sun.jvm.hotspot.tools.jcore.ByteCodeRewriter.DEBUG"); + } + } + ); + DEBUG = (debug != null ? debug.equalsIgnoreCase("true") : false); + } + protected void debugMessage(String message) { System.out.println(message); @@ -54,6 +71,18 @@ public class ByteCodeRewriter } + protected short getConstantPoolIndexFromRefMap(int rawcode, int bci) { + int refIndex; + String fmt = Bytecodes.format(rawcode); + switch (fmt.length()) { + case 2: refIndex = 0xFF & method.getBytecodeByteArg(bci); break; + case 3: refIndex = 0xFFFF & bytes.swapShort(method.getBytecodeShortArg(bci)); break; + default: throw new IllegalArgumentException(); + } + + return (short)cpool.objectToCPIndex(refIndex); + } + protected short getConstantPoolIndex(int rawcode, int bci) { // get ConstantPool index from ConstantPoolCacheIndex at given bci String fmt = Bytecodes.format(rawcode); @@ -95,6 +124,12 @@ public class ByteCodeRewriter int hotspotcode = Bytecodes._illegal; int len = 0; + if (DEBUG) { + String msg = method.getMethodHolder().getName().asString() + "." + + method.getName().asString() + + method.getSignature().asString(); + debugMessage(msg); + } for (int bci = 0; bci < code.length;) { hotspotcode = Bytecodes.codeAt(method, bci); bytecode = Bytecodes.javaCode(hotspotcode); @@ -133,15 +168,15 @@ public class ByteCodeRewriter case Bytecodes._ldc_w: if (hotspotcode != bytecode) { - // fast_aldc_w puts constant in CP cache - cpoolIndex = getConstantPoolIndex(hotspotcode, bci + 1); + // fast_aldc_w puts constant in reference map + cpoolIndex = getConstantPoolIndexFromRefMap(hotspotcode, bci + 1); writeShort(code, bci + 1, cpoolIndex); } break; case Bytecodes._ldc: if (hotspotcode != bytecode) { - // fast_aldc puts constant in CP cache - cpoolIndex = getConstantPoolIndex(hotspotcode, bci + 1); + // fast_aldc puts constant in reference map + cpoolIndex = getConstantPoolIndexFromRefMap(hotspotcode, bci + 1); code[bci + 1] = (byte)(cpoolIndex); } break; From f214e4cef37f5c6810aebf9e157d402667cb45a3 Mon Sep 17 00:00:00 2001 From: Yumin Qi Date: Fri, 19 Oct 2012 08:58:14 -0700 Subject: [PATCH 073/241] 8001055: Bytes.swap should follow big endian This is a mistake change in 6879063 about Bytes.swap. Java byte code order always follows big endian, but in that change, assume they follow native platform order that is not right. Reviewed-by: coleenp, sspitsyn, dholmes --- .../classes/sun/jvm/hotspot/runtime/Bytes.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Bytes.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Bytes.java index a8df4418454..b0cc278b812 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Bytes.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Bytes.java @@ -30,24 +30,10 @@ import sun.jvm.hotspot.utilities.PlatformInfo; /** Encapsulates some byte-swapping operations defined in the VM */ public class Bytes { - // swap if client platform is different from server's. private boolean swap; public Bytes(MachineDescription machDesc) { - String cpu = PlatformInfo.getCPU(); - if (cpu.equals("sparc")) { - if (machDesc.isBigEndian()) { - swap = false; - } else { - swap = true; - } - } else { // intel - if (machDesc.isBigEndian()) { - swap = true; - } else { - swap = false; - } - } + swap = !machDesc.isBigEndian(); } /** Should only swap if the hardware's underlying byte order is From 65c322fa7075d4df64940de1beff43f5f5781fb6 Mon Sep 17 00:00:00 2001 From: Alejandro Murillo Date: Fri, 19 Oct 2012 11:03:04 -0700 Subject: [PATCH 074/241] Added tag hs25-b06 for changeset 57dfd29e4742 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 29c43257ae4..0da4f9dddd5 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -286,3 +286,4 @@ f2e12eb74117c917c0bb264694c02de4a6a15a10 hs25-b03 3cfd05b2219a29649741a52637696f06acf24a4e jdk8-b60 b261523fe66c40a02968f0aa7e73602491bb3386 hs25-b05 4547dc71db765276e027b0c2780b724bae0a07d3 jdk8-b61 +d0337c31c8be7716369b4e7c3bd5f352983c6a06 hs25-b06 From e57ac83cace78ca22582bada639c8f2873a18fec Mon Sep 17 00:00:00 2001 From: Dean Long Date: Fri, 19 Oct 2012 14:21:09 -0400 Subject: [PATCH 075/241] 8001101: C2: more general vector rule subsetting Allow which vector rules are supported to be decided at runtime. Also a small change to allow vector types in Type::_type_info[] to apply to more platforms. Reviewed-by: kvn, twisti --- hotspot/src/share/vm/opto/type.cpp | 2 +- hotspot/src/share/vm/opto/vectornode.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/hotspot/src/share/vm/opto/type.cpp b/hotspot/src/share/vm/opto/type.cpp index f982799f634..1a8ee2597dd 100644 --- a/hotspot/src/share/vm/opto/type.cpp +++ b/hotspot/src/share/vm/opto/type.cpp @@ -61,7 +61,7 @@ Type::TypeInfo Type::_type_info[Type::lastype] = { { Bad, T_ILLEGAL, "tuple:", false, Node::NotAMachineReg, relocInfo::none }, // Tuple { Bad, T_ARRAY, "array:", false, Node::NotAMachineReg, relocInfo::none }, // Array -#if defined(IA32) || defined(AMD64) +#ifndef SPARC { Bad, T_ILLEGAL, "vectors:", false, Op_VecS, relocInfo::none }, // VectorS { Bad, T_ILLEGAL, "vectord:", false, Op_VecD, relocInfo::none }, // VectorD { Bad, T_ILLEGAL, "vectorx:", false, Op_VecX, relocInfo::none }, // VectorX diff --git a/hotspot/src/share/vm/opto/vectornode.cpp b/hotspot/src/share/vm/opto/vectornode.cpp index d0955a819e1..4d6aa10cc79 100644 --- a/hotspot/src/share/vm/opto/vectornode.cpp +++ b/hotspot/src/share/vm/opto/vectornode.cpp @@ -29,8 +29,7 @@ //------------------------------VectorNode-------------------------------------- // Return the vector operator for the specified scalar operation -// and vector length. Also used to check if the code generator -// supports the vector operation. +// and vector length. int VectorNode::opcode(int sopc, BasicType bt) { switch (sopc) { case Op_AddI: @@ -75,7 +74,7 @@ int VectorNode::opcode(int sopc, BasicType bt) { case T_BYTE: return 0; // Unimplemented case T_CHAR: case T_SHORT: return Op_MulVS; - case T_INT: return Matcher::match_rule_supported(Op_MulVI) ? Op_MulVI : 0; // SSE4_1 + case T_INT: return Op_MulVI; } ShouldNotReachHere(); case Op_MulF: @@ -157,12 +156,14 @@ int VectorNode::opcode(int sopc, BasicType bt) { return 0; // Unimplemented } +// Also used to check if the code generator +// supports the vector operation. bool VectorNode::implemented(int opc, uint vlen, BasicType bt) { if (is_java_primitive(bt) && (vlen > 1) && is_power_of_2(vlen) && Matcher::vector_size_supported(bt, vlen)) { int vopc = VectorNode::opcode(opc, bt); - return vopc > 0 && Matcher::has_match_rule(vopc); + return vopc > 0 && Matcher::match_rule_supported(vopc); } return false; } From 8277d1355e1c7497b6bfcb9497a1843f92153d3e Mon Sep 17 00:00:00 2001 From: Alejandro Murillo Date: Fri, 19 Oct 2012 11:26:17 -0700 Subject: [PATCH 076/241] 8001176: new hotspot build - hs25-b07 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 14577a1280c..1f72e227aae 100644 --- a/hotspot/make/hotspot_version +++ b/hotspot/make/hotspot_version @@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2012 HS_MAJOR_VER=25 HS_MINOR_VER=0 -HS_BUILD_NUMBER=06 +HS_BUILD_NUMBER=07 JDK_MAJOR_VER=1 JDK_MINOR_VER=8 From 01d0ba69cedc8f397c089be257fa8e8cf2f4f4ef Mon Sep 17 00:00:00 2001 From: Christian Thalinger Date: Fri, 19 Oct 2012 17:04:35 -0700 Subject: [PATCH 077/241] 8000989: smaller code changes to make future JSR 292 backports easier Reviewed-by: jrose --- .../java/lang/invoke/BoundMethodHandle.java | 22 +++++++++---------- .../classes/java/lang/invoke/CallSite.java | 2 +- .../java/lang/invoke/DirectMethodHandle.java | 6 ++--- .../lang/invoke/InvokerBytecodeGenerator.java | 6 ++--- .../classes/java/lang/invoke/Invokers.java | 12 +++++----- .../classes/java/lang/invoke/LambdaForm.java | 4 ++-- .../classes/java/lang/invoke/MemberName.java | 2 +- .../java/lang/invoke/MethodHandle.java | 4 ++-- .../java/lang/invoke/MethodHandleImpl.java | 2 +- .../java/lang/invoke/MethodHandleStatics.java | 8 ++++++- .../sun/invoke/util/ValueConversions.java | 15 +++++++++---- jdk/test/java/lang/invoke/BigArityTest.java | 2 +- .../java/lang/invoke/PrivateInvokeTest.java | 6 ++--- 13 files changed, 52 insertions(+), 39 deletions(-) diff --git a/jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java b/jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java index 4071305abc5..dfc6e9d41fe 100644 --- a/jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java +++ b/jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java @@ -79,7 +79,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; default : throw new InternalError("unexpected xtype: " + xtype); } } catch (Throwable t) { - throw new InternalError(t); + throw newInternalError(t); } } @@ -97,7 +97,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; case 'D': return cloneExtendD(type, form, (double) x); } } catch (Throwable t) { - throw new InternalError(t); + throw newInternalError(t); } throw new InternalError("unexpected type: " + xtype); } @@ -115,7 +115,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; try { return clone(srcType, form); } catch (Throwable t) { - throw new InternalError(t); + throw newInternalError(t); } } @@ -124,7 +124,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; try { return clone(newType, form.permuteArguments(1, reorder, basicTypes(newType.parameterList()))); } catch (Throwable t) { - throw new InternalError(t); + throw newInternalError(t); } } @@ -166,7 +166,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; case 'J': return argJ(i); } } catch (Throwable ex) { - throw new InternalError(ex); + throw newInternalError(ex); } throw new InternalError("unexpected type: " + speciesData().types+"."+i); } @@ -192,7 +192,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; try { return (MethodHandle) argL(0); } catch (Throwable ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } @@ -464,7 +464,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; } } } catch (Throwable e) { - throw new InternalError(e); + throw newInternalError(e); } for (SpeciesData d : CACHE.values()) { @@ -748,7 +748,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; try { return LOOKUP.findGetter(cbmhClass, fieldName, fieldType); } catch (NoSuchFieldException | IllegalAccessException e) { - throw new InternalError(e); + throw newInternalError(e); } } @@ -776,7 +776,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; Field F_SPECIES_DATA = cbmh.getDeclaredField("SPECIES_DATA"); return (SpeciesData) F_SPECIES_DATA.get(null); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } @@ -802,7 +802,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; try { return linkConstructor(LOOKUP.findConstructor(cbmh, MethodType.fromMethodDescriptorString(makeSignature(types, true), null))); } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | TypeNotPresentException e) { - throw new InternalError(e); + throw newInternalError(e); } } @@ -833,7 +833,7 @@ import com.sun.xml.internal.ws.org.objectweb.asm.Type; linkerMN = MemberName.getFactory().resolveOrFail(REF_invokeStatic, linkerMN, null, NoSuchMethodException.class); assert(linkerMN.isStatic()); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } // extend arguments array Object[] newArgs = Arrays.copyOf(initName.arguments, initName.arguments.length + 1); diff --git a/jdk/src/share/classes/java/lang/invoke/CallSite.java b/jdk/src/share/classes/java/lang/invoke/CallSite.java index 7beb101b755..5d637b96d4f 100644 --- a/jdk/src/share/classes/java/lang/invoke/CallSite.java +++ b/jdk/src/share/classes/java/lang/invoke/CallSite.java @@ -222,7 +222,7 @@ public class CallSite { GET_TARGET = IMPL_LOOKUP. findVirtual(CallSite.class, "getTarget", MethodType.methodType(MethodHandle.class)); } catch (ReflectiveOperationException e) { - throw new InternalError(e); + throw newInternalError(e); } } diff --git a/jdk/src/share/classes/java/lang/invoke/DirectMethodHandle.java b/jdk/src/share/classes/java/lang/invoke/DirectMethodHandle.java index b1c7f82da9a..2adc8e82bd8 100644 --- a/jdk/src/share/classes/java/lang/invoke/DirectMethodHandle.java +++ b/jdk/src/share/classes/java/lang/invoke/DirectMethodHandle.java @@ -218,7 +218,7 @@ class DirectMethodHandle extends MethodHandle { try { linker = IMPL_NAMES.resolveOrFail(REF_invokeStatic, linker, null, NoSuchMethodException.class); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } final int DMH_THIS = 0; final int ARG_BASE = 1; @@ -554,7 +554,7 @@ class DirectMethodHandle extends MethodHandle { try { linker = IMPL_NAMES.resolveOrFail(REF_invokeVirtual, linker, null, NoSuchMethodException.class); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } // What is the external type of the lambda form? @@ -653,7 +653,7 @@ class DirectMethodHandle extends MethodHandle { nf.resolve(); } } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } } diff --git a/jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index 48f88adeecc..0def847d38c 100644 --- a/jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -138,7 +138,7 @@ class InvokerBytecodeGenerator { DUMP_CLASS_FILES_DIR = dumpDir; System.out.println("Dumping class files to "+DUMP_CLASS_FILES_DIR+"/..."); } catch (Exception e) { - throw new InternalError(e); + throw newInternalError(e); } } else { DUMP_CLASS_FILES_COUNTERS = null; @@ -162,7 +162,7 @@ class InvokerBytecodeGenerator { file.close(); return null; } catch (IOException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } }); @@ -279,7 +279,7 @@ class InvokerBytecodeGenerator { try { member = MEMBERNAME_FACTORY.resolveOrFail(REF_invokeStatic, member, HOST_CLASS, ReflectiveOperationException.class); } catch (ReflectiveOperationException e) { - throw new InternalError(e); + throw newInternalError(e); } //System.out.println("resolveInvokerMember => "+member); return member; diff --git a/jdk/src/share/classes/java/lang/invoke/Invokers.java b/jdk/src/share/classes/java/lang/invoke/Invokers.java index 0e3dcf64bc7..0e40396a96f 100644 --- a/jdk/src/share/classes/java/lang/invoke/Invokers.java +++ b/jdk/src/share/classes/java/lang/invoke/Invokers.java @@ -27,6 +27,7 @@ package java.lang.invoke; import java.util.Arrays; import sun.invoke.empty.Empty; +import static java.lang.invoke.MethodHandleStatics.*; import static java.lang.invoke.MethodHandleNatives.Constants.*; import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; import static java.lang.invoke.LambdaForm.*; @@ -128,9 +129,8 @@ class Invokers { try { //Lookup.findVirtual(MethodHandle.class, name, type); return IMPL_LOOKUP.resolveOrFail(REF_invokeVirtual, MethodHandle.class, name, type); - } catch (ReflectiveOperationException ex) { - throw new InternalError("JVM cannot find invoker for "+type, ex); + throw newInternalError("JVM cannot find invoker for "+type, ex); } } @@ -176,7 +176,7 @@ class Invokers { .findVirtual(MethodHandle.class, "asSpreader", MethodType.methodType(MethodHandle.class, Class.class, int.class)); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } makeSpreader = MethodHandles.insertArguments(makeSpreader, 1, Object[].class, spreadArgCount); vaInvoker = MethodHandles.filterArgument(arrayInvoker, 0, makeSpreader); @@ -215,7 +215,7 @@ class Invokers { .findStatic(CallSite.class, "uninitializedCallSite", MethodType.methodType(Empty.class)); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } invoker = MethodHandles.explicitCastArguments(invoker, MethodType.methodType(targetType.returnType())); @@ -389,7 +389,7 @@ class Invokers { form.genericInvoker = gamh; return gamh; } catch (Exception ex) { - throw new InternalError("Exception while resolving inexact invoke", ex); + throw newInternalError("Exception while resolving inexact invoke", ex); } } @@ -456,7 +456,7 @@ class Invokers { NF_getCallSiteTarget.resolve(); // bound } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } diff --git a/jdk/src/share/classes/java/lang/invoke/LambdaForm.java b/jdk/src/share/classes/java/lang/invoke/LambdaForm.java index e39896afecb..f1da24379c0 100644 --- a/jdk/src/share/classes/java/lang/invoke/LambdaForm.java +++ b/jdk/src/share/classes/java/lang/invoke/LambdaForm.java @@ -457,7 +457,7 @@ class LambdaForm { isCompiled = true; return vmentry; } catch (Error | Exception ex) { - throw new InternalError(this.toString(), ex); + throw newInternalError(this.toString(), ex); } } @@ -1547,7 +1547,7 @@ class LambdaForm { try { zmem = IMPL_NAMES.resolveOrFail(REF_invokeStatic, zmem, null, NoSuchMethodException.class); } catch (IllegalAccessException|NoSuchMethodException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } NamedFunction zcon = new NamedFunction(zmem); Name n = new Name(zcon).newIndex(0); diff --git a/jdk/src/share/classes/java/lang/invoke/MemberName.java b/jdk/src/share/classes/java/lang/invoke/MemberName.java index 595b1145fe1..e2bd9b068d4 100644 --- a/jdk/src/share/classes/java/lang/invoke/MemberName.java +++ b/jdk/src/share/classes/java/lang/invoke/MemberName.java @@ -558,7 +558,7 @@ import java.util.Objects; try { return (MemberName) super.clone(); } catch (CloneNotSupportedException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } diff --git a/jdk/src/share/classes/java/lang/invoke/MethodHandle.java b/jdk/src/share/classes/java/lang/invoke/MethodHandle.java index a5e4e584d18..2a6b8c1b789 100644 --- a/jdk/src/share/classes/java/lang/invoke/MethodHandle.java +++ b/jdk/src/share/classes/java/lang/invoke/MethodHandle.java @@ -1372,7 +1372,7 @@ assertEquals("[three, thee, tee]", asListFix.invoke((Object)argv).toString()); NF_reinvokerTarget = new LambdaForm.NamedFunction(MethodHandle.class .getDeclaredMethod("reinvokerTarget")); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } @@ -1397,7 +1397,7 @@ assertEquals("[three, thee, tee]", asListFix.invoke((Object)argv).toString()); try { FORM_OFFSET = UNSAFE.objectFieldOffset(MethodHandle.class.getDeclaredField("form")); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } } diff --git a/jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java b/jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java index d9822bd7189..636bfeb72ce 100644 --- a/jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -478,7 +478,7 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; .getDeclaredMethod("checkSpreadArgument", Object.class, int.class)); NF_checkSpreadArgument.resolve(); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } } diff --git a/jdk/src/share/classes/java/lang/invoke/MethodHandleStatics.java b/jdk/src/share/classes/java/lang/invoke/MethodHandleStatics.java index 3db5712fdeb..1c069aa1047 100644 --- a/jdk/src/share/classes/java/lang/invoke/MethodHandleStatics.java +++ b/jdk/src/share/classes/java/lang/invoke/MethodHandleStatics.java @@ -93,6 +93,12 @@ import sun.misc.Unsafe; } // handy shared exception makers (they simplify the common case code) + /*non-public*/ static InternalError newInternalError(String message, Throwable cause) { + return new InternalError(message, cause); + } + /*non-public*/ static InternalError newInternalError(Throwable cause) { + return new InternalError(cause); + } /*non-public*/ static RuntimeException newIllegalStateException(String message) { return new IllegalStateException(message); } @@ -109,7 +115,7 @@ import sun.misc.Unsafe; return new IllegalArgumentException(message(message, obj, obj2)); } /*non-public*/ static Error uncaughtException(Exception ex) { - throw new InternalError("uncaught exception", ex); + throw newInternalError("uncaught exception", ex); } static Error NYI() { throw new AssertionError("NYI"); diff --git a/jdk/src/share/classes/sun/invoke/util/ValueConversions.java b/jdk/src/share/classes/sun/invoke/util/ValueConversions.java index 1533f4b2ad2..bf8d0336afa 100644 --- a/jdk/src/share/classes/sun/invoke/util/ValueConversions.java +++ b/jdk/src/share/classes/sun/invoke/util/ValueConversions.java @@ -475,7 +475,7 @@ public class ValueConversions { .findStatic(THIS_CLASS, "fillNewTypedArray", MethodType.methodType(Object[].class, Object[].class, Integer.class, Object[].class)); } catch (NoSuchMethodException | IllegalAccessException ex) { - throw new InternalError("uncaught exception", ex); + throw newInternalError("uncaught exception", ex); } } @@ -489,7 +489,7 @@ public class ValueConversions { COPY_AS_PRIMITIVE_ARRAY = IMPL_LOOKUP.findStatic(THIS_CLASS, "copyAsPrimitiveArray", MethodType.methodType(Object.class, Wrapper.class, Object[].class)); MAKE_LIST = IMPL_LOOKUP.findStatic(THIS_CLASS, "makeList", MethodType.methodType(List.class, Object[].class)); } catch (ReflectiveOperationException ex) { - throw new InternalError("uncaught exception", ex); + throw newInternalError("uncaught exception", ex); } } } @@ -527,9 +527,8 @@ public class ValueConversions { MethodHandle.class, int.class, MethodHandle.class); m.setAccessible(true); mh = IMPL_LOOKUP.unreflect(m); - } catch (ReflectiveOperationException | SecurityException ex) { - throw new InternalError(ex); + throw newInternalError(ex); } COLLECT_ARGUMENTS = mh; } @@ -1209,4 +1208,12 @@ public class ValueConversions { private static MethodHandle buildVarargsList(int nargs) { return MethodHandles.filterReturnValue(varargsArray(nargs), LazyStatics.MAKE_LIST); } + + // handy shared exception makers (they simplify the common case code) + private static InternalError newInternalError(String message, Throwable cause) { + return new InternalError(message, cause); + } + private static InternalError newInternalError(Throwable cause) { + return new InternalError(cause); + } } diff --git a/jdk/test/java/lang/invoke/BigArityTest.java b/jdk/test/java/lang/invoke/BigArityTest.java index 9aeaa79af0b..fa4d5975fc4 100644 --- a/jdk/test/java/lang/invoke/BigArityTest.java +++ b/jdk/test/java/lang/invoke/BigArityTest.java @@ -70,7 +70,7 @@ public class BigArityTest { MethodHandles.lookup().unreflect( BigArityTest.class.getDeclaredMethod("hashArguments", Object[].class)); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw new Error(ex); } } static MethodHandle MH_hashArguments(int arity) { diff --git a/jdk/test/java/lang/invoke/PrivateInvokeTest.java b/jdk/test/java/lang/invoke/PrivateInvokeTest.java index 4741f4b675a..434b8e82ca2 100644 --- a/jdk/test/java/lang/invoke/PrivateInvokeTest.java +++ b/jdk/test/java/lang/invoke/PrivateInvokeTest.java @@ -145,21 +145,21 @@ public class PrivateInvokeTest { MH_DEBUG_STRING = DIRECT_INVOKER_LOOKUP .findVirtual(MethodHandle.class, "debugString", methodType(String.class)); } catch (ReflectiveOperationException ex) { - throw new InternalError(ex); + throw new Error(ex); } } private Object internalMemberName(MethodHandle mh) { try { return MH_INTERNAL_MEMBER_NAME.invokeExact(mh); } catch (Throwable ex) { - throw new InternalError(ex); + throw new Error(ex); } } private String debugString(MethodHandle mh) { try { return (String) MH_DEBUG_STRING.invokeExact(mh); } catch (Throwable ex) { - throw new InternalError(ex); + throw new Error(ex); } } private static MethodHandle directInvoker(int refKind, MethodType mtype) { From 3e481cdd81a487db046b1b8d18a5a0871a286971 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Fri, 19 Oct 2012 21:40:07 -0400 Subject: [PATCH 078/241] 7199092: NMT: NMT needs to deal overlapped virtual memory ranges Enhanced virtual memory tracking to track committed regions as well as reserved regions, so NMT now can generate virtual memory map. Reviewed-by: acorn, coleenp --- hotspot/src/os/bsd/vm/perfMemory_bsd.cpp | 9 + hotspot/src/os/linux/vm/perfMemory_linux.cpp | 9 + hotspot/src/os/solaris/vm/os_solaris.cpp | 4 +- .../src/os/solaris/vm/perfMemory_solaris.cpp | 9 + .../src/os/windows/vm/perfMemory_windows.cpp | 12 + hotspot/src/share/vm/memory/allocation.cpp | 16 +- hotspot/src/share/vm/memory/allocation.hpp | 7 +- hotspot/src/share/vm/memory/filemap.cpp | 20 +- hotspot/src/share/vm/memory/filemap.hpp | 1 - .../src/share/vm/memory/metaspaceShared.cpp | 12 +- hotspot/src/share/vm/memory/resourceArea.hpp | 20 +- hotspot/src/share/vm/runtime/handles.cpp | 7 +- hotspot/src/share/vm/runtime/handles.hpp | 1 + .../src/share/vm/runtime/handles.inline.hpp | 7 +- hotspot/src/share/vm/runtime/os.cpp | 16 +- hotspot/src/share/vm/runtime/thread.cpp | 25 +- .../src/share/vm/services/attachListener.cpp | 2 + hotspot/src/share/vm/services/memBaseline.cpp | 231 +++++++---- hotspot/src/share/vm/services/memBaseline.hpp | 5 +- hotspot/src/share/vm/services/memPtr.cpp | 32 -- hotspot/src/share/vm/services/memPtr.hpp | 107 +++-- hotspot/src/share/vm/services/memRecorder.cpp | 17 +- hotspot/src/share/vm/services/memRecorder.hpp | 1 + hotspot/src/share/vm/services/memReporter.cpp | 60 ++- hotspot/src/share/vm/services/memReporter.hpp | 13 + hotspot/src/share/vm/services/memSnapshot.cpp | 365 ++++++++++++++---- hotspot/src/share/vm/services/memSnapshot.hpp | 134 +++++-- hotspot/src/share/vm/services/memTracker.cpp | 7 +- hotspot/src/share/vm/services/memTracker.hpp | 15 +- 29 files changed, 800 insertions(+), 364 deletions(-) diff --git a/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp b/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp index 123e6e289bf..cb9dada906b 100644 --- a/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp +++ b/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp @@ -30,6 +30,7 @@ #include "os_bsd.inline.hpp" #include "runtime/handles.inline.hpp" #include "runtime/perfMemory.hpp" +#include "services/memTracker.hpp" #include "utilities/exceptions.hpp" // put OS-includes here @@ -753,6 +754,10 @@ static char* mmap_create_shared(size_t size) { // clear the shared memory region (void)::memset((void*) mapAddress, 0, size); + // it does not go through os api, the operation has to record from here + MemTracker::record_virtual_memory_reserve((address)mapAddress, size, CURRENT_PC); + MemTracker::record_virtual_memory_type((address)mapAddress, mtInternal); + return mapAddress; } @@ -912,6 +917,10 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor "Could not map PerfMemory"); } + // it does not go through os api, the operation has to record from here + MemTracker::record_virtual_memory_reserve((address)mapAddress, size, CURRENT_PC); + MemTracker::record_virtual_memory_type((address)mapAddress, mtInternal); + *addr = mapAddress; *sizep = size; diff --git a/hotspot/src/os/linux/vm/perfMemory_linux.cpp b/hotspot/src/os/linux/vm/perfMemory_linux.cpp index 2adae8d18af..b54c5db14a5 100644 --- a/hotspot/src/os/linux/vm/perfMemory_linux.cpp +++ b/hotspot/src/os/linux/vm/perfMemory_linux.cpp @@ -30,6 +30,7 @@ #include "os_linux.inline.hpp" #include "runtime/handles.inline.hpp" #include "runtime/perfMemory.hpp" +#include "services/memTracker.hpp" #include "utilities/exceptions.hpp" // put OS-includes here @@ -753,6 +754,10 @@ static char* mmap_create_shared(size_t size) { // clear the shared memory region (void)::memset((void*) mapAddress, 0, size); + // it does not go through os api, the operation has to record from here + MemTracker::record_virtual_memory_reserve((address)mapAddress, size, CURRENT_PC); + MemTracker::record_virtual_memory_type((address)mapAddress, mtInternal); + return mapAddress; } @@ -912,6 +917,10 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor "Could not map PerfMemory"); } + // it does not go through os api, the operation has to record from here + MemTracker::record_virtual_memory_reserve((address)mapAddress, size, CURRENT_PC); + MemTracker::record_virtual_memory_type((address)mapAddress, mtInternal); + *addr = mapAddress; *sizep = size; diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp index 0483dcbfb34..e3415b8d802 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.cpp +++ b/hotspot/src/os/solaris/vm/os_solaris.cpp @@ -55,6 +55,7 @@ #include "runtime/threadCritical.hpp" #include "runtime/timer.hpp" #include "services/attachListener.hpp" +#include "services/memTracker.hpp" #include "services/runtimeService.hpp" #include "thread_solaris.inline.hpp" #include "utilities/decoder.hpp" @@ -3072,11 +3073,12 @@ char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { // Since snv_84, Solaris attempts to honor the address hint - see 5003415. // Give it a try, if the kernel honors the hint we can return immediately. char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false); + volatile int err = errno; if (addr == requested_addr) { return addr; } else if (addr != NULL) { - unmap_memory(addr, bytes); + pd_unmap_memory(addr, bytes); } if (PrintMiscellaneous && Verbose) { diff --git a/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp b/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp index c24789cbb17..ebbc00b3015 100644 --- a/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp +++ b/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp @@ -30,6 +30,7 @@ #include "os_solaris.inline.hpp" #include "runtime/handles.inline.hpp" #include "runtime/perfMemory.hpp" +#include "services/memTracker.hpp" #include "utilities/exceptions.hpp" // put OS-includes here @@ -768,6 +769,10 @@ static char* mmap_create_shared(size_t size) { // clear the shared memory region (void)::memset((void*) mapAddress, 0, size); + // it does not go through os api, the operation has to record from here + MemTracker::record_virtual_memory_reserve((address)mapAddress, size, CURRENT_PC); + MemTracker::record_virtual_memory_type((address)mapAddress, mtInternal); + return mapAddress; } @@ -927,6 +932,10 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor "Could not map PerfMemory"); } + // it does not go through os api, the operation has to record from here + MemTracker::record_virtual_memory_reserve((address)mapAddress, size, CURRENT_PC); + MemTracker::record_virtual_memory_type((address)mapAddress, mtInternal); + *addr = mapAddress; *sizep = size; diff --git a/hotspot/src/os/windows/vm/perfMemory_windows.cpp b/hotspot/src/os/windows/vm/perfMemory_windows.cpp index 2c75539d86a..061c9d84a82 100644 --- a/hotspot/src/os/windows/vm/perfMemory_windows.cpp +++ b/hotspot/src/os/windows/vm/perfMemory_windows.cpp @@ -30,6 +30,7 @@ #include "os_windows.inline.hpp" #include "runtime/handles.inline.hpp" #include "runtime/perfMemory.hpp" +#include "services/memTracker.hpp" #include "utilities/exceptions.hpp" #include @@ -1496,6 +1497,10 @@ static char* mapping_create_shared(size_t size) { // clear the shared memory region (void)memset(mapAddress, '\0', size); + // it does not go through os api, the operation has to record from here + MemTracker::record_virtual_memory_reserve((address)mapAddress, size, CURRENT_PC); + MemTracker::record_virtual_memory_type((address)mapAddress, mtInternal); + return (char*) mapAddress; } @@ -1672,6 +1677,11 @@ static void open_file_mapping(const char* user, int vmid, "Could not map PerfMemory"); } + // it does not go through os api, the operation has to record from here + MemTracker::record_virtual_memory_reserve((address)mapAddress, size, CURRENT_PC); + MemTracker::record_virtual_memory_type((address)mapAddress, mtInternal); + + *addrp = (char*)mapAddress; *sizep = size; @@ -1824,6 +1834,8 @@ void PerfMemory::detach(char* addr, size_t bytes, TRAPS) { } remove_file_mapping(addr); + // it does not go through os api, the operation has to record from here + MemTracker::record_virtual_memory_release((address)addr, bytes); } char* PerfMemory::backing_store_filename() { diff --git a/hotspot/src/share/vm/memory/allocation.cpp b/hotspot/src/share/vm/memory/allocation.cpp index 56c7b63fbe5..92b335b105a 100644 --- a/hotspot/src/share/vm/memory/allocation.cpp +++ b/hotspot/src/share/vm/memory/allocation.cpp @@ -433,19 +433,18 @@ Arena::Arena() { NOT_PRODUCT(Atomic::inc(&_instance_count);) } -Arena::Arena(Arena *a) : _chunk(a->_chunk), _hwm(a->_hwm), _max(a->_max), _first(a->_first) { - set_size_in_bytes(a->size_in_bytes()); - NOT_PRODUCT(Atomic::inc(&_instance_count);) -} - - Arena *Arena::move_contents(Arena *copy) { copy->destruct_contents(); copy->_chunk = _chunk; copy->_hwm = _hwm; copy->_max = _max; copy->_first = _first; - copy->set_size_in_bytes(size_in_bytes()); + + // workaround rare racing condition, which could double count + // the arena size by native memory tracking + size_t size = size_in_bytes(); + set_size_in_bytes(0); + copy->set_size_in_bytes(size); // Destroy original arena reset(); return copy; // Return Arena with contents @@ -497,6 +496,9 @@ void Arena::destruct_contents() { char* end = _first->next() ? _first->top() : _hwm; free_malloced_objects(_first, _first->bottom(), end, _hwm); } + // reset size before chop to avoid a rare racing condition + // that can have total arena memory exceed total chunk memory + set_size_in_bytes(0); _first->chop(); reset(); } diff --git a/hotspot/src/share/vm/memory/allocation.hpp b/hotspot/src/share/vm/memory/allocation.hpp index 30662b8e5da..892e50ddc0a 100644 --- a/hotspot/src/share/vm/memory/allocation.hpp +++ b/hotspot/src/share/vm/memory/allocation.hpp @@ -144,8 +144,10 @@ enum MemoryType { mtNMT = 0x0A00, // memory used by native memory tracking mtChunk = 0x0B00, // chunk that holds content of arenas mtJavaHeap = 0x0C00, // Java heap - mtDontTrack = 0x0D00, // memory we donot or cannot track - mt_number_of_types = 0x000C, // number of memory types + mtClassShared = 0x0D00, // class data sharing + mt_number_of_types = 0x000D, // number of memory types (mtDontTrack + // is not included as validate type) + mtDontTrack = 0x0E00, // memory we do not or cannot track mt_masks = 0x7F00, // object type mask @@ -342,7 +344,6 @@ protected: public: Arena(); Arena(size_t init_size); - Arena(Arena *old); ~Arena(); void destruct_contents(); char* hwm() const { return _hwm; } diff --git a/hotspot/src/share/vm/memory/filemap.cpp b/hotspot/src/share/vm/memory/filemap.cpp index d4a11f4080e..c3d1bf5f9e3 100644 --- a/hotspot/src/share/vm/memory/filemap.cpp +++ b/hotspot/src/share/vm/memory/filemap.cpp @@ -29,6 +29,7 @@ #include "runtime/arguments.hpp" #include "runtime/java.hpp" #include "runtime/os.hpp" +#include "services/memTracker.hpp" #include "utilities/defaultStream.hpp" # include @@ -344,24 +345,13 @@ ReservedSpace FileMapInfo::reserve_shared_memory() { fail_continue(err_msg("Unable to reserved shared space at required address " INTPTR_FORMAT, requested_addr)); return rs; } + // the reserved virtual memory is for mapping class data sharing archive + if (MemTracker::is_on()) { + MemTracker::record_virtual_memory_type((address)rs.base(), mtClassShared); + } return rs; } -// Memory map a region in the address space. - -char* FileMapInfo::map_region(int i, ReservedSpace rs) { - struct FileMapInfo::FileMapHeader::space_info* si = &_header._space[i]; - size_t used = si->_used; - size_t size = align_size_up(used, os::vm_allocation_granularity()); - - ReservedSpace mapped_rs = rs.first_part(size, true, true); - ReservedSpace unmapped_rs = rs.last_part(size); - mapped_rs.release(); - - return map_region(i); -} - - // Memory map a region in the address space. static const char* shared_region_name[] = { "ReadOnly", "ReadWrite", "MiscData", "MiscCode"}; diff --git a/hotspot/src/share/vm/memory/filemap.hpp b/hotspot/src/share/vm/memory/filemap.hpp index 760ddfe1795..7cdd9616cbe 100644 --- a/hotspot/src/share/vm/memory/filemap.hpp +++ b/hotspot/src/share/vm/memory/filemap.hpp @@ -125,7 +125,6 @@ public: size_t capacity, bool read_only, bool allow_exec); void write_bytes(const void* buffer, int count); void write_bytes_aligned(const void* buffer, int count); - char* map_region(int i, ReservedSpace rs); char* map_region(int i); void unmap_region(int i); void close(); diff --git a/hotspot/src/share/vm/memory/metaspaceShared.cpp b/hotspot/src/share/vm/memory/metaspaceShared.cpp index f69e7586e08..dde26b5f8c5 100644 --- a/hotspot/src/share/vm/memory/metaspaceShared.cpp +++ b/hotspot/src/share/vm/memory/metaspaceShared.cpp @@ -663,8 +663,8 @@ bool MetaspaceShared::is_in_shared_space(const void* p) { if (_ro_base == NULL || _rw_base == NULL) { return false; } else { - return ((p > _ro_base && p < (_ro_base + SharedReadOnlySize)) || - (p > _rw_base && p < (_rw_base + SharedReadWriteSize))); + return ((p >= _ro_base && p < (_ro_base + SharedReadOnlySize)) || + (p >= _rw_base && p < (_rw_base + SharedReadWriteSize))); } } @@ -693,14 +693,6 @@ bool MetaspaceShared::map_shared_spaces(FileMapInfo* mapinfo) { ReservedSpace shared_rs = mapinfo->reserve_shared_memory(); if (!shared_rs.is_reserved()) return false; - // Split reserved memory into pieces (windows needs this) - ReservedSpace ro_rs = shared_rs.first_part(SharedReadOnlySize); - ReservedSpace tmp_rs1 = shared_rs.last_part(SharedReadOnlySize); - ReservedSpace rw_rs = tmp_rs1.first_part(SharedReadWriteSize); - ReservedSpace tmp_rs2 = tmp_rs1.last_part(SharedReadWriteSize); - ReservedSpace md_rs = tmp_rs2.first_part(SharedMiscDataSize); - ReservedSpace mc_rs = tmp_rs2.last_part(SharedMiscDataSize); - // Map each shared region if ((_ro_base = mapinfo->map_region(ro)) != NULL && (_rw_base = mapinfo->map_region(rw)) != NULL && diff --git a/hotspot/src/share/vm/memory/resourceArea.hpp b/hotspot/src/share/vm/memory/resourceArea.hpp index f42c0f62457..f1418ce19c3 100644 --- a/hotspot/src/share/vm/memory/resourceArea.hpp +++ b/hotspot/src/share/vm/memory/resourceArea.hpp @@ -127,15 +127,21 @@ protected: void reset_to_mark() { if (UseMallocOnly) free_malloced_objects(); - if( _chunk->next() ) // Delete later chunks + if( _chunk->next() ) { // Delete later chunks + // reset arena size before delete chunks. Otherwise, the total + // arena size could exceed total chunk size + assert(_area->size_in_bytes() > size_in_bytes(), "Sanity check"); + _area->set_size_in_bytes(size_in_bytes()); _chunk->next_chop(); + } else { + assert(_area->size_in_bytes() == size_in_bytes(), "Sanity check"); + } _area->_chunk = _chunk; // Roll back arena to saved chunk _area->_hwm = _hwm; _area->_max = _max; // clear out this chunk (to detect allocation bugs) if (ZapResourceArea) memset(_hwm, badResourceValue, _max - _hwm); - _area->set_size_in_bytes(size_in_bytes()); } ~ResourceMark() { @@ -219,15 +225,21 @@ protected: void reset_to_mark() { if (UseMallocOnly) free_malloced_objects(); - if( _chunk->next() ) // Delete later chunks + if( _chunk->next() ) { // Delete later chunks + // reset arena size before delete chunks. Otherwise, the total + // arena size could exceed total chunk size + assert(_area->size_in_bytes() > size_in_bytes(), "Sanity check"); + _area->set_size_in_bytes(size_in_bytes()); _chunk->next_chop(); + } else { + assert(_area->size_in_bytes() == size_in_bytes(), "Sanity check"); + } _area->_chunk = _chunk; // Roll back arena to saved chunk _area->_hwm = _hwm; _area->_max = _max; // clear out this chunk (to detect allocation bugs) if (ZapResourceArea) memset(_hwm, badResourceValue, _max - _hwm); - _area->set_size_in_bytes(size_in_bytes()); } ~DeoptResourceMark() { diff --git a/hotspot/src/share/vm/runtime/handles.cpp b/hotspot/src/share/vm/runtime/handles.cpp index cb53088ee69..a37e46da1a8 100644 --- a/hotspot/src/share/vm/runtime/handles.cpp +++ b/hotspot/src/share/vm/runtime/handles.cpp @@ -158,13 +158,18 @@ HandleMark::~HandleMark() { // Delete later chunks if( _chunk->next() ) { + // reset arena size before delete chunks. Otherwise, the total + // arena size could exceed total chunk size + assert(area->size_in_bytes() > size_in_bytes(), "Sanity check"); + area->set_size_in_bytes(size_in_bytes()); _chunk->next_chop(); + } else { + assert(area->size_in_bytes() == size_in_bytes(), "Sanity check"); } // Roll back arena to saved top markers area->_chunk = _chunk; area->_hwm = _hwm; area->_max = _max; - area->set_size_in_bytes(_size_in_bytes); #ifdef ASSERT // clear out first chunk (to detect allocation bugs) if (ZapVMHandleArea) { diff --git a/hotspot/src/share/vm/runtime/handles.hpp b/hotspot/src/share/vm/runtime/handles.hpp index cab3dc581f9..8c643d7c206 100644 --- a/hotspot/src/share/vm/runtime/handles.hpp +++ b/hotspot/src/share/vm/runtime/handles.hpp @@ -297,6 +297,7 @@ class HandleMark { void set_previous_handle_mark(HandleMark* mark) { _previous_handle_mark = mark; } HandleMark* previous_handle_mark() const { return _previous_handle_mark; } + size_t size_in_bytes() const { return _size_in_bytes; } public: HandleMark(); // see handles_inline.hpp HandleMark(Thread* thread) { initialize(thread); } diff --git a/hotspot/src/share/vm/runtime/handles.inline.hpp b/hotspot/src/share/vm/runtime/handles.inline.hpp index 96dd94cc592..51c31ff4b12 100644 --- a/hotspot/src/share/vm/runtime/handles.inline.hpp +++ b/hotspot/src/share/vm/runtime/handles.inline.hpp @@ -136,13 +136,18 @@ inline void HandleMark::pop_and_restore() { HandleArea* area = _area; // help compilers with poor alias analysis // Delete later chunks if( _chunk->next() ) { + // reset arena size before delete chunks. Otherwise, the total + // arena size could exceed total chunk size + assert(area->size_in_bytes() > size_in_bytes(), "Sanity check"); + area->set_size_in_bytes(size_in_bytes()); _chunk->next_chop(); + } else { + assert(area->size_in_bytes() == size_in_bytes(), "Sanity check"); } // Roll back arena to saved top markers area->_chunk = _chunk; area->_hwm = _hwm; area->_max = _max; - area->set_size_in_bytes(_size_in_bytes); debug_only(area->_handle_mark_nesting--); } diff --git a/hotspot/src/share/vm/runtime/os.cpp b/hotspot/src/share/vm/runtime/os.cpp index 550e64a2754..56bd8261322 100644 --- a/hotspot/src/share/vm/runtime/os.cpp +++ b/hotspot/src/share/vm/runtime/os.cpp @@ -600,9 +600,7 @@ void* os::malloc(size_t size, MEMFLAGS memflags, address caller) { if (PrintMalloc && tty != NULL) tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, memblock); // we do not track MallocCushion memory - if (MemTracker::is_on()) { MemTracker::record_malloc((address)memblock, size, memflags, caller == 0 ? CALLER_PC : caller); - } return memblock; } @@ -613,7 +611,7 @@ void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, address caller NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1)); NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size)); void* ptr = ::realloc(memblock, size); - if (ptr != NULL && MemTracker::is_on()) { + if (ptr != NULL) { MemTracker::record_realloc((address)memblock, (address)ptr, size, memflags, caller == 0 ? CALLER_PC : caller); } @@ -1401,7 +1399,7 @@ bool os::create_stack_guard_pages(char* addr, size_t bytes) { char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { char* result = pd_reserve_memory(bytes, addr, alignment_hint); - if (result != NULL && MemTracker::is_on()) { + if (result != NULL) { MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); } @@ -1409,7 +1407,7 @@ char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { } char* os::attempt_reserve_memory_at(size_t bytes, char* addr) { char* result = pd_attempt_reserve_memory_at(bytes, addr); - if (result != NULL && MemTracker::is_on()) { + if (result != NULL) { MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); } return result; @@ -1422,7 +1420,7 @@ void os::split_reserved_memory(char *base, size_t size, bool os::commit_memory(char* addr, size_t bytes, bool executable) { bool res = pd_commit_memory(addr, bytes, executable); - if (res && MemTracker::is_on()) { + if (res) { MemTracker::record_virtual_memory_commit((address)addr, bytes, CALLER_PC); } return res; @@ -1431,7 +1429,7 @@ bool os::commit_memory(char* addr, size_t bytes, bool executable) { bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, bool executable) { bool res = os::pd_commit_memory(addr, size, alignment_hint, executable); - if (res && MemTracker::is_on()) { + if (res) { MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC); } return res; @@ -1458,8 +1456,9 @@ char* os::map_memory(int fd, const char* file_name, size_t file_offset, char *addr, size_t bytes, bool read_only, bool allow_exec) { char* result = pd_map_memory(fd, file_name, file_offset, addr, bytes, read_only, allow_exec); - if (result != NULL && MemTracker::is_on()) { + if (result != NULL) { MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); + MemTracker::record_virtual_memory_commit((address)result, bytes, CALLER_PC); } return result; } @@ -1474,6 +1473,7 @@ char* os::remap_memory(int fd, const char* file_name, size_t file_offset, bool os::unmap_memory(char *addr, size_t bytes) { bool result = pd_unmap_memory(addr, bytes); if (result) { + MemTracker::record_virtual_memory_uncommit((address)addr, bytes); MemTracker::record_virtual_memory_release((address)addr, bytes); } return result; diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp index 0ed9a4b1fee..5c96224a422 100644 --- a/hotspot/src/share/vm/runtime/thread.cpp +++ b/hotspot/src/share/vm/runtime/thread.cpp @@ -323,12 +323,10 @@ void Thread::record_stack_base_and_size() { os::initialize_thread(this); #if INCLUDE_NMT - // record thread's native stack, stack grows downward - if (MemTracker::is_on()) { - address stack_low_addr = stack_base() - stack_size(); - MemTracker::record_thread_stack(stack_low_addr, stack_size(), this, + // record thread's native stack, stack grows downward + address stack_low_addr = stack_base() - stack_size(); + MemTracker::record_thread_stack(stack_low_addr, stack_size(), this, CURRENT_PC); - } #endif // INCLUDE_NMT } @@ -345,6 +343,9 @@ Thread::~Thread() { if (_stack_base != NULL) { address low_stack_addr = stack_base() - stack_size(); MemTracker::release_thread_stack(low_stack_addr, stack_size(), this); +#ifdef ASSERT + set_stack_base(NULL); +#endif } #endif // INCLUDE_NMT @@ -1521,10 +1522,12 @@ JavaThread::~JavaThread() { tty->print_cr("terminate thread %p", this); } - // Info NMT that this JavaThread is exiting, its memory - // recorder should be collected + // By now, this thread should already be invisible to safepoint, + // and its per-thread recorder also collected. assert(!is_safepoint_visible(), "wrong state"); - MemTracker::thread_exiting(this); +#if INCLUDE_NMT + assert(get_recorder() == NULL, "Already collected"); +#endif // INCLUDE_NMT // JSR166 -- return the parker to the free list Parker::Release(_parker); @@ -2425,6 +2428,7 @@ void JavaThread::create_stack_guard_pages() { } void JavaThread::remove_stack_guard_pages() { + assert(Thread::current() == this, "from different thread"); if (_stack_guard_state == stack_guard_unused) return; address low_addr = stack_base() - stack_size(); size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size(); @@ -4093,7 +4097,10 @@ void Threads::remove(JavaThread* p) { // Now, this thread is not visible to safepoint p->set_safepoint_visible(false); - + // once the thread becomes safepoint invisible, we can not use its per-thread + // recorder. And Threads::do_threads() no longer walks this thread, so we have + // to release its per-thread recorder here. + MemTracker::thread_exiting(p); } // unlock Threads_lock // Since Events::log uses a lock, we grab it outside the Threads_lock diff --git a/hotspot/src/share/vm/services/attachListener.cpp b/hotspot/src/share/vm/services/attachListener.cpp index 983f3f95fe1..80dfd7effd4 100644 --- a/hotspot/src/share/vm/services/attachListener.cpp +++ b/hotspot/src/share/vm/services/attachListener.cpp @@ -404,6 +404,8 @@ static AttachOperationFunctionInfo funcs[] = { static void attach_listener_thread_entry(JavaThread* thread, TRAPS) { os::set_priority(thread, NearMaxPriority); + thread->record_stack_base_and_size(); + if (AttachListener::pd_init() != 0) { return; } diff --git a/hotspot/src/share/vm/services/memBaseline.cpp b/hotspot/src/share/vm/services/memBaseline.cpp index 5b829751649..57bdb013874 100644 --- a/hotspot/src/share/vm/services/memBaseline.cpp +++ b/hotspot/src/share/vm/services/memBaseline.cpp @@ -40,6 +40,7 @@ MemType2Name MemBaseline::MemType2NameMap[NUMBER_OF_MEMORY_TYPE] = { {mtSymbol, "Symbol"}, {mtNMT, "Memory Tracking"}, {mtChunk, "Pooled Free Chunks"}, + {mtClassShared,"Shared spaces for classes"}, {mtNone, "Unknown"} // It can happen when type tagging records are lagging // behind }; @@ -55,6 +56,7 @@ MemBaseline::MemBaseline() { _malloc_cs = NULL; _vm_cs = NULL; + _vm_map = NULL; _number_of_classes = 0; _number_of_threads = 0; @@ -72,6 +74,11 @@ void MemBaseline::clear() { _vm_cs = NULL; } + if (_vm_map != NULL) { + delete _vm_map; + _vm_map = NULL; + } + reset(); } @@ -85,6 +92,7 @@ void MemBaseline::reset() { if (_malloc_cs != NULL) _malloc_cs->clear(); if (_vm_cs != NULL) _vm_cs->clear(); + if (_vm_map != NULL) _vm_map->clear(); for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) { _malloc_data[index].clear(); @@ -94,39 +102,33 @@ void MemBaseline::reset() { } MemBaseline::~MemBaseline() { - if (_malloc_cs != NULL) { - delete _malloc_cs; - } - - if (_vm_cs != NULL) { - delete _vm_cs; - } + clear(); } // baseline malloc'd memory records, generate overall summary and summaries by // memory types bool MemBaseline::baseline_malloc_summary(const MemPointerArray* malloc_records) { - MemPointerArrayIteratorImpl mItr((MemPointerArray*)malloc_records); - MemPointerRecord* mptr = (MemPointerRecord*)mItr.current(); + MemPointerArrayIteratorImpl malloc_itr((MemPointerArray*)malloc_records); + MemPointerRecord* malloc_ptr = (MemPointerRecord*)malloc_itr.current(); size_t used_arena_size = 0; int index; - while (mptr != NULL) { - index = flag2index(FLAGS_TO_MEMORY_TYPE(mptr->flags())); - size_t size = mptr->size(); + while (malloc_ptr != NULL) { + index = flag2index(FLAGS_TO_MEMORY_TYPE(malloc_ptr->flags())); + size_t size = malloc_ptr->size(); _total_malloced += size; _malloc_data[index].inc(size); - if (MemPointerRecord::is_arena_record(mptr->flags())) { + if (MemPointerRecord::is_arena_record(malloc_ptr->flags())) { // see if arena size record present - MemPointerRecord* next_p = (MemPointerRecordEx*)mItr.peek_next(); - if (MemPointerRecord::is_arena_size_record(next_p->flags())) { - assert(next_p->is_size_record_of_arena(mptr), "arena records do not match"); - size = next_p->size(); + MemPointerRecord* next_malloc_ptr = (MemPointerRecordEx*)malloc_itr.peek_next(); + if (MemPointerRecord::is_arena_size_record(next_malloc_ptr->flags())) { + assert(next_malloc_ptr->is_size_record_of_arena(malloc_ptr), "arena records do not match"); + size = next_malloc_ptr->size(); _arena_data[index].inc(size); used_arena_size += size; - mItr.next(); + malloc_itr.next(); } } - mptr = (MemPointerRecordEx*)mItr.next(); + malloc_ptr = (MemPointerRecordEx*)malloc_itr.next(); } // substract used arena size to get size of arena chunk in free list @@ -142,20 +144,23 @@ bool MemBaseline::baseline_malloc_summary(const MemPointerArray* malloc_records) // baseline mmap'd memory records, generate overall summary and summaries by // memory types bool MemBaseline::baseline_vm_summary(const MemPointerArray* vm_records) { - MemPointerArrayIteratorImpl vItr((MemPointerArray*)vm_records); - VMMemRegion* vptr = (VMMemRegion*)vItr.current(); + MemPointerArrayIteratorImpl vm_itr((MemPointerArray*)vm_records); + VMMemRegion* vm_ptr = (VMMemRegion*)vm_itr.current(); int index; - while (vptr != NULL) { - index = flag2index(FLAGS_TO_MEMORY_TYPE(vptr->flags())); - + while (vm_ptr != NULL) { + if (vm_ptr->is_reserved_region()) { + index = flag2index(FLAGS_TO_MEMORY_TYPE(vm_ptr->flags())); // we use the number of thread stack to count threads - if (IS_MEMORY_TYPE(vptr->flags(), mtThreadStack)) { + if (IS_MEMORY_TYPE(vm_ptr->flags(), mtThreadStack)) { _number_of_threads ++; } - _total_vm_reserved += vptr->reserved_size(); - _total_vm_committed += vptr->committed_size(); - _vm_data[index].inc(vptr->reserved_size(), vptr->committed_size()); - vptr = (VMMemRegion*)vItr.next(); + _total_vm_reserved += vm_ptr->size(); + _vm_data[index].inc(vm_ptr->size(), 0); + } else { + _total_vm_committed += vm_ptr->size(); + _vm_data[index].inc(0, vm_ptr->size()); + } + vm_ptr = (VMMemRegion*)vm_itr.next(); } return true; } @@ -165,41 +170,57 @@ bool MemBaseline::baseline_vm_summary(const MemPointerArray* vm_records) { bool MemBaseline::baseline_malloc_details(const MemPointerArray* malloc_records) { assert(MemTracker::track_callsite(), "detail tracking is off"); - MemPointerArrayIteratorImpl mItr((MemPointerArray*)malloc_records); - MemPointerRecordEx* mptr = (MemPointerRecordEx*)mItr.current(); - MallocCallsitePointer mp; + MemPointerArrayIteratorImpl malloc_itr(const_cast(malloc_records)); + MemPointerRecordEx* malloc_ptr = (MemPointerRecordEx*)malloc_itr.current(); + MallocCallsitePointer malloc_callsite; + // initailize malloc callsite array if (_malloc_cs == NULL) { _malloc_cs = new (std::nothrow) MemPointerArrayImpl(64); // out of native memory - if (_malloc_cs == NULL) { + if (_malloc_cs == NULL || _malloc_cs->out_of_memory()) { return false; } } else { _malloc_cs->clear(); } + MemPointerArray* malloc_data = const_cast(malloc_records); + + // sort into callsite pc order. Details are aggregated by callsites + malloc_data->sort((FN_SORT)malloc_sort_by_pc); + bool ret = true; + // baseline memory that is totaled over 1 KB - while (mptr != NULL) { - if (!MemPointerRecord::is_arena_size_record(mptr->flags())) { + while (malloc_ptr != NULL) { + if (!MemPointerRecord::is_arena_size_record(malloc_ptr->flags())) { // skip thread stacks - if (!IS_MEMORY_TYPE(mptr->flags(), mtThreadStack)) { - if (mp.addr() != mptr->pc()) { - if ((mp.amount()/K) > 0) { - if (!_malloc_cs->append(&mp)) { - return false; + if (!IS_MEMORY_TYPE(malloc_ptr->flags(), mtThreadStack)) { + if (malloc_callsite.addr() != malloc_ptr->pc()) { + if ((malloc_callsite.amount()/K) > 0) { + if (!_malloc_cs->append(&malloc_callsite)) { + ret = false; + break; } } - mp = MallocCallsitePointer(mptr->pc()); + malloc_callsite = MallocCallsitePointer(malloc_ptr->pc()); } - mp.inc(mptr->size()); + malloc_callsite.inc(malloc_ptr->size()); } } - mptr = (MemPointerRecordEx*)mItr.next(); + malloc_ptr = (MemPointerRecordEx*)malloc_itr.next(); } - if (mp.addr() != 0 && (mp.amount()/K) > 0) { - if (!_malloc_cs->append(&mp)) { + // restore to address order. Snapshot malloc data is maintained in memory + // address order. + malloc_data->sort((FN_SORT)malloc_sort_by_addr); + + if (!ret) { + return false; + } + // deal with last record + if (malloc_callsite.addr() != 0 && (malloc_callsite.amount()/K) > 0) { + if (!_malloc_cs->append(&malloc_callsite)) { return false; } } @@ -210,34 +231,106 @@ bool MemBaseline::baseline_malloc_details(const MemPointerArray* malloc_records) bool MemBaseline::baseline_vm_details(const MemPointerArray* vm_records) { assert(MemTracker::track_callsite(), "detail tracking is off"); - VMCallsitePointer vp; - MemPointerArrayIteratorImpl vItr((MemPointerArray*)vm_records); - VMMemRegionEx* vptr = (VMMemRegionEx*)vItr.current(); + VMCallsitePointer vm_callsite; + VMCallsitePointer* cur_callsite = NULL; + MemPointerArrayIteratorImpl vm_itr((MemPointerArray*)vm_records); + VMMemRegionEx* vm_ptr = (VMMemRegionEx*)vm_itr.current(); + // initialize virtual memory map array + if (_vm_map == NULL) { + _vm_map = new (std::nothrow) MemPointerArrayImpl(vm_records->length()); + if (_vm_map == NULL || _vm_map->out_of_memory()) { + return false; + } + } else { + _vm_map->clear(); + } + + // initialize virtual memory callsite array if (_vm_cs == NULL) { _vm_cs = new (std::nothrow) MemPointerArrayImpl(64); - if (_vm_cs == NULL) { + if (_vm_cs == NULL || _vm_cs->out_of_memory()) { return false; } } else { _vm_cs->clear(); } - while (vptr != NULL) { - if (vp.addr() != vptr->pc()) { - if (!_vm_cs->append(&vp)) { + // consolidate virtual memory data + VMMemRegionEx* reserved_rec = NULL; + VMMemRegionEx* committed_rec = NULL; + + // vm_ptr is coming in increasing base address order + while (vm_ptr != NULL) { + if (vm_ptr->is_reserved_region()) { + // consolidate reserved memory regions for virtual memory map. + // The criteria for consolidation is: + // 1. two adjacent reserved memory regions + // 2. belong to the same memory type + // 3. reserved from the same callsite + if (reserved_rec == NULL || + reserved_rec->base() + reserved_rec->size() != vm_ptr->addr() || + FLAGS_TO_MEMORY_TYPE(reserved_rec->flags()) != FLAGS_TO_MEMORY_TYPE(vm_ptr->flags()) || + reserved_rec->pc() != vm_ptr->pc()) { + if (!_vm_map->append(vm_ptr)) { return false; } - vp = VMCallsitePointer(vptr->pc()); + // inserted reserved region, we need the pointer to the element in virtual + // memory map array. + reserved_rec = (VMMemRegionEx*)_vm_map->at(_vm_map->length() - 1); + } else { + reserved_rec->expand_region(vm_ptr->addr(), vm_ptr->size()); } - vp.inc(vptr->size(), vptr->committed_size()); - vptr = (VMMemRegionEx*)vItr.next(); - } - if (vp.addr() != 0) { - if (!_vm_cs->append(&vp)) { + + if (cur_callsite != NULL && !_vm_cs->append(cur_callsite)) { return false; } + vm_callsite = VMCallsitePointer(vm_ptr->pc()); + cur_callsite = &vm_callsite; + vm_callsite.inc(vm_ptr->size(), 0); + } else { + // consolidate committed memory regions for virtual memory map + // The criterial is: + // 1. two adjacent committed memory regions + // 2. committed from the same callsite + if (committed_rec == NULL || + committed_rec->base() + committed_rec->size() != vm_ptr->addr() || + committed_rec->pc() != vm_ptr->pc()) { + if (!_vm_map->append(vm_ptr)) { + return false; } + committed_rec = (VMMemRegionEx*)_vm_map->at(_vm_map->length() - 1); + } else { + committed_rec->expand_region(vm_ptr->addr(), vm_ptr->size()); + } + vm_callsite.inc(0, vm_ptr->size()); + } + vm_ptr = (VMMemRegionEx*)vm_itr.next(); + } + // deal with last record + if (cur_callsite != NULL && !_vm_cs->append(cur_callsite)) { + return false; + } + + // sort it into callsite pc order. Details are aggregated by callsites + _vm_cs->sort((FN_SORT)bl_vm_sort_by_pc); + + // walk the array to consolidate record by pc + MemPointerArrayIteratorImpl itr(_vm_cs); + VMCallsitePointer* callsite_rec = (VMCallsitePointer*)itr.current(); + VMCallsitePointer* next_rec = (VMCallsitePointer*)itr.next(); + while (next_rec != NULL) { + assert(callsite_rec != NULL, "Sanity check"); + if (next_rec->addr() == callsite_rec->addr()) { + callsite_rec->inc(next_rec->reserved_amount(), next_rec->committed_amount()); + itr.remove(); + next_rec = (VMCallsitePointer*)itr.current(); + } else { + callsite_rec = next_rec; + next_rec = (VMCallsitePointer*)itr.next(); + } + } + return true; } @@ -251,12 +344,8 @@ bool MemBaseline::baseline(MemSnapshot& snapshot, bool summary_only) { _number_of_classes = SystemDictionary::number_of_classes(); if (!summary_only && MemTracker::track_callsite() && _baselined) { - ((MemPointerArray*)snapshot._alloc_ptrs)->sort((FN_SORT)malloc_sort_by_pc); - ((MemPointerArray*)snapshot._vm_ptrs)->sort((FN_SORT)vm_sort_by_pc); _baselined = baseline_malloc_details(snapshot._alloc_ptrs) && baseline_vm_details(snapshot._vm_ptrs); - ((MemPointerArray*)snapshot._alloc_ptrs)->sort((FN_SORT)malloc_sort_by_addr); - ((MemPointerArray*)snapshot._vm_ptrs)->sort((FN_SORT)vm_sort_by_addr); } return _baselined; } @@ -278,7 +367,7 @@ const char* MemBaseline::type2name(MEMFLAGS type) { return MemType2NameMap[index]._name; } } - assert(false, "no type"); + assert(false, err_msg("bad type %x", type)); return NULL; } @@ -341,13 +430,6 @@ int MemBaseline::bl_malloc_sort_by_pc(const void* p1, const void* p2) { return UNSIGNED_COMPARE(mp1->addr(), mp2->addr()); } -// sort snapshot mmap'd records in callsite pc order -int MemBaseline::vm_sort_by_pc(const void* p1, const void* p2) { - assert(MemTracker::track_callsite(),"Just check"); - const VMMemRegionEx* mp1 = (const VMMemRegionEx*)p1; - const VMMemRegionEx* mp2 = (const VMMemRegionEx*)p2; - return UNSIGNED_COMPARE(mp1->pc(), mp2->pc()); -} // sort baselined mmap'd records in size (reserved size) order int MemBaseline::bl_vm_sort_by_size(const void* p1, const void* p2) { @@ -376,12 +458,3 @@ int MemBaseline::malloc_sort_by_addr(const void* p1, const void* p2) { return delta; } -// sort snapshot mmap'd records in memory block address order -int MemBaseline::vm_sort_by_addr(const void* p1, const void* p2) { - assert(MemTracker::is_on(), "Just check"); - const VMMemRegion* mp1 = (const VMMemRegion*)p1; - const VMMemRegion* mp2 = (const VMMemRegion*)p2; - int delta = UNSIGNED_COMPARE(mp1->addr(), mp2->addr()); - assert(delta != 0, "dup pointer"); - return delta; -} diff --git a/hotspot/src/share/vm/services/memBaseline.hpp b/hotspot/src/share/vm/services/memBaseline.hpp index 2affa2b96ca..5f98e30d451 100644 --- a/hotspot/src/share/vm/services/memBaseline.hpp +++ b/hotspot/src/share/vm/services/memBaseline.hpp @@ -320,6 +320,8 @@ class MemBaseline : public _ValueObj { // only available when detail tracking is on. MemPointerArray* _malloc_cs; MemPointerArray* _vm_cs; + // virtual memory map + MemPointerArray* _vm_map; private: static MemType2Name MemType2NameMap[NUMBER_OF_MEMORY_TYPE]; @@ -432,9 +434,6 @@ class MemBaseline : public _ValueObj { static int malloc_sort_by_pc(const void* p1, const void* p2); static int malloc_sort_by_addr(const void* p1, const void* p2); - static int vm_sort_by_pc(const void* p1, const void* p2); - static int vm_sort_by_addr(const void* p1, const void* p2); - private: // sorting functions for baselined records static int bl_malloc_sort_by_size(const void* p1, const void* p2); diff --git a/hotspot/src/share/vm/services/memPtr.cpp b/hotspot/src/share/vm/services/memPtr.cpp index d2a18765a4f..5d0fbf5bf57 100644 --- a/hotspot/src/share/vm/services/memPtr.cpp +++ b/hotspot/src/share/vm/services/memPtr.cpp @@ -40,35 +40,3 @@ jint SequenceGenerator::next() { return seq; } - - -bool VMMemRegion::contains(const VMMemRegion* mr) const { - assert(base() != 0, "Sanity check"); - assert(size() != 0 || committed_size() != 0, - "Sanity check"); - address base_addr = base(); - address end_addr = base_addr + - (is_reserve_record()? reserved_size(): committed_size()); - if (mr->is_reserve_record()) { - if (mr->base() == base_addr && mr->size() == size()) { - // the same range - return true; - } - return false; - } else if (mr->is_commit_record() || mr->is_uncommit_record()) { - assert(mr->base() != 0 && mr->committed_size() > 0, - "bad record"); - return (mr->base() >= base_addr && - (mr->base() + mr->committed_size()) <= end_addr); - } else if (mr->is_type_tagging_record()) { - assert(mr->base() != NULL, "Sanity check"); - return (mr->base() >= base_addr && mr->base() < end_addr); - } else if (mr->is_release_record()) { - assert(mr->base() != 0 && mr->size() > 0, - "bad record"); - return (mr->base() == base_addr && mr->size() == size()); - } else { - ShouldNotReachHere(); - return false; - } -} diff --git a/hotspot/src/share/vm/services/memPtr.hpp b/hotspot/src/share/vm/services/memPtr.hpp index bef49b2b47a..0618a3c806a 100644 --- a/hotspot/src/share/vm/services/memPtr.hpp +++ b/hotspot/src/share/vm/services/memPtr.hpp @@ -291,6 +291,26 @@ public: inline bool is_type_tagging_record() const { return is_virtual_memory_type_record(_flags); } + + // if the two memory pointer records actually represent the same + // memory block + inline bool is_same_region(const MemPointerRecord* other) const { + return (addr() == other->addr() && size() == other->size()); + } + + // if this memory region fully contains another one + inline bool contains_region(const MemPointerRecord* other) const { + return contains_region(other->addr(), other->size()); + } + + // if this memory region fully contains specified memory range + inline bool contains_region(address add, size_t sz) const { + return (addr() <= add && addr() + size() >= add + sz); + } + + inline bool contains_address(address add) const { + return (addr() <= add && addr() + size() > add); + } }; // MemPointerRecordEx also records callsite pc, from where @@ -321,66 +341,32 @@ class MemPointerRecordEx : public MemPointerRecord { } }; -// a virtual memory region +// a virtual memory region. The region can represent a reserved +// virtual memory region or a committed memory region class VMMemRegion : public MemPointerRecord { - private: - // committed size - size_t _committed_size; - public: - VMMemRegion(): _committed_size(0) { } + VMMemRegion() { } void init(const MemPointerRecord* mp) { - assert(mp->is_vm_pointer(), "not virtual memory pointer"); + assert(mp->is_vm_pointer(), "Sanity check"); _addr = mp->addr(); - if (mp->is_commit_record() || mp->is_uncommit_record()) { - _committed_size = mp->size(); - set_size(_committed_size); - } else { set_size(mp->size()); - _committed_size = 0; - } set_flags(mp->flags()); } VMMemRegion& operator=(const VMMemRegion& other) { MemPointerRecord::operator=(other); - _committed_size = other.committed_size(); return *this; } - inline bool is_reserve_record() const { - return is_virtual_memory_reserve_record(flags()); + inline bool is_reserved_region() const { + return is_allocation_record(); } - inline bool is_release_record() const { - return is_virtual_memory_release_record(flags()); + inline bool is_committed_region() const { + return is_commit_record(); } - // resize reserved VM range - inline void set_reserved_size(size_t new_size) { - assert(new_size >= committed_size(), "resize"); - set_size(new_size); - } - - inline void commit(size_t size) { - _committed_size += size; - } - - inline void uncommit(size_t size) { - if (_committed_size >= size) { - _committed_size -= size; - } else { - _committed_size = 0; - } - } - - /* - * if this virtual memory range covers whole range of - * the other VMMemRegion - */ - bool contains(const VMMemRegion* mr) const; - /* base address of this virtual memory range */ inline address base() const { return addr(); @@ -391,13 +377,28 @@ public: set_flags(flags() | (f & mt_masks)); } - // release part of memory range - inline void partial_release(address add, size_t sz) { - assert(add >= addr() && add < addr() + size(), "not valid address"); - // for now, it can partially release from the both ends, - // but not in the middle + // expand this region to also cover specified range. + // The range has to be on either end of the memory region. + void expand_region(address addr, size_t sz) { + if (addr < base()) { + assert(addr + sz == base(), "Sanity check"); + _addr = addr; + set_size(size() + sz); + } else { + assert(base() + size() == addr, "Sanity check"); + set_size(size() + sz); + } + } + + // exclude the specified address range from this region. + // The excluded memory range has to be on either end of this memory + // region. + inline void exclude_region(address add, size_t sz) { + assert(is_reserved_region() || is_committed_region(), "Sanity check"); + assert(addr() != NULL && size() != 0, "Sanity check"); + assert(add >= addr() && add < addr() + size(), "Sanity check"); assert(add == addr() || (add + sz) == (addr() + size()), - "release in the middle"); + "exclude in the middle"); if (add == addr()) { set_addr(add + sz); set_size(size() - sz); @@ -405,16 +406,6 @@ public: set_size(size() - sz); } } - - // the committed size of the virtual memory block - inline size_t committed_size() const { - return _committed_size; - } - - // the reserved size of the virtual memory block - inline size_t reserved_size() const { - return size(); - } }; class VMMemRegionEx : public VMMemRegion { diff --git a/hotspot/src/share/vm/services/memRecorder.cpp b/hotspot/src/share/vm/services/memRecorder.cpp index 33db875af31..5ec865af323 100644 --- a/hotspot/src/share/vm/services/memRecorder.cpp +++ b/hotspot/src/share/vm/services/memRecorder.cpp @@ -31,14 +31,19 @@ #include "services/memTracker.hpp" MemPointer* SequencedRecordIterator::next_record() { - MemPointer* itr_cur = _itr.current(); - if (itr_cur == NULL) return NULL; - MemPointer* itr_next = _itr.next(); + MemPointerRecord* itr_cur = (MemPointerRecord*)_itr.current(); + if (itr_cur == NULL) { + return itr_cur; + } - while (itr_next != NULL && - same_kind((MemPointerRecord*)itr_cur, (MemPointerRecord*)itr_next)) { + MemPointerRecord* itr_next = (MemPointerRecord*)_itr.next(); + + // don't collapse virtual memory records + while (itr_next != NULL && !itr_cur->is_vm_pointer() && + !itr_next->is_vm_pointer() && + same_kind(itr_cur, itr_next)) { itr_cur = itr_next; - itr_next = _itr.next(); + itr_next = (MemPointerRecord*)_itr.next(); } return itr_cur; diff --git a/hotspot/src/share/vm/services/memRecorder.hpp b/hotspot/src/share/vm/services/memRecorder.hpp index 754cbd6c346..2afeeb09b52 100644 --- a/hotspot/src/share/vm/services/memRecorder.hpp +++ b/hotspot/src/share/vm/services/memRecorder.hpp @@ -188,6 +188,7 @@ class SequencedRecordIterator : public MemPointerArrayIterator { // Test if the two records are the same kind: the same memory block and allocation // type. inline bool same_kind(const MemPointerRecord* p1, const MemPointerRecord* p2) const { + assert(!p1->is_vm_pointer() && !p2->is_vm_pointer(), "malloc pointer only"); return (p1->addr() == p2->addr() && (p1->flags() &MemPointerRecord::tag_masks) == (p2->flags() & MemPointerRecord::tag_masks)); diff --git a/hotspot/src/share/vm/services/memReporter.cpp b/hotspot/src/share/vm/services/memReporter.cpp index 783d951de14..602ac1c08ed 100644 --- a/hotspot/src/share/vm/services/memReporter.cpp +++ b/hotspot/src/share/vm/services/memReporter.cpp @@ -51,6 +51,7 @@ void BaselineReporter::report_baseline(const MemBaseline& baseline, bool summary report_summaries(baseline); if (!summary_only && MemTracker::track_callsite()) { + report_virtual_memory_map(baseline); report_callsites(baseline); } _outputer.done(); @@ -74,6 +75,25 @@ void BaselineReporter::report_summaries(const MemBaseline& baseline) { _outputer.done_category_summary(); } +void BaselineReporter::report_virtual_memory_map(const MemBaseline& baseline) { + _outputer.start_virtual_memory_map(); + MemBaseline* pBL = const_cast(&baseline); + MemPointerArrayIteratorImpl itr = MemPointerArrayIteratorImpl(pBL->_vm_map); + VMMemRegionEx* rgn = (VMMemRegionEx*)itr.current(); + while (rgn != NULL) { + if (rgn->is_reserved_region()) { + _outputer.reserved_memory_region(FLAGS_TO_MEMORY_TYPE(rgn->flags()), + rgn->base(), rgn->base() + rgn->size(), amount_in_current_scale(rgn->size()), rgn->pc()); + } else { + _outputer.committed_memory_region(rgn->base(), rgn->base() + rgn->size(), + amount_in_current_scale(rgn->size()), rgn->pc()); + } + rgn = (VMMemRegionEx*)itr.next(); + } + + _outputer.done_virtual_memory_map(); +} + void BaselineReporter::report_callsites(const MemBaseline& baseline) { _outputer.start_callsite(); MemBaseline* pBL = const_cast(&baseline); @@ -324,6 +344,40 @@ void BaselineTTYOutputer::done_category_summary() { _output->print_cr(" "); } + +void BaselineTTYOutputer::start_virtual_memory_map() { + _output->print_cr("Virtual memory map:"); +} + +void BaselineTTYOutputer::reserved_memory_region(MEMFLAGS type, address base, address end, + size_t size, address pc) { + const char* unit = memory_unit(_scale); + char buf[128]; + int offset; + _output->print_cr(" "); + _output->print_cr("[" PTR_FORMAT " - " PTR_FORMAT "] reserved %d%s for %s", base, end, size, unit, + MemBaseline::type2name(type)); + if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) { + _output->print_cr("\t\tfrom [%s+0x%x]", buf, offset); + } +} + +void BaselineTTYOutputer::committed_memory_region(address base, address end, size_t size, address pc) { + const char* unit = memory_unit(_scale); + char buf[128]; + int offset; + _output->print("\t[" PTR_FORMAT " - " PTR_FORMAT "] committed %d%s", base, end, size, unit); + if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) { + _output->print_cr(" from [%s+0x%x]", buf, offset); + } +} + +void BaselineTTYOutputer::done_virtual_memory_map() { + _output->print_cr(" "); +} + + + void BaselineTTYOutputer::start_callsite() { _output->print_cr("Details:"); _output->print_cr(" "); @@ -337,7 +391,7 @@ void BaselineTTYOutputer::malloc_callsite(address pc, size_t malloc_amt, size_t malloc_count) { if (malloc_amt > 0) { const char* unit = memory_unit(_scale); - char buf[64]; + char buf[128]; int offset; if (pc == 0) { _output->print("[BOOTSTRAP]%18s", " "); @@ -357,7 +411,7 @@ void BaselineTTYOutputer::virtual_memory_callsite(address pc, size_t reserved_am size_t committed_amt) { if (reserved_amt > 0) { const char* unit = memory_unit(_scale); - char buf[64]; + char buf[128]; int offset; if (pc == 0) { _output->print("[BOOTSTRAP]%18s", " "); @@ -502,7 +556,7 @@ void BaselineTTYOutputer::diff_malloc_callsite(address pc, int malloc_diff, int malloc_count_diff) { if (malloc_diff != 0) { const char* unit = memory_unit(_scale); - char buf[64]; + char buf[128]; int offset; if (pc == 0) { _output->print_cr("[BOOTSTRAP]%18s", " "); diff --git a/hotspot/src/share/vm/services/memReporter.hpp b/hotspot/src/share/vm/services/memReporter.hpp index 4595b2797b3..7a5372d49a0 100644 --- a/hotspot/src/share/vm/services/memReporter.hpp +++ b/hotspot/src/share/vm/services/memReporter.hpp @@ -93,6 +93,11 @@ class BaselineOutputer : public StackObj { virtual void done_category_summary() = 0; + virtual void start_virtual_memory_map() = 0; + virtual void reserved_memory_region(MEMFLAGS type, address base, address end, size_t size, address pc) = 0; + virtual void committed_memory_region(address base, address end, size_t size, address pc) = 0; + virtual void done_virtual_memory_map() = 0; + /* * Report callsite information */ @@ -136,6 +141,7 @@ class BaselineReporter : public StackObj { private: void report_summaries(const MemBaseline& baseline); + void report_virtual_memory_map(const MemBaseline& baseline); void report_callsites(const MemBaseline& baseline); void diff_summaries(const MemBaseline& cur, const MemBaseline& prev); @@ -251,6 +257,13 @@ class BaselineTTYOutputer : public BaselineOutputer { void done_category_summary(); + // virtual memory map + void start_virtual_memory_map(); + void reserved_memory_region(MEMFLAGS type, address base, address end, size_t size, address pc); + void committed_memory_region(address base, address end, size_t size, address pc); + void done_virtual_memory_map(); + + /* * Report callsite information */ diff --git a/hotspot/src/share/vm/services/memSnapshot.cpp b/hotspot/src/share/vm/services/memSnapshot.cpp index f860576941e..20e1ce61fa4 100644 --- a/hotspot/src/share/vm/services/memSnapshot.cpp +++ b/hotspot/src/share/vm/services/memSnapshot.cpp @@ -31,6 +31,220 @@ #include "services/memSnapshot.hpp" #include "services/memTracker.hpp" + +bool VMMemPointerIterator::insert_record(MemPointerRecord* rec) { + VMMemRegionEx new_rec; + assert(rec->is_allocation_record() || rec->is_commit_record(), + "Sanity check"); + if (MemTracker::track_callsite()) { + new_rec.init((MemPointerRecordEx*)rec); + } else { + new_rec.init(rec); + } + return insert(&new_rec); +} + +bool VMMemPointerIterator::insert_record_after(MemPointerRecord* rec) { + VMMemRegionEx new_rec; + assert(rec->is_allocation_record() || rec->is_commit_record(), + "Sanity check"); + if (MemTracker::track_callsite()) { + new_rec.init((MemPointerRecordEx*)rec); + } else { + new_rec.init(rec); + } + return insert_after(&new_rec); +} + +// we don't consolidate reserved regions, since they may be categorized +// in different types. +bool VMMemPointerIterator::add_reserved_region(MemPointerRecord* rec) { + assert(rec->is_allocation_record(), "Sanity check"); + VMMemRegion* cur = (VMMemRegion*)current(); + + // we don't have anything yet + if (cur == NULL) { + return insert_record(rec); + } + + assert(cur->is_reserved_region(), "Sanity check"); + // duplicated records + if (cur->is_same_region(rec)) { + return true; + } + assert(cur->base() > rec->addr(), "Just check: locate()"); + assert(rec->addr() + rec->size() <= cur->base(), "Can not overlap"); + return insert_record(rec); +} + +// we do consolidate committed regions +bool VMMemPointerIterator::add_committed_region(MemPointerRecord* rec) { + assert(rec->is_commit_record(), "Sanity check"); + VMMemRegion* cur; + cur = (VMMemRegion*)current(); + assert(cur->is_reserved_region() && cur->contains_region(rec), + "Sanity check"); + + // thread's native stack is always marked as "committed", ignore + // the "commit" operation for creating stack guard pages + if (FLAGS_TO_MEMORY_TYPE(cur->flags()) == mtThreadStack && + FLAGS_TO_MEMORY_TYPE(rec->flags()) != mtThreadStack) { + return true; + } + + cur = (VMMemRegion*)next(); + while (cur != NULL && cur->is_committed_region()) { + // duplicated commit records + if(cur->contains_region(rec)) { + return true; + } + if (cur->base() > rec->addr()) { + // committed regions can not overlap + assert(rec->addr() + rec->size() <= cur->base(), "Can not overlap"); + if (rec->addr() + rec->size() == cur->base()) { + cur->expand_region(rec->addr(), rec->size()); + return true; + } else { + return insert_record(rec); + } + } else if (cur->base() + cur->size() == rec->addr()) { + cur->expand_region(rec->addr(), rec->size()); + VMMemRegion* next_reg = (VMMemRegion*)next(); + // see if we can consolidate next committed region + if (next_reg != NULL && next_reg->is_committed_region() && + next_reg->base() == cur->base() + cur->size()) { + cur->expand_region(next_reg->base(), next_reg->size()); + remove(); + } + return true; + } + cur = (VMMemRegion*)next(); + } + return insert_record(rec); +} + +bool VMMemPointerIterator::remove_uncommitted_region(MemPointerRecord* rec) { + assert(rec->is_uncommit_record(), "sanity check"); + VMMemRegion* cur; + cur = (VMMemRegion*)current(); + assert(cur->is_reserved_region() && cur->contains_region(rec), + "Sanity check"); + // thread's native stack is always marked as "committed", ignore + // the "commit" operation for creating stack guard pages + if (FLAGS_TO_MEMORY_TYPE(cur->flags()) == mtThreadStack && + FLAGS_TO_MEMORY_TYPE(rec->flags()) != mtThreadStack) { + return true; + } + + cur = (VMMemRegion*)next(); + while (cur != NULL && cur->is_committed_region()) { + // region already uncommitted, must be due to duplicated record + if (cur->addr() >= rec->addr() + rec->size()) { + break; + } else if (cur->contains_region(rec)) { + // uncommit whole region + if (cur->is_same_region(rec)) { + remove(); + break; + } else if (rec->addr() == cur->addr() || + rec->addr() + rec->size() == cur->addr() + cur->size()) { + // uncommitted from either end of current memory region. + cur->exclude_region(rec->addr(), rec->size()); + break; + } else { // split the committed region and release the middle + address high_addr = cur->addr() + cur->size(); + size_t sz = high_addr - rec->addr(); + cur->exclude_region(rec->addr(), sz); + sz = high_addr - (rec->addr() + rec->size()); + if (MemTracker::track_callsite()) { + MemPointerRecordEx tmp(rec->addr() + rec->size(), cur->flags(), sz, + ((VMMemRegionEx*)cur)->pc()); + return insert_record_after(&tmp); + } else { + MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz); + return insert_record_after(&tmp); + } + } + } + cur = (VMMemRegion*)next(); + } + + // we may not find committed record due to duplicated records + return true; +} + +bool VMMemPointerIterator::remove_released_region(MemPointerRecord* rec) { + assert(rec->is_deallocation_record(), "Sanity check"); + VMMemRegion* cur = (VMMemRegion*)current(); + assert(cur->is_reserved_region() && cur->contains_region(rec), + "Sanity check"); +#ifdef ASSERT + VMMemRegion* next_reg = (VMMemRegion*)peek_next(); + // should not have any committed memory in this reserved region + assert(next_reg == NULL || !next_reg->is_committed_region(), "Sanity check"); +#endif + if (rec->is_same_region(cur)) { + remove(); + } else if (rec->addr() == cur->addr() || + rec->addr() + rec->size() == cur->addr() + cur->size()) { + // released region is at either end of this region + cur->exclude_region(rec->addr(), rec->size()); + } else { // split the reserved region and release the middle + address high_addr = cur->addr() + cur->size(); + size_t sz = high_addr - rec->addr(); + cur->exclude_region(rec->addr(), sz); + sz = high_addr - rec->addr() - rec->size(); + if (MemTracker::track_callsite()) { + MemPointerRecordEx tmp(rec->addr() + rec->size(), cur->flags(), sz, + ((VMMemRegionEx*)cur)->pc()); + return insert_reserved_region(&tmp); + } else { + MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz); + return insert_reserved_region(&tmp); + } + } + return true; +} + +bool VMMemPointerIterator::insert_reserved_region(MemPointerRecord* rec) { + // skip all 'commit' records associated with previous reserved region + VMMemRegion* p = (VMMemRegion*)next(); + while (p != NULL && p->is_committed_region() && + p->base() + p->size() < rec->addr()) { + p = (VMMemRegion*)next(); + } + return insert_record(rec); +} + +bool VMMemPointerIterator::split_reserved_region(VMMemRegion* rgn, address new_rgn_addr, size_t new_rgn_size) { + assert(rgn->contains_region(new_rgn_addr, new_rgn_size), "Not fully contained"); + address pc = (MemTracker::track_callsite() ? ((VMMemRegionEx*)rgn)->pc() : NULL); + if (rgn->base() == new_rgn_addr) { // new region is at the beginning of the region + size_t sz = rgn->size() - new_rgn_size; + // the original region becomes 'new' region + rgn->exclude_region(new_rgn_addr + new_rgn_size, sz); + // remaining becomes next region + MemPointerRecordEx next_rgn(new_rgn_addr + new_rgn_size, rgn->flags(), sz, pc); + return insert_reserved_region(&next_rgn); + } else if (rgn->base() + rgn->size() == new_rgn_addr + new_rgn_size) { + rgn->exclude_region(new_rgn_addr, new_rgn_size); + MemPointerRecordEx next_rgn(new_rgn_addr, rgn->flags(), new_rgn_size, pc); + return insert_reserved_region(&next_rgn); + } else { + // the orginal region will be split into three + address rgn_high_addr = rgn->base() + rgn->size(); + // first region + rgn->exclude_region(new_rgn_addr, (rgn_high_addr - new_rgn_addr)); + // the second region is the new region + MemPointerRecordEx new_rgn(new_rgn_addr, rgn->flags(), new_rgn_size, pc); + if (!insert_reserved_region(&new_rgn)) return false; + // the remaining region + MemPointerRecordEx rem_rgn(new_rgn_addr + new_rgn_size, rgn->flags(), + rgn_high_addr - (new_rgn_addr + new_rgn_size), pc); + return insert_reserved_region(&rem_rgn); + } +} + static int sort_in_seq_order(const void* p1, const void* p2) { assert(p1 != NULL && p2 != NULL, "Sanity check"); const MemPointerRecord* mp1 = (MemPointerRecord*)p1; @@ -61,11 +275,11 @@ bool StagingArea::init() { } -MemPointerArrayIteratorImpl StagingArea::virtual_memory_record_walker() { +VMRecordIterator StagingArea::virtual_memory_record_walker() { MemPointerArray* arr = vm_data(); // sort into seq number order arr->sort((FN_SORT)sort_in_seq_order); - return MemPointerArrayIteratorImpl(arr); + return VMRecordIterator(arr); } @@ -135,6 +349,8 @@ bool MemSnapshot::merge(MemRecorder* rec) { return false; } } else { + // locate matched record and/or also position the iterator to proper + // location for this incoming record. p2 = (MemPointerRecord*)malloc_staging_itr.locate(p1->addr()); // we have not seen this memory block, so just add to staging area if (p2 == NULL) { @@ -199,7 +415,7 @@ bool MemSnapshot::promote() { MallocRecordIterator malloc_itr = _staging_area.malloc_record_walker(); bool promoted = false; if (promote_malloc_records(&malloc_itr)) { - MemPointerArrayIteratorImpl vm_itr = _staging_area.virtual_memory_record_walker(); + VMRecordIterator vm_itr = _staging_area.virtual_memory_record_walker(); if (promote_virtual_memory_records(&vm_itr)) { promoted = true; } @@ -218,7 +434,7 @@ bool MemSnapshot::promote_malloc_records(MemPointerArrayIterator* itr) { matched_rec = (MemPointerRecord*)malloc_snapshot_itr.locate(new_rec->addr()); // found matched memory block if (matched_rec != NULL && new_rec->addr() == matched_rec->addr()) { - // snapshot already contains 'lived' records + // snapshot already contains 'live' records assert(matched_rec->is_allocation_record() || matched_rec->is_arena_size_record(), "Sanity check"); // update block states @@ -277,87 +493,60 @@ bool MemSnapshot::promote_malloc_records(MemPointerArrayIterator* itr) { bool MemSnapshot::promote_virtual_memory_records(MemPointerArrayIterator* itr) { VMMemPointerIterator vm_snapshot_itr(_vm_ptrs); MemPointerRecord* new_rec = (MemPointerRecord*)itr->current(); - VMMemRegionEx new_vm_rec; - VMMemRegion* matched_rec; + VMMemRegion* reserved_rec; while (new_rec != NULL) { assert(new_rec->is_vm_pointer(), "Sanity check"); - if (MemTracker::track_callsite()) { - new_vm_rec.init((MemPointerRecordEx*)new_rec); - } else { - new_vm_rec.init(new_rec); - } - matched_rec = (VMMemRegion*)vm_snapshot_itr.locate(new_rec->addr()); - if (matched_rec != NULL && - (matched_rec->contains(&new_vm_rec) || matched_rec->base() == new_vm_rec.base())) { + + // locate a reserved region that contains the specified address, or + // the nearest reserved region has base address just above the specified + // address + reserved_rec = (VMMemRegion*)vm_snapshot_itr.locate(new_rec->addr()); + if (reserved_rec != NULL && reserved_rec->contains_region(new_rec)) { // snapshot can only have 'live' records - assert(matched_rec->is_reserve_record(), "Sanity check"); - if (new_vm_rec.is_reserve_record() && matched_rec->base() == new_vm_rec.base()) { - // resize reserved virtual memory range - // resize has to cover committed area - assert(new_vm_rec.size() >= matched_rec->committed_size(), "Sanity check"); - matched_rec->set_reserved_size(new_vm_rec.size()); - } else if (new_vm_rec.is_commit_record()) { - // commit memory inside reserved memory range - assert(new_vm_rec.committed_size() <= matched_rec->reserved_size(), "Sanity check"); - // thread stacks are marked committed, so we ignore 'commit' record for creating - // stack guard pages - if (FLAGS_TO_MEMORY_TYPE(matched_rec->flags()) != mtThreadStack) { - matched_rec->commit(new_vm_rec.committed_size()); - } - } else if (new_vm_rec.is_uncommit_record()) { - if (FLAGS_TO_MEMORY_TYPE(matched_rec->flags()) == mtThreadStack) { - // ignore 'uncommit' record from removing stack guard pages, uncommit - // thread stack as whole - if (matched_rec->committed_size() == new_vm_rec.committed_size()) { - matched_rec->uncommit(new_vm_rec.committed_size()); + assert(reserved_rec->is_reserved_region(), "Sanity check"); + if (new_rec->is_allocation_record()) { + if (!reserved_rec->is_same_region(new_rec)) { + // only deal with split a bigger reserved region into smaller regions. + // So far, CDS is the only use case. + if (!vm_snapshot_itr.split_reserved_region(reserved_rec, new_rec->addr(), new_rec->size())) { + return false; } - } else { - // uncommit memory inside reserved memory range - assert(new_vm_rec.committed_size() <= matched_rec->committed_size(), - "Sanity check"); - matched_rec->uncommit(new_vm_rec.committed_size()); } - } else if (new_vm_rec.is_type_tagging_record()) { - // tag this virtual memory range to a memory type - // can not re-tag a memory range to different type - assert(FLAGS_TO_MEMORY_TYPE(matched_rec->flags()) == mtNone || - FLAGS_TO_MEMORY_TYPE(matched_rec->flags()) == FLAGS_TO_MEMORY_TYPE(new_vm_rec.flags()), + } else if (new_rec->is_uncommit_record()) { + if (!vm_snapshot_itr.remove_uncommitted_region(new_rec)) { + return false; + } + } else if (new_rec->is_commit_record()) { + // insert or expand existing committed region to cover this + // newly committed region + if (!vm_snapshot_itr.add_committed_region(new_rec)) { + return false; + } + } else if (new_rec->is_deallocation_record()) { + // release part or all memory region + if (!vm_snapshot_itr.remove_released_region(new_rec)) { + return false; + } + } else if (new_rec->is_type_tagging_record()) { + // tag this reserved virtual memory range to a memory type. Can not re-tag a memory range + // to different type. + assert(FLAGS_TO_MEMORY_TYPE(reserved_rec->flags()) == mtNone || + FLAGS_TO_MEMORY_TYPE(reserved_rec->flags()) == FLAGS_TO_MEMORY_TYPE(new_rec->flags()), "Sanity check"); - matched_rec->tag(new_vm_rec.flags()); - } else if (new_vm_rec.is_release_record()) { - // release part or whole memory range - if (new_vm_rec.base() == matched_rec->base() && - new_vm_rec.size() == matched_rec->size()) { - // release whole virtual memory range - assert(matched_rec->committed_size() == 0, "Sanity check"); - vm_snapshot_itr.remove(); - } else { - // partial release - matched_rec->partial_release(new_vm_rec.base(), new_vm_rec.size()); - } - } else { - // multiple reserve/commit on the same virtual memory range - assert((new_vm_rec.is_reserve_record() || new_vm_rec.is_commit_record()) && - (new_vm_rec.base() == matched_rec->base() && new_vm_rec.size() == matched_rec->size()), - "Sanity check"); - matched_rec->tag(new_vm_rec.flags()); - } + reserved_rec->tag(new_rec->flags()); } else { - // no matched record - if (new_vm_rec.is_reserve_record()) { - if (matched_rec == NULL || matched_rec->base() > new_vm_rec.base()) { - if (!vm_snapshot_itr.insert(&new_vm_rec)) { - return false; + ShouldNotReachHere(); } } else { - if (!vm_snapshot_itr.insert_after(&new_vm_rec)) { + /* + * The assertion failure indicates mis-matched virtual memory records. The likely + * scenario is, that some virtual memory operations are not going through os::xxxx_memory() + * api, which have to be tracked manually. (perfMemory is an example). + */ + assert(new_rec->is_allocation_record(), "Sanity check"); + if (!vm_snapshot_itr.add_reserved_region(new_rec)) { return false; } - } - } else { - // throw out obsolete records, which are the commit/uncommit/release/tag records - // on memory regions that are already released. - } } new_rec = (MemPointerRecord*)itr->next(); } @@ -433,5 +622,33 @@ void MemSnapshot::check_staging_data() { cur = (MemPointerRecord*)vm_itr.next(); } } + +void MemSnapshot::dump_all_vm_pointers() { + MemPointerArrayIteratorImpl itr(_vm_ptrs); + VMMemRegion* ptr = (VMMemRegion*)itr.current(); + tty->print_cr("dump virtual memory pointers:"); + while (ptr != NULL) { + if (ptr->is_committed_region()) { + tty->print("\t"); + } + tty->print("[" PTR_FORMAT " - " PTR_FORMAT "] [%x]", ptr->addr(), + (ptr->addr() + ptr->size()), ptr->flags()); + + if (MemTracker::track_callsite()) { + VMMemRegionEx* ex = (VMMemRegionEx*)ptr; + if (ex->pc() != NULL) { + char buf[1024]; + if (os::dll_address_to_function_name(ex->pc(), buf, sizeof(buf), NULL)) { + tty->print_cr("\t%s", buf); + } else { + tty->print_cr(""); + } + } + } + + ptr = (VMMemRegion*)itr.next(); + } + tty->flush(); +} #endif // ASSERT diff --git a/hotspot/src/share/vm/services/memSnapshot.hpp b/hotspot/src/share/vm/services/memSnapshot.hpp index 9ac6e4cf368..dd52f4cd7f7 100644 --- a/hotspot/src/share/vm/services/memSnapshot.hpp +++ b/hotspot/src/share/vm/services/memSnapshot.hpp @@ -111,33 +111,41 @@ class VMMemPointerIterator : public MemPointerIterator { MemPointerIterator(arr) { } - // locate an existing record that contains specified address, or - // the record, where the record with specified address, should - // be inserted. - // virtual memory record array is sorted in address order, so - // binary search is performed + // locate an existing reserved memory region that contains specified address, + // or the reserved region just above this address, where the incoming + // reserved region should be inserted. virtual MemPointer* locate(address addr) { - int index_low = 0; - int index_high = _array->length(); - int index_mid = (index_high + index_low) / 2; - int r = 1; - while (index_low < index_high && (r = compare(index_mid, addr)) != 0) { - if (r > 0) { - index_high = index_mid; - } else { - index_low = index_mid; + reset(); + VMMemRegion* reg = (VMMemRegion*)current(); + while (reg != NULL) { + if (reg->is_reserved_region()) { + if (reg->contains_address(addr) || addr < reg->base()) { + return reg; } - index_mid = (index_high + index_low) / 2; } - if (r == 0) { - // update current location - _pos = index_mid; - return _array->at(index_mid); - } else { + reg = (VMMemRegion*)next(); + } return NULL; } - } + // following methods update virtual memory in the context + // of 'current' position, which is properly positioned by + // callers via locate method. + bool add_reserved_region(MemPointerRecord* rec); + bool add_committed_region(MemPointerRecord* rec); + bool remove_uncommitted_region(MemPointerRecord* rec); + bool remove_released_region(MemPointerRecord* rec); + + // split a reserved region to create a new memory region with specified base and size + bool split_reserved_region(VMMemRegion* rgn, address new_rgn_addr, size_t new_rgn_size); + private: + bool insert_record(MemPointerRecord* rec); + bool insert_record_after(MemPointerRecord* rec); + + bool insert_reserved_region(MemPointerRecord* rec); + + // reset current position + inline void reset() { _pos = 0; } #ifdef ASSERT virtual bool is_dup_pointer(const MemPointer* ptr1, const MemPointer* ptr2) const { @@ -154,32 +162,17 @@ class VMMemPointerIterator : public MemPointerIterator { (p1->flags() & MemPointerRecord::tag_masks) == MemPointerRecord::tag_release; } #endif - // compare if an address falls into a memory region, - // return 0, if the address falls into a memory region at specified index - // return 1, if memory region pointed by specified index is higher than the address - // return -1, if memory region pointed by specified index is lower than the address - int compare(int index, address addr) const { - VMMemRegion* r = (VMMemRegion*)_array->at(index); - assert(r->is_reserve_record(), "Sanity check"); - if (r->addr() > addr) { - return 1; - } else if (r->addr() + r->reserved_size() <= addr) { - return -1; - } else { - return 0; - } - } }; class MallocRecordIterator : public MemPointerArrayIterator { - private: + protected: MemPointerArrayIteratorImpl _itr; public: MallocRecordIterator(MemPointerArray* arr) : _itr(arr) { } - MemPointer* current() const { + virtual MemPointer* current() const { MemPointerRecord* cur = (MemPointerRecord*)_itr.current(); assert(cur == NULL || !cur->is_vm_pointer(), "seek error"); MemPointerRecord* next = (MemPointerRecord*)_itr.peek_next(); @@ -194,7 +187,7 @@ class MallocRecordIterator : public MemPointerArrayIterator { } } - MemPointer* next() { + virtual MemPointer* next() { MemPointerRecord* cur = (MemPointerRecord*)_itr.current(); assert(cur == NULL || !cur->is_vm_pointer(), "Sanity check"); MemPointerRecord* next = (MemPointerRecord*)_itr.next(); @@ -214,6 +207,63 @@ class MallocRecordIterator : public MemPointerArrayIterator { bool insert_after(MemPointer* ptr) { ShouldNotReachHere(); return false; } }; +// collapse duplicated records. Eliminating duplicated records here, is much +// cheaper than during promotion phase. However, it does have limitation - it +// can only eliminate duplicated records within the generation, there are +// still chances seeing duplicated records during promotion. +// We want to use the record with higher sequence number, because it has +// more accurate callsite pc. +class VMRecordIterator : public MallocRecordIterator { + public: + VMRecordIterator(MemPointerArray* arr) : MallocRecordIterator(arr) { + MemPointerRecord* cur = (MemPointerRecord*)_itr.current(); + MemPointerRecord* next = (MemPointerRecord*)_itr.peek_next(); + while (next != NULL) { + assert(cur != NULL, "Sanity check"); + assert(((SeqMemPointerRecord*)next)->seq() > ((SeqMemPointerRecord*)cur)->seq(), + "pre-sort order"); + + if (is_duplicated_record(cur, next)) { + _itr.next(); + next = (MemPointerRecord*)_itr.peek_next(); + } else { + break; + } + } + } + + virtual MemPointer* current() const { + return _itr.current(); + } + + // get next record, but skip the duplicated records + virtual MemPointer* next() { + MemPointerRecord* cur = (MemPointerRecord*)_itr.next(); + MemPointerRecord* next = (MemPointerRecord*)_itr.peek_next(); + while (next != NULL) { + assert(cur != NULL, "Sanity check"); + assert(((SeqMemPointerRecord*)next)->seq() > ((SeqMemPointerRecord*)cur)->seq(), + "pre-sort order"); + + if (is_duplicated_record(cur, next)) { + _itr.next(); + cur = next; + next = (MemPointerRecord*)_itr.peek_next(); + } else { + break; + } + } + return cur; + } + + private: + bool is_duplicated_record(MemPointerRecord* p1, MemPointerRecord* p2) const { + bool ret = (p1->addr() == p2->addr() && p1->size() == p2->size() && p1->flags() == p2->flags()); + assert(!(ret && FLAGS_TO_MEMORY_TYPE(p1->flags()) == mtThreadStack), "dup on stack record"); + return ret; + } +}; + class StagingArea : public _ValueObj { private: MemPointerArray* _malloc_data; @@ -233,7 +283,8 @@ class StagingArea : public _ValueObj { return MallocRecordIterator(malloc_data()); } - MemPointerArrayIteratorImpl virtual_memory_record_walker(); + VMRecordIterator virtual_memory_record_walker(); + bool init(); void clear() { assert(_malloc_data != NULL && _vm_data != NULL, "Just check"); @@ -293,6 +344,8 @@ class MemSnapshot : public CHeapObj { NOT_PRODUCT(void check_staging_data();) NOT_PRODUCT(void check_malloc_pointers();) NOT_PRODUCT(bool has_allocation_record(address addr);) + // dump all virtual memory pointers in snapshot + DEBUG_ONLY( void dump_all_vm_pointers();) private: // copy pointer data from src to dest @@ -302,5 +355,4 @@ class MemSnapshot : public CHeapObj { bool promote_virtual_memory_records(MemPointerArrayIterator* itr); }; - #endif // SHARE_VM_SERVICES_MEM_SNAPSHOT_HPP diff --git a/hotspot/src/share/vm/services/memTracker.cpp b/hotspot/src/share/vm/services/memTracker.cpp index 2af6e10d627..3cec67868ad 100644 --- a/hotspot/src/share/vm/services/memTracker.cpp +++ b/hotspot/src/share/vm/services/memTracker.cpp @@ -364,7 +364,7 @@ void MemTracker::create_memory_record(address addr, MEMFLAGS flags, if (thread != NULL) { if (thread->is_Java_thread() && ((JavaThread*)thread)->is_safepoint_visible()) { - JavaThread* java_thread = static_cast(thread); + JavaThread* java_thread = (JavaThread*)thread; JavaThreadState state = java_thread->thread_state(); if (SafepointSynchronize::safepoint_safe(java_thread, state)) { // JavaThreads that are safepoint safe, can run through safepoint, @@ -472,6 +472,8 @@ void MemTracker::sync() { // it should guarantee that NMT is fully sync-ed. ThreadCritical tc; + SequenceGenerator::reset(); + // walk all JavaThreads to collect recorders SyncThreadRecorderClosure stc; Threads::threads_do(&stc); @@ -484,11 +486,12 @@ void MemTracker::sync() { pending_recorders = _global_recorder; _global_recorder = NULL; } - SequenceGenerator::reset(); // check _worker_thread with lock to avoid racing condition if (_worker_thread != NULL) { _worker_thread->at_sync_point(pending_recorders); } + + assert(SequenceGenerator::peek() == 1, "Should not have memory activities during sync-point"); } } diff --git a/hotspot/src/share/vm/services/memTracker.hpp b/hotspot/src/share/vm/services/memTracker.hpp index 62637d8a8a5..c42f01bf668 100644 --- a/hotspot/src/share/vm/services/memTracker.hpp +++ b/hotspot/src/share/vm/services/memTracker.hpp @@ -113,8 +113,10 @@ class MemTracker : AllStatic { #include "thread_solaris.inline.hpp" #endif -#ifdef _DEBUG - #define DEBUG_CALLER_PC os::get_caller_pc(3) +extern bool NMT_track_callsite; + +#ifdef ASSERT + #define DEBUG_CALLER_PC (NMT_track_callsite ? os::get_caller_pc(2) : 0) #else #define DEBUG_CALLER_PC 0 #endif @@ -261,7 +263,7 @@ class MemTracker : AllStatic { // record a 'malloc' call static inline void record_malloc(address addr, size_t size, MEMFLAGS flags, address pc = 0, Thread* thread = NULL) { - if (NMT_CAN_TRACK(flags)) { + if (is_on() && NMT_CAN_TRACK(flags)) { assert(size > 0, "Sanity check"); create_memory_record(addr, (flags|MemPointerRecord::malloc_tag()), size, pc, thread); } @@ -275,7 +277,7 @@ class MemTracker : AllStatic { // record a 'realloc' call static inline void record_realloc(address old_addr, address new_addr, size_t size, MEMFLAGS flags, address pc = 0, Thread* thread = NULL) { - if (is_on()) { + if (is_on() && NMT_CAN_TRACK(flags)) { assert(size > 0, "Sanity check"); record_free(old_addr, flags, thread); record_malloc(new_addr, size, flags, pc, thread); @@ -317,6 +319,7 @@ class MemTracker : AllStatic { static inline void release_thread_stack(address addr, size_t size, Thread* thr) { if (is_on()) { assert(size > 0 && thr != NULL, "Sanity check"); + assert(!thr->is_Java_thread(), "too early"); create_memory_record(addr, MemPointerRecord::virtual_memory_uncommit_tag() | mtThreadStack, size, DEBUG_CALLER_PC, thr); create_memory_record(addr, MemPointerRecord::virtual_memory_release_tag() | mtThreadStack, @@ -326,11 +329,11 @@ class MemTracker : AllStatic { // record a virtual memory 'commit' call static inline void record_virtual_memory_commit(address addr, size_t size, - address pc = 0, Thread* thread = NULL) { + address pc, Thread* thread = NULL) { if (is_on()) { assert(size > 0, "Sanity check"); create_memory_record(addr, MemPointerRecord::virtual_memory_commit_tag(), - size, DEBUG_CALLER_PC, thread); + size, pc, thread); } } From 7f872374009622db3fce3f4fb1d64f9f8b046d2c Mon Sep 17 00:00:00 2001 From: Vladimir Ivanov Date: Mon, 22 Oct 2012 11:44:30 -0700 Subject: [PATCH 079/241] 8000805: JMM issue: short loads are non-atomic Perform transforms during IGVN phase when Load has a single user. Reviewed-by: jrose, kvn, twisti --- hotspot/src/share/vm/opto/mulnode.cpp | 41 +++++---- .../test/compiler/8000805/Test8000805.java | 85 +++++++++++++++++++ 2 files changed, 108 insertions(+), 18 deletions(-) create mode 100644 hotspot/test/compiler/8000805/Test8000805.java diff --git a/hotspot/src/share/vm/opto/mulnode.cpp b/hotspot/src/share/vm/opto/mulnode.cpp index 4572a265e57..4047b933fbd 100644 --- a/hotspot/src/share/vm/opto/mulnode.cpp +++ b/hotspot/src/share/vm/opto/mulnode.cpp @@ -479,24 +479,27 @@ Node *AndINode::Ideal(PhaseGVN *phase, bool can_reshape) { return new (phase->C) AndINode(load,phase->intcon(mask&0xFFFF)); // Masking bits off of a Short? Loading a Character does some masking - if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { - Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), - load->in(MemNode::Memory), - load->in(MemNode::Address), - load->adr_type()); - ldus = phase->transform(ldus); - return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); - } + if (can_reshape && + load->outcnt() == 1 && load->unique_out() == this) { + if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { + Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), + load->adr_type()); + ldus = phase->transform(ldus); + return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); + } - // Masking sign bits off of a Byte? Do an unsigned byte load plus - // an and. - if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { - Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), - load->in(MemNode::Memory), - load->in(MemNode::Address), - load->adr_type()); - ldub = phase->transform(ldub); - return new (phase->C) AndINode(ldub, phase->intcon(mask)); + // Masking sign bits off of a Byte? Do an unsigned byte load plus + // an and. + if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { + Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), + load->adr_type()); + ldub = phase->transform(ldub); + return new (phase->C) AndINode(ldub, phase->intcon(mask)); + } } // Masking off sign bits? Dont make them! @@ -923,7 +926,9 @@ Node *RShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) { set_req(2, phase->intcon(0)); return this; } - else if( ld->Opcode() == Op_LoadUS ) + else if( can_reshape && + ld->Opcode() == Op_LoadUS && + ld->outcnt() == 1 && ld->unique_out() == shl) // Replace zero-extension-load with sign-extension-load return new (phase->C) LoadSNode( ld->in(MemNode::Control), ld->in(MemNode::Memory), diff --git a/hotspot/test/compiler/8000805/Test8000805.java b/hotspot/test/compiler/8000805/Test8000805.java new file mode 100644 index 00000000000..bd0b7b41cc6 --- /dev/null +++ b/hotspot/test/compiler/8000805/Test8000805.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8000805 + * @summary JMM issue: short loads are non-atomic + * + * @run main/othervm -server -XX:-TieredCompilation -Xcomp -XX:+PrintCompilation -XX:CompileOnly=Test8000805.loadS2LmaskFF,Test8000805.loadS2Lmask16,Test8000805.loadS2Lmask13,Test8000805.loadUS_signExt,Test8000805.loadB2L_mask8 Test8000805 + */ + +public class Test8000805 { + static long loadS2LmaskFF (short[] sa) { return sa[0] & 0xFF; } + static long loadS2LmaskFF_1 (short[] sa) { return sa[0] & 0xFF; } + + static long loadS2Lmask16 (short[] sa) { return sa[0] & 0xFFFE; } + static long loadS2Lmask16_1 (short[] sa) { return sa[0] & 0xFFFE; } + + static long loadS2Lmask13 (short[] sa) { return sa[0] & 0x0FFF; } + static long loadS2Lmask13_1 (short[] sa) { return sa[0] & 0x0FFF; } + + static int loadUS_signExt (char[] ca) { return (ca[0] << 16) >> 16; } + static int loadUS_signExt_1 (char[] ca) { return (ca[0] << 16) >> 16; } + + static long loadB2L_mask8 (byte[] ba) { return ba[0] & 0x55; } + static long loadB2L_mask8_1 (byte[] ba) { return ba[0] & 0x55; } + + public static void main(String[] args) { + for (int i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; i++) { + byte[] ba = new byte[] { (byte) i}; + + { long v1 = loadB2L_mask8(ba); + long v2 = loadB2L_mask8_1(ba); + if (v1 != v2) + throw new InternalError(String.format("loadB2L_mask8 failed: %x != %x", v1, v2)); } + } + + for (int i = Short.MIN_VALUE; i < Short.MAX_VALUE; i++) { + short[] sa = new short[] { (short)i }; + char[] ca = new char[] { (char)i }; + + { long v1 = loadS2LmaskFF(sa); + long v2 = loadS2LmaskFF_1(sa); + if (v1 != v2) + throw new InternalError(String.format("loadS2LmaskFF failed: %x != %x", v1, v2)); } + + { long v1 = loadS2Lmask16(sa); + long v2 = loadS2Lmask16_1(sa); + if (v1 != v2) + throw new InternalError(String.format("loadS2Lmask16 failed: %x != %x", v1, v2)); } + + { long v1 = loadS2Lmask13(sa); + long v2 = loadS2Lmask13_1(sa); + if (v1 != v2) + throw new InternalError(String.format("loadS2Lmask13 failed: %x != %x", v1, v2)); } + + { int v1 = loadUS_signExt(ca); + int v2 = loadUS_signExt_1(ca); + if (v1 != v2) + throw new InternalError(String.format("loadUS_signExt failed: %x != %x", v1, v2)); } + } + + System.out.println("TEST PASSED."); + } +} From 65c20a5492aeb9d7ab8ef1f9bbe6b11d96e05b37 Mon Sep 17 00:00:00 2001 From: Christian Thalinger Date: Mon, 22 Oct 2012 16:56:03 -0700 Subject: [PATCH 080/241] 8000821: JSR 292: C1 fails to call virtual method (JRUBY-6920) Reviewed-by: kvn --- hotspot/src/share/vm/c1/c1_GraphBuilder.cpp | 41 +++++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp index 1bbdc5afbca..941dd120a01 100644 --- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp +++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp @@ -1844,17 +1844,12 @@ void GraphBuilder::invoke(Bytecodes::Code code) { code == Bytecodes::_invokevirtual && target->is_final_method() || code == Bytecodes::_invokedynamic) { ciMethod* inline_target = (cha_monomorphic_target != NULL) ? cha_monomorphic_target : target; - bool success = false; - if (target->is_method_handle_intrinsic()) { - // method handle invokes - success = try_method_handle_inline(target); - } else { - // static binding => check if callee is ok - success = try_inline(inline_target, (cha_monomorphic_target != NULL) || (exact_target != NULL), code, better_receiver); - } - CHECK_BAILOUT(); + // static binding => check if callee is ok + bool success = try_inline(inline_target, (cha_monomorphic_target != NULL) || (exact_target != NULL), code, better_receiver); + CHECK_BAILOUT(); clear_inline_bailout(); + if (success) { // Register dependence if JVMTI has either breakpoint // setting or hotswapping of methods capabilities since they may @@ -3201,6 +3196,11 @@ bool GraphBuilder::try_inline(ciMethod* callee, bool holder_known, Bytecodes::Co return false; } + // method handle invokes + if (callee->is_method_handle_intrinsic()) { + return try_method_handle_inline(callee); + } + // handle intrinsics if (callee->intrinsic_id() != vmIntrinsics::_none) { if (try_inline_intrinsics(callee)) { @@ -3885,10 +3885,14 @@ bool GraphBuilder::try_method_handle_inline(ciMethod* callee) { ValueType* type = state()->stack_at(args_base)->type(); if (type->is_constant()) { ciMethod* target = type->as_ObjectType()->constant_value()->as_method_handle()->get_vmtarget(); - guarantee(!target->is_method_handle_intrinsic(), "should not happen"); // XXX remove - Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual; - if (try_inline(target, /*holder_known*/ true, bc)) { - return true; + // We don't do CHA here so only inline static and statically bindable methods. + if (target->is_static() || target->can_be_statically_bound()) { + Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual; + if (try_inline(target, /*holder_known*/ true, bc)) { + return true; + } + } else { + print_inlining(target, "not static or statically bindable", /*success*/ false); } } else { print_inlining(callee, "receiver not constant", /*success*/ false); @@ -3941,9 +3945,14 @@ bool GraphBuilder::try_method_handle_inline(ciMethod* callee) { } j += t->size(); // long and double take two slots } - Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual; - if (try_inline(target, /*holder_known*/ true, bc)) { - return true; + // We don't do CHA here so only inline static and statically bindable methods. + if (target->is_static() || target->can_be_statically_bound()) { + Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual; + if (try_inline(target, /*holder_known*/ true, bc)) { + return true; + } + } else { + print_inlining(target, "not static or statically bindable", /*success*/ false); } } } else { From 9322a179db0bfe573129237238e69c97423767bf Mon Sep 17 00:00:00 2001 From: Keith McGuigan Date: Mon, 22 Oct 2012 20:12:19 -0400 Subject: [PATCH 081/241] 8001225: Disable jdk regression test java/lang/System/Versions.java until jdk's classfile version code is updated Exclude java/lang/System/Versions.java test Reviewed-by: sspitsyn, coleenp --- jdk/test/ProblemList.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt index 35aaa99f931..23c91cf3a92 100644 --- a/jdk/test/ProblemList.txt +++ b/jdk/test/ProblemList.txt @@ -143,6 +143,11 @@ java/lang/management/MemoryMXBean/CollectionUsageThresholdSerialGC.sh generic-al java/lang/management/MemoryMXBean/MemoryTest.java generic-all java/lang/management/MemoryMXBean/MemoryTestAllGC.sh generic-all +# Exclude until hotspot/jdk repos are sync'd w.r.t. JAVA_MAX_SUPPORTED_VERSION +# Needed when hotspot fix 7054345 is present. Remove when the JDK source is +# updated accordingly. +java/lang/System/Versions.java generic-all + ############################################################################ # jdk_management From 433715e09c6de4a510a34da1539605994c110479 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Tue, 23 Oct 2012 13:10:52 +0400 Subject: [PATCH 082/241] 7051394: NullPointerException when running regression tests LoadProfileTest by using openjdk-7-b144 Reviewed-by: jgodinez, prr --- jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 1195f7c5067..910969f95b2 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c @@ -253,6 +253,16 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfile if (sProf.pf == NULL) { JNU_ThrowIllegalArgumentException(env, "Invalid profile data"); + } else { + /* Sanity check: try to save the profile in order + * to force basic validation. + */ + cmsUInt32Number pfSize = 0; + if (!cmsSaveProfileToMem(sProf.pf, NULL, &pfSize) || + pfSize < sizeof(cmsICCHeader)) + { + JNU_ThrowIllegalArgumentException(env, "Invalid profile data"); + } } return sProf.j; From 3c6c782cf3f6fb0dc74abb8c5ce0052e848b4c6b Mon Sep 17 00:00:00 2001 From: Alexander Scherbatiy Date: Tue, 23 Oct 2012 14:30:41 +0400 Subject: [PATCH 083/241] 6624200: Regression test fails: test/closed/javax/swing/JMenuItem/4654927/bug4654927.java Reviewed-by: rupashka --- .../swing/JMenuItem/4654927/bug4654927.java | 152 ++++++++++++++++++ jdk/test/javax/swing/regtesthelpers/Util.java | 30 ++++ 2 files changed, 182 insertions(+) create mode 100644 jdk/test/javax/swing/JMenuItem/4654927/bug4654927.java diff --git a/jdk/test/javax/swing/JMenuItem/4654927/bug4654927.java b/jdk/test/javax/swing/JMenuItem/4654927/bug4654927.java new file mode 100644 index 00000000000..cac3386567a --- /dev/null +++ b/jdk/test/javax/swing/JMenuItem/4654927/bug4654927.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 4654927 + * @summary Clicking on Greyed Menuitems closes the Menubar Dropdown + * @author Alexander Potochkin + * @library ../../regtesthelpers + * @build Util + * @run main bug4654927 + */ + +import javax.swing.*; + +import java.awt.*; +import java.awt.event.InputEvent; +import java.util.concurrent.Callable; +import sun.awt.SunToolkit; + +public class bug4654927 { + + private static volatile JMenu menu; + private static volatile JMenuItem menuItem; + + public static void main(String[] args) throws Exception { + String systemLAF = UIManager.getSystemLookAndFeelClassName(); + // the test is not applicable to Motif L&F + if(systemLAF.endsWith("MotifLookAndFeel")){ + return; + } + + UIManager.setLookAndFeel(systemLAF); + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + Robot robot = new Robot(); + robot.setAutoDelay(10); + + SwingUtilities.invokeAndWait(new Runnable() { + + public void run() { + createAndShowUI(); + } + }); + toolkit.realSync(); + + // test mouse press + Point point = Util.getCenterPoint(menu); + robot.mouseMove(point.x, point.y); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + toolkit.realSync(); + + point = Util.getCenterPoint(menuItem); + robot.mouseMove(point.x, point.y); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + toolkit.realSync(); + + if (!isMenuItemShowing()) { + throw new RuntimeException("Popup is unexpectedly closed"); + } + + // test mouse drag + point = Util.getCenterPoint(menu); + robot.mouseMove(point.x, point.y); + Point menuLocation = Util.invokeOnEDT(new Callable() { + + @Override + public Point call() throws Exception { + return menu.getLocationOnScreen(); + } + }); + + Point itemLocation = Util.invokeOnEDT(new Callable() { + + @Override + public Point call() throws Exception { + return menuItem.getLocationOnScreen(); + } + }); + + int x0 = menuLocation.x + 10; + int y0 = menuLocation.y + 10; + int x1 = itemLocation.x + 10; + int y1 = itemLocation.y + 10; + + // close menu + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + toolkit.realSync(); + + robot.mousePress(InputEvent.BUTTON1_MASK); + Util.glide(robot, x0, y0, x1, y1); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + toolkit.realSync(); + + if (!isMenuItemShowing()) { + throw new RuntimeException("Popup is unexpectedly closed"); + } + } + + private static boolean isMenuItemShowing() throws Exception { + return Util.invokeOnEDT(new Callable() { + + @Override + public Boolean call() throws Exception { + return menuItem.isShowing(); + } + }); + } + + private static void createAndShowUI() { + JFrame frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + menu = new JMenu("Menu"); + menu.add(new JMenuItem("menuItem")); + menuItem = new JMenuItem("menuItem"); + menuItem.setEnabled(false); + menu.add(menuItem); + menu.add(new JMenuItem("menuItem")); + + JMenuBar bar = new JMenuBar(); + bar.add(menu); + frame.setJMenuBar(bar); + + frame.setSize(200, 200); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + + } +} diff --git a/jdk/test/javax/swing/regtesthelpers/Util.java b/jdk/test/javax/swing/regtesthelpers/Util.java index 68bc0f8c404..a9df4934583 100644 --- a/jdk/test/javax/swing/regtesthelpers/Util.java +++ b/jdk/test/javax/swing/regtesthelpers/Util.java @@ -156,6 +156,36 @@ public class Util { } } + /** + * Moves mouse smoothly from (x0, y0) to (x1, y1). + */ + public static void glide(Robot robot, int x0, int y0, int x1, int y1) throws AWTException { + float dmax = (float) Math.max(Math.abs(x1 - x0), Math.abs(y1 - y0)); + float dx = (x1 - x0) / dmax; + float dy = (y1 - y0) / dmax; + + for (int i = 0; i <= dmax; i += 10) { + robot.mouseMove((int) (x0 + dx * i), (int) (y0 + dy * i)); + } + } + + /** + * Gets component center point + * + * @return center point of the component + */ + public static Point getCenterPoint(final Component component) throws Exception { + return Util.invokeOnEDT(new Callable() { + + @Override + public Point call() throws Exception { + Point p = component.getLocationOnScreen(); + Dimension size = component.getSize(); + return new Point(p.x + size.width / 2, p.y + size.height / 2); + } + }); + } + /** * Invokes the task on the EDT thread. * From 906081c12dfee398446ef175a14cef9cb8fb5e57 Mon Sep 17 00:00:00 2001 From: Volker Simonis Date: Tue, 23 Oct 2012 10:10:23 -0700 Subject: [PATCH 084/241] 7152336: Enable builds on Windows with MinGW/MSYS Minimal makefile changes to enable building OpenJDK using MSYS on Windows7 Reviewed-by: ohair, tbell --- jdk/make/com/sun/java/pack/Makefile | 8 +- jdk/make/common/Defs-windows.gmk | 18 +-- jdk/make/common/Demo.gmk | 6 +- jdk/make/common/Library.gmk | 6 +- jdk/make/common/Program.gmk | 10 +- jdk/make/common/Release.gmk | 17 +++ jdk/make/common/shared/Defs-utils.gmk | 12 +- jdk/make/common/shared/Defs-windows.gmk | 114 ++++++++++-------- jdk/make/common/shared/Platform.gmk | 45 +++---- jdk/make/common/shared/Sanity-Settings.gmk | 9 +- jdk/make/common/shared/Sanity.gmk | 20 ++- jdk/make/jdk_generic_profile.sh | 30 ++++- jdk/make/tools/freetypecheck/Makefile | 8 +- jdk/make/tools/msys_build_scripts/dospath.sh | 42 +++++++ jdk/make/tools/msys_build_scripts/dospath.vbs | 34 ++++++ 15 files changed, 263 insertions(+), 116 deletions(-) create mode 100644 jdk/make/tools/msys_build_scripts/dospath.sh create mode 100644 jdk/make/tools/msys_build_scripts/dospath.vbs diff --git a/jdk/make/com/sun/java/pack/Makefile b/jdk/make/com/sun/java/pack/Makefile index 5882683fe04..e8c256d3e9b 100644 --- a/jdk/make/com/sun/java/pack/Makefile +++ b/jdk/make/com/sun/java/pack/Makefile @@ -94,9 +94,9 @@ ifeq ($(PLATFORM), windows) LDOUTPUT = -Fe # JDK name required here - RC_FLAGS += /D "JDK_FNAME=$(PGRM).exe" \ - /D "JDK_INTERNAL_NAME=$(PGRM)" \ - /D "JDK_FTYPE=0x1L" + RC_FLAGS += -D "JDK_FNAME=$(PGRM).exe" \ + -D "JDK_INTERNAL_NAME=$(PGRM)" \ + -D "JDK_FTYPE=0x1L" RES = $(OBJDIR)/$(PGRM).res else @@ -161,7 +161,7 @@ $(UNPACK_EXE): $(UNPACK_EXE_FILES_o) updatefiles winres $(CP) mapfile-vers-unpack200 $(TEMPDIR)/mapfile-vers $(LINKER) $(LDDFLAGS) $(sort $(UNPACK_EXE_FILES_o)) $(RES) $(LIBCXX) $(LDOUTPUT)$(TEMPDIR)/unpack200$(EXE_SUFFIX) ifdef MT - $(MT) /manifest $(OBJDIR)/unpack200$(EXE_SUFFIX).manifest /outputresource:$(TEMPDIR)/unpack200$(EXE_SUFFIX);#1 + $(MT) -manifest $(OBJDIR)/unpack200$(EXE_SUFFIX).manifest -outputresource:$(TEMPDIR)/unpack200$(EXE_SUFFIX);#1 endif $(CP) $(TEMPDIR)/unpack200$(EXE_SUFFIX) $(UNPACK_EXE) @$(call binary_file_verification,$@) diff --git a/jdk/make/common/Defs-windows.gmk b/jdk/make/common/Defs-windows.gmk index 7afe0b515e0..50a5a66c477 100644 --- a/jdk/make/common/Defs-windows.gmk +++ b/jdk/make/common/Defs-windows.gmk @@ -78,7 +78,7 @@ ifeq ($(COMPILER_VERSION), VS2010) MS_RUNTIME_LIBRARIES = $(MSVCRNN_DLL) endif -EXTRA_LFLAGS += /LIBPATH:$(DXSDK_LIB_PATH) +EXTRA_LFLAGS += -LIBPATH:$(DXSDK_LIB_PATH) # Full Debug Symbols has been enabled on Windows since JDK1.4.1. # The Full Debug Symbols (FDS) default for VARIANT == OPT builds is @@ -198,7 +198,7 @@ CC_OPT = $(CC_OPT/$(OPTIMIZATION_LEVEL)) # -MTd Use static debug version (better than -MDd, no runtime issues) # -D_DEBUG Change use of malloc/free/etc to use special debug ones (-MTd) # -# NOTE: We also will use /D _STATIC_CPPLIB so we don't need msvcpnn.dll +# NOTE: We also will use -D _STATIC_CPPLIB so we don't need msvcpnn.dll # # If MS_RUNTIME_STATIC is requested we may have a problem, it is no longer # supported by VS2010 @@ -223,12 +223,12 @@ ifeq ($(MFC_DEBUG), true) endif # Always add _STATIC_CPPLIB definition -STATIC_CPPLIB_OPTION = /D _STATIC_CPPLIB +STATIC_CPPLIB_OPTION = -D _STATIC_CPPLIB # Silence the warning about using _STATIC_CPPLIB ifneq ($(SHOW_ALL_WARNINGS),true) # Needed with VS2010 to turn off the deprecated warning. - STATIC_CPPLIB_OPTION += /D _DISABLE_DEPRECATE_STATIC_CPPLIB + STATIC_CPPLIB_OPTION += -D _DISABLE_DEPRECATE_STATIC_CPPLIB endif MS_RUNTIME_OPTION += $(STATIC_CPPLIB_OPTION) @@ -242,7 +242,7 @@ ifeq ($(CC_VERSION),msvc) # -Od Turns off optimization and speeds compilation # -YX -Fp/.../foobar.pch Use precompiled headers (try someday?) # -nologo Don't print out startup message - # /D _STATIC_CPPLIB + # -D _STATIC_CPPLIB # Use static link for the C++ runtime (so msvcpnn.dll not needed) # ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) @@ -258,12 +258,12 @@ ifeq ($(CC_VERSION),msvc) CFLAGS_COMMON += $(MS_RUNTIME_OPTION) $(CFLAGS_$(COMPILER_VERSION)) ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) - LDEBUG = /debug + LDEBUG = -debug endif ifeq ($(VTUNE_SUPPORT), true) OTHER_CFLAGS = -Z7 -Ox - LDEBUG += /pdb:NONE + LDEBUG += -pdb:NONE endif # VS2010, always need safe exception handlers, not needed on 64bit @@ -272,7 +272,7 @@ ifeq ($(CC_VERSION),msvc) endif # LFLAGS are the flags given to $(LINK) and used to build the actual DLL file - BASELFLAGS = -nologo /opt:REF /incremental:no + BASELFLAGS = -nologo -opt:REF -incremental:no LFLAGS = $(BASELFLAGS) $(LDEBUG) $(EXTRA_LFLAGS) $(LFLAGS_$(COMPILER_VERSION)) LDDFLAGS += $(LFLAGS_$(COMPILER_VERSION)) @@ -404,7 +404,7 @@ else JDK_UPDATE_VER := 0 endif -RC_FLAGS = /l 0x409 /r +RC_FLAGS = -l 0x409 -r ifeq ($(VARIANT), OPT) RC_FLAGS += -d NDEBUG diff --git a/jdk/make/common/Demo.gmk b/jdk/make/common/Demo.gmk index 3aba9a62c07..9163cf76513 100644 --- a/jdk/make/common/Demo.gmk +++ b/jdk/make/common/Demo.gmk @@ -292,9 +292,9 @@ endif ifeq ($(PLATFORM),windows) # JDK name required here -RC_FLAGS += /D "JDK_FNAME=$(LIBRARY).dll" \ - /D "JDK_INTERNAL_NAME=$(LIBRARY)" \ - /D "JDK_FTYPE=0x2L" +RC_FLAGS += -D "JDK_FNAME=$(LIBRARY).dll" \ + -D "JDK_INTERNAL_NAME=$(LIBRARY)" \ + -D "JDK_FTYPE=0x2L" endif # Native library building diff --git a/jdk/make/common/Library.gmk b/jdk/make/common/Library.gmk index b04095c93e2..4b080304d1f 100644 --- a/jdk/make/common/Library.gmk +++ b/jdk/make/common/Library.gmk @@ -206,9 +206,9 @@ endif @$(ECHO) Created $@ # JDK name required here -RC_FLAGS += /D "JDK_FNAME=$(LIBRARY).dll" \ - /D "JDK_INTERNAL_NAME=$(LIBRARY)" \ - /D "JDK_FTYPE=0x2L" +RC_FLAGS += -D "JDK_FNAME=$(LIBRARY).dll" \ + -D "JDK_INTERNAL_NAME=$(LIBRARY)" \ + -D "JDK_FTYPE=0x2L" $(OBJDIR)/$(LIBRARY).res: $(VERSIONINFO_RESOURCE) ifndef LOCAL_RESOURCE_FILE diff --git a/jdk/make/common/Program.gmk b/jdk/make/common/Program.gmk index 094d18ff997..b319ee41889 100644 --- a/jdk/make/common/Program.gmk +++ b/jdk/make/common/Program.gmk @@ -157,9 +157,9 @@ $(ACTUAL_PROGRAM):: classes $(INIT) # ifeq ($(PLATFORM), windows) # JDK name required here - RC_FLAGS += /D "JDK_FNAME=$(PROGRAM)$(EXE_SUFFIX)" \ - /D "JDK_INTERNAL_NAME=$(PROGRAM)" \ - /D "JDK_FTYPE=0x1L" + RC_FLAGS += -D "JDK_FNAME=$(PROGRAM)$(EXE_SUFFIX)" \ + -D "JDK_INTERNAL_NAME=$(PROGRAM)" \ + -D "JDK_FTYPE=0x1L" $(OBJDIR)/$(PROGRAM).res: $(VERSIONINFO_RESOURCE) @$(prep-target) @@ -201,11 +201,11 @@ endif @$(prep-target) @set -- $?; \ $(ECHO) Rebuilding $@ because of $$1 $$2 $$3 $$4 $$5 $$6 $${7:+...}; - $(LINK) -out:$@ /STACK:$(STACK_SIZE) \ + $(LINK) -out:$@ -STACK:$(STACK_SIZE) \ $(MAP_OPTION) $(LFLAGS) $(LDFLAGS) \ @$(OBJDIR)/$(PROGRAM).lcf $(LDLIBS) ifdef MT - $(MT) /manifest $(OBJDIR)/$(PROGRAM).exe.manifest /outputresource:$@;#1 + $(MT) -manifest $(OBJDIR)/$(PROGRAM).exe.manifest /outputresource:$@;#1 endif @$(call binary_file_verification,$@) ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) diff --git a/jdk/make/common/Release.gmk b/jdk/make/common/Release.gmk index 7d04d3e14e2..2f2b1693384 100644 --- a/jdk/make/common/Release.gmk +++ b/jdk/make/common/Release.gmk @@ -784,11 +784,22 @@ initial-image-jre:: initial-image-jre-setup \ $(RT_JAR) $(RESOURCES_JAR) $(JSSE_JAR) $(JFR_JAR) \ $(BUILDMETAINDEX_JARFILE) @# Copy in bin directory +ifeq ($(USING_MSYS),true) + # No cpio in MinGW/MSYS + $(CD) $(OUTPUTDIR) && $(TAR) -cf - bin | ($(CD) $(JRE_IMAGE_DIR) && $(TAR) -xpf -) +else $(CD) $(OUTPUTDIR) && $(FIND) bin -depth | $(CPIO) -pdum $(JRE_IMAGE_DIR) +endif @# CTE plugin security change require new empty directory lib/applet $(MKDIR) -p $(JRE_IMAGE_DIR)/lib/applet @# Copy in lib directory +ifeq ($(USING_MSYS),true) + # No cpio in MinGW/MSYS + $(CD) $(OUTPUTDIR) && $(TAR) -cf - lib | ($(CD) $(JRE_IMAGE_DIR) && $(TAR) -xpf -) +else $(CD) $(OUTPUTDIR) && $(FIND) lib -depth | $(CPIO) -pdum $(JRE_IMAGE_DIR) +endif + ifeq ($(USING_CYGWIN),true) $(RM) -rf $(JRE_IMAGE_DIR)/[A-Za-z]: $(RM) -rf $(OUTPUTDIR)/[A-Za-z]: @@ -919,11 +930,17 @@ endif # only places from which we copy everything), but because the presence # of this file causes cygwin's find to bomb out, thus breaking the build # in "install". + initial-image-jdk-setup: $(RM) -r $(JDK_IMAGE_DIR) $(MKDIR) -p $(JDK_IMAGE_DIR)/jre +ifeq ($(USING_MSYS),true) + ($(CD) $(JRE_IMAGE_DIR) && $(TAR) -cf - . \ + | ($(CD) $(JDK_IMAGE_DIR)/jre && $(TAR) -xpf -)) +else ($(CD) $(JRE_IMAGE_DIR) && $(FIND) . -depth -print \ | $(CPIO) -pdum $(JDK_IMAGE_DIR)/jre ) +endif ifeq ($(USING_CYGWIN),true) $(RM) -rf $(JRE_IMAGE_DIR)/[A-Za-z]: $(RM) -rf $(JDK_IMAGE_DIR)/jre/[A-Za-z]: diff --git a/jdk/make/common/shared/Defs-utils.gmk b/jdk/make/common/shared/Defs-utils.gmk index 9bc05d6f69b..573f7ccaa80 100644 --- a/jdk/make/common/shared/Defs-utils.gmk +++ b/jdk/make/common/shared/Defs-utils.gmk @@ -169,15 +169,19 @@ CD = cd # intrinsic unix command ifeq ($(PLATFORM),windows) ifdef USING_CYGWIN # Intrinsic unix command, with backslash-escaped character interpretation - ECHO = $(UNIXCOMMAND_PATH)echo -e - ZIPEXE = $(UNIXCOMMAND_PATH)zip - UNZIP = $(UNIXCOMMAND_PATH)unzip + ECHO = $(UNIXCOMMAND_PATH)echo -e + ZIPEXE = $(UNIXCOMMAND_PATH)zip + UNZIP = $(UNIXCOMMAND_PATH)unzip # Some CYGWIN nawk versions require BINMODE=w for proper '\r' interpretation - NAWK = $(UNIXCOMMAND_PATH)awk -v BINMODE=w + NAWK = $(UNIXCOMMAND_PATH)awk -v BINMODE=w else ZIPEXE = $(UTILS_DEVTOOL_PATH)zip UNZIP = $(UTILS_DEVTOOL_PATH)unzip NAWK = $(UNIXCOMMAND_PATH)awk + ifdef USING_MSYS + ECHO = $(UTILS_COMMAND_PATH)echo -e + AR = $(UTILS_DEVTOOL_PATH)ar + endif endif # Re-define some utilities LEX =# override GNU Make intrinsic: no lex on windows diff --git a/jdk/make/common/shared/Defs-windows.gmk b/jdk/make/common/shared/Defs-windows.gmk index af611f3aab2..c4ccdbca4ea 100644 --- a/jdk/make/common/shared/Defs-windows.gmk +++ b/jdk/make/common/shared/Defs-windows.gmk @@ -112,6 +112,15 @@ define OptFullPath $(shell if [ "$1" != "" -a -d "$1" ]; then $(CYGPATH_CMD) "$1" 2> $(DEV_NULL); else echo "$1"; fi) endef else +ifdef USING_MSYS +DOSPATH_CMD:=$(shell cd $(JDK_TOPDIR) 2> $(DEV_NULL) && pwd)/make/tools/msys_build_scripts/dospath.sh +define FullPath +$(subst \,/,$(shell $(DOSPATH_CMD) $1)) +endef +define OptFullPath +$(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi) +endef +else # Temporary until we upgrade to MKS 8.7, MKS pwd returns mixed mode path define FullPath $(shell cd $1 2> $(DEV_NULL) && pwd) @@ -120,6 +129,7 @@ define OptFullPath $(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi) endef endif +endif # System drive ifdef SYSTEMDRIVE @@ -146,43 +156,47 @@ else ifdef USING_CYGWIN UNIXCOMMAND_PATH :=$(call PrefixPath,/usr/bin) else - ifdef ROOTDIR - xROOTDIR :="$(subst \,/,$(ROOTDIR))" - _rootdir :=$(call FullPath,$(xROOTDIR)) + ifdef USING_MSYS + UNIXCOMMAND_PATH :=$(call PrefixPath,/bin) else - xROOTDIR :="$(_system_drive)/mksnt" - _rootdir :=$(call FullPath,$(xROOTDIR)) - endif - ifneq ($(_rootdir),) - UNIXCOMMAND_PATH :=$(call PrefixPath,$(_rootdir)/mksnt) - endif - endif + ifdef ROOTDIR + xROOTDIR :="$(subst \,/,$(ROOTDIR))" + _rootdir :=$(call FullPath,$(xROOTDIR)) + else + xROOTDIR :="$(_system_drive)/mksnt" + _rootdir :=$(call FullPath,$(xROOTDIR)) + endif + ifneq ($(_rootdir),) + UNIXCOMMAND_PATH :=$(call PrefixPath,$(_rootdir)/mksnt) + endif + endif # USING_MSYS + endif # USING_CYGWIN endif UNIXCOMMAND_PATH:=$(call AltCheckSpaces,UNIXCOMMAND_PATH) # Get version of MKS or CYGWIN -ifndef USING_CYGWIN -_MKS_VER :=$(shell $(MKSINFO) 2>&1 | $(GREP) Release | $(TAIL) -1 | $(SED) -e 's@.*\(Release.*\)@\1@') -MKS_VER :=$(call GetVersion,$(_MKS_VER)) -# At this point, we can re-define FullPath to use DOSNAME_CMD -CHECK_MKS87:=$(call CheckVersions,$(MKS_VER),8.7) -TRY_DOSNAME:=false -ifeq ($(CHECK_MKS87),same) -TRY_DOSNAME:=true -endif -# Newer should be ok -ifeq ($(CHECK_MKS87),newer) -TRY_DOSNAME:=true -endif -ifeq ($(TRY_DOSNAME),true) -ifeq ($(shell $(UNIXCOMMAND_PATH)dosname -s $(_system_drive)/ 2> $(DEV_NULL)),$(_system_drive)/) -_DOSNAME=$(UNIXCOMMAND_PATH)dosname -DOSNAME_CMD:=$(_DOSNAME) -s +ifdef USING_MKS + _MKS_VER :=$(shell $(MKSINFO) 2>&1 | $(GREP) Release | $(TAIL) -1 | $(SED) -e 's@.*\(Release.*\)@\1@') + MKS_VER :=$(call GetVersion,$(_MKS_VER)) + # At this point, we can re-define FullPath to use DOSNAME_CMD + CHECK_MKS87:=$(call CheckVersions,$(MKS_VER),8.7) + TRY_DOSNAME:=false + ifeq ($(CHECK_MKS87),same) + TRY_DOSNAME:=true + endif + # Newer should be ok + ifeq ($(CHECK_MKS87),newer) + TRY_DOSNAME:=true + endif + ifeq ($(TRY_DOSNAME),true) + ifeq ($(shell $(UNIXCOMMAND_PATH)dosname -s $(_system_drive)/ 2> $(DEV_NULL)),$(_system_drive)/) + _DOSNAME=$(UNIXCOMMAND_PATH)dosname + DOSNAME_CMD:=$(_DOSNAME) -s define FullPath $(subst //,/,$(shell echo $1 | $(DOSNAME_CMD) 2> $(DEV_NULL))) endef -endif # test dosname -s -endif # TRY_DOSNAME + endif # test dosname -s + endif # TRY_DOSNAME endif # MKS # We try to get references to what we need via the default component @@ -440,10 +454,14 @@ else ifdef USING_CYGWIN DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH) else - xDEVTOOLS_PATH :="$(_system_drive)/utils" - fxDEVTOOLS_PATH :=$(call FullPath,$(xDEVTOOLS_PATH)) - DEVTOOLS_PATH :=$(call PrefixPath,$(fxDEVTOOLS_PATH)) - endif + ifdef USING_MSYS + DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH) + else + xDEVTOOLS_PATH :="$(_system_drive)/utils" + fxDEVTOOLS_PATH :=$(call FullPath,$(xDEVTOOLS_PATH)) + DEVTOOLS_PATH :=$(call PrefixPath,$(fxDEVTOOLS_PATH)) + endif # USING_MSYS + endif # USING_CYGWIN endif DEVTOOLS_PATH:=$(call AltCheckSpaces,DEVTOOLS_PATH) @@ -636,7 +654,7 @@ HOTSPOT_LIB_PATH:=$(call AltCheckValue,HOTSPOT_LIB_PATH) # Special define for checking the binaries -# All windows dll and exe files should have been built with /NXCOMPAT +# All windows dll and exe files should have been built with -NXCOMPAT # and be setup for dynamic base addresses. # In addition, we should not be dependent on certain dll files that # we do not or cannot redistribute. @@ -648,37 +666,37 @@ else BANNED_DLLS=msvcp100[.]dll|msvcr100d[.]dll|msvcrtd[.]dll endif -# Check for /safeseh (only used on 32bit) +# Check for -safeseh (only used on 32bit) define binary_file_safeseh_verification # binary_file ( \ - $(ECHO) "Checking for /SAFESEH usage in: $1" && \ - if [ "`$(DUMPBIN) /loadconfig $1 | $(EGREP) -i 'Safe Exception Handler Table'`" = "" ] ; then \ + $(ECHO) "Checking for -SAFESEH usage in: $1" && \ + if [ "`$(DUMPBIN) -loadconfig $1 | $(EGREP) -i 'Safe Exception Handler Table'`" = "" ] ; then \ $(ECHO) "ERROR: Did not find 'Safe Exception Handler Table' in loadconfig: $1" ; \ - $(DUMPBIN) /loadconfig $1 ; \ + $(DUMPBIN) -loadconfig $1 ; \ exit 6 ; \ fi ; \ ) endef -# Check for /NXCOMPAT usage +# Check for -NXCOMPAT usage define binary_file_nxcompat_verification # binary_file ( \ - $(ECHO) "Checking for /NXCOMPAT usage in: $1" && \ - if [ "`$(DUMPBIN) /headers $1 | $(EGREP) -i 'NX compatible'`" = "" ] ; then \ + $(ECHO) "Checking for -NXCOMPAT usage in: $1" && \ + if [ "`$(DUMPBIN) -headers $1 | $(EGREP) -i 'NX compatible'`" = "" ] ; then \ $(ECHO) "ERROR: Did not find 'NX compatible' in headers: $1" ; \ - $(DUMPBIN) /headers $1 ; \ + $(DUMPBIN) -headers $1 ; \ exit 7 ; \ fi ; \ ) endef -# Check for /DYNAMICBASE usage +# Check for -DYNAMICBASE usage define binary_file_dynamicbase_verification # binary_file ( \ - $(ECHO) "Checking for /DYNAMICBASE usage in: $1" && \ - if [ "`$(DUMPBIN) /headers $1 | $(EGREP) -i 'Dynamic base'`" = "" ] ; then \ + $(ECHO) "Checking for -DYNAMICBASE usage in: $1" && \ + if [ "`$(DUMPBIN) -headers $1 | $(EGREP) -i 'Dynamic base'`" = "" ] ; then \ $(ECHO) "ERROR: Did not find 'Dynamic base' in headers: $1" ; \ - $(DUMPBIN) /headers $1 ; \ + $(DUMPBIN) -headers $1 ; \ exit 8 ; \ fi ; \ ) @@ -688,9 +706,9 @@ endef define binary_file_dll_verification # binary_file ( \ $(ECHO) "Checking for banned dependencies in: $1" && \ - if [ "`$(DUMPBIN) /dependents $1 | $(EGREP) -i '$(BANNED_DLLS)'`" != "" ] ; then \ + if [ "`$(DUMPBIN) -dependents $1 | $(EGREP) -i '$(BANNED_DLLS)'`" != "" ] ; then \ $(ECHO) "ERROR: Found use of $(BANNED_DLLS)"; \ - $(DUMPBIN) /dependents $1 ; \ + $(DUMPBIN) -dependents $1 ; \ exit 9 ; \ fi ; \ ) diff --git a/jdk/make/common/shared/Platform.gmk b/jdk/make/common/shared/Platform.gmk index 49e6cbda78e..aeaeabe42f6 100644 --- a/jdk/make/common/shared/Platform.gmk +++ b/jdk/make/common/shared/Platform.gmk @@ -70,6 +70,8 @@ PLATFORM_SHARED=done # LIBARCH32 solaris only: sparc or i386 # LIBARCH64 solaris only: sparcv9 or amd64 # USING_CYGWIN windows only: true or false +# USING_MSYS windows only: true or false +# USING_MKS windows only: true or false # ISHIELD_TEMP_MIN windows only: minimum disk space in temp area # Only run uname once in this make session. @@ -306,6 +308,8 @@ endif # Windows with and without CYGWIN will be slightly different ifeq ($(SYSTEM_UNAME), Windows_NT) PLATFORM = windows + USING_MKS = true + export USING_MKS endif ifneq (,$(findstring CYGWIN,$(SYSTEM_UNAME))) PLATFORM = windows @@ -318,6 +322,11 @@ ifneq (,$(findstring CYGWIN,$(SYSTEM_UNAME))) export CYGWIN_HOME endif endif +ifneq (,$(findstring MINGW,$(SYSTEM_UNAME))) + PLATFORM = windows + USING_MSYS = true + export USING_MSYS +endif # Platform settings specific to Windows ifeq ($(PLATFORM), windows) @@ -395,11 +404,12 @@ ifeq ($(PLATFORM), windows) endif ARCH_FAMILY = $(ARCH) # Where is unwanted output to be delivered? - # MKS uses the special file "NUL", cygwin uses the customary unix file. - ifeq ($(USING_CYGWIN),true) - DEV_NULL = /dev/null - else + # MKS uses the special file "NUL"; Cygwin and MinGW/MSYS use the + # customary unix file. + ifeq ($(USING_MKS),true) DEV_NULL = NUL + else + DEV_NULL = /dev/null endif export DEV_NULL # Classpath separator @@ -440,28 +450,11 @@ ifeq ($(PLATFORM), windows) _MB_OF_MEMORY := \ $(shell free -m | grep Mem: | awk '{print $$2;}' ) else - # Windows 2000 has the mem utility, but two memory areas - # extended memory is what is beyond 1024M - _B_OF_EXT_MEMORY := \ - $(shell mem 2> $(DEV_NULL) | \ - grep 'total contiguous extended memory' | awk '{print $$1;}') - ifeq ($(_B_OF_EXT_MEMORY),) - _B_OF_MEMORY := \ - $(shell mem 2> $(DEV_NULL) | \ - grep 'total conventional memory' | awk '{print $$1;}') - else - _B_OF_MEMORY := \ - $(shell expr 1048576 '+' $(_B_OF_EXT_MEMORY) 2> $(DEV_NULL)) - endif - ifeq ($(_B_OF_MEMORY),) - # Windows 2003 has the systeminfo utility use it if mem doesn't work - _MB_OF_MEMORY := \ - $(shell systeminfo 2> $(DEV_NULL) | \ - grep 'Total Physical Memory:' | \ - awk '{print $$4;}' | sed -e 's@,@@') - else - _MB_OF_MEMORY := $(shell expr $(_B_OF_MEMORY) '/' 1024 2> $(DEV_NULL)) - endif + # Windows XP and higher has the systeminfo utility + _MB_OF_MEMORY := \ + $(shell systeminfo 2> $(DEV_NULL) | \ + grep 'Total Physical Memory:' | \ + awk '{print $$4;}' | sed -e 's@,@@') endif ifeq ($(shell expr $(_MB_OF_MEMORY) '+' 0 2> $(DEV_NULL)), $(_MB_OF_MEMORY)) MB_OF_MEMORY := $(_MB_OF_MEMORY) diff --git a/jdk/make/common/shared/Sanity-Settings.gmk b/jdk/make/common/shared/Sanity-Settings.gmk index e571b068f82..b6b0fdcf19d 100644 --- a/jdk/make/common/shared/Sanity-Settings.gmk +++ b/jdk/make/common/shared/Sanity-Settings.gmk @@ -182,8 +182,13 @@ ifeq ($(PLATFORM),windows) ALL_SETTINGS+=$(call addRequiredVersionSetting,CYGWIN_VER) ALL_SETTINGS+=$(call addRequiredSetting,CYGPATH_CMD) else - ALL_SETTINGS+=$(call addRequiredVersionSetting,MKS_VER) - ALL_SETTINGS+=$(call addOptionalSetting,DOSNAME_CMD) + ifdef USING_MSYS + ALL_SETTINGS+=$(call addRequiredSetting,USING_MSYS) + ALL_SETTINGS+=$(call addRequiredSetting,DOSPATH_CMD) + else + ALL_SETTINGS+=$(call addRequiredVersionSetting,MKS_VER) + ALL_SETTINGS+=$(call addOptionalSetting,DOSNAME_CMD) + endif endif endif ifeq ($(PLATFORM),linux) diff --git a/jdk/make/common/shared/Sanity.gmk b/jdk/make/common/shared/Sanity.gmk index b6c340cfe91..845418bcecc 100644 --- a/jdk/make/common/shared/Sanity.gmk +++ b/jdk/make/common/shared/Sanity.gmk @@ -395,7 +395,7 @@ endif ifeq ($(PLATFORM), windows) MKS_CHECK :=$(call CheckVersions,$(MKS_VER),$(REQUIRED_MKS_VER)) sane-mks: - ifndef USING_CYGWIN + ifdef USING_MKS ifeq ($(MKS_CHECK),missing) @$(call OfficialErrorMessage,MKS version,$(MKS_VER),$(REQUIRED_MKS_VER)) endif @@ -905,14 +905,25 @@ sane-unixcommand_path: "" >> $(ERROR_FILE) ; \ fi ifeq ($(PLATFORM), windows) - @for utility in cpio ar file m4 ; do \ +ifeq ($(USING_MSYS), true) + @for utility in $(AR) $(FILE) $(M4) ; do \ if [ ! -r "`$(WHICH) $${utility}`" ]; then \ $(ECHO) "WARNING: You do not have the utility $${utility} in the \n" \ " directory $(UNIXCOMMAND_PATH). \n" \ - " The utilities cpio, ar, file, and m4 are required. \n" \ + " The utilities ar, file and m4 are required. \n" \ "" >> $(WARNING_FILE) ; \ fi; \ done +else + @for utility in $(AR) $(CPIO) $(FILE) $(M4) ; do \ + if [ ! -r "`$(WHICH) $${utility}`" ]; then \ + $(ECHO) "WARNING: You do not have the utility $${utility} in the \n" \ + " directory $(UNIXCOMMAND_PATH). \n" \ + " The utilities ar, cpio, file and m4 are required. \n" \ + "" >> $(WARNING_FILE) ; \ + fi; \ + done +endif endif ###################################################### @@ -999,7 +1010,8 @@ ifeq ($(PLATFORM), windows) " This is normally obtained from the WINDOWSSDKDIR." \ "" >> $(ERROR_FILE) endif - ifeq ($(wildcard $(DUMPBIN)),) + # MinGW/MSYS make 3.81 will not tolerate a path with a quoted substring + ifeq ($(wildcard $(subst ",,$(DUMPBIN))),) @$(ECHO) "ERROR: Cannot find the DUMPBIN utility from path: $(DUMPBIN)\n" \ " This is normally obtained from the COMPILER_PATH." \ "" >> $(ERROR_FILE) diff --git a/jdk/make/jdk_generic_profile.sh b/jdk/make/jdk_generic_profile.sh index 93aa1cd4d25..6836d8bd0b8 100644 --- a/jdk/make/jdk_generic_profile.sh +++ b/jdk/make/jdk_generic_profile.sh @@ -176,17 +176,38 @@ else else windows_arch=i586 fi + + repo=`hg root | sed -e 's@\\\\@/@g'` # We need to check if we are running a CYGWIN shell - if [ "$(uname -a | fgrep Cygwin)" != "" -a -f /bin/cygpath ] ; then + if [ "$(echo ${osname} | fgrep Cygwin)" != "" -a -f /bin/cygpath ] ; then # For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist # Utility to convert to short pathnames without spaces cygpath="/usr/bin/cygpath -a -m -s" + cygpathp="/usr/bin/cygpath -p" # Most unix utilities are in the /usr/bin unixcommand_path="/usr/bin" # Make the prompt tell you CYGWIN export PS1="CYGWIN:${COMPUTERNAME}:${USERNAME}[\!] " + elif [ "$(echo ${osname} | fgrep MINGW)" != "" ] ; then + # Utility to convert to short pathnames without spaces + cygpath="${repo}/make/tools/msys_build_scripts/dospath.sh" + if [ ! -f ${cygpath} ] ; then + echo "ERROR: Cannot find cygpath or equivalent on this machine" + exit 1 + fi + # Utility to fix a path to MinGW/MSYS format - the equivalent of 'cygpath -p' + for tfile in "${repo}/make/scripts/fixpath.pl" "${repo}/../make/scripts/fixpath.pl"; do + if [ -f ${tfile} ] ; then + cygpathp="/bin/perl ${tfile} -m" + fi + done; + if [ -z "${cygpathp}" ] ; then + echo "ERROR: Cannot find make/scripts/fixpath.pl on this machine" + exit 1 + fi + unixcommand_path="/usr/bin" else - echo "ERROR: Cannot find CYGWIN on this machine" + echo "ERROR: Cannot find CYGWIN or MinGW/MSYS on this machine" exit 1 fi if [ "${ALT_UNIXCOMMAND_PATH}" != "" ] ; then @@ -204,17 +225,18 @@ else else sys_root=$(${cygpath} "C:/WINNT") fi - path4sdk="${unixcommand_path};${sys_root}/system32;${sys_root};${sys_root}/System32/Wbem" if [ ! -d "${sys_root}" ] ; then echo "WARNING: No system root found at: ${sys_root}" fi + # Build a : separated path making sure each segment is acceptable to ${osname} + path4sdk="${unixcommand_path}:"`${cygpathp} "${sys_root}/system32;${sys_root};${sys_root}/System32/Wbem"` + # 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 # Use supplied vsvars.sh - repo=`hg root` if [ -f "${repo}/make/scripts/vsvars.sh" ] ; then eval `sh ${repo}/make/scripts/vsvars.sh -v10` elif [ -f "${repo}/../make/scripts/vsvars.sh" ] ; then diff --git a/jdk/make/tools/freetypecheck/Makefile b/jdk/make/tools/freetypecheck/Makefile index 0b18de0c17c..5bed801916a 100644 --- a/jdk/make/tools/freetypecheck/Makefile +++ b/jdk/make/tools/freetypecheck/Makefile @@ -37,11 +37,11 @@ ifeq ($(OPENJDK),true) # Start with CFLAGS (which gets us the required -xarch setting on solaris) ifeq ($(PLATFORM), windows) - FT_OPTIONS = /nologo /c + FT_OPTIONS = -nologo -c FREETYPE_DLL = $(FREETYPE_LIB_PATH)/freetype.dll FT_LD_OPTIONS = $(FREETYPE_LIB_PATH)/freetype.lib ifdef MT - FT_LD_OPTIONS += /manifest + FT_LD_OPTIONS += -manifest endif else FT_OPTIONS = $(CFLAGS) @@ -72,11 +72,11 @@ $(FT_TEST): freetypecheck.c $(prep-target) ifeq ($(PLATFORM), windows) $(CC) $(FT_OPTIONS) $(CC_OBJECT_OUTPUT_FLAG)$(FT_OBJ) $< - $(LINK) $(FT_LD_OPTIONS) /OUT:$(FT_TEST) $(FT_OBJ) + $(LINK) $(FT_LD_OPTIONS) -OUT:$(FT_TEST) $(FT_OBJ) $(CP) $(FREETYPE_DLL) $(@D)/ ifdef MT $(CP) $(MSVCRNN_DLL_PATH)/$(MSVCRNN_DLL) $(@D)/ - $(MT) /manifest $(FT_TEST).manifest /outputresource:$(FT_TEST);#1 + $(MT) -manifest $(FT_TEST).manifest -outputresource:$(FT_TEST);#1 endif else @$(CC) $(FT_OPTIONS) -o $@ $< $(FT_LD_OPTIONS) diff --git a/jdk/make/tools/msys_build_scripts/dospath.sh b/jdk/make/tools/msys_build_scripts/dospath.sh new file mode 100644 index 00000000000..d674aba29ec --- /dev/null +++ b/jdk/make/tools/msys_build_scripts/dospath.sh @@ -0,0 +1,42 @@ +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# A shell script which converts its first argument, which must be an existing +# path name, into a DOS (aka 8.3) path name. If the path is a file, only the +# directory part of the whole path will be converted. +# This shell script executes the Visual Basic helper script 'dospath.vbs' +# which must be located in the same directory as this script itself. +# The Visual Basic script will be invoked trough the "Windows Script Host" +# which is available by default on Windows since Windows 98. + +pushd `dirname "$0"` > /dev/null +ABS_PATH=`pwd` +popd > /dev/null +if [ -d "$1" ]; then + echo `cd "$1" && cscript.exe -nologo $ABS_PATH/dospath.vbs`; +elif [ -f "$1" ]; then + DIR=`dirname "$1"`; + echo `cd "$DIR" && cscript.exe -nologo $ABS_PATH/dospath.vbs`\\`basename "$1"`; +fi diff --git a/jdk/make/tools/msys_build_scripts/dospath.vbs b/jdk/make/tools/msys_build_scripts/dospath.vbs new file mode 100644 index 00000000000..55ff34bcabe --- /dev/null +++ b/jdk/make/tools/msys_build_scripts/dospath.vbs @@ -0,0 +1,34 @@ +' +' Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' This code is free software; you can redistribute it and/or modify it +' under the terms of the GNU General Public License version 2 only, as +' published by the Free Software Foundation. Oracle designates this +' particular file as subject to the "Classpath" exception as provided +' by Oracle in the LICENSE file that accompanied this code. +' +' This code is distributed in the hope that it will be useful, but WITHOUT +' ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +' FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +' version 2 for more details (a copy is included in the LICENSE file that +' accompanied this code). +' +' You should have received a copy of the GNU General Public License version +' 2 along with this work; if not, write to the Free Software Foundation, +' Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +' +' Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +' or visit www.oracle.com if you need additional information or have any +' questions. +' + +' +' Visual Basic Script which returns the DOS (aka 8.3) filename of the current +' directory. +' Only called from 'dospath.sh' during a Windows build under MinGW/MSYS. +' + +Set fso=CreateObject("Scripting.FileSystemObject") +Set path = fso.GetFolder(".") +WScript.Echo path.ShortPath From 9c0b5ee904c87f3c81bfb067ab7fe766a3f610d3 Mon Sep 17 00:00:00 2001 From: Volker Simonis Date: Tue, 23 Oct 2012 10:10:39 -0700 Subject: [PATCH 085/241] 7152336: Enable builds on Windows with MinGW/MSYS Minimal makefile changes to enable building OpenJDK using MSYS on Windows7 Reviewed-by: ohair, tbell --- corba/make/common/shared/Defs-utils.gmk | 22 ++++-- corba/make/common/shared/Defs-windows.gmk | 89 ++++++++++++++--------- corba/make/common/shared/Platform.gmk | 9 +++ 3 files changed, 78 insertions(+), 42 deletions(-) diff --git a/corba/make/common/shared/Defs-utils.gmk b/corba/make/common/shared/Defs-utils.gmk index 40bf4687263..1de3dde0ba5 100644 --- a/corba/make/common/shared/Defs-utils.gmk +++ b/corba/make/common/shared/Defs-utils.gmk @@ -151,16 +151,26 @@ CD = cd # intrinsic unix command ifeq ($(PLATFORM),windows) ifdef USING_CYGWIN # Intrinsic unix command, with backslash-escaped character interpretation - ECHO = $(UNIXCOMMAND_PATH)echo -e - ZIPEXE = $(UNIXCOMMAND_PATH)zip - UNZIP = $(UNIXCOMMAND_PATH)unzip + ECHO = $(UNIXCOMMAND_PATH)echo -e + ZIPEXE = $(UNIXCOMMAND_PATH)zip + UNZIP = $(UNIXCOMMAND_PATH)unzip + # Some CYGWIN nawk versions require BINMODE=w for proper '\r' interpretation + NAWK = $(UNIXCOMMAND_PATH)awk -v BINMODE=w else - ZIPEXE = $(UTILS_DEVTOOL_PATH)zip - UNZIP = $(UTILS_DEVTOOL_PATH)unzip + ifdef USING_MSYS + ECHO = $(UTILS_COMMAND_PATH)echo -e + ZIPEXE = $(UTILS_DEVTOOL_PATH)zip + UNZIP = $(UTILS_DEVTOOL_PATH)unzip + NAWK = $(UNIXCOMMAND_PATH)awk + else + ZIPEXE = $(UTILS_DEVTOOL_PATH)zip + UNZIP = $(UTILS_DEVTOOL_PATH)unzip + NAWK = $(UNIXCOMMAND_PATH)awk + endif endif # Re-define some utilities LEX =# override GNU Make intrinsic: no lex on windows - NAWK = $(UNIXCOMMAND_PATH)awk + SHA1SUM = $(UNIXCOMMAND_PATH)openssl sha1 endif # Linux specific diff --git a/corba/make/common/shared/Defs-windows.gmk b/corba/make/common/shared/Defs-windows.gmk index 1521d9461c3..812e6038dda 100644 --- a/corba/make/common/shared/Defs-windows.gmk +++ b/corba/make/common/shared/Defs-windows.gmk @@ -91,6 +91,15 @@ define OptFullPath $(shell if [ "$1" != "" -a -d "$1" ]; then $(CYGPATH_CMD) "$1"; else echo "$1"; fi) endef else +ifdef USING_MSYS +DOSPATH_CMD:=$(shell cd $(JDK_TOPDIR) 2> $(DEV_NULL) && pwd)/make/tools/msys_build_scripts/dospath.sh +define FullPath +$(subst \,/,$(shell $(DOSPATH_CMD) $1)) +endef +define OptFullPath +$(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi) +endef +else # Temporary until we upgrade to MKS 8.7, MKS pwd returns mixed mode path define FullPath $(shell cd $1 2> $(DEV_NULL) && pwd) @@ -99,6 +108,7 @@ define OptFullPath $(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi) endef endif +endif # System drive ifdef SYSTEMDRIVE @@ -112,14 +122,21 @@ _system_drive:=$(call CheckValue,_system_drive,C:) # UNIXCOMMAND_PATH: path to where the most common Unix commands are. # NOTE: Must end with / so that it could be empty, allowing PATH usage. -ifndef UNIXCOMMAND_PATH - ifdef ALT_UNIXCOMMAND_PATH +# With cygwin, use this as is; don't use FullPath on it. +ifdef ALT_UNIXCOMMAND_PATH + ifdef USING_CYGWIN + UNIXCOMMAND_PATH :=$(call PrefixPath,$(ALT_UNIXCOMMAND_PATH)) + else xALT_UNIXCOMMAND_PATH :="$(subst \,/,$(ALT_UNIXCOMMAND_PATH))" fxALT_UNIXCOMMAND_PATH :=$(call FullPath,$(xALT_UNIXCOMMAND_PATH)) UNIXCOMMAND_PATH :=$(call PrefixPath,$(fxALT_UNIXCOMMAND_PATH)) + endif +else + ifdef USING_CYGWIN + UNIXCOMMAND_PATH :=$(call PrefixPath,/usr/bin) else - ifdef USING_CYGWIN - UNIXCOMMAND_PATH :=$(call PrefixPath,/usr/bin) + ifdef USING_MSYS + UNIXCOMMAND_PATH :=$(call PrefixPath,/bin) else ifdef ROOTDIR xROOTDIR :="$(subst \,/,$(ROOTDIR))" @@ -131,41 +148,35 @@ ifndef UNIXCOMMAND_PATH ifneq ($(_rootdir),) UNIXCOMMAND_PATH :=$(call PrefixPath,$(_rootdir)/mksnt) endif - endif - endif - UNIXCOMMAND_PATH:=$(call AltCheckSpaces,UNIXCOMMAND_PATH) - export UNIXCOMMAND_PATH + endif # USING_MSYS + endif # USING_CYGWIN endif +UNIXCOMMAND_PATH:=$(call AltCheckSpaces,UNIXCOMMAND_PATH) +export UNIXCOMMAND_PATH # Get version of MKS or CYGWIN -ifdef USING_CYGWIN - ifndef CYGWIN_VER - _CYGWIN_VER :=$(shell $(UNAME)) - CYGWIN_VER :=$(call GetVersion,$(_CYGWIN_VER)) - export CYGWIN_VER +ifdef USING_MKS + _MKS_VER :=$(shell $(MKSINFO) 2>&1 | $(GREP) Release | $(TAIL) -1 | $(SED) -e 's@.*\(Release.*\)@\1@') + MKS_VER :=$(call GetVersion,$(_MKS_VER)) + # At this point, we can re-define FullPath to use DOSNAME_CMD + CHECK_MKS87:=$(call CheckVersions,$(MKS_VER),8.7) + TRY_DOSNAME:=false + ifeq ($(CHECK_MKS87),same) + TRY_DOSNAME:=true endif -else # MKS -_MKS_VER :=$(shell $(MKSINFO) 2>&1 | $(GREP) Release | $(TAIL) -1 | $(SED) -e 's@.*\(Release.*\)@\1@') -MKS_VER :=$(call GetVersion,$(_MKS_VER)) -# At this point, we can re-define FullPath to use DOSNAME_CMD -CHECK_MKS87:=$(call CheckVersions,$(MKS_VER),8.7) -TRY_DOSNAME:=false -ifeq ($(CHECK_MKS87),same) -TRY_DOSNAME:=true -endif -# Newer should be ok -ifeq ($(CHECK_MKS87),newer) -TRY_DOSNAME:=true -endif -ifeq ($(TRY_DOSNAME),true) -ifeq ($(shell $(UNIXCOMMAND_PATH)dosname -s $(_system_drive)/ 2> $(DEV_NULL)),$(_system_drive)/) -_DOSNAME=$(UNIXCOMMAND_PATH)dosname -DOSNAME_CMD:=$(_DOSNAME) -s + # Newer should be ok + ifeq ($(CHECK_MKS87),newer) + TRY_DOSNAME:=true + endif + ifeq ($(TRY_DOSNAME),true) + ifeq ($(shell $(UNIXCOMMAND_PATH)dosname -s $(_system_drive)/ 2> $(DEV_NULL)),$(_system_drive)/) + _DOSNAME=$(UNIXCOMMAND_PATH)dosname + DOSNAME_CMD:=$(_DOSNAME) -s define FullPath $(subst //,/,$(shell echo $1 | $(DOSNAME_CMD) 2> $(DEV_NULL))) endef -endif # test dosname -s -endif # TRY_DOSNAME + endif # test dosname -s + endif # TRY_DOSNAME endif # MKS # We try to get references to what we need via the default component @@ -240,6 +251,8 @@ endif # DEVTOOLS_PATH: for other tools required for building (such as zip, etc.) # NOTE: Must end with / so that it could be empty, allowing PATH usage. ifndef DEVTOOLS_PATH + # DEVTOOLS_PATH: for other tools required for building (such as zip, etc.) + # NOTE: Must end with / so that it could be empty, allowing PATH usage. ifdef ALT_DEVTOOLS_PATH xALT_DEVTOOLS_PATH :="$(subst \,/,$(ALT_DEVTOOLS_PATH))" fxALT_DEVTOOLS_PATH :=$(call FullPath,$(xALT_DEVTOOLS_PATH)) @@ -248,10 +261,14 @@ ifndef DEVTOOLS_PATH ifdef USING_CYGWIN DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH) else - xDEVTOOLS_PATH :="$(_system_drive)/utils" - fxDEVTOOLS_PATH :=$(call FullPath,$(xDEVTOOLS_PATH)) - DEVTOOLS_PATH :=$(call PrefixPath,$(fxDEVTOOLS_PATH)) - endif + ifdef USING_MSYS + DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH) + else + xDEVTOOLS_PATH :="$(_system_drive)/utils" + fxDEVTOOLS_PATH :=$(call FullPath,$(xDEVTOOLS_PATH)) + DEVTOOLS_PATH :=$(call PrefixPath,$(fxDEVTOOLS_PATH)) + endif # USING_MSYS + endif # USING_CYGWIN endif DEVTOOLS_PATH:=$(call AltCheckSpaces,DEVTOOLS_PATH) export DEVTOOLS_PATH diff --git a/corba/make/common/shared/Platform.gmk b/corba/make/common/shared/Platform.gmk index 822c1e787b8..0b3edf4fa8b 100644 --- a/corba/make/common/shared/Platform.gmk +++ b/corba/make/common/shared/Platform.gmk @@ -65,6 +65,8 @@ PLATFORM_SHARED=done # REQUIRED_WINDOWS_NAME windows only: basic name of windows # REQUIRED_WINDOWS_VERSION windows only: specific version of windows # USING_CYGWIN windows only: true or false +# USING_MSYS windows only: true or false +# USING_MKS windows only: true or false # WINDOWS_NT_VERSION_STRING windows only: long version name # REQUIRED_OS_VERSION required OS version, e.g. 5.10, 2.4 # REQUIRED_FREE_SPACE minimum disk space needed for outputdir @@ -327,6 +329,8 @@ endif # Windows with and without CYGWIN will be slightly different ifeq ($(SYSTEM_UNAME), Windows_NT) PLATFORM = windows + USING_MKS = true + export USING_MKS OS_VERSION := $(shell uname -r) WINDOWS_NT_VERSION_STRING=Windows_NT REQUIRED_MKS_VER=6.1 @@ -339,6 +343,11 @@ ifneq (,$(findstring CYGWIN,$(SYSTEM_UNAME))) WINDOWS_NT_VERSION_STRING=CYGWIN_NT REQUIRED_CYGWIN_VER=4.0 endif +ifneq (,$(findstring MINGW,$(SYSTEM_UNAME))) + PLATFORM = windows + USING_MSYS = true + export USING_MSYS +endif # Platform settings specific to Windows ifeq ($(PLATFORM), windows) From 5b56f65379114f84c3ba30cd1c8ec710bbce7872 Mon Sep 17 00:00:00 2001 From: Volker Simonis Date: Tue, 23 Oct 2012 10:10:49 -0700 Subject: [PATCH 086/241] 7152336: Enable builds on Windows with MinGW/MSYS Minimal makefile changes to enable building OpenJDK using MSYS on Windows7 Reviewed-by: ohair, tbell --- README-builds.html | 372 ++++++++++++++++++++++++++-------------- make/scripts/fixpath.pl | 169 ++++++++++++++++++ make/scripts/vsvars.sh | 153 +++++++++++------ 3 files changed, 515 insertions(+), 179 deletions(-) create mode 100644 make/scripts/fixpath.pl diff --git a/README-builds.html b/README-builds.html index 57ded784f9a..446588f7a36 100644 --- a/README-builds.html +++ b/README-builds.html @@ -96,7 +96,8 @@
  • Windows only:
  • @@ -161,7 +162,7 @@
    This file often describes specific requirements for what we call the "minimum build environments" (MBE) for this - specific release of the JDK, + specific release of the JDK, Building with the MBE will generate the most compatible bits that install on, and run correctly on, the most variations of the same base OS and hardware architecture. @@ -241,16 +242,16 @@

    - These same sources do indeed build on many more systems than the - above older generation systems, again the above is just a minimum. + These same sources do indeed build on many more systems than the + above older generation systems, again the above is just a minimum.

    - Compilation problems with newer or different C/C++ compilers is a - common problem. - Similarly, compilation problems related to changes to the + Compilation problems with newer or different C/C++ compilers is a + common problem. + Similarly, compilation problems related to changes to the /usr/include or system header files is also a - common problem with newer or unreleased OS versions. - Please report these types of problems as bugs so that they - can be dealt with accordingly. + common problem with newer or unreleased OS versions. + Please report these types of problems as bugs so that they + can be dealt with accordingly.


    @@ -266,15 +267,15 @@

    After installing Fedora 9 - you need to install several build dependencies. The simplest - way to do it is to execute the following commands as user + you need to install several build dependencies. The simplest + way to do it is to execute the following commands as user root:

    yum-builddep java-1.6.0-openjdk

    yum install gcc gcc-c++

    - In addition, it's necessary to set a few environment variables for the build: + In addition, it's necessary to set a few environment variables for the build:

    export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk @@ -283,15 +284,15 @@

    After installing Fedora 10 - you need to install several build dependencies. The simplest - way to do it is to execute the following commands as user + you need to install several build dependencies. The simplest + way to do it is to execute the following commands as user root:

    yum-builddep java-1.6.0-openjdk

    yum install gcc gcc-c++

    - In addition, it's necessary to set a few environment variables for the build: + In addition, it's necessary to set a few environment variables for the build:

    export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk @@ -300,15 +301,15 @@

    After installing Fedora 11 - you need to install several build dependencies. The simplest - way to do it is to execute the following commands as user + you need to install several build dependencies. The simplest + way to do it is to execute the following commands as user root:

    yum-builddep java-1.6.0-openjdk

    yum install gcc gcc-c++

    - In addition, it's necessary to set a few environment variables for the build: + In addition, it's necessary to set a few environment variables for the build:

    export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk @@ -360,16 +361,16 @@

    Debian 5.0 (Lenny)

    - After installing Debian 5 - you need to install several build dependencies. - The simplest way to install the build dependencies is to - execute the following commands as user root: + After installing Debian 5 + you need to install several build dependencies. + The simplest way to install the build dependencies is to + execute the following commands as user root:

    aptitude build-dep openjdk-6

    aptitude install openjdk-6-jdk libmotif-dev

    - In addition, it's necessary to set a few environment variables for the build: + In addition, it's necessary to set a few environment variables for the build:

    export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk

    @@ -380,52 +381,52 @@

    Ubuntu 8.04

    - After installing Ubuntu 8.04 - you need to install several build dependencies. + After installing Ubuntu 8.04 + you need to install several build dependencies.

    - First, you need to enable the universe repository in the - Software Sources application and reload the repository - information. The Software Sources application is available - under the System/Administration menu. + First, you need to enable the universe repository in the + Software Sources application and reload the repository + information. The Software Sources application is available + under the System/Administration menu.

    - The simplest way to install the build dependencies is to - execute the following commands: + The simplest way to install the build dependencies is to + execute the following commands:

    sudo aptitude build-dep openjdk-6

    sudo aptitude install openjdk-6-jdk

    - In addition, it's necessary to set a few environment variables for the build: + In addition, it's necessary to set a few environment variables for the build:

    export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk

    Ubuntu 8.10

    - After installing Ubuntu 8.10 - you need to install several build dependencies. The simplest - way to do it is to execute the following commands: + After installing Ubuntu 8.10 + you need to install several build dependencies. The simplest + way to do it is to execute the following commands:

    sudo aptitude build-dep openjdk-6

    sudo aptitude install openjdk-6-jdk

    - In addition, it's necessary to set a few environment variables for the build: + In addition, it's necessary to set a few environment variables for the build:

    export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk

    Ubuntu 9.04

    - After installing Ubuntu 9.04 - you need to install several build dependencies. The simplest - way to do it is to execute the following commands: + After installing Ubuntu 9.04 + you need to install several build dependencies. The simplest + way to do it is to execute the following commands:

    sudo aptitude build-dep openjdk-6

    sudo aptitude install openjdk-6-jdk

    - In addition, it's necessary to set a few environment variables for the build: + In addition, it's necessary to set a few environment variables for the build:

    export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk

    @@ -436,20 +437,20 @@

    OpenSUSE 11.1

    - After installing OpenSUSE 11.1 - you need to install several build dependencies. - The simplest way to install the build dependencies is to - execute the following commands: + After installing OpenSUSE 11.1 + you need to install several build dependencies. + The simplest way to install the build dependencies is to + execute the following commands:

    sudo zypper source-install -d java-1_6_0-openjdk

    sudo zypper install make

    - In addition, it is necessary to set a few environment variables for the build: + In addition, it is necessary to set a few environment variables for the build:

    export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk

    - Finally, you need to unset the JAVA_HOME environment variable: + Finally, you need to unset the JAVA_HOME environment variable:

    export -n JAVA_HOME

    @@ -460,14 +461,14 @@

    Mandriva Linux One 2009 Spring

    - After installing Mandriva Linux One 2009 Spring - you need to install several build dependencies. - The simplest way to install the build dependencies is to - execute the following commands as user root: + After installing Mandriva Linux One 2009 Spring + you need to install several build dependencies. + The simplest way to install the build dependencies is to + execute the following commands as user root:

    urpmi java-1.6.0-openjdk-devel ant make gcc gcc-c++ freetype-devel zip unzip libcups2-devel libxrender1-devel libalsa2-devel libstc++-static-devel libxtst6-devel libxi-devel

    - In addition, it is necessary to set a few environment variables for the build: + In addition, it is necessary to set a few environment variables for the build:

    export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk

    @@ -478,18 +479,18 @@

    OpenSolaris 2009.06

    - After installing OpenSolaris 2009.06 - you need to install several build dependencies. - The simplest way to install the build dependencies is to - execute the following commands: + After installing OpenSolaris 2009.06 + you need to install several build dependencies. + The simplest way to install the build dependencies is to + execute the following commands:

    pfexec pkg install SUNWgmake SUNWj6dev SUNWant sunstudioexpress SUNWcups SUNWzip SUNWunzip SUNWxwhl SUNWxorg-headers SUNWaudh SUNWfreetype2

    - In addition, it is necessary to set a few environment variables for the build: + In addition, it is necessary to set a few environment variables for the build:

    export LANG=C ALT_COMPILER_PATH=/opt/SunStudioExpress/bin/ ALT_CUPS_HEADERS_PATH=/usr/include/

    - Finally, you need to make sure that the build process can find the Sun Studio compilers: + Finally, you need to make sure that the build process can find the Sun Studio compilers:

    export PATH=$PATH:/opt/SunStudioExpress/bin/

    @@ -687,31 +688,20 @@
  • Windows: - Make sure you start your build inside a bash/sh/ksh shell - and are using a make.exe utility built for that - environment (a cygwin make.exe is not the same - as a make.exe built for something like - MKS). -
    - WARNING: Watch out on some make 3.81 versions, it may - not work due to a lack of support for MS-DOS drive letter paths - like C:/ or C:\. -
    - You may be able to use the information at the - - mozilla developer center - on this topic. -
    - It's hoped that when make 3.82 starts shipping in a future cygwin - release that this MS-DOS path issue will be fixed. -
    - It may be possible to download the version at - - www.cmake.org make.exe. -
    - It might be necessary for you to build your own GNU make 3.81, - see the "Building GNU make" section - in that case. + Make sure you start your build inside a bash/sh/ksh shell and are + using a make.exe utility built for that environment.
    + MKS builds need a native Windows version of GNU make + (see Building GNU make).
    + Cygwin builds need + a make version which was specially compiled for the Cygwin environment + (see Building GNU make). WARNING: + the OpenJDK build with the make utility provided by Cygwin will not + work because it does not support drive letters in paths. Make sure that + your version of make will be found before the Cygwins default make by + setting an appropriate PATH environment variable or by removing + Cygwin's make after you built your own make version.
    + MinGW/MSYS builds can use the default make which + comes with the environment.
  • @@ -727,7 +717,7 @@

    Building GNU make

    - First step is to get the GNU make 3.81 source from + First step is to get the GNU make 3.81 (or newer) source from ftp.gnu.org/pub/gnu/make/. Building is a little different depending on the OS and unix toolset @@ -742,12 +732,24 @@ ./configure && gmake CC=gcc
  • - Windows for CYGWIN: - ./configure && make + Windows for CYGWIN:
    + ./configure
    + Add the line #define HAVE_CYGWIN_SHELL 1 to the end of config.h
    + make
    +
    + This should produce make.exe in the current directory.
  • - Windows for MKS: (CYGWIN is recommended) - ./configure && make -f Makefile.win32 + Windows for MKS:
    + Edit config.h.W32 and uncomment the line #define HAVE_MKS_SHELL 1
    + Set the environment for your native compiler (e.g. by calling:
    + "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /Release /xp /x64) + nmake -f NMakefile.win32 +
    + This should produce WinDebug/make.exe and WinRel/make.exe +
    + If you get the error: NMAKE : fatal error U1045: spawn failed : Permission denied + you have to set the Read & execute permission for the file subproc.bat.
  • @@ -894,39 +896,135 @@

    Windows Paths

    Windows: - Note that GNU make is a historic utility and is based very - heavily on shell scripting, so it does not tolerate the Windows habit + Note that GNU make, the shell and other Unix-tools required during the build + do not tolerate the Windows habit of having spaces in pathnames or the use of the \characters in pathnames. - Luckily on most Windows systems, you can use /instead of \, and - there is always a 'short' pathname without spaces for any path that - contains spaces. - Unfortunately, this short pathname can be somewhat dynamic and the - formula is difficult to explain. - You can use cygpath utility to map pathnames with spaces - or the \character into the C:/ style of pathname - (called 'mixed'), e.g. - cygpath -s -m "path". + Luckily on most Windows systems, you can use /instead of \, and + there is always a short + "8.3" pathname without spaces for any path that contains spaces. + Unfortunately, this short pathname is somewhat dynamic (i.e. dependant on the + other files and directories inside a given directory) and can not be + algorithmicly calculated by only looking at a specific path name.

    The makefiles will try to translate any pathnames supplied to it into the C:/ style automatically. +

    - Note that use of CYGWIN creates a unique problem with regards to + Special care has to be taken if native Windows applications + like nmake or cl are called with file arguments processed + by Unix-tools like make or sh! +

    +
    + +

    Windows build environments

    +
    + Building on Windows requires a Unix-like environment, notably a Unix-like shell. + There are several such environments available of which + MKS, + Cygwin and + MinGW/MSYS are currently supported for + the OpenJDK build. One of the differences of these three systems is the way + they handle Windows path names, particularly path names which contain + spaces, backslashes as path separators and possibly drive letters. Depending + on the use case and the specifics of each environment these path problems can + be solved by a combination of quoting whole paths, translating backslashes to + forward slashes, escaping backslashes with additional backslashes and + translating the path names to their + "8.3" version. +

    + As of this writing (MKS ver. 9.4, Cygwin ver. 1.7.9, MinGW/MSYS 1.0.17), + MKS builds are known to be the fastest Windows builds while MingGW/MSYS + builds are slightly slower (about 10%) than MKS builds and Cygwin builds + require nearly twice the time (about 180%) of MKS builds (e.g. on a + DualCore i7 notebook with 8GB of RAM, HDD and 64-bit Windows 7 operating system + the complete OpenJDK 8 product build takes about 49min with MKS, 54min with + MinGW/MSYS and 88min with Cygwin). +

    +

    + Mixing tools from the different Unix emulation environments is not a good + idea and will probably not work! +

    +

    + MKS: is a commercial product which includes + all the Unix utilities which are required to build the OpenJDK except GNU + make. In pre-OpenJDK times it was the only supported build environment on + Windows. The MKS tools support Windows paths with drive letters and + forward slashes as path separator. Paths in environment variables like (for + example) PATH are separated by semicolon ';'. +

    +

    + Recent versions of MKS provide the dosname utility to convert paths + with spaces to short (8.3) path names,e .g. + dosname -s "path". +

    +

    + If you are using the MKS environment, you need a native Windows version + of Gnu make which you can easily build yourself. +

    +

    + Cygwin: + is an open source, Linux-like environment which tries to emulate + a complete POSIX layer on Windows. It tries to be smart about path names + and can usually handle all kinds of paths if they are correctly quoted + or escaped although internally it maps drive letters <drive>: + to a virtual directory /cygdrive/<drive>. +

    +

    + You can always use the cygpath utility to map pathnames with spaces + or the backslash character into the C:/ style of pathname + (called 'mixed'), e.g. cygpath -s -m "path". +

    +

    + Note that the use of CYGWIN creates a unique problem with regards to setting PATH. Normally on Windows the PATH variable contains directories - separated with the ";" character (Solaris and Linux uses ":"). + separated with the ";" character (Solaris and Linux use ":"). With CYGWIN, it uses ":", but that means that paths like "C:/path" cannot be placed in the CYGWIN version of PATH and instead CYGWIN uses something like /cygdrive/c/path which CYGWIN understands, but only CYGWIN understands. - So be careful with paths on Windows. +

    +

    + If you are using the Cygwin environment, you need to + compile your own version + of GNU make because the default Cygwin make can not handle drive letters in paths. +

    +

    + MinGW/MSYS: + MinGW ("Minimalist GNU for Windows") is a collection of free Windows + specific header files and import libraries combined with GNU toolsets that + allow one to produce native Windows programs that do not rely on any + 3rd-party C runtime DLLs. MSYS is a supplement to MinGW which allows building + applications and programs which rely on traditional UNIX tools to + be present. Among others this includes tools like bash and make. +

    +

    + Like Cygwin, MinGW/MSYS can handle different types of path formats. They + are internally converted to paths with forward slashes and drive letters + <drive>: replaced by a virtual + directory /<drive>. Additionally, MSYS automatically + detects binaries compiled for the MSYS environment and feeds them with the + internal, Unix-style path names. If native Windows applications are called + from within MSYS programs their path arguments are automatically converted + back to Windows style path names with drive letters and backslashes as + path separators. This may cause problems for Windows applications which + use forward slashes as parameter separator (e.g. cl /nologo /I) + because MSYS may wrongly + replace such parameters by drive letters. +

    +

    + If you are using the MinGW/MSYS system you can use the default make + version supplied by the environment. +

    Basic Windows Check List

    1. - Install the - CYGWIN product. + Install one of the + CYGWIN, MinGW/MSYS or + MKS environments.
    2. Install the @@ -1097,9 +1195,9 @@ Sun Studio 12 Update 1 Compilers (containing version 5.10 of the C and C++ compilers) is required, - including specific patches. + including specific patches.

      - The Solaris SPARC patch list is: + The Solaris SPARC patch list is:

      • 118683-05: SunOS 5.10: Patch for profiling libraries and assembler @@ -1286,7 +1384,8 @@ The XRender header file is included with the other X11 header files in the package SFWxwinc on new enough versions of Solaris and will be installed in - /usr/X11/include/X11/extensions/Xrender.h + /usr/X11/include/X11/extensions/Xrender.h or + /usr/openwin/share/include/X11/extensions/Xrender.h

        Linux: XRender header files are required for building the @@ -1456,7 +1555,9 @@ Devel make The GNU version of the 'make' utility built for CYGWIN.
        - NOTE: See the GNU make section + NOTE: the Cygwin make can not be used to build the + OpenJDK. You only need it to build your own version of make + (see the GNU make section) m4.exe @@ -1521,6 +1622,21 @@ So it's important that the Visual Studio paths in PATH preceed the CYGWIN path /usr/bin.

    + Minimalist GNU for Windows (MinGW/MSYS) +
    + Alternatively, the set of unix command tools for the OpenJDK build on + Windows can be supplied by + MinGW/MSYS. +

    + In addition to the tools which will be installed by default, you have + to manually install the msys-zip and msys-unzip packages. + This can be easily done with the MinGW command line installer:
    +
    + mingw-get.exe install msys-zip
    + mingw-get.exe install msys-unzip
    +
    +

    +
    Microsoft DirectX 9.0 SDK header files and libraries
    Microsoft DirectX 9.0 SDK (Summer 2004) @@ -1781,10 +1897,10 @@
    ALT_OPENWIN_HOME
    - The top-level directory of the libraries and include files for the platform's - graphical programming environment. The default location is platform specific. - For example, on Linux it defaults to /usr/X11R6/. -
    + The top-level directory of the libraries and include files for the platform's + graphical programming environment. The default location is platform specific. + For example, on Linux it defaults to /usr/X11R6/. +
    Windows specific:
    @@ -1792,9 +1908,9 @@
    The location of the Microsoft Windows SDK where some tools will be - located. - The default is whatever WINDOWSSDKDIR is set to - (or WindowsSdkDir) or the path + located. + The default is whatever WINDOWSSDKDIR is set to + (or WindowsSdkDir) or the path
    c:\Program Files\Microsoft SDKs\Windows\v7.0a
    @@ -1823,17 +1939,17 @@ is that ALT_COMPILER_PATH is set to point to the cross-compiler and that any cross-compilation specific flags are passed using EXTRA_CFLAGS. - The ALT_OPENWIN_HOME variable should - also be set to point to the graphical header files (e.g. X11) provided with - the cross-compiler. + The ALT_OPENWIN_HOME variable should + also be set to point to the graphical header files (e.g. X11) provided with + the cross-compiler. When cross-compiling we skip execution of any demos etc that may be built, and also skip binary-file verification.
    EXTRA_CFLAGS
    - Used to pass cross-compilation options to the cross-compiler. + Used to pass cross-compilation options to the cross-compiler. These are added to the CFLAGS and CXXFLAGS variables. -
    +
    USE_ONLY_BOOTDIR_TOOLS
    Used primarily for cross-compilation builds (and always set in that case) @@ -1868,23 +1984,23 @@
    BUILD_HEADLESS_ONLY
    Used when the build environment has no graphical capabilities at all. This - excludes building anything that requires graphical libraries to be available. + excludes building anything that requires graphical libraries to be available.
    JAVASE_EMBEDDED
    - Used to indicate this is a build of the Oracle Java SE Embedded product. - This will enable the directives included in the SE-Embedded specific build - files. + Used to indicate this is a build of the Oracle Java SE Embedded product. + This will enable the directives included in the SE-Embedded specific build + files.
    LIBZIP_CAN_USE_MMAP
    - If set to false, disables the use of mmap by the zip utility. Otherwise, - mmap will be used. + If set to false, disables the use of mmap by the zip utility. Otherwise, + mmap will be used.
    COMPRESS_JARS
    - If set to true, causes certain jar files that would otherwise be built without - compression, to use compression. + If set to true, causes certain jar files that would otherwise be built without + compression, to use compression.
    diff --git a/make/scripts/fixpath.pl b/make/scripts/fixpath.pl new file mode 100644 index 00000000000..36ec981cdf5 --- /dev/null +++ b/make/scripts/fixpath.pl @@ -0,0 +1,169 @@ +#!/bin/perl + +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# Crunch down the input(s) to Windows short (mangled) form. +# Any elements not actually found in the filesystem will be dropped. +# +# This script needs three modes: +# 1) DOS mode with drive letter followed by : and ; path separator +# 2) Cygwin mode with /cygdrive// and : path separator +# 3) MinGW/MSYS mode with // and : path separator + +use strict; +use warnings; +use Getopt::Std; + +sub Usage() { + print ("Usage:\n $0 -d | -c | -m \\n"); + print (" -d DOS style (drive letter, :, and ; path separator)\n"); + print (" -c Cywgin style (/cygdrive/drive/ and : path separator)\n"); + print (" -m MinGW style (/drive/ and : path separator)\n"); + exit 1; +} +# Process command line options: +my %opts; +getopts('dcm', \%opts) || Usage(); + +if (scalar(@ARGV) != 1) {Usage()}; + +# Translate drive letters such as C:/ +# if MSDOS, Win32::GetShortPathName() does the work (see below). +# if Cygwin, use the /cygdrive/c/ form. +# if MinGW, use the /c/ form. +my $path0; +my $sep2; +if (defined ($opts{'d'})) { + #MSDOS + $path0 = ''; + $sep2 = ';'; +} elsif (defined ($opts{'c'})) { + #Cygwin + $path0 = '/cygdrive'; + $sep2 = ':'; +} elsif (defined ($opts{'m'})) { + #MinGW/MSYS + $path0 = ''; + $sep2 = ':'; +} else { + Usage(); +} + +my $input = $ARGV[0]; +my $sep1; + +# Is the input ';' separated, or ':' separated, or a simple string? +if (($input =~ tr/;/;/) > 0) { + # One or more ';' implies Windows style path. + $sep1 = ';'; +} elsif (($input =~ tr/:/:/) > 1) { + # Two or more ':' implies Cygwin or MinGW/MSYS style path. + $sep1 = ':'; +} else { + # Otherwise, this is not a path - take up to the end of string in + # one piece. + $sep1 = '/$/'; +} + +# Split the input on $sep1 PATH separator and process the pieces. +my @pieces; +for (split($sep1, $input)) { + my $try = $_; + + if (($try =~ /^\/cygdrive\/(.)\/(.*)$/) || ($try =~ /^\/(.)\/(.*)$/)) { + # Special case #1: This is a Cygwin /cygrive/ 1)) { + $result = join ($sep2, @pieces); +} else { + $result = $pieces[0]; +} + +if (defined ($result)) { + + # Change all '\' to '/' + $result =~ s/\\/\//g; + + # Remove duplicate '/' + $result =~ s/\/\//\//g; + + # Map to lower case + $result =~ tr/A-Z/a-z/; + + print ("$result\n"); +} diff --git a/make/scripts/vsvars.sh b/make/scripts/vsvars.sh index 369a04a9ec3..928777cb54f 100644 --- a/make/scripts/vsvars.sh +++ b/make/scripts/vsvars.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -27,22 +27,6 @@ # variables normally set by the vcvars32.bat or vcvars64.bat file or # SetEnv.cmd for older SDKs. -# Use cygpath? -isCygwin="`uname -s | grep CYGWIN`" -if [ "${isCygwin}" != "" ] ; then - cygpath="/usr/bin/cygpath" - cygpath_short="${cygpath} -m -s" - cygpath_windows="${cygpath} -w -s" - cygpath_path="${cygpath} -p" - pathsep=':' -else - cygpath="dosname" - cygpath_short="${cygpath} -s" - cygpath_windows="${cygpath} -s" - cygpath_path="echo" - pathsep=';' -fi - ######################################################################## # Error functions msg() # message @@ -60,8 +44,8 @@ warning() # message } envpath() # path { - if [ "${cygpath_short}" != "" -a -d "$1" ] ; then - ${cygpath_short} "$1" + if [ "${fixpath}" != "" -a -d "$1" ] ; then + ${fixpath} "$1" else echo "$1" fi @@ -72,14 +56,65 @@ envpath() # path # Defaults settings debug="false" verbose="false" -shellStyle="sh" -parentCsh="` ps -p ${PPID} 2> /dev/null | grep csh `" -if [ "${parentCsh}" != "" ] ; then - shellStyle="csh" -fi set -e +CYGWIN="nodosfilewarning ntsec" +export CYGWIN + +# pathsepIn is always ; because the input strings are coming from +# vcvarsxx.bat. This is true under all of MKS, Cygwin, MINGW/msys +pathsepIn=';' + +OS="`uname -s`" +case "${OS}" in + CYGWIN*) + pathflag='-c' + devnull=/dev/null + pathsepOut=':' + ;; + + MINGW*) + pathflag='-m' + devnull=/dev/null + pathsepOut=':' + ;; + + *) + # MKS? + # Continue using dosname -s + pathflag='-s' + fixpath="dosname ${pathflag}" + fixpath_windows="${fixpath}" + fixpath_path="echo" + devnull=NUL + pathsepOut=';' + ;; +esac + +case "${OS}" in + CYGWIN*|MINGW*) + t=`dirname ${0}` + wd=`cd ${t} 2> ${devnull} && pwd` + fixpath_script="${wd}/fixpath.pl" + if [ ! -f "${fixpath_script}" ] ; then + error "Does not exist: ${fixpath_script}" + fi + fixpath="perl ${fixpath_script} ${pathflag}" + fixpath_windows="perl ${fixpath_script} -d" + fixpath_path="${fixpath_windows}" + ;; +esac + +shellStyle="sh" +## As far as I can tell from hg history, this has not worked +## for a long time because PPID is unset. When run under Cygwin +## the script quits due to the 1 return from grep. +##parentCsh="` ps -p ${PPID} 2> ${devnull} | grep csh `" +##if [ "${parentCsh}" != "" ] ; then +## shellStyle="csh" +##fi + # Check environment first if [ "${PROGRAMFILES}" != "" ] ; then progfiles=`envpath "${PROGRAMFILES}"` @@ -96,15 +131,19 @@ fi # Arch data model if [ "${PROCESSOR_IDENTIFIER}" != "" ] ; then arch=`echo "${PROCESSOR_IDENTIFIER}" | cut -d' ' -f1` -elif [ "${MACHTYPE}" != "" ] ; then - if [ "`echo ${MACHTYPE} | grep 64`" != "" ] ; then - # Assume this is X64, not IA64 - arch="x64" - else - arch="x86" - fi else - arch="`uname -m`" + if [ "${MACHTYPE}" != "" ] ; then + if [ "`echo ${MACHTYPE} | grep 64`" != "" ] ; then + # Assume this is X64, not IA64 + arch="x64" + else + arch="x86" + fi + else + arch="`uname -m`" + fi + PROCESSOR_IDENTIFIER="${arch}" + export PROCESSOR_IDENTIFIER fi if [ "${arch}" = "X86" -o \ "${arch}" = "386" -o "${arch}" = "i386" -o \ @@ -121,11 +160,11 @@ if [ "${arch}" = "X64" -o \ "${arch}" = "intel64" -o "${arch}" = "Intel64" -o \ "${arch}" = "64" ] ; then arch="x64" - binarch64="/amd64" + binarch64="\\amd64" fi if [ "${arch}" = "IA64" ] ; then arch="ia64" - binarch64="/ia64" + binarch64="\\ia64" fi if [ "${arch}" != "x86" -a "${arch}" != "x64" -a "${arch}" != "ia64" ] ; then error "No PROCESSOR_IDENTIFIER or MACHTYPE environment variables and uname -m is not helping" @@ -324,25 +363,26 @@ checkPaths() # var path sep } # Remove all duplicate entries -removeDeadDups() # string sep +removeDeadDups() # string sepIn sepOut { set -e - sep="$2" + sepIn="$2" + sepOut="$3" pathlist="${tmp}/pathlist" printf "%s\n" "$1" | \ sed -e 's@\\@/@g' | \ sed -e 's@//@/@g' | \ - ${awk} -F"${sep}" '{for(i=1;i<=NF;i++){printf "%s\n",$i;}}' \ + ${awk} -F"${sepIn}" '{for(i=1;i<=NF;i++){printf "%s\n",$i;}}' \ > ${pathlist} upaths="${tmp}/upaths" cat ${pathlist} | while read orig; do p="${orig}" - if [ "${cygpath_short}" != "" ] ; then + if [ "${fixpath}" != "" ] ; then if [ "${p}" != "" ] ; then if [ -d "${p}" ] ; then - short=`${cygpath_short} "${p}"` + short=`${fixpath} "${p}"` if [ "${short}" != "" -a -d "${short}" ] ; then - p=`${cygpath} "${short}"` + p="${short}" fi echo "${p}" >> ${upaths} fi @@ -356,11 +396,11 @@ removeDeadDups() # string sep if [ "${newpaths}" = "" ] ; then newpaths="${i}" else - newpaths="${newpaths}${sep}${i}" + newpaths="${newpaths}${sepOut}${i}" fi done printf "%s\n" "${newpaths}" | \ - ${awk} -F"${sep}" \ + ${awk} -F"${sepOut}" \ '{a[$1];printf "%s",$1;for(i=2;i<=NF;i++){if(!($i in a)){a[$i];printf "%s%s",FS,$i;}};printf "\n";}' } @@ -388,7 +428,7 @@ set VCINSTALLDIR= set VSINSTALLDIR= set WindowsSdkDir= REM Run the vcvars bat file, send all output to stderr -call `${cygpath_windows} ${bdir}`\\${command} > `${cygpath_windows} "${stdout}"` +call `${fixpath_windows} ${bdir}`\\${command} > `${fixpath_windows} "${stdout}"` REM Echo out env var settings echo VS_VS71COMNTOOLS="%VS71COMNTOOLS%" echo export VS_VS71COMNTOOLS @@ -427,9 +467,18 @@ EOF # Create env file createEnv() # batfile envfile { - rm -f ${1}.stdout - cmd.exe /Q /C `${cygpath_short} $1` | \ - sed -e 's@\\@/@g' | \ + rm -f ${1}.stdout ${1}.temp1 ${1}.temp2 + batfile=`${fixpath} ${1}` + cmd.exe -Q -C < "$batfile" 1> ${1}.temp1 2> ${1}.temp2 + cat ${1}.temp1 | \ + sed -e 's@^Microsoft.*@@' \ + -e 's@^.*Copyright.*@@' \ + -e 's@^.*>REM.*@@' \ + -e 's@^.*>set.*@@' \ + -e 's@^.*>echo.*@@' \ + -e 's@^.*>call.*@@' \ + -e 's@^.*>$@@' \ + -e 's@\\@/@g' | \ sed -e 's@//@/@g' > $2 if [ -f "${1}.stdout" ] ; then cat ${1}.stdout 1>&2 @@ -465,7 +514,7 @@ printEnv() # name pname vsname val ############################################################################# # Get Visual Studio settings -if [ "${cygpath}" != "" ] ; then +if [ "${fixpath}" != "" ] ; then # Create bat file to run batfile="${tmp}/vs-to-env.bat" @@ -485,11 +534,11 @@ if [ "${cygpath}" != "" ] ; then . ${envfile} # Derive unix style path, save old, and define new (remove dups) - VS_UPATH=`${cygpath_path} "${VS_WPATH}"` + VS_UPATH=`${fixpath_path} "${VS_WPATH}"` export VS_UPATH VS_OPATH=`printf "%s" "${PATH}" | sed -e 's@\\\\@/@g'` export VS_OPATH - VS_PATH=`removeDeadDups "${VS_UPATH}${pathsep}${VS_OPATH}" "${pathsep}"` + VS_PATH=`removeDeadDups "${VS_UPATH}${pathsepIn}${VS_OPATH}" "${pathsepIn}" "${pathsepOut}"` export VS_PATH fi @@ -536,11 +585,13 @@ if [ "${verbose}" = "true" ] ; then checkPaths "Windows PATH" "${VS_WPATH}" ";" checkPaths LIB "${VS_LIB}" ";" checkPaths INCLUDE "${VS_INCLUDE}" ";" - checkPaths PATH "${VS_PATH}" "${pathsep}" + checkPaths PATH "${VS_PATH}" "${pathsepIn}" fi # Remove all temp files -rm -f -r ${tmp} +if [ "${debug}" != "true" ] ; then + rm -f -r ${tmp} +fi exit 0 From a9c2b6a9008daf5f5645889436a475dfb4a9a5c7 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Tue, 23 Oct 2012 13:06:37 -0700 Subject: [PATCH 087/241] 8001183: incorrect results of char vectors right shift operaiton Do vector right shift operation for small int types only after loads Reviewed-by: jrose, dlong --- hotspot/src/cpu/x86/vm/x86.ad | 153 +- hotspot/src/share/vm/opto/superword.cpp | 40 +- hotspot/src/share/vm/opto/vectornode.cpp | 16 +- .../test/compiler/6340864/TestByteVect.java | 215 ++- .../test/compiler/6340864/TestIntVect.java | 213 +++ .../test/compiler/6340864/TestLongVect.java | 212 +++ .../test/compiler/6340864/TestShortVect.java | 213 +++ .../test/compiler/8001183/TestCharVect.java | 1332 +++++++++++++++++ 8 files changed, 2380 insertions(+), 14 deletions(-) create mode 100644 hotspot/test/compiler/8001183/TestCharVect.java diff --git a/hotspot/src/cpu/x86/vm/x86.ad b/hotspot/src/cpu/x86/vm/x86.ad index a2cf6f7945d..c49d0e6c31c 100644 --- a/hotspot/src/cpu/x86/vm/x86.ad +++ b/hotspot/src/cpu/x86/vm/x86.ad @@ -4102,9 +4102,158 @@ instruct vsll4L_reg_imm(vecY dst, vecY src, immI8 shift) %{ // ----------------------- LogicalRightShift ----------------------------------- -// Shorts/Chars vector logical right shift produces incorrect Java result +// Shorts vector logical right shift produces incorrect Java result // for negative data because java code convert short value into int with -// sign extension before a shift. +// sign extension before a shift. But char vectors are fine since chars are +// unsigned values. + +instruct vsrl2S(vecS dst, vecS shift) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed2S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, $shift$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl2S_imm(vecS dst, immI8 shift) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed2S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, (int)$shift$$constant); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl2S_reg(vecS dst, vecS src, vecS shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 2); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl2S_reg_imm(vecS dst, vecS src, immI8 shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 2); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl4S(vecD dst, vecS shift) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed4S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, $shift$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl4S_imm(vecD dst, immI8 shift) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed4S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, (int)$shift$$constant); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl4S_reg(vecD dst, vecD src, vecS shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 4); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl4S_reg_imm(vecD dst, vecD src, immI8 shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 4); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl8S(vecX dst, vecS shift) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed8S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, $shift$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl8S_imm(vecX dst, immI8 shift) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed8S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, (int)$shift$$constant); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl8S_reg(vecX dst, vecX src, vecS shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 8); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl8S_reg_imm(vecX dst, vecX src, immI8 shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 8); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl16S_reg(vecY dst, vecY src, vecS shift) %{ + predicate(UseAVX > 1 && n->as_Vector()->length() == 16); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %} + ins_encode %{ + bool vector256 = true; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl16S_reg_imm(vecY dst, vecY src, immI8 shift) %{ + predicate(UseAVX > 1 && n->as_Vector()->length() == 16); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %} + ins_encode %{ + bool vector256 = true; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256); + %} + ins_pipe( pipe_slow ); +%} // Integers vector logical right shift instruct vsrl2I(vecD dst, vecS shift) %{ diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp index ffc5394bb09..c21c1e3ab16 100644 --- a/hotspot/src/share/vm/opto/superword.cpp +++ b/hotspot/src/share/vm/opto/superword.cpp @@ -1776,16 +1776,15 @@ void SuperWord::compute_vector_element_type() { set_velt_type(n, container_type(n)); } - // Propagate narrowed type backwards through operations + // Propagate integer narrowed type backwards through operations // that don't depend on higher order bits for (int i = _block.length() - 1; i >= 0; i--) { Node* n = _block.at(i); // Only integer types need be examined - const Type* vt = velt_type(n); - if (vt->basic_type() == T_INT) { + const Type* vtn = velt_type(n); + if (vtn->basic_type() == T_INT) { uint start, end; VectorNode::vector_operands(n, &start, &end); - const Type* vt = velt_type(n); for (uint j = start; j < end; j++) { Node* in = n->in(j); @@ -1801,6 +1800,24 @@ void SuperWord::compute_vector_element_type() { } } if (same_type) { + // For right shifts of small integer types (bool, byte, char, short) + // we need precise information about sign-ness. Only Load nodes have + // this information because Store nodes are the same for signed and + // unsigned values. And any arithmetic operation after a load may + // expand a value to signed Int so such right shifts can't be used + // because vector elements do not have upper bits of Int. + const Type* vt = vtn; + if (VectorNode::is_shift(in)) { + Node* load = in->in(1); + if (load->is_Load() && (velt_type(load)->basic_type() == T_INT)) { + vt = velt_type(load); + } else if (in->Opcode() != Op_LShiftI) { + // Widen type to Int to avoid creation of right shift vector + // (align + data_size(s1) check in stmts_can_pack() will fail). + // Note, left shifts work regardless type. + vt = TypeInt::INT; + } + } set_velt_type(in, vt); } } @@ -1841,7 +1858,20 @@ int SuperWord::memory_alignment(MemNode* s, int iv_adjust) { // Smallest type containing range of values const Type* SuperWord::container_type(Node* n) { if (n->is_Mem()) { - return Type::get_const_basic_type(n->as_Mem()->memory_type()); + BasicType bt = n->as_Mem()->memory_type(); + if (n->is_Store() && (bt == T_CHAR)) { + // Use T_SHORT type instead of T_CHAR for stored values because any + // preceding arithmetic operation extends values to signed Int. + bt = T_SHORT; + } + if (n->Opcode() == Op_LoadUB) { + // Adjust type for unsigned byte loads, it is important for right shifts. + // T_BOOLEAN is used because there is no basic type representing type + // TypeInt::UBYTE. Use of T_BOOLEAN for vectors is fine because only + // size (one byte) and sign is important. + bt = T_BOOLEAN; + } + return Type::get_const_basic_type(bt); } const Type* t = _igvn.type(n); if (t->basic_type() == T_INT) { diff --git a/hotspot/src/share/vm/opto/vectornode.cpp b/hotspot/src/share/vm/opto/vectornode.cpp index 4d6aa10cc79..9660d4ed818 100644 --- a/hotspot/src/share/vm/opto/vectornode.cpp +++ b/hotspot/src/share/vm/opto/vectornode.cpp @@ -103,9 +103,9 @@ int VectorNode::opcode(int sopc, BasicType bt) { return Op_LShiftVL; case Op_RShiftI: switch (bt) { - case T_BOOLEAN: + case T_BOOLEAN:return Op_URShiftVB; // boolean is unsigned value + case T_CHAR: return Op_URShiftVS; // char is unsigned value case T_BYTE: return Op_RShiftVB; - case T_CHAR: case T_SHORT: return Op_RShiftVS; case T_INT: return Op_RShiftVI; } @@ -115,10 +115,14 @@ int VectorNode::opcode(int sopc, BasicType bt) { return Op_RShiftVL; case Op_URShiftI: switch (bt) { - case T_BOOLEAN: - case T_BYTE: return Op_URShiftVB; - case T_CHAR: - case T_SHORT: return Op_URShiftVS; + case T_BOOLEAN:return Op_URShiftVB; + case T_CHAR: return Op_URShiftVS; + case T_BYTE: + case T_SHORT: return 0; // Vector logical right shift for signed short + // values produces incorrect Java result for + // negative data because java code should convert + // a short value into int value with sign + // extension before a shift. case T_INT: return Op_URShiftVI; } ShouldNotReachHere(); diff --git a/hotspot/test/compiler/6340864/TestByteVect.java b/hotspot/test/compiler/6340864/TestByteVect.java index ec4ba9fcd0f..5db3687e67c 100644 --- a/hotspot/test/compiler/6340864/TestByteVect.java +++ b/hotspot/test/compiler/6340864/TestByteVect.java @@ -33,7 +33,7 @@ public class TestByteVect { private static final int ARRLEN = 997; private static final int ITERS = 11000; - private static final int ADD_INIT = 0; + private static final int ADD_INIT = 63; private static final int BIT_MASK = 0xB7; private static final int VALUE = 3; private static final int SHIFT = 8; @@ -76,6 +76,7 @@ public class TestByteVect { test_subc(a0, a1); test_subv(a0, a1, (byte)VALUE); test_suba(a0, a1, a2); + test_mulc(a0, a1); test_mulv(a0, a1, (byte)VALUE); test_mula(a0, a1, a2); @@ -88,6 +89,7 @@ public class TestByteVect { test_divc_n(a0, a1); test_divv(a0, a1, (byte)-VALUE); test_diva(a0, a1, a3); + test_andc(a0, a1); test_andv(a0, a1, (byte)BIT_MASK); test_anda(a0, a1, a4); @@ -97,30 +99,49 @@ public class TestByteVect { test_xorc(a0, a1); test_xorv(a0, a1, (byte)BIT_MASK); test_xora(a0, a1, a4); + test_sllc(a0, a1); test_sllv(a0, a1, VALUE); test_srlc(a0, a1); test_srlv(a0, a1, VALUE); test_srac(a0, a1); test_srav(a0, a1, VALUE); + test_sllc_n(a0, a1); test_sllv(a0, a1, -VALUE); test_srlc_n(a0, a1); test_srlv(a0, a1, -VALUE); test_srac_n(a0, a1); test_srav(a0, a1, -VALUE); + test_sllc_o(a0, a1); test_sllv(a0, a1, SHIFT); test_srlc_o(a0, a1); test_srlv(a0, a1, SHIFT); test_srac_o(a0, a1); test_srav(a0, a1, SHIFT); + test_sllc_on(a0, a1); test_sllv(a0, a1, -SHIFT); test_srlc_on(a0, a1); test_srlv(a0, a1, -SHIFT); test_srac_on(a0, a1); test_srav(a0, a1, -SHIFT); + + test_sllc_add(a0, a1); + test_sllv_add(a0, a1, ADD_INIT); + test_srlc_add(a0, a1); + test_srlv_add(a0, a1, ADD_INIT); + test_srac_add(a0, a1); + test_srav_add(a0, a1, ADD_INIT); + + test_sllc_and(a0, a1); + test_sllv_and(a0, a1, BIT_MASK); + test_srlc_and(a0, a1); + test_srlv_and(a0, a1, BIT_MASK); + test_srac_and(a0, a1); + test_srav_and(a0, a1, BIT_MASK); + test_pack2(p2, a1); test_unpack2(a0, p2); test_pack2_swap(p2, a1); @@ -369,6 +390,60 @@ public class TestByteVect { errn += verify("test_srav_on: ", i, a0[i], (byte)((byte)(ADD_INIT+i)>>(-SHIFT))); } + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + test_pack2(p2, a1); for (int i=0; i>>b); } } + static void test_srlc_add(byte[] a0, byte[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(byte[] a0, byte[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(byte[] a0, byte[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(byte[] a0, byte[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] & b)>>>VALUE); + } + } static void test_srac(byte[] a0, byte[] a1) { for (int i = 0; i < a0.length; i+=1) { @@ -1088,6 +1281,26 @@ public class TestByteVect { a0[i] = (byte)(a1[i]>>b); } } + static void test_srac_add(byte[] a0, byte[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(byte[] a0, byte[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(byte[] a0, byte[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(byte[] a0, byte[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] & b)>>VALUE); + } + } static void test_pack2(short[] p2, byte[] a1) { if (p2.length*2 > a1.length) return; diff --git a/hotspot/test/compiler/6340864/TestIntVect.java b/hotspot/test/compiler/6340864/TestIntVect.java index 36e277f731b..5866b34a5af 100644 --- a/hotspot/test/compiler/6340864/TestIntVect.java +++ b/hotspot/test/compiler/6340864/TestIntVect.java @@ -74,6 +74,7 @@ public class TestIntVect { test_subc(a0, a1); test_subv(a0, a1, (int)VALUE); test_suba(a0, a1, a2); + test_mulc(a0, a1); test_mulv(a0, a1, (int)VALUE); test_mula(a0, a1, a2); @@ -86,6 +87,7 @@ public class TestIntVect { test_divc_n(a0, a1); test_divv(a0, a1, (int)-VALUE); test_diva(a0, a1, a3); + test_andc(a0, a1); test_andv(a0, a1, (int)BIT_MASK); test_anda(a0, a1, a4); @@ -95,30 +97,49 @@ public class TestIntVect { test_xorc(a0, a1); test_xorv(a0, a1, (int)BIT_MASK); test_xora(a0, a1, a4); + test_sllc(a0, a1); test_sllv(a0, a1, VALUE); test_srlc(a0, a1); test_srlv(a0, a1, VALUE); test_srac(a0, a1); test_srav(a0, a1, VALUE); + test_sllc_n(a0, a1); test_sllv(a0, a1, -VALUE); test_srlc_n(a0, a1); test_srlv(a0, a1, -VALUE); test_srac_n(a0, a1); test_srav(a0, a1, -VALUE); + test_sllc_o(a0, a1); test_sllv(a0, a1, SHIFT); test_srlc_o(a0, a1); test_srlv(a0, a1, SHIFT); test_srac_o(a0, a1); test_srav(a0, a1, SHIFT); + test_sllc_on(a0, a1); test_sllv(a0, a1, -SHIFT); test_srlc_on(a0, a1); test_srlv(a0, a1, -SHIFT); test_srac_on(a0, a1); test_srav(a0, a1, -SHIFT); + + test_sllc_add(a0, a1); + test_sllv_add(a0, a1, ADD_INIT); + test_srlc_add(a0, a1); + test_srlv_add(a0, a1, ADD_INIT); + test_srac_add(a0, a1); + test_srav_add(a0, a1, ADD_INIT); + + test_sllc_and(a0, a1); + test_sllv_and(a0, a1, BIT_MASK); + test_srlc_and(a0, a1); + test_srlv_and(a0, a1, BIT_MASK); + test_srac_and(a0, a1); + test_srav_and(a0, a1, BIT_MASK); + test_pack2(p2, a1); test_unpack2(a0, p2); test_pack2_swap(p2, a1); @@ -359,6 +380,60 @@ public class TestIntVect { errn += verify("test_srav_on: ", i, a0[i], (int)((int)(ADD_INIT+i)>>(-SHIFT))); } + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + test_pack2(p2, a1); for (int i=0; i>>b); } } + static void test_srlc_add(int[] a0, int[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(int[] a0, int[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(int[] a0, int[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(int[] a0, int[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] & b)>>>VALUE); + } + } static void test_srac(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { @@ -960,6 +1153,26 @@ public class TestIntVect { a0[i] = (int)(a1[i]>>b); } } + static void test_srac_add(int[] a0, int[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(int[] a0, int[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(int[] a0, int[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(int[] a0, int[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] & b)>>VALUE); + } + } static void test_pack2(long[] p2, int[] a1) { if (p2.length*2 > a1.length) return; diff --git a/hotspot/test/compiler/6340864/TestLongVect.java b/hotspot/test/compiler/6340864/TestLongVect.java index 70b41f4b4cb..436a8472df8 100644 --- a/hotspot/test/compiler/6340864/TestLongVect.java +++ b/hotspot/test/compiler/6340864/TestLongVect.java @@ -73,6 +73,7 @@ public class TestLongVect { test_subc(a0, a1); test_subv(a0, a1, (long)VALUE); test_suba(a0, a1, a2); + test_mulc(a0, a1); test_mulv(a0, a1, (long)VALUE); test_mula(a0, a1, a2); @@ -85,6 +86,7 @@ public class TestLongVect { test_divc_n(a0, a1); test_divv(a0, a1, (long)-VALUE); test_diva(a0, a1, a3); + test_andc(a0, a1); test_andv(a0, a1, (long)BIT_MASK); test_anda(a0, a1, a4); @@ -94,30 +96,48 @@ public class TestLongVect { test_xorc(a0, a1); test_xorv(a0, a1, (long)BIT_MASK); test_xora(a0, a1, a4); + test_sllc(a0, a1); test_sllv(a0, a1, VALUE); test_srlc(a0, a1); test_srlv(a0, a1, VALUE); test_srac(a0, a1); test_srav(a0, a1, VALUE); + test_sllc_n(a0, a1); test_sllv(a0, a1, -VALUE); test_srlc_n(a0, a1); test_srlv(a0, a1, -VALUE); test_srac_n(a0, a1); test_srav(a0, a1, -VALUE); + test_sllc_o(a0, a1); test_sllv(a0, a1, SHIFT); test_srlc_o(a0, a1); test_srlv(a0, a1, SHIFT); test_srac_o(a0, a1); test_srav(a0, a1, SHIFT); + test_sllc_on(a0, a1); test_sllv(a0, a1, -SHIFT); test_srlc_on(a0, a1); test_srlv(a0, a1, -SHIFT); test_srac_on(a0, a1); test_srav(a0, a1, -SHIFT); + + test_sllc_add(a0, a1); + test_sllv_add(a0, a1, ADD_INIT); + test_srlc_add(a0, a1); + test_srlv_add(a0, a1, ADD_INIT); + test_srac_add(a0, a1); + test_srav_add(a0, a1, ADD_INIT); + + test_sllc_and(a0, a1); + test_sllv_and(a0, a1, BIT_MASK); + test_srlc_and(a0, a1); + test_srlv_and(a0, a1, BIT_MASK); + test_srac_and(a0, a1); + test_srav_and(a0, a1, BIT_MASK); } // Test and verify results System.out.println("Verification"); @@ -354,6 +374,60 @@ public class TestLongVect { errn += verify("test_srav_on: ", i, a0[i], (long)((long)(ADD_INIT+i)>>(-SHIFT))); } + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + } if (errn > 0) @@ -696,6 +770,84 @@ public class TestLongVect { end = System.currentTimeMillis(); System.out.println("test_srav_on: " + (end - start)); + start = System.currentTimeMillis(); + for (int i=0; i>>b); } } + static void test_srlc_add(long[] a0, long[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(long[] a0, long[] a1, long b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(long[] a0, long[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(long[] a0, long[] a1, long b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] & b)>>>VALUE); + } + } static void test_srac(long[] a0, long[] a1) { for (int i = 0; i < a0.length; i+=1) { @@ -906,6 +1098,26 @@ public class TestLongVect { a0[i] = (long)(a1[i]>>b); } } + static void test_srac_add(long[] a0, long[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(long[] a0, long[] a1, long b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(long[] a0, long[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(long[] a0, long[] a1, long b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] & b)>>VALUE); + } + } static int verify(String text, int i, long elem, long val) { if (elem != val) { diff --git a/hotspot/test/compiler/6340864/TestShortVect.java b/hotspot/test/compiler/6340864/TestShortVect.java index a688e0de0e0..9f59c8f22cd 100644 --- a/hotspot/test/compiler/6340864/TestShortVect.java +++ b/hotspot/test/compiler/6340864/TestShortVect.java @@ -75,6 +75,7 @@ public class TestShortVect { test_subc(a0, a1); test_subv(a0, a1, (short)VALUE); test_suba(a0, a1, a2); + test_mulc(a0, a1); test_mulv(a0, a1, (short)VALUE); test_mula(a0, a1, a2); @@ -87,6 +88,7 @@ public class TestShortVect { test_divc_n(a0, a1); test_divv(a0, a1, (short)-VALUE); test_diva(a0, a1, a3); + test_andc(a0, a1); test_andv(a0, a1, (short)BIT_MASK); test_anda(a0, a1, a4); @@ -96,30 +98,49 @@ public class TestShortVect { test_xorc(a0, a1); test_xorv(a0, a1, (short)BIT_MASK); test_xora(a0, a1, a4); + test_sllc(a0, a1); test_sllv(a0, a1, VALUE); test_srlc(a0, a1); test_srlv(a0, a1, VALUE); test_srac(a0, a1); test_srav(a0, a1, VALUE); + test_sllc_n(a0, a1); test_sllv(a0, a1, -VALUE); test_srlc_n(a0, a1); test_srlv(a0, a1, -VALUE); test_srac_n(a0, a1); test_srav(a0, a1, -VALUE); + test_sllc_o(a0, a1); test_sllv(a0, a1, SHIFT); test_srlc_o(a0, a1); test_srlv(a0, a1, SHIFT); test_srac_o(a0, a1); test_srav(a0, a1, SHIFT); + test_sllc_on(a0, a1); test_sllv(a0, a1, -SHIFT); test_srlc_on(a0, a1); test_srlv(a0, a1, -SHIFT); test_srac_on(a0, a1); test_srav(a0, a1, -SHIFT); + + test_sllc_add(a0, a1); + test_sllv_add(a0, a1, ADD_INIT); + test_srlc_add(a0, a1); + test_srlv_add(a0, a1, ADD_INIT); + test_srac_add(a0, a1); + test_srav_add(a0, a1, ADD_INIT); + + test_sllc_and(a0, a1); + test_sllv_and(a0, a1, BIT_MASK); + test_srlc_and(a0, a1); + test_srlv_and(a0, a1, BIT_MASK); + test_srac_and(a0, a1); + test_srav_and(a0, a1, BIT_MASK); + test_pack2(p2, a1); test_unpack2(a0, p2); test_pack2_swap(p2, a1); @@ -364,6 +385,60 @@ public class TestShortVect { errn += verify("test_srav_on: ", i, a0[i], (short)((short)(ADD_INIT+i)>>(-SHIFT))); } + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + test_pack2(p2, a1); for (int i=0; i>>b); } } + static void test_srlc_add(short[] a0, short[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(short[] a0, short[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(short[] a0, short[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(short[] a0, short[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] & b)>>>VALUE); + } + } static void test_srac(short[] a0, short[] a1) { for (int i = 0; i < a0.length; i+=1) { @@ -1020,6 +1213,26 @@ public class TestShortVect { a0[i] = (short)(a1[i]>>b); } } + static void test_srac_add(short[] a0, short[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(short[] a0, short[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(short[] a0, short[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(short[] a0, short[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] & b)>>VALUE); + } + } static void test_pack2(int[] p2, short[] a1) { if (p2.length*2 > a1.length) return; diff --git a/hotspot/test/compiler/8001183/TestCharVect.java b/hotspot/test/compiler/8001183/TestCharVect.java new file mode 100644 index 00000000000..a6ff1e2b961 --- /dev/null +++ b/hotspot/test/compiler/8001183/TestCharVect.java @@ -0,0 +1,1332 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 8001183 + * @summary incorrect results of char vectors right shift operaiton + * + * @run main/othervm/timeout=400 -Xbatch -Xmx64m TestCharVect + */ + +public class TestCharVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int ADD_INIT = Character.MAX_VALUE-500; + private static final int BIT_MASK = 0xB731; + private static final int VALUE = 7; + private static final int SHIFT = 16; + + public static void main(String args[]) { + System.out.println("Testing Char vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + char[] a0 = new char[ARRLEN]; + char[] a1 = new char[ARRLEN]; + short[] a2 = new short[ARRLEN]; + short[] a3 = new short[ARRLEN]; + short[] a4 = new short[ARRLEN]; + int[] p2 = new int[ARRLEN/2]; + long[] p4 = new long[ARRLEN/4]; + // Initialize + int gold_sum = 0; + for (int i=0; i>>VALUE)); + } + test_srlv(a0, a1, VALUE); + for (int i=0; i>>VALUE)); + } + + test_srac(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav(a0, a1, VALUE); + for (int i=0; i>VALUE)); + } + + test_sllc_n(a0, a1); + for (int i=0; i>>(-VALUE))); + } + test_srlv(a0, a1, -VALUE); + for (int i=0; i>>(-VALUE))); + } + + test_srac_n(a0, a1); + for (int i=0; i>(-VALUE))); + } + test_srav(a0, a1, -VALUE); + for (int i=0; i>(-VALUE))); + } + + test_sllc_o(a0, a1); + for (int i=0; i>>SHIFT)); + } + test_srlv(a0, a1, SHIFT); + for (int i=0; i>>SHIFT)); + } + + test_srac_o(a0, a1); + for (int i=0; i>SHIFT)); + } + test_srav(a0, a1, SHIFT); + for (int i=0; i>SHIFT)); + } + + test_sllc_on(a0, a1); + for (int i=0; i>>(-SHIFT))); + } + test_srlv(a0, a1, -SHIFT); + for (int i=0; i>>(-SHIFT))); + } + + test_srac_on(a0, a1); + for (int i=0; i>(-SHIFT))); + } + test_srav(a0, a1, -SHIFT); + for (int i=0; i>(-SHIFT))); + } + + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + + test_pack2(p2, a1); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + + start = System.currentTimeMillis(); + for (int i=0; i>>VALUE); + } + } + static void test_srlc_n(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>>(-VALUE)); + } + } + static void test_srlc_o(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>>SHIFT); + } + } + static void test_srlc_on(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>>(-SHIFT)); + } + } + static void test_srlv(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>>b); + } + } + static void test_srlc_add(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] & b)>>>VALUE); + } + } + + static void test_srac(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>VALUE); + } + } + static void test_srac_n(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>(-VALUE)); + } + } + static void test_srac_o(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>SHIFT); + } + } + static void test_srac_on(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>(-SHIFT)); + } + } + static void test_srav(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>b); + } + } + static void test_srac_add(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] & b)>>VALUE); + } + } + + static void test_pack2(int[] p2, char[] a1) { + if (p2.length*2 > a1.length) return; + for (int i = 0; i < p2.length; i+=1) { + int l0 = (int)a1[i*2+0]; + int l1 = (int)a1[i*2+1]; + p2[i] = (l1 << 16) | (l0 & 0xFFFF); + } + } + static void test_unpack2(char[] a0, int[] p2) { + if (p2.length*2 > a0.length) return; + for (int i = 0; i < p2.length; i+=1) { + int l = p2[i]; + a0[i*2+0] = (char)(l & 0xFFFF); + a0[i*2+1] = (char)(l >> 16); + } + } + static void test_pack2_swap(int[] p2, char[] a1) { + if (p2.length*2 > a1.length) return; + for (int i = 0; i < p2.length; i+=1) { + int l0 = (int)a1[i*2+0]; + int l1 = (int)a1[i*2+1]; + p2[i] = (l0 << 16) | (l1 & 0xFFFF); + } + } + static void test_unpack2_swap(char[] a0, int[] p2) { + if (p2.length*2 > a0.length) return; + for (int i = 0; i < p2.length; i+=1) { + int l = p2[i]; + a0[i*2+0] = (char)(l >> 16); + a0[i*2+1] = (char)(l & 0xFFFF); + } + } + + static void test_pack4(long[] p4, char[] a1) { + if (p4.length*4 > a1.length) return; + for (int i = 0; i < p4.length; i+=1) { + long l0 = (long)a1[i*4+0]; + long l1 = (long)a1[i*4+1]; + long l2 = (long)a1[i*4+2]; + long l3 = (long)a1[i*4+3]; + p4[i] = (l0 & 0xFFFFl) | + ((l1 & 0xFFFFl) << 16) | + ((l2 & 0xFFFFl) << 32) | + ((l3 & 0xFFFFl) << 48); + } + } + static void test_unpack4(char[] a0, long[] p4) { + if (p4.length*4 > a0.length) return; + for (int i = 0; i < p4.length; i+=1) { + long l = p4[i]; + a0[i*4+0] = (char)(l & 0xFFFFl); + a0[i*4+1] = (char)(l >> 16); + a0[i*4+2] = (char)(l >> 32); + a0[i*4+3] = (char)(l >> 48); + } + } + static void test_pack4_swap(long[] p4, char[] a1) { + if (p4.length*4 > a1.length) return; + for (int i = 0; i < p4.length; i+=1) { + long l0 = (long)a1[i*4+0]; + long l1 = (long)a1[i*4+1]; + long l2 = (long)a1[i*4+2]; + long l3 = (long)a1[i*4+3]; + p4[i] = (l3 & 0xFFFFl) | + ((l2 & 0xFFFFl) << 16) | + ((l1 & 0xFFFFl) << 32) | + ((l0 & 0xFFFFl) << 48); + } + } + static void test_unpack4_swap(char[] a0, long[] p4) { + if (p4.length*4 > a0.length) return; + for (int i = 0; i < p4.length; i+=1) { + long l = p4[i]; + a0[i*4+0] = (char)(l >> 48); + a0[i*4+1] = (char)(l >> 32); + a0[i*4+2] = (char)(l >> 16); + a0[i*4+3] = (char)(l & 0xFFFFl); + } + } + + static int verify(String text, int i, int elem, int val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + + static int verify(String text, int i, long elem, long val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + Long.toHexString(elem) + " != " + Long.toHexString(val)); + return 1; + } + return 0; + } +} From 296286534c33b17fc2acd6baf33adeae33eb991f Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 23 Oct 2012 13:20:37 -0700 Subject: [PATCH 088/241] 8000741: refactor javadoc to use abstraction to handle relative paths Reviewed-by: darcy --- .../com/sun/javadoc/SerialFieldTag.java | 4 +- .../formats/html/AbstractIndexWriter.java | 24 +- .../html/AbstractPackageIndexWriter.java | 8 +- .../formats/html/AbstractTreeWriter.java | 29 +- .../formats/html/AllClassesFrameWriter.java | 21 +- ...nnotationTypeOptionalMemberWriterImpl.java | 2 +- ...nnotationTypeRequiredMemberWriterImpl.java | 4 +- .../html/AnnotationTypeWriterImpl.java | 15 +- .../doclets/formats/html/ClassUseWriter.java | 32 +- .../doclets/formats/html/ClassWriterImpl.java | 13 +- .../formats/html/ConfigurationImpl.java | 14 +- .../html/ConstantsSummaryWriterImpl.java | 2 +- .../formats/html/ConstructorWriterImpl.java | 4 +- .../formats/html/DeprecatedListWriter.java | 6 +- .../formats/html/EnumConstantWriterImpl.java | 4 +- .../doclets/formats/html/FieldWriterImpl.java | 4 +- .../formats/html/FrameOutputWriter.java | 18 +- .../doclets/formats/html/HelpWriter.java | 21 +- .../doclets/formats/html/HtmlDoclet.java | 17 +- .../formats/html/HtmlDocletWriter.java | 211 +++++------- .../doclets/formats/html/LinkFactoryImpl.java | 14 +- .../formats/html/MethodWriterImpl.java | 4 +- .../formats/html/NestedClassWriterImpl.java | 5 +- .../formats/html/PackageFrameWriter.java | 11 +- .../formats/html/PackageIndexFrameWriter.java | 10 +- .../formats/html/PackageIndexWriter.java | 6 +- .../formats/html/PackageTreeWriter.java | 26 +- .../formats/html/PackageUseWriter.java | 18 +- .../formats/html/PackageWriterImpl.java | 37 +- .../html/SerializedFormWriterImpl.java | 5 +- .../formats/html/SingleIndexWriter.java | 8 +- .../formats/html/SourceToHTMLConverter.java | 37 +- .../formats/html/SplitIndexWriter.java | 23 +- .../formats/html/SubWriterHolderWriter.java | 11 +- .../formats/html/TagletWriterImpl.java | 14 +- .../doclets/formats/html/TreeWriter.java | 6 +- .../formats/html/markup/HtmlDocWriter.java | 59 ++-- .../formats/html/markup/HtmlWriter.java | 20 +- .../internal/toolkit/AbstractDoclet.java | 4 +- .../toolkit/PackageSummaryWriter.java | 7 - .../builders/AnnotationTypeBuilder.java | 8 +- .../toolkit/builders/ClassBuilder.java | 7 +- .../builders/PackageSummaryBuilder.java | 4 +- .../builders/SerializedFormBuilder.java | 2 + .../toolkit/util/DirectoryManager.java | 317 ------------------ .../internal/toolkit/util/DocPath.java | 188 +++++++++++ .../internal/toolkit/util/DocPaths.java | 110 ++++++ .../toolkit/util/DocletConstants.java | 40 +-- .../doclets/internal/toolkit/util/Extern.java | 7 +- .../toolkit/util/PackageListWriter.java | 5 +- .../internal/toolkit/util/SourcePath.java | 9 +- .../doclets/internal/toolkit/util/Util.java | 133 ++++---- .../com/sun/tools/javadoc/SerializedForm.java | 3 + .../com/sun/javadoc/testIndex/TestIndex.java | 28 +- .../TestNewLanguageFeatures.java | 6 +- .../testPackagePage/TestPackagePage.java | 4 +- 56 files changed, 727 insertions(+), 922 deletions(-) delete mode 100644 langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java create mode 100644 langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java create mode 100644 langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPaths.java diff --git a/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java b/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java index ad32c1a1d43..7f73936588f 100644 --- a/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java +++ b/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,7 @@ package com.sun.javadoc; public interface SerialFieldTag extends Tag, Comparable { /** - * Return the serialziable field name. + * Return the serializable field name. */ public String fieldName(); 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 2e902b39e77..3db480cfcdf 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 @@ -56,32 +56,18 @@ public class AbstractIndexWriter extends HtmlDocletWriter { protected IndexBuilder indexbuilder; /** - * This constructor will be used by {@link SplitIndexWriter}. Initialises + * This constructor will be used by {@link SplitIndexWriter}. Initializes * path to this file and relative path from this file. * + * @param configuration The current configuration * @param path Path to the file which is getting generated. - * @param filename Name of the file which is getting genrated. - * @param relpath Relative path from this file to the current directory. * @param indexbuilder Unicode based Index from {@link IndexBuilder} */ protected AbstractIndexWriter(ConfigurationImpl configuration, - String path, String filename, - String relpath, IndexBuilder indexbuilder) + DocPath path, + IndexBuilder indexbuilder) throws IOException { - super(configuration, path, filename, relpath); - this.indexbuilder = indexbuilder; - } - - /** - * This Constructor will be used by {@link SingleIndexWriter}. - * - * @param filename Name of the file which is getting genrated. - * @param indexbuilder Unicode based Index form {@link IndexBuilder} - */ - protected AbstractIndexWriter(ConfigurationImpl configuration, - String filename, IndexBuilder indexbuilder) - throws IOException { - super(configuration, filename); + super(configuration, path); this.indexbuilder = indexbuilder; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java index 9667b0f1477..0a75cca2329 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java @@ -27,9 +27,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; 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.DocPath; /** * Abstract class to generate the overview files in @@ -52,14 +54,14 @@ public abstract class AbstractPackageIndexWriter extends HtmlDocletWriter { protected PackageDoc[] packages; /** - * Constructor. Also initialises the packages variable. + * Constructor. Also initializes the packages variable. * + * @param configuration The current configuration * @param filename Name of the package index file to be generated. */ public AbstractPackageIndexWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); - this.relativepathNoSlash = "."; packages = configuration.packages; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java index ccf82cf6be9..63786f474f0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java @@ -56,45 +56,22 @@ public abstract class AbstractTreeWriter extends HtmlDocletWriter { private static final String LI_CIRCLE = "circle"; /** - * Constructor initilises classtree variable. This constructor will be used + * Constructor initializes classtree variable. This constructor will be used * while generating global tree file "overview-tree.html". * + * @param configuration The current configuration * @param filename File to be generated. * @param classtree Tree built by {@link ClassTree}. * @throws IOException * @throws DocletAbortException */ protected AbstractTreeWriter(ConfigurationImpl configuration, - String filename, ClassTree classtree) + DocPath filename, ClassTree classtree) throws IOException { super(configuration, filename); this.classtree = classtree; } - /** - * Create appropriate directory for the package and also initilise the - * relative path from this generated file to the current or - * the destination directory. This constructor will be used while - * generating "package tree" file. - * - * @param path Directories in this path will be created if they are not - * already there. - * @param filename Name of the package tree file to be generated. - * @param classtree The tree built using {@link ClassTree}. - * for the package pkg. - * @param pkg PackageDoc for which tree file will be generated. - * @throws IOException - * @throws DocletAbortException - */ - protected AbstractTreeWriter(ConfigurationImpl configuration, - String path, String filename, - ClassTree classtree, PackageDoc pkg) - throws IOException { - super(configuration, - path, filename, DirectoryManager.getRelativePath(pkg.name())); - this.classtree = classtree; - } - /** * Add each level of the class tree. For each sub-class or * sub-interface indents the next level information. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java index adef39e1415..af0f4a24f81 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java @@ -50,16 +50,6 @@ import com.sun.tools.doclets.internal.toolkit.util.*; */ public class AllClassesFrameWriter extends HtmlDocletWriter { - /** - * The name of the output file with frames - */ - public static final String OUTPUT_FILE_NAME_FRAMES = "allclasses-frame.html"; - - /** - * The name of the output file without frames - */ - public static final String OUTPUT_FILE_NAME_NOFRAMES = "allclasses-noframe.html"; - /** * Index of all the classes. */ @@ -71,13 +61,16 @@ public class AllClassesFrameWriter extends HtmlDocletWriter { final HtmlTree BR = new HtmlTree(HtmlTag.BR); /** - * Construct AllClassesFrameWriter object. Also initilises the indexbuilder + * Construct AllClassesFrameWriter object. Also initializes the indexbuilder * variable in this class. + * @param configuration The current configuration + * @param filename Path to the file which is getting generated. + * @param indexbuilder Unicode based Index from {@link IndexBuilder} * @throws IOException * @throws DocletAbortException */ public AllClassesFrameWriter(ConfigurationImpl configuration, - String filename, IndexBuilder indexbuilder) + DocPath filename, IndexBuilder indexbuilder) throws IOException { super(configuration, filename); this.indexbuilder = indexbuilder; @@ -94,13 +87,13 @@ public class AllClassesFrameWriter extends HtmlDocletWriter { public static void generate(ConfigurationImpl configuration, IndexBuilder indexbuilder) { AllClassesFrameWriter allclassgen; - String filename = OUTPUT_FILE_NAME_FRAMES; + DocPath filename = DocPaths.ALLCLASSES_FRAME; try { allclassgen = new AllClassesFrameWriter(configuration, filename, indexbuilder); allclassgen.buildAllClassesFile(true); allclassgen.close(); - filename = OUTPUT_FILE_NAME_NOFRAMES; + filename = DocPaths.ALLCLASSES_NOFRAME; allclassgen = new AllClassesFrameWriter(configuration, filename, indexbuilder); allclassgen.buildAllClassesFile(false); 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 66c51aa2696..03e04e79946 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 @@ -141,7 +141,7 @@ public class AnnotationTypeOptionalMemberWriterImpl extends */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", "annotation_type_optional_element_summary", + return writer.getHyperLink("annotation_type_optional_element_summary", writer.getResource("doclet.navAnnotationTypeOptionalMember")); } else { return writer.getResource("doclet.navAnnotationTypeOptionalMember"); 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 baa725d1809..2fe1f662c1e 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 @@ -260,7 +260,7 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", "annotation_type_required_element_summary", + return writer.getHyperLink("annotation_type_required_element_summary", writer.getResource("doclet.navAnnotationTypeRequiredMember")); } else { return writer.getResource("doclet.navAnnotationTypeRequiredMember"); @@ -272,7 +272,7 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "annotation_type_element_detail", + liNav.addContent(writer.getHyperLink("annotation_type_element_detail", writer.getResource("doclet.navAnnotationTypeMember"))); } else { liNav.addContent(writer.getResource("doclet.navAnnotationTypeMember")); 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 bb228d2cb2a..c804fc9a5de 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 @@ -65,13 +65,10 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * @param prevType the previous class that was documented. * @param nextType the next class being documented. */ - public AnnotationTypeWriterImpl (AnnotationTypeDoc annotationType, + public AnnotationTypeWriterImpl(AnnotationTypeDoc annotationType, Type prevType, Type nextType) - throws Exception { - super(ConfigurationImpl.getInstance(), - DirectoryManager.getDirectoryPath(annotationType.containingPackage()), - annotationType.name() + ".html", - DirectoryManager.getRelativePath(annotationType.containingPackage().name())); + throws Exception { + super(ConfigurationImpl.getInstance(), DocPath.forClass(annotationType)); this.annotationType = annotationType; configuration.currentcd = annotationType.asClassDoc(); this.prev = prevType; @@ -84,7 +81,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("package-summary.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "", packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -106,7 +103,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * @return a content tree for the class use link */ protected Content getNavLinkClassUse() { - Content linkContent = getHyperLink("class-use/" + filename, "", useLabel); + Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), "", useLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -289,7 +286,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * {@inheritDoc} */ protected Content getNavLinkTree() { - Content treeLinkContent = getHyperLink("package-tree.html", + Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE, "", treeLabel, "", ""); Content li = HtmlTree.LI(treeLinkContent); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java index 69edcde9796..05317cabe8a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java @@ -82,7 +82,6 @@ public class ClassUseWriter extends SubWriterHolderWriter { final String methodUseTableSummary; final String constructorUseTableSummary; - /** * Constructor. * @@ -91,10 +90,9 @@ public class ClassUseWriter extends SubWriterHolderWriter { * @throws DocletAbortException */ public ClassUseWriter(ConfigurationImpl configuration, - ClassUseMapper mapper, String path, - String filename, String relpath, + ClassUseMapper mapper, DocPath filename, ClassDoc classdoc) throws IOException { - super(configuration, path, filename, relpath); + super(configuration, filename); this.classdoc = classdoc; if (mapper.classToPackageAnnotations.containsKey(classdoc.qualifiedName())) pkgToPackageAnnotations = new HashSet(mapper.classToPackageAnnotations.get(classdoc.qualifiedName())); @@ -199,23 +197,19 @@ public class ClassUseWriter extends SubWriterHolderWriter { public static void generate(ConfigurationImpl configuration, ClassUseMapper mapper, ClassDoc classdoc) { ClassUseWriter clsgen; - String path = DirectoryManager.getDirectoryPath(classdoc. - containingPackage()); - path += "class-use" + DirectoryManager.URL_FILE_SEPARATOR; - String filename = classdoc.name() + ".html"; - String pkgname = classdoc.containingPackage().name(); - pkgname += (pkgname.length() > 0)? ".class-use": "class-use"; - String relpath = DirectoryManager.getRelativePath(pkgname); + DocPath path = DocPath.forPackage(classdoc) + .resolve(DocPaths.CLASS_USE) + .resolve(DocPath.forName(classdoc)); try { clsgen = new ClassUseWriter(configuration, - mapper, path, filename, - relpath, classdoc); + mapper, path, + classdoc); clsgen.generateClassUseFile(); clsgen.close(); } catch (IOException exc) { configuration.standardmessage. error("doclet.exception_encountered", - exc.toString(), filename); + exc.toString(), path.getPath()); throw new DocletAbortException(); } } @@ -359,7 +353,7 @@ public class ClassUseWriter extends SubWriterHolderWriter { */ protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException { Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, - getHyperLink("", pkg.name(), new StringContent(Util.getPackageName(pkg)))); + getHyperLink(pkg.name(), new StringContent(Util.getPackageName(pkg)))); contentTree.addContent(tdFirst); HtmlTree tdLast = new HtmlTree(HtmlTag.TD); tdLast.addStyle(HtmlStyle.colLast); @@ -470,8 +464,8 @@ public class ClassUseWriter extends SubWriterHolderWriter { * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("../package-summary.html", "", - packageLabel); + Content linkContent = + getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_SUMMARY), "", packageLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -506,8 +500,8 @@ public class ClassUseWriter extends SubWriterHolderWriter { */ protected Content getNavLinkTree() { Content linkContent = classdoc.containingPackage().isIncluded() ? - getHyperLink("../package-tree.html", "", treeLabel) : - getHyperLink(relativePath + "overview-tree.html", "", treeLabel); + getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_TREE), "", treeLabel) : + getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), "", treeLabel); Content li = HtmlTree.LI(linkContent); return li; } 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 5db9e65b8dd..14cf47a1c68 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 @@ -72,11 +72,8 @@ public class ClassWriterImpl extends SubWriterHolderWriter */ public ClassWriterImpl (ClassDoc classDoc, ClassDoc prevClass, ClassDoc nextClass, ClassTree classTree) - throws Exception { - super(ConfigurationImpl.getInstance(), - DirectoryManager.getDirectoryPath(classDoc.containingPackage()), - classDoc.name() + ".html", - DirectoryManager.getRelativePath(classDoc.containingPackage().name())); + throws Exception { + super(ConfigurationImpl.getInstance(), DocPath.forClass(classDoc)); this.classDoc = classDoc; configuration.currentcd = classDoc; this.classtree = classTree; @@ -90,7 +87,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("package-summary.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "", packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -112,7 +109,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter * @return a content tree for the class use link */ protected Content getNavLinkClassUse() { - Content linkContent = getHyperLink("class-use/" + filename, "", useLabel); + Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), "", useLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -567,7 +564,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter * {@inheritDoc} */ protected Content getNavLinkTree() { - Content treeLinkContent = getHyperLink("package-tree.html", + Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE, "", treeLabel, "", ""); Content li = HtmlTree.LI(treeLinkContent); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java index 7c214429b7d..2d564b6055d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java @@ -61,11 +61,6 @@ public class ConfigurationImpl extends Configuration { */ public static final String BUILD_DATE = System.getProperty("java.version"); - /** - * The name of the constant values file. - */ - public static final String CONSTANTS_FILE_NAME = "constant-values.html"; - /** * Argument for command line option "-header". */ @@ -179,7 +174,7 @@ public class ConfigurationImpl extends Configuration { * First file to appear in the right-hand frame in the generated * documentation. */ - public String topFile = ""; + public DocPath topFile = DocPath.empty; /** * The classdoc for the class file getting generated. @@ -447,18 +442,17 @@ public class ConfigurationImpl extends Configuration { return; } if (createoverview) { - topFile = "overview-summary.html"; + topFile = DocPaths.OVERVIEW_SUMMARY; } else { if (packages.length == 1 && packages[0].name().equals("")) { if (root.classes().length > 0) { ClassDoc[] classarr = root.classes(); Arrays.sort(classarr); ClassDoc cd = getValidClass(classarr); - topFile = DirectoryManager.getPathToClass(cd); + topFile = DocPath.forClass(cd); } } else { - topFile = DirectoryManager.getPathToPackage(packages[0], - "package-summary.html"); + topFile = DocPath.forPackage(packages[0]).resolve(DocPaths.PACKAGE_SUMMARY); } } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java index d6902610c02..cd55f087ee3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java @@ -69,7 +69,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter */ public ConstantsSummaryWriterImpl(ConfigurationImpl configuration) throws IOException { - super(configuration, ConfigurationImpl.CONSTANTS_FILE_NAME); + super(configuration, DocPaths.CONSTANT_VALUES); this.configuration = configuration; constantsTableSummary = configuration.getText("doclet.Constants_Table_Summary", configuration.getText("doclet.Constants_Summary")); 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 22a52a41409..6e2a5ec5284 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 @@ -280,7 +280,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", "constructor_summary", + return writer.getHyperLink("constructor_summary", writer.getResource("doclet.navConstructor")); } else { return writer.getResource("doclet.navConstructor"); @@ -292,7 +292,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "constructor_detail", + liNav.addContent(writer.getHyperLink("constructor_detail", writer.getResource("doclet.navConstructor"))); } else { liNav.addContent(writer.getResource("doclet.navConstructor")); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java index 5d852171964..bb989452b85 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java @@ -95,7 +95,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter { * @param filename the file to be generated. */ public DeprecatedListWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); this.configuration = configuration; NestedClassWriterImpl classW = new NestedClassWriterImpl(this); @@ -116,7 +116,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter { * @param configuration the current configuration of the doclet. */ public static void generate(ConfigurationImpl configuration) { - String filename = "deprecated-list.html"; + DocPath filename = DocPaths.DEPRECATED_LIST; try { DeprecatedListWriter depr = new DeprecatedListWriter(configuration, filename); @@ -180,7 +180,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter { private void addIndexLink(DeprecatedAPIListBuilder builder, int type, Content contentTree) { if (builder.hasDocumentation(type)) { - Content li = HtmlTree.LI(getHyperLink("#" + ANCHORS[type], + Content li = HtmlTree.LI(getHyperLink(ANCHORS[type], getResource(HEADING_KEYS[type]))); contentTree.addContent(li); } 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 7e1a977ddb9..b06255ad9a6 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 @@ -263,7 +263,7 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", (cd == null)? + return writer.getHyperLink((cd == null)? "enum_constant_summary": "enum_constants_inherited_from_class_" + configuration().getClassName(cd), @@ -278,7 +278,7 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "enum_constant_detail", + liNav.addContent(writer.getHyperLink("enum_constant_detail", writer.getResource("doclet.navEnum"))); } else { liNav.addContent(writer.getResource("doclet.navEnum")); 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 3f00063060d..10f076a08af 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 @@ -293,7 +293,7 @@ public class FieldWriterImpl extends AbstractMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", (cd == null)? + return writer.getHyperLink((cd == null)? "field_summary": "fields_inherited_from_class_" + configuration().getClassName(cd), @@ -308,7 +308,7 @@ public class FieldWriterImpl extends AbstractMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "field_detail", + liNav.addContent(writer.getHyperLink("field_detail", writer.getResource("doclet.navField"))); } else { liNav.addContent(writer.getResource("doclet.navField")); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java index 006e8e2a1c7..6a39cedee6d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java @@ -63,7 +63,7 @@ public class FrameOutputWriter extends HtmlDocletWriter { * @param filename File to be generated. */ public FrameOutputWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); noOfPackages = configuration.packages.length; } @@ -77,9 +77,9 @@ public class FrameOutputWriter extends HtmlDocletWriter { */ public static void generate(ConfigurationImpl configuration) { FrameOutputWriter framegen; - String filename = ""; + DocPath filename = DocPath.empty; try { - filename = "index.html"; + filename = DocPaths.INDEX; framegen = new FrameOutputWriter(configuration, filename); framegen.generateFrameFile(); framegen.close(); @@ -92,7 +92,7 @@ public class FrameOutputWriter extends HtmlDocletWriter { } /** - * Generate the contants in the "index.html" file. Print the frame details + * Generate the constants in the "index.html" file. Print the frame details * as well as warning if browser is not supporting the Html frames. */ protected void generateFrameFile() throws IOException { @@ -155,8 +155,8 @@ public class FrameOutputWriter extends HtmlDocletWriter { * @param contentTree the content tree to which the information will be added */ private void addAllPackagesFrameTag(Content contentTree) { - HtmlTree frame = HtmlTree.FRAME("overview-frame.html", "packageListFrame", - configuration.getText("doclet.All_Packages")); + HtmlTree frame = HtmlTree.FRAME(DocPaths.OVERVIEW_FRAME.getPath(), + "packageListFrame", configuration.getText("doclet.All_Packages")); contentTree.addContent(frame); } @@ -166,8 +166,8 @@ public class FrameOutputWriter extends HtmlDocletWriter { * @param contentTree the content tree to which the information will be added */ private void addAllClassesFrameTag(Content contentTree) { - HtmlTree frame = HtmlTree.FRAME("allclasses-frame.html", "packageFrame", - configuration.getText("doclet.All_classes_and_interfaces")); + HtmlTree frame = HtmlTree.FRAME(DocPaths.ALLCLASSES_FRAME.getPath(), + "packageFrame", configuration.getText("doclet.All_classes_and_interfaces")); contentTree.addContent(frame); } @@ -177,7 +177,7 @@ public class FrameOutputWriter extends HtmlDocletWriter { * @param contentTree the content tree to which the information will be added */ private void addClassFrameTag(Content contentTree) { - HtmlTree frame = HtmlTree.FRAME(configuration.topFile, "classFrame", + HtmlTree frame = HtmlTree.FRAME(configuration.topFile.getPath(), "classFrame", configuration.getText("doclet.Package_class_and_interface_descriptions"), SCROLL_YES); contentTree.addContent(frame); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java index b5e6ac3bb2d..9d14671f3d2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java @@ -49,7 +49,7 @@ public class HelpWriter extends HtmlDocletWriter { * @param filename File to be generated. */ public HelpWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); } @@ -62,9 +62,9 @@ public class HelpWriter extends HtmlDocletWriter { */ public static void generate(ConfigurationImpl configuration) { HelpWriter helpgen; - String filename = ""; + DocPath filename = DocPath.empty; try { - filename = "help-doc.html"; + filename = DocPaths.HELP_DOC; helpgen = new HelpWriter(configuration, filename); helpgen.generateHelpFile(); helpgen.close(); @@ -113,7 +113,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.Overview")); Content liOverview = HtmlTree.LI(HtmlStyle.blockList, overviewHeading); Content line3 = getResource("doclet.Help_line_3", - getHyperLinkString("overview-summary.html", + getHyperLinkString(DocPaths.OVERVIEW_SUMMARY, configuration.getText("doclet.Overview"))); Content overviewPara = HtmlTree.P(line3); liOverview.addContent(overviewPara); @@ -234,7 +234,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.Help_line_16")); Content liTree = HtmlTree.LI(HtmlStyle.blockList, treeHead); Content line17 = getResource("doclet.Help_line_17_with_tree_link", - getHyperLinkString("overview-tree.html", + getHyperLinkString(DocPaths.OVERVIEW_TREE, configuration.getText("doclet.Class_Hierarchy"))); Content treePara = HtmlTree.P(line17); liTree.addContent(treePara); @@ -252,7 +252,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.Deprecated_API")); Content liDeprecated = HtmlTree.LI(HtmlStyle.blockList, dHead); Content line20 = getResource("doclet.Help_line_20_with_deprecated_api_link", - getHyperLinkString("deprecated-list.html", + getHyperLinkString(DocPaths.DEPRECATED_LIST, configuration.getText("doclet.Deprecated_API"))); Content dPara = HtmlTree.P(line20); liDeprecated.addContent(dPara); @@ -261,10 +261,10 @@ public class HelpWriter extends HtmlDocletWriter { if (configuration.createindex) { String indexlink; if (configuration.splitindex) { - indexlink = getHyperLinkString("index-files/index-1.html", + indexlink = getHyperLinkString(DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1)), configuration.getText("doclet.Index")); } else { - indexlink = getHyperLinkString("index-all.html", + indexlink = getHyperLinkString(DocPaths.INDEX_ALL, configuration.getText("doclet.Index")); } Content indexHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, @@ -293,7 +293,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.All_Classes")); Content liAllClasses = HtmlTree.LI(HtmlStyle.blockList, allclassesHead); Content line27 = getResource("doclet.Help_line_27", - getHyperLinkString("allclasses-noframe.html", + getHyperLinkString(DocPaths.ALLCLASSES_NOFRAME, configuration.getText("doclet.All_Classes"))); Content allclassesPara = HtmlTree.P(line27); liAllClasses.addContent(allclassesPara); @@ -309,7 +309,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.Constants_Summary")); Content liConst = HtmlTree.LI(HtmlStyle.blockList, constHead); Content line29 = getResource("doclet.Help_line_29", - getHyperLinkString("constant-values.html", + getHyperLinkString(DocPaths.CONSTANT_VALUES, configuration.getText("doclet.Constants_Summary"))); Content constPara = HtmlTree.P(line29); liConst.addContent(constPara); @@ -325,6 +325,7 @@ public class HelpWriter extends HtmlDocletWriter { * * @return a content tree for the help label */ + @Override protected Content getNavLinkHelp() { Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, helpLabel); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java index ef5bb2477de..fc193cc47dd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java @@ -94,17 +94,11 @@ public class HtmlDoclet extends AbstractDoclet { throws Exception { super.generateOtherFiles(root, classtree); if (configuration.linksource) { - if (configuration.destDirName.length() > 0) { - SourceToHTMLConverter.convertRoot(configuration, - root, configuration.destDirName + File.separator - + DocletConstants.SOURCE_OUTPUT_DIR_NAME); - } else { - SourceToHTMLConverter.convertRoot(configuration, - root, DocletConstants.SOURCE_OUTPUT_DIR_NAME); - } + SourceToHTMLConverter.convertRoot(configuration, + root, DocPaths.SOURCE_OUTPUT); } - if (configuration.topFile.length() == 0) { + if (configuration.topFile.isEmpty()) { configuration.standardmessage. error("doclet.No_Non_Deprecated_Classes_To_Document"); return; @@ -155,9 +149,8 @@ public class HtmlDoclet extends AbstractDoclet { // If a stylesheet file is not specified, copy the default stylesheet // and replace newline with platform-specific newline. if (configuration.stylesheetfile.length() == 0) { - Util.copyFile(configuration, "stylesheet.css", Util.RESOURCESDIR, - (configdestdir.isEmpty()) ? - System.getProperty("user.dir") : configdestdir, false, true); + Util.copyFile(configuration, "stylesheet.css", DocPaths.RESOURCES, + DocPath.empty, false, true); } } 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 c5bd281e82f..ccaaa463a7f 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 @@ -55,32 +55,24 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Relative path from the file getting generated to the destination * directory. For example, if the file getting generated is - * "java/lang/Object.html", then the relative path string is "../../". + * "java/lang/Object.html", then the path to the root is "../..". * This string can be empty if the file getting generated is in * the destination directory. */ - public String relativePath = ""; + public final DocPath pathToRoot; /** - * Same as relativepath, but normalized to never be empty or - * end with a slash. - */ - public String relativepathNoSlash = ""; - - /** - * Platform-dependent directory path from the current or the + * Platform-independent path from the current or the * destination directory to the file getting generated. * Used when creating the file. - * For example, if the file getting generated is - * "java/lang/Object.html", then the path string is "java/lang". */ - public String path = ""; + public final DocPath path; /** * Name of the file getting generated. If the file getting generated is * "java/lang/Object.html", then the filename is "Object.html". */ - public String filename = ""; + public final DocPath filename; /** * The display length used for indentation while generating the class page. @@ -100,33 +92,15 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Constructor to construct the HtmlStandardWriter object. * - * @param filename File to be generated. + * @param path File to be generated. */ - public HtmlDocletWriter(ConfigurationImpl configuration, - String filename) throws IOException { - super(configuration, filename); - this.configuration = configuration; - this.filename = filename; - } - - /** - * Constructor to construct the HtmlStandardWriter object. - * - * @param path Platform-dependent {@link #path} used when - * creating file. - * @param filename Name of file to be generated. - * @param relativePath Value for the variable {@link #relativePath}. - */ - public HtmlDocletWriter(ConfigurationImpl configuration, - String path, String filename, - String relativePath) throws IOException { - super(configuration, path, filename); + public HtmlDocletWriter(ConfigurationImpl configuration, DocPath path) + throws IOException { + super(configuration, path); this.configuration = configuration; this.path = path; - this.relativePath = relativePath; - this.relativepathNoSlash = - DirectoryManager.getPathNoTrailingSlash(this.relativePath); - this.filename = filename; + this.pathToRoot = path.parent().invert(); + this.filename = path.basename(); } /** @@ -165,8 +139,9 @@ public class HtmlDocletWriter extends HtmlDocWriter { int previndex = 0; while (true) { if (configuration.docrootparent.length() > 0) { + final String docroot_parent = "{@docroot}/.."; // Search for lowercase version of {@docRoot}/.. - index = lowerHtml.indexOf("{@docroot}/..", previndex); + index = lowerHtml.indexOf(docroot_parent, previndex); // If next {@docRoot}/.. pattern not found, append rest of htmlstr and exit loop if (index < 0) { buf.append(htmlstr.substring(previndex)); @@ -174,17 +149,18 @@ public class HtmlDocletWriter extends HtmlDocWriter { } // If next {@docroot}/.. pattern found, append htmlstr up to start of tag buf.append(htmlstr.substring(previndex, index)); - previndex = index + 13; // length for {@docroot}/.. string + previndex = index + docroot_parent.length(); // Insert docrootparent absolute path where {@docRoot}/.. was located buf.append(configuration.docrootparent); // Append slash if next character is not a slash if (previndex < htmlstr.length() && htmlstr.charAt(previndex) != '/') { - buf.append(DirectoryManager.URL_FILE_SEPARATOR); + buf.append('/'); } } else { + final String docroot = "{@docroot}"; // Search for lowercase version of {@docRoot} - index = lowerHtml.indexOf("{@docroot}", previndex); + index = lowerHtml.indexOf(docroot, previndex); // If next {@docRoot} tag not found, append rest of htmlstr and exit loop if (index < 0) { buf.append(htmlstr.substring(previndex)); @@ -192,13 +168,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { } // If next {@docroot} tag found, append htmlstr up to start of tag buf.append(htmlstr.substring(previndex, index)); - previndex = index + 10; // length for {@docroot} string + previndex = index + docroot.length(); // Insert relative path where {@docRoot} was located - buf.append(relativepathNoSlash); + buf.append(pathToRoot.isEmpty() ? "." : pathToRoot.getPath()); // Append slash if next character is not a slash - if (relativepathNoSlash.length() > 0 && previndex < htmlstr.length() && - htmlstr.charAt(previndex) != '/') { - buf.append(DirectoryManager.URL_FILE_SEPARATOR); + if (previndex < htmlstr.length() && htmlstr.charAt(previndex) != '/') { + buf.append('/'); } } } @@ -312,7 +287,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ public Content getTargetPackageLink(PackageDoc pd, String target, Content label) { - return getHyperLink(pathString(pd, "package-summary.html"), "", label, "", target); + return getHyperLink(pathString(pd, DocPaths.PACKAGE_SUMMARY), "", label, "", target); } /** @@ -539,8 +514,8 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkContents() { - Content linkContent = getHyperLink(relativePath + - "overview-summary.html", "", overviewLabel, "", ""); + Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_SUMMARY), + "", overviewLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; } @@ -584,7 +559,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param prev File name for the prev link * @return a content tree for the link */ - public Content getNavLinkPrevious(String prev) { + public Content getNavLinkPrevious(DocPath prev) { Content li; if (prev != null) { li = HtmlTree.LI(getHyperLink(prev, "", prevLabel, "", "")); @@ -601,7 +576,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param next File name for the next link * @return a content tree for the link */ - public Content getNavLinkNext(String next) { + public Content getNavLinkNext(DocPath next) { Content li; if (next != null) { li = HtmlTree.LI(getHyperLink(next, "", nextLabel, "", "")); @@ -617,9 +592,9 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param link File to be linked, "index.html" * @return a content tree for the link */ - protected Content getNavShowLists(String link) { - Content framesContent = getHyperLink(link + "?" + path + - filename, "", framesLabel, "", "_top"); + protected Content getNavShowLists(DocPath link) { + Content framesContent = getHyperLink(link.getPath() + "?" + path.getPath(), + "", framesLabel, "", "_top"); Content li = HtmlTree.LI(framesContent); return li; } @@ -630,7 +605,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavShowLists() { - return getNavShowLists(relativePath + "index.html"); + return getNavShowLists(pathToRoot.resolve(DocPaths.INDEX)); } /** @@ -639,7 +614,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param link File to be linked * @return a content tree for the link */ - protected Content getNavHideLists(String link) { + protected Content getNavHideLists(DocPath link) { Content noFramesContent = getHyperLink(link, "", noframesLabel, "", "_top"); Content li = HtmlTree.LI(noFramesContent); return li; @@ -658,10 +633,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { PackageDoc[] packages = configuration.root.specifiedPackages(); if (packages.length == 1 && configuration.root.specifiedClasses().length == 0) { treeLinkContent = getHyperLink(pathString(packages[0], - "package-tree.html"), "", treeLabel, + DocPaths.PACKAGE_TREE), "", treeLabel, "", ""); } else { - treeLinkContent = getHyperLink(relativePath + "overview-tree.html", + treeLinkContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), "", treeLabel, "", ""); } Content li = HtmlTree.LI(treeLinkContent); @@ -675,7 +650,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkMainTree(String label) { - Content mainTreeContent = getHyperLink(relativePath + "overview-tree.html", + Content mainTreeContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), new StringContent(label)); Content li = HtmlTree.LI(mainTreeContent); return li; @@ -697,8 +672,8 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkDeprecated() { - Content linkContent = getHyperLink(relativePath + - "deprecated-list.html", "", deprecatedLabel, "", ""); + Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.DEPRECATED_LIST), + "", deprecatedLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; } @@ -711,8 +686,8 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkClassIndex() { - Content allClassesContent = getHyperLink(relativePath + - AllClassesFrameWriter.OUTPUT_FILE_NAME_NOFRAMES, "", + Content allClassesContent = getHyperLink(pathToRoot.resolve( + DocPaths.ALLCLASSES_NOFRAME), "", allclassesLabel, "", ""); Content li = HtmlTree.LI(allClassesContent); return li; @@ -724,9 +699,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkIndex() { - Content linkContent = getHyperLink(relativePath +(configuration.splitindex? - DirectoryManager.getPath("index-files") + fileseparator: "") + - (configuration.splitindex?"index-1.html" : "index-all.html"), "", + Content linkContent = getHyperLink(pathToRoot.resolve( + (configuration.splitindex + ? DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1)) + : DocPaths.INDEX_ALL)), "", indexLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; @@ -740,16 +716,14 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkHelp() { - String helpfilenm = configuration.helpfile; - if (helpfilenm.equals("")) { - helpfilenm = "help-doc.html"; + String helpfile = configuration.helpfile; + DocPath helpfilenm; + if (helpfile.isEmpty()) { + helpfilenm = DocPaths.HELP_DOC; } else { - int lastsep; - if ((lastsep = helpfilenm.lastIndexOf(File.separatorChar)) != -1) { - helpfilenm = helpfilenm.substring(lastsep + 1); - } + helpfilenm = DocPath.create(new File(helpfile).getName()); } - Content linkContent = getHyperLink(relativePath + helpfilenm, "", + Content linkContent = getHyperLink(pathToRoot.resolve(helpfilenm), "", helpLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; @@ -883,18 +857,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } - /** - * Return path to the class page for a classdoc. For example, the class - * name is "java.lang.Object" and if the current file getting generated is - * "java/io/File.html", then the path string to the class, returned is - * "../../java/lang.Object.html". - * - * @param cd Class to which the path is requested. - */ - protected String pathToClass(ClassDoc cd) { - return pathString(cd.containingPackage(), cd.name() + ".html"); - } - /** * Return the path to the class page for a classdoc. Works same as * {@link #pathToClass(ClassDoc)}. @@ -902,7 +864,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param cd Class to which the path is requested. * @param name Name of the file(doesn't include path). */ - protected String pathString(ClassDoc cd, String name) { + protected DocPath pathString(ClassDoc cd, DocPath name) { return pathString(cd.containingPackage(), name); } @@ -915,10 +877,8 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param pd Package in which the file name is assumed to be. * @param name File name, to which path string is. */ - protected String pathString(PackageDoc pd, String name) { - StringBuilder buf = new StringBuilder(relativePath); - buf.append(DirectoryManager.getPathToPackage(pd, name)); - return buf.toString(); + protected DocPath pathString(PackageDoc pd, DocPath name) { + return pathToRoot.resolve(DocPath.forPackage(pd).resolve(name)); } /** @@ -956,12 +916,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } if (included || pkg == null) { - return getHyperLinkString(pathString(pkg, "package-summary.html"), + return getHyperLinkString(pathString(pkg, DocPaths.PACKAGE_SUMMARY), "", label, isStrong, style); } else { String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); if (crossPkgLink != null) { - return getHyperLinkString(crossPkgLink, "", label, isStrong, style); + return getHyperLinkString(/*TEMP*/ DocPath.create(crossPkgLink), "", label, isStrong, style); } else { return label; } @@ -987,12 +947,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } if (included || pkg == null) { - return getHyperLink(pathString(pkg, "package-summary.html"), + return getHyperLink(pathString(pkg, DocPaths.PACKAGE_SUMMARY), "", label); } else { String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); if (crossPkgLink != null) { - return getHyperLink(crossPkgLink, "", label); + return getHyperLink(/*TEMP*/ DocPath.create(crossPkgLink), "", label); } else { return label; } @@ -1020,10 +980,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { //d must be a class doc since in has no containing class. cd = (ClassDoc) doc; } - String href = relativePath + DocletConstants.SOURCE_OUTPUT_DIR_NAME - + DirectoryManager.getDirectoryPath(cd.containingPackage()) - + cd.name() + ".html#" + SourceToHTMLConverter.getAnchorName(doc); - Content linkContent = getHyperLink(href, "", label, "", ""); + DocPath href = pathToRoot + .resolve(DocPaths.SOURCE_OUTPUT) + .resolve(DocPath.forClass(cd)); + Content linkContent = getHyperLink(href, SourceToHTMLConverter.getAnchorName(doc), label, "", ""); htmltree.addContent(linkContent); } @@ -1085,7 +1045,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { //exists, but no way to determine if the external class exists. We just //have to assume that it does. return getHyperLinkString( - configuration.extern.getExternalLink(packageName, relativePath, + configuration.extern.getExternalLink(packageName, pathToRoot, className + ".html?is-external=true"), refMemName == null ? "" : refMemName, label == null || label.length() == 0 ? defaultLabel : label, @@ -1105,7 +1065,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { } public String getCrossPackageLink(String pkgName) { - return configuration.extern.getExternalLink(pkgName, relativePath, + return configuration.extern.getExternalLink(pkgName, pathToRoot, "package-summary.html?is-external=true"); } @@ -1321,7 +1281,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { String classCrossLink, packageCrossLink = getCrossPackageLink(refClassName); if (packageCrossLink != null) { //Package cross link found - return getHyperLinkString(packageCrossLink, "", + return getHyperLinkString(/*TEMP*/ DocPath.create(packageCrossLink), "", (label.isEmpty() ? text : label), false); } else if ((classCrossLink = getCrossClassLink(refClassName, refMemName, label, false, "", !plain)) != null) { @@ -1450,7 +1410,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param doc the doc for which the comment tags will be generated * @param tags the first sentence tags for the doc * @param depr true if it is deprecated - * @param first true if the first sentenge tags should be added + * @param first true if the first sentence tags should be added * @param htmltree the documentation tree to which the comment tags will be added */ private void addCommentTags(Doc doc, Tag[] tags, boolean depr, @@ -1561,7 +1521,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Suppose a piece of documentation has a relative link. When you copy - * that documetation to another place such as the index or class-use page, + * that documentation to another place such as the index or class-use page, * that relative link will no longer work. We should redirect those links * so that they will work again. *

    @@ -1587,21 +1547,17 @@ public class HtmlDocletWriter extends HtmlDocWriter { return text; } - String redirectPathFromRoot; + DocPath redirectPathFromRoot; if (doc instanceof ClassDoc) { - redirectPathFromRoot = DirectoryManager.getDirectoryPath(((ClassDoc) doc).containingPackage()); + redirectPathFromRoot = DocPath.forPackage(((ClassDoc) doc).containingPackage()); } else if (doc instanceof MemberDoc) { - redirectPathFromRoot = DirectoryManager.getDirectoryPath(((MemberDoc) doc).containingPackage()); + redirectPathFromRoot = DocPath.forPackage(((MemberDoc) doc).containingPackage()); } else if (doc instanceof PackageDoc) { - redirectPathFromRoot = DirectoryManager.getDirectoryPath((PackageDoc) doc); + redirectPathFromRoot = DocPath.forPackage((PackageDoc) doc); } else { return text; } - if (! redirectPathFromRoot.endsWith(DirectoryManager.URL_FILE_SEPARATOR)) { - redirectPathFromRoot += DirectoryManager.URL_FILE_SEPARATOR; - } - //Redirect all relative links. int end, begin = text.toLowerCase().indexOf("= 0){ @@ -1627,22 +1583,21 @@ public class HtmlDocletWriter extends HtmlDocWriter { //might be missing '>' character because the href has an inline tag. break; } - if(textBuff.substring(begin, end).indexOf("\"") != -1){ + if (textBuff.substring(begin, end).indexOf("\"") != -1){ begin = textBuff.indexOf("\"", begin) + 1; end = textBuff.indexOf("\"", begin +1); - if(begin == 0 || end == -1){ + if (begin == 0 || end == -1){ //Link is missing a quote. break; } } String relativeLink = textBuff.substring(begin, end); - if(!(relativeLink.toLowerCase().startsWith("mailto:") || - relativeLink.toLowerCase().startsWith("http:") || - relativeLink.toLowerCase().startsWith("https:") || - relativeLink.toLowerCase().startsWith("file:"))){ - relativeLink = "{@"+(new DocRootTaglet()).getName() + "}" - + redirectPathFromRoot - + relativeLink; + if (!(relativeLink.toLowerCase().startsWith("mailto:") || + relativeLink.toLowerCase().startsWith("http:") || + relativeLink.toLowerCase().startsWith("https:") || + relativeLink.toLowerCase().startsWith("file:"))) { + relativeLink = "{@"+(new DocRootTaglet()).getName() + "}/" + + redirectPathFromRoot.resolve(relativeLink).getPath(); textBuff.replace(begin, end, relativeLink); } begin = textBuff.toString().toLowerCase().indexOf(" 0) { - File stylefile = new File(filename); - String parent = stylefile.getParent(); - filename = (parent == null)? - filename: - filename.substring(parent.length() + 1); + stylesheet = DocPath.create(new File(filename).getName()); } else { - filename = "stylesheet.css"; + stylesheet = DocPaths.STYLESHEET; } - filename = relativePath + filename; - HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", filename, "Style"); + HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", + pathToRoot.resolve(stylesheet).getPath(), + "Style"); return link; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java index dac765d925c..3052f61e7e3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java @@ -78,9 +78,9 @@ public class LinkFactoryImpl extends LinkFactory { LinkOutputImpl linkOutput = new LinkOutputImpl(); if (classDoc.isIncluded()) { if (configuration.isGeneratedDoc(classDoc)) { - String filename = pathString(classLinkInfo); + DocPath filename = getPath(classLinkInfo); if (linkInfo.linkToSelf || - !(linkInfo.classDoc.name() + ".html").equals(m_writer.filename)) { + !(DocPath.forName(classDoc)).equals(m_writer.filename)) { linkOutput.append(m_writer.getHyperLinkString(filename, classLinkInfo.where, label.toString(), classLinkInfo.isStrong, classLinkInfo.styleName, @@ -161,16 +161,12 @@ public class LinkFactoryImpl extends LinkFactory { * * @param linkInfo the information about the link. */ - private String pathString(LinkInfoImpl linkInfo) { + private DocPath getPath(LinkInfoImpl linkInfo) { if (linkInfo.context == LinkInfoImpl.PACKAGE_FRAME) { //Not really necessary to do this but we want to be consistent //with 1.4.2 output. - return linkInfo.classDoc.name() + ".html"; + return DocPath.forName(linkInfo.classDoc); } - StringBuilder buf = new StringBuilder(m_writer.relativePath); - buf.append(DirectoryManager.getPathToPackage( - linkInfo.classDoc.containingPackage(), - linkInfo.classDoc.name() + ".html")); - return buf.toString(); + return m_writer.pathToRoot.resolve(DocPath.forClass(linkInfo.classDoc)); } } 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 467859d740b..6b9ff239511 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 @@ -400,7 +400,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", (cd == null)? + return writer.getHyperLink((cd == null)? "method_summary": "methods_inherited_from_class_" + configuration().getClassName(cd), @@ -415,7 +415,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "method_detail", + liNav.addContent(writer.getHyperLink("method_detail", writer.getResource("doclet.navMethod"))); } else { liNav.addContent(writer.getResource("doclet.navMethod")); 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 ec9a50f52fa..5b9cda91b33 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 @@ -203,9 +203,8 @@ public class NestedClassWriterImpl extends AbstractMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", (cd == null) ? "nested_class_summary": - "nested_classes_inherited_from_class_" + - cd.qualifiedName(), + return writer.getHyperLink((cd == null) ? "nested_class_summary": + "nested_classes_inherited_from_class_" + cd.qualifiedName(), writer.getResource("doclet.navNested")); } else { return writer.getResource("doclet.navNested"); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java index 6c9f3770b00..e218a273d47 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java @@ -59,18 +59,13 @@ public class PackageFrameWriter extends HtmlDocletWriter { */ private Set documentedClasses; - /** - * The name of the output file. - */ - public static final String OUTPUT_FILE_NAME = "package-frame.html"; - /** * Constructor to construct PackageFrameWriter object and to generate * "package-frame.html" file in the respective package directory. * For example for package "java.lang" this will generate file * "package-frame.html" file in the "java/lang" directory. It will also * create "java/lang" directory in the current or the destination directory - * if it doesen't exist. + * if it doesn't exist. * * @param configuration the configuration of the doclet. * @param packageDoc PackageDoc under consideration. @@ -78,7 +73,7 @@ public class PackageFrameWriter extends HtmlDocletWriter { public PackageFrameWriter(ConfigurationImpl configuration, PackageDoc packageDoc) throws IOException { - super(configuration, DirectoryManager.getDirectoryPath(packageDoc), OUTPUT_FILE_NAME, DirectoryManager.getRelativePath(packageDoc)); + super(configuration, DocPath.forPackage(packageDoc).resolve(DocPaths.PACKAGE_FRAME)); this.packageDoc = packageDoc; if (configuration.root.specifiedPackages().length == 0) { documentedClasses = new HashSet(Arrays.asList(configuration.root.classes())); @@ -113,7 +108,7 @@ public class PackageFrameWriter extends HtmlDocletWriter { } catch (IOException exc) { configuration.standardmessage.error( "doclet.exception_encountered", - exc.toString(), OUTPUT_FILE_NAME); + exc.toString(), DocPaths.PACKAGE_FRAME.getPath()); throw new DocletAbortException(); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java index 2928983b61d..f5a1b1c5212 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java @@ -52,7 +52,7 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { * @param filename Name of the package index file to be generated. */ public PackageIndexFrameWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); } @@ -62,7 +62,7 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { */ public static void generate(ConfigurationImpl configuration) { PackageIndexFrameWriter packgen; - String filename = "overview-frame.html"; + DocPath filename = DocPaths.OVERVIEW_FRAME; try { packgen = new PackageIndexFrameWriter(configuration, filename); packgen.buildPackageIndexFile("doclet.Window_Overview", false); @@ -109,11 +109,11 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { if (pd.name().length() > 0) { packageLabel = getPackageLabel(pd.name()); packageLinkContent = getHyperLink(pathString(pd, - "package-frame.html"), "", packageLabel, "", + DocPaths.PACKAGE_FRAME), "", packageLabel, "", "packageFrame"); } else { packageLabel = new RawHtml("<unnamed package>"); - packageLinkContent = getHyperLink("package-frame.html", + packageLinkContent = getHyperLink(DocPaths.PACKAGE_FRAME, "", packageLabel, "", "packageFrame"); } Content li = HtmlTree.LI(packageLinkContent); @@ -148,7 +148,7 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { * @param body the Content object to which the all classes link should be added */ protected void addAllClassesLink(Content body) { - Content linkContent = getHyperLink("allclasses-frame.html", "", + Content linkContent = getHyperLink(DocPaths.ALLCLASSES_FRAME, "", allclassesLabel, "", "packageFrame"); Content div = HtmlTree.DIV(HtmlStyle.indexHeader, linkContent); body.addContent(div); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java index b1400f4bdd1..15acb974d73 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java @@ -36,7 +36,7 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the package index page "overview-summary.html" for the right-hand * frame. A click on the package name on this page will update the same frame - * with the "pacakge-summary.html" file for the clicked package. + * with the "package-summary.html" file for the clicked package. * *

    This is NOT part of any supported API. * If you write code that depends on this, you do so at your own risk. @@ -73,7 +73,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { * @see Group */ public PackageIndexWriter(ConfigurationImpl configuration, - String filename) + DocPath filename) throws IOException { super(configuration, filename); this.root = configuration.root; @@ -88,7 +88,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { */ public static void generate(ConfigurationImpl configuration) { PackageIndexWriter packgen; - String filename = "overview-summary.html"; + DocPath filename = DocPaths.OVERVIEW_SUMMARY; try { packgen = new PackageIndexWriter(configuration, filename); packgen.buildPackageIndexFile("doclet.Window_Overview_Summary", true); 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 5895015f210..30147f86916 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 @@ -67,15 +67,14 @@ public class PackageTreeWriter extends AbstractTreeWriter { * @throws DocletAbortException */ public PackageTreeWriter(ConfigurationImpl configuration, - String path, String filename, + DocPath path, PackageDoc packagedoc, PackageDoc prev, PackageDoc next) throws IOException { - super(configuration, path, filename, + super(configuration, path, new ClassTree( configuration.classDocCatalog.allClasses(packagedoc), - configuration), - packagedoc); + configuration)); this.packagedoc = packagedoc; this.prev = prev; this.next = next; @@ -96,17 +95,16 @@ public class PackageTreeWriter extends AbstractTreeWriter { PackageDoc pkg, PackageDoc prev, PackageDoc next, boolean noDeprecated) { PackageTreeWriter packgen; - String path = DirectoryManager.getDirectoryPath(pkg); - String filename = "package-tree.html"; + DocPath path = DocPath.forPackage(pkg).resolve(DocPaths.PACKAGE_TREE); try { - packgen = new PackageTreeWriter(configuration, path, filename, pkg, + packgen = new PackageTreeWriter(configuration, path, pkg, prev, next); packgen.generatePackageTreeFile(); packgen.close(); } catch (IOException exc) { configuration.standardmessage.error( "doclet.exception_encountered", - exc.toString(), filename); + exc.toString(), path.getPath()); throw new DocletAbortException(); } } @@ -175,9 +173,8 @@ public class PackageTreeWriter extends AbstractTreeWriter { if (prev == null) { return getNavLinkPrevious(null); } else { - String path = DirectoryManager.getRelativePath(packagedoc.name(), - prev.name()); - return getNavLinkPrevious(path + "package-tree.html"); + DocPath path = DocPath.relativePath(packagedoc, prev); + return getNavLinkPrevious(path.resolve(DocPaths.PACKAGE_TREE)); } } @@ -190,9 +187,8 @@ public class PackageTreeWriter extends AbstractTreeWriter { if (next == null) { return getNavLinkNext(null); } else { - String path = DirectoryManager.getRelativePath(packagedoc.name(), - next.name()); - return getNavLinkNext(path + "package-tree.html"); + DocPath path = DocPath.relativePath(packagedoc, next); + return getNavLinkNext(path.resolve(DocPaths.PACKAGE_TREE)); } } @@ -202,7 +198,7 @@ public class PackageTreeWriter extends AbstractTreeWriter { * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("package-summary.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "", packageLabel); Content li = HtmlTree.LI(linkContent); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java index 1bf61a55ca8..a43ad38ddf6 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java @@ -57,11 +57,9 @@ public class PackageUseWriter extends SubWriterHolderWriter { * @throws DocletAbortException */ public PackageUseWriter(ConfigurationImpl configuration, - ClassUseMapper mapper, String filename, + ClassUseMapper mapper, DocPath filename, PackageDoc pkgdoc) throws IOException { - super(configuration, DirectoryManager.getDirectoryPath(pkgdoc), - filename, - DirectoryManager.getRelativePath(pkgdoc.name())); + super(configuration, DocPath.forPackage(pkgdoc).resolve(filename)); this.pkgdoc = pkgdoc; // by examining all classes in this package, find what packages @@ -98,7 +96,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { public static void generate(ConfigurationImpl configuration, ClassUseMapper mapper, PackageDoc pkgdoc) { PackageUseWriter pkgusegen; - String filename = "package-use.html"; + DocPath filename = DocPaths.PACKAGE_USE; try { pkgusegen = new PackageUseWriter(configuration, mapper, filename, pkgdoc); @@ -232,8 +230,8 @@ public class PackageUseWriter extends SubWriterHolderWriter { */ protected void addClassRow(ClassDoc usedClass, String packageName, Content contentTree) { - String path = pathString(usedClass, - "class-use/" + usedClass.name() + ".html"); + DocPath path = pathString(usedClass, + DocPaths.CLASS_USE.resolve(DocPath.forName(usedClass))); Content td = HtmlTree.TD(HtmlStyle.colOne, getHyperLink(path, packageName, new StringContent(usedClass.name()))); addIndexComment(usedClass, td); @@ -248,7 +246,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { */ protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException { Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, - getHyperLink("", Util.getPackageName(pkg), + getHyperLink(Util.getPackageName(pkg), new RawHtml(Util.getPackageName(pkg)))); contentTree.addContent(tdFirst); HtmlTree tdLast = new HtmlTree(HtmlTag.TD); @@ -288,7 +286,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("package-summary.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "", packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -310,7 +308,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { * @return a content tree for the tree link */ protected Content getNavLinkTree() { - Content linkContent = getHyperLink("package-tree.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_TREE, "", treeLabel); Content li = HtmlTree.LI(linkContent); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java index c91bf4d016c..0153ca6abc3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java @@ -64,18 +64,13 @@ public class PackageWriterImpl extends HtmlDocletWriter */ protected PackageDoc packageDoc; - /** - * The name of the output file. - */ - private static final String OUTPUT_FILE_NAME = "package-summary.html"; - /** * Constructor to construct PackageWriter object and to generate * "package-summary.html" file in the respective package directory. * For example for package "java.lang" this will generate file * "package-summary.html" file in the "java/lang" directory. It will also * create "java/lang" directory in the current or the destination directory - * if it doesen't exist. + * if it doesn't exist. * * @param configuration the configuration of the doclet. * @param packageDoc PackageDoc under consideration. @@ -83,24 +78,14 @@ public class PackageWriterImpl extends HtmlDocletWriter * @param next Next package in the sorted array. */ public PackageWriterImpl(ConfigurationImpl configuration, - PackageDoc packageDoc, PackageDoc prev, PackageDoc next) - throws IOException { - super(configuration, DirectoryManager.getDirectoryPath(packageDoc), OUTPUT_FILE_NAME, - DirectoryManager.getRelativePath(packageDoc.name())); + PackageDoc packageDoc, PackageDoc prev, PackageDoc next) + throws IOException { + super(configuration, DocPath.forPackage(packageDoc).resolve(DocPaths.PACKAGE_SUMMARY)); this.prev = prev; this.next = next; this.packageDoc = packageDoc; } - /** - * Return the name of the output file. - * - * @return the name of the output file. - */ - public String getOutputFileName() { - return OUTPUT_FILE_NAME; - } - /** * {@inheritDoc} */ @@ -265,7 +250,7 @@ public class PackageWriterImpl extends HtmlDocletWriter * @return a content tree for the class use link */ protected Content getNavLinkClassUse() { - Content useLink = getHyperLink("package-use.html", "", + Content useLink = getHyperLink(DocPaths.PACKAGE_USE, "", useLabel, "", ""); Content li = HtmlTree.LI(useLink); return li; @@ -281,9 +266,8 @@ public class PackageWriterImpl extends HtmlDocletWriter if (prev == null) { li = HtmlTree.LI(prevpackageLabel); } else { - String path = DirectoryManager.getRelativePath(packageDoc.name(), - prev.name()); - li = HtmlTree.LI(getHyperLink(path + "package-summary.html", "", + DocPath path = DocPath.relativePath(packageDoc, prev); + li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), "", prevpackageLabel, "", "")); } return li; @@ -299,9 +283,8 @@ public class PackageWriterImpl extends HtmlDocletWriter if (next == null) { li = HtmlTree.LI(nextpackageLabel); } else { - String path = DirectoryManager.getRelativePath(packageDoc.name(), - next.name()); - li = HtmlTree.LI(getHyperLink(path + "package-summary.html", "", + DocPath path = DocPath.relativePath(packageDoc, next); + li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), "", nextpackageLabel, "", "")); } return li; @@ -314,7 +297,7 @@ public class PackageWriterImpl extends HtmlDocletWriter * @return a content tree for the tree link */ protected Content getNavLinkTree() { - Content useLink = getHyperLink("package-tree.html", "", + Content useLink = getHyperLink(DocPaths.PACKAGE_TREE, "", treeLabel, "", ""); Content li = HtmlTree.LI(useLink); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java index f7cb4feff81..c1df94a8728 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java @@ -29,6 +29,7 @@ import java.io.*; 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.DocPaths; import com.sun.tools.doclets.internal.toolkit.util.DocletAbortException; /** @@ -44,14 +45,12 @@ import com.sun.tools.doclets.internal.toolkit.util.DocletAbortException; public class SerializedFormWriterImpl extends SubWriterHolderWriter implements SerializedFormWriter { - private static final String FILE_NAME = "serialized-form.html"; - /** * @throws IOException * @throws DocletAbortException */ public SerializedFormWriterImpl() throws IOException { - super(ConfigurationImpl.getInstance(), FILE_NAME); + super(ConfigurationImpl.getInstance(), DocPaths.SERIALIZED_FORM); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java index a0ce80f928b..924557c95df 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java @@ -55,11 +55,9 @@ public class SingleIndexWriter extends AbstractIndexWriter { * @param indexbuilder Unicode based Index from {@link IndexBuilder} */ public SingleIndexWriter(ConfigurationImpl configuration, - String filename, + DocPath filename, IndexBuilder indexbuilder) throws IOException { super(configuration, filename, indexbuilder); - relativepathNoSlash = "."; - relativePath = "./"; } /** @@ -71,7 +69,7 @@ public class SingleIndexWriter extends AbstractIndexWriter { public static void generate(ConfigurationImpl configuration, IndexBuilder indexbuilder) { SingleIndexWriter indexgen; - String filename = "index-all.html"; + DocPath filename = DocPaths.INDEX_ALL; try { indexgen = new SingleIndexWriter(configuration, filename, indexbuilder); @@ -117,7 +115,7 @@ public class SingleIndexWriter extends AbstractIndexWriter { for (int i = 0; i < indexbuilder.elements().length; i++) { String unicode = (indexbuilder.elements())[i].toString(); contentTree.addContent( - getHyperLink("#_" + unicode + "_", new StringContent(unicode))); + getHyperLink("_" + unicode + "_", new StringContent(unicode))); contentTree.addContent(getSpace()); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java index c560bb8711c..8a1699d8d57 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java @@ -62,7 +62,7 @@ public class SourceToHTMLConverter { * Relative path from the documentation root to the file that is being * generated. */ - private static String relativePath = ""; + private static DocPath relativePath = DocPath.empty; /** * Source is converted to HTML using static methods below. @@ -77,7 +77,7 @@ public class SourceToHTMLConverter { * @param outputdir the name of the directory to output to. */ public static void convertRoot(ConfigurationImpl configuration, RootDoc rd, - String outputdir) { + DocPath outputdir) { if (rd == null || outputdir == null) { return; } @@ -108,11 +108,11 @@ public class SourceToHTMLConverter { * @param outputdir the name of the directory to output to. */ public static void convertPackage(ConfigurationImpl configuration, PackageDoc pd, - String outputdir) { + DocPath outputdir) { if (pd == null || outputdir == null) { return; } - String classOutputdir = getPackageOutputDir(outputdir, pd); + DocPath classOutputdir = getPackageOutputDir(outputdir, pd); ClassDoc[] cds = pd.allClasses(); for (int i = 0; i < cds.length; i++) { // If -nodeprecated option is set and the class is marked as deprecated, @@ -131,9 +131,8 @@ public class SourceToHTMLConverter { * @param pd the Package to generate output for. * @return the package output directory as a String. */ - private static String getPackageOutputDir(String outputDir, PackageDoc pd) { - return outputDir + File.separator + - DirectoryManager.getDirectoryPath(pd) + File.separator; + private static DocPath getPackageOutputDir(DocPath outputDir, PackageDoc pd) { + return outputDir.resolve(DocPath.forPackage(pd)); } /** @@ -144,7 +143,7 @@ public class SourceToHTMLConverter { * @param outputdir the name of the directory to output to. */ public static void convertClass(ConfigurationImpl configuration, ClassDoc cd, - String outputdir) { + DocPath outputdir) { if (cd == null || outputdir == null) { return; } @@ -168,8 +167,9 @@ public class SourceToHTMLConverter { LineNumberReader reader = new LineNumberReader(r); int lineno = 1; String line; - relativePath = DirectoryManager.getRelativePath(DocletConstants.SOURCE_OUTPUT_DIR_NAME) + - DirectoryManager.getRelativePath(cd.containingPackage()); + relativePath = DocPaths.SOURCE_OUTPUT + .resolve(DocPath.forPackage(cd)) + .invert(); Content body = getHeader(); Content pre = new HtmlTree(HtmlTag.PRE); try { @@ -198,7 +198,7 @@ public class SourceToHTMLConverter { * @param className the name of the class that I am converting to HTML. * @param configuration the Doclet configuration to pass notices to. */ - private static void writeToFile(Content body, String outputDir, + private static void writeToFile(Content body, DocPath outputDir, String className, ConfigurationImpl configuration) throws IOException { Content htmlDocType = DocType.Transitional(); Content head = new HtmlTree(HtmlTag.HEAD); @@ -208,7 +208,7 @@ public class SourceToHTMLConverter { Content htmlTree = HtmlTree.HTML(configuration.getLocale().getLanguage(), head, body); Content htmlDocument = new HtmlDocument(htmlDocType, htmlTree); - File dir = new File(outputDir); + File dir = outputDir.resolveAgainst(configuration.destDirName); dir.mkdirs(); File newFile = new File(dir, className + ".html"); configuration.message.notice("doclet.Generating_0", newFile.getPath()); @@ -227,17 +227,14 @@ public class SourceToHTMLConverter { */ public static HtmlTree getStyleSheetProperties(ConfigurationImpl configuration) { String filename = configuration.stylesheetfile; + DocPath stylesheet; if (filename.length() > 0) { - File stylefile = new File(filename); - String parent = stylefile.getParent(); - filename = (parent == null)? - filename: - filename.substring(parent.length() + 1); + stylesheet = DocPath.create(new File(filename).getName()); } else { - filename = "stylesheet.css"; + stylesheet = DocPaths.STYLESHEET; } - filename = relativePath + filename; - HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", filename, "Style"); + DocPath p = relativePath.resolve(stylesheet); + HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", p.getPath(), "Style"); return link; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java index e6249f29ddb..94b407f4101 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java @@ -67,10 +67,10 @@ public class SplitIndexWriter extends AbstractIndexWriter { * @param indexbuilder Unicode based Index from {@link IndexBuilder} */ public SplitIndexWriter(ConfigurationImpl configuration, - String path, String filename, - String relpath, IndexBuilder indexbuilder, + DocPath path, + IndexBuilder indexbuilder, int prev, int next) throws IOException { - super(configuration, path, filename, relpath, indexbuilder); + super(configuration, path, indexbuilder); this.prev = prev; this.next = next; } @@ -85,17 +85,16 @@ public class SplitIndexWriter extends AbstractIndexWriter { public static void generate(ConfigurationImpl configuration, IndexBuilder indexbuilder) { SplitIndexWriter indexgen; - String filename = ""; - String path = DirectoryManager.getPath("index-files"); - String relpath = DirectoryManager.getRelativePath("index-files"); + DocPath filename = DocPath.empty; + DocPath path = DocPaths.INDEX_FILES; try { for (int i = 0; i < indexbuilder.elements().length; i++) { int j = i + 1; int prev = (j == 1)? -1: i; int next = (j == indexbuilder.elements().length)? -1: j + 1; - filename = "index-" + j +".html"; + filename = DocPaths.indexN(j); indexgen = new SplitIndexWriter(configuration, - path, filename, relpath, + path.resolve(filename), indexbuilder, prev, next); indexgen.generateIndexFile((Character)indexbuilder. elements()[i]); @@ -104,7 +103,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { } catch (IOException exc) { configuration.standardmessage.error( "doclet.exception_encountered", - exc.toString(), filename); + exc.toString(), filename.getPath()); throw new DocletAbortException(); } } @@ -142,7 +141,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { Object[] unicodeChars = indexbuilder.elements(); for (int i = 0; i < unicodeChars.length; i++) { int j = i + 1; - contentTree.addContent(getHyperLink("index-" + j + ".html", + contentTree.addContent(getHyperLink(DocPaths.indexN(j), new StringContent(unicodeChars[i].toString()))); contentTree.addContent(getSpace()); } @@ -159,7 +158,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { return HtmlTree.LI(prevletterLabel); } else { - Content prevLink = getHyperLink("index-" + prev + ".html", "", + Content prevLink = getHyperLink(DocPaths.indexN(prev), "", prevletterLabel); return HtmlTree.LI(prevLink); } @@ -176,7 +175,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { return HtmlTree.LI(nextletterLabel); } else { - Content nextLink = getHyperLink("index-" + next + ".html","", + Content nextLink = getHyperLink(DocPaths.indexN(next), "", nextletterLabel); return HtmlTree.LI(nextLink); } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java index 424c55dfd8f..8f00a359a83 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java @@ -54,18 +54,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; */ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { - public SubWriterHolderWriter(ConfigurationImpl configuration, - String filename) throws IOException { + public SubWriterHolderWriter(ConfigurationImpl configuration, DocPath filename) + throws IOException { super(configuration, filename); } - - public SubWriterHolderWriter(ConfigurationImpl configuration, - String path, String filename, String relpath) - throws IOException { - super(configuration, path, filename, relpath); - } - /** * Add the summary header. * 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 92478e2f6ce..639ea585a82 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 @@ -66,8 +66,10 @@ public class TagletWriterImpl extends TagletWriter { public TagletOutput getDocRootOutput() { if (htmlWriter.configuration.docrootparent.length() > 0) return new TagletOutputImpl(htmlWriter.configuration.docrootparent); + else if (htmlWriter.pathToRoot.isEmpty()) + return new TagletOutputImpl("."); else - return new TagletOutputImpl(htmlWriter.relativepathNoSlash); + return new TagletOutputImpl(htmlWriter.pathToRoot.getPath()); } /** @@ -170,18 +172,18 @@ public class TagletWriterImpl extends TagletWriter { htmlWriter instanceof ClassWriterImpl) { //Automatically add link to constant values page for constant fields. result = addSeeHeader(result); - result += htmlWriter.getHyperLinkString(htmlWriter.relativePath + - ConfigurationImpl.CONSTANTS_FILE_NAME - + "#" + ((ClassWriterImpl) htmlWriter).getClassDoc().qualifiedName() + result += htmlWriter.getHyperLinkString(htmlWriter.pathToRoot.resolve( + DocPaths.CONSTANT_VALUES), + ((ClassWriterImpl) htmlWriter).getClassDoc().qualifiedName() + "." + ((FieldDoc) holder).name(), - htmlWriter.configuration.getText("doclet.Constants_Summary")); + htmlWriter.configuration.getText("doclet.Constants_Summary"), false); } if (holder.isClass() && ((ClassDoc)holder).isSerializable()) { //Automatically add link to serialized form page for serializable classes. if ((SerializedFormBuilder.serialInclude(holder) && SerializedFormBuilder.serialInclude(((ClassDoc)holder).containingPackage()))) { result = addSeeHeader(result); - result += htmlWriter.getHyperLinkString(htmlWriter.relativePath + "serialized-form.html", + result += htmlWriter.getHyperLinkString(htmlWriter.pathToRoot.resolve(DocPaths.SERIALIZED_FORM), ((ClassDoc)holder).qualifiedName(), htmlWriter.configuration.getText("doclet.Serialized_Form"), false); } } 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 7dab45c6cb0..927dbda99b9 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 @@ -67,7 +67,7 @@ public class TreeWriter extends AbstractTreeWriter { * @param classtree the tree being built. */ public TreeWriter(ConfigurationImpl configuration, - String filename, ClassTree classtree) + DocPath filename, ClassTree classtree) throws IOException { super(configuration, filename, classtree); packages = configuration.packages; @@ -84,7 +84,7 @@ public class TreeWriter extends AbstractTreeWriter { public static void generate(ConfigurationImpl configuration, ClassTree classtree) { TreeWriter treegen; - String filename = "overview-tree.html"; + DocPath filename = DocPaths.OVERVIEW_TREE; try { treegen = new TreeWriter(configuration, filename, classtree); treegen.generateTreeFile(); @@ -144,7 +144,7 @@ public class TreeWriter extends AbstractTreeWriter { (configuration.nodeprecated && Util.isDeprecated(packages[i]))) { continue; } - String link = pathString(packages[i], "package-tree.html"); + DocPath link = pathString(packages[i], DocPaths.PACKAGE_TREE); Content li = HtmlTree.LI(getHyperLink( link, "", new StringContent(packages[i].name()))); if (i < packages.length - 1) { 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 4af650d601a..31abaa881e7 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 @@ -31,6 +31,8 @@ import java.util.*; import com.sun.javadoc.*; import com.sun.tools.doclets.formats.html.ConfigurationImpl; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.DocPath; +import com.sun.tools.doclets.internal.toolkit.util.DocPaths; /** @@ -56,25 +58,11 @@ public abstract class HtmlDocWriter extends HtmlWriter { * * @param filename String file name. */ - public HtmlDocWriter(Configuration configuration, - String filename) throws IOException { - super(configuration, - null, configuration.destDirName + filename, - configuration.docencoding); - // use File to normalize file separators + public HtmlDocWriter(Configuration configuration, DocPath filename) + throws IOException { + super(configuration, filename); configuration.message.notice("doclet.Generating_0", - new File(configuration.destDirName, filename)); - } - - public HtmlDocWriter(Configuration configuration, - String path, String filename) throws IOException { - super(configuration, - configuration.destDirName + path, filename, - configuration.docencoding); - // use File to normalize file separators - configuration.message.notice("doclet.Generating_0", - new File(configuration.destDirName, - ((path.length() > 0)? path + File.separator: "") + filename)); + filename.resolveAgainst(configuration.destDirName)); } /** @@ -92,7 +80,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param strong Boolean that sets label to strong. * @return String Hyper Link. */ - public String getHyperLinkString(String link, String where, + public String getHyperLinkString(DocPath link, String where, String label, boolean strong) { return getHyperLinkString(link, where, label, strong, "", "", ""); } @@ -108,12 +96,25 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param stylename String style of text defined in style sheet. * @return String Hyper Link. */ - public String getHyperLinkString(String link, String where, + public String getHyperLinkString(DocPath link, String where, String label, boolean strong, String stylename) { return getHyperLinkString(link, where, label, strong, stylename, "", ""); } + /** + * Get Html Hyper Link string. + * + * @param where Position of the link in the file. Character '#' is not + * needed. + * @param label Tag for the link. + * @return a content tree for the hyper link + */ + public Content getHyperLink(String where, + Content label) { + return getHyperLink(DocPath.empty, where, label, "", ""); + } + /** * Get Html Hyper Link string. * @@ -123,7 +124,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param label Tag for the link. * @return a content tree for the hyper link */ - public Content getHyperLink(String link, String where, + public Content getHyperLink(DocPath link, String where, Content label) { return getHyperLink(link, where, label, "", ""); } @@ -141,6 +142,13 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param target Target frame. * @return String Hyper Link. */ + public String getHyperLinkString(DocPath link, String where, + String label, boolean strong, + String stylename, String title, String target) { + return getHyperLinkString(link.getPath(), where, label, strong, + stylename, title, target); + } + public String getHyperLinkString(String link, String where, String label, boolean strong, String stylename, String title, String target) { @@ -189,8 +197,13 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param target Target frame. * @return a content tree for the hyper link. */ + public Content getHyperLink(DocPath link, String where, + Content label, String title, String target) { + return getHyperLink(link.getPath(), where, label, title, target); + } public Content getHyperLink(String link, String where, Content label, String title, String target) { + if (link.startsWith("/")) Thread.dumpStack(); if (where != null && where.length() != 0) { link += "#" + where; } @@ -211,7 +224,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param label Label for the link * @return a content for the hyperlink to the file */ - public Content getHyperLink(String link, Content label) { + public Content getHyperLink(DocPath link, Content label) { return getHyperLink(link, "", label); } @@ -222,7 +235,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param label Tag for the link. * @return Strign Hyper link. */ - public String getHyperLinkString(String link, String label) { + public String getHyperLinkString(DocPath link, String label) { return getHyperLinkString(link, "", label, false); } 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 64ea8760612..505371a7655 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 @@ -46,22 +46,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; */ public class HtmlWriter { - /** - * Name of the file, to which this writer is writing to. - */ - protected final String htmlFilename; - /** * The window title of this file */ protected String winTitle; - /** - * URL file separator string("/"). - */ - public static final String fileseparator = - DirectoryManager.URL_FILE_SEPARATOR; - /** * The configuration */ @@ -162,18 +151,15 @@ public class HtmlWriter { * or null if none to be created. * @param filename File Name to which the PrintWriter will * do the Output. - * @param docencoding Encoding to be used for this file. * @exception IOException Exception raised by the FileWriter is passed on * to next level. * @exception UnsupportedEncodingException Exception raised by the * OutputStreamWriter is passed on to next level. */ - public HtmlWriter(Configuration configuration, - String path, String filename, String docencoding) - throws IOException, UnsupportedEncodingException { - writer = Util.genWriter(configuration, path, filename, docencoding); + public HtmlWriter(Configuration configuration,DocPath path) + throws IOException, UnsupportedEncodingException { + writer = Util.genWriter(configuration, path); this.configuration = configuration; - htmlFilename = filename; this.memberDetailsListPrinted = false; packageTableHeader = new String[] { configuration.getText("doclet.Package"), diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java index 7f38f38564c..2f7f1e6892d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java @@ -130,8 +130,8 @@ public abstract class AbstractDoclet { boolean first = true; while(pathTokens.hasMoreTokens()){ Util.copyDocFiles(configuration, - pathTokens.nextToken() + File.separator, - DocletConstants.DOC_FILES_DIR_NAME, first); + new File(pathTokens.nextToken()), + DocPaths.DOC_FILES, first); first = false; } } 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 001335168fa..e6ce1ff4fe1 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 @@ -44,13 +44,6 @@ import com.sun.javadoc.*; public interface PackageSummaryWriter { - /** - * Return the name of the output file. - * - * @return the name of the output file. - */ - public abstract String getOutputFileName(); - /** * Get the header for the summary. * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java index dbb7e4ab8d0..cee69244d01 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java @@ -141,11 +141,9 @@ public class AnnotationTypeBuilder extends AbstractBuilder { //documented AND if we have not documented a class from the same //package already. Otherwise, we are making duplicate copies. Util.copyDocFiles(configuration, - Util.getPackageSourcePath(configuration, - annotationTypeDoc.containingPackage()) + - DirectoryManager.getDirectoryPath( - annotationTypeDoc.containingPackage()) - + File.separator, DocletConstants.DOC_FILES_DIR_NAME, true); + new File(Util.getPackageSourcePath(configuration, containingPackage), + DocPath.forPackage(annotationTypeDoc).getPath()), + DocPaths.DOC_FILES, true); containingPackagesSeen.add(containingPackage.name()); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java index 9f5d095edf4..5f419709e15 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java @@ -267,10 +267,9 @@ public class ClassBuilder extends AbstractBuilder { //documented AND if we have not documented a class from the same //package already. Otherwise, we are making duplicate copies. Util.copyDocFiles(configuration, - Util.getPackageSourcePath(configuration, - classDoc.containingPackage()) + - DirectoryManager.getDirectoryPath(classDoc.containingPackage()) - + File.separator, DocletConstants.DOC_FILES_DIR_NAME, true); + new File(Util.getPackageSourcePath(configuration, containingPackage), + DocPath.forPackage(classDoc).getPath()), + DocPaths.DOC_FILES, true); containingPackagesSeen.add(containingPackage.name()); } } 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 b6dcab6c97c..5d311dee0dd 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 @@ -122,9 +122,7 @@ public class PackageSummaryBuilder extends AbstractBuilder { Util.copyDocFiles( configuration, Util.getPackageSourcePath(configuration, packageDoc), - DirectoryManager.getDirectoryPath(packageDoc) - + File.separator - + DocletConstants.DOC_FILES_DIR_NAME, + DocPath.forPackage(packageDoc).resolve(DocPaths.DOC_FILES), true); } 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 66e8478d940..3b50d6c00e7 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 @@ -474,6 +474,8 @@ public class SerializedFormBuilder extends AbstractBuilder { Arrays.sort(tags); int tagsLength = tags.length; for (int i = 0; i < tagsLength; i++) { + if (tags[i].fieldName() == null || tags[i].fieldType() == null) // ignore malformed @serialField tags + continue; Content fieldsContentTree = fieldWriter.getFieldsContentHeader( (i == tagsLength - 1)); fieldWriter.addMemberHeader(tags[i].fieldTypeDoc(), diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java deleted file mode 100644 index a91a1b72e06..00000000000 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.doclets.internal.toolkit.util; - -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; -import java.io.*; - - -/** - * Handle the directory creations and the path string generations. - * All static - never instaniated. - * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API - * - * @since 1.2 - * @author Atul M Dambalkar - */ -public class DirectoryManager { - - /** - * The file separator string, "/", used in the formation of the URL path. - */ - public static final String URL_FILE_SEPARATOR = "/"; - - /** - * Never instaniated. - */ - private DirectoryManager() { - } - - /** - * Given a PackageDoc, return its URL path string. - * - * @param pd PackageDoc - * @see #getPath(String) - */ - public static String createPathString(PackageDoc pd) { - if (pd == null) { - return ""; - } - return getPath(pd.name()); - } - - /** - * Given a ClassDoc, return its URL path string. - * - * @param cd ClassDoc - * @see #getPath(String) - */ - public static String createPathString(ClassDoc cd) { - if (cd == null) { - return ""; - } - PackageDoc pd = cd.containingPackage(); - return (pd == null)? "": getPath(pd.name()); - } - - /** - * Given a PackageDoc, return the corresponding directory name - * with the platform-dependent file separator between subdirectory names. - * For example, if name of the package is "java.lang" , then it - * returns "java/lang" on Unix and "java\lang" on Windows. - * If name of the package contains no dot, then the value - * will be returned unchanged. Because package names cannot - * end in a dot, the return value will never end with a slash. - *

    - * Also see getPath for the URL separator version of this method - * that takes a string instead of a PackageDoc. - * - * @param pd the PackageDoc - * @return the platform-dependent directory path for the package - */ - public static String getDirectoryPath(PackageDoc pd) { - return pd == null || pd.name().length() == 0 ? "" : getDirectoryPath(pd.name()); - } - - /** - * Given a package name, return the corresponding directory name - * with the platform-dependent file separator between subdirectory names. - * For example, if name of the package is "java.lang" , then it - * returns "java/lang" on Unix and "java\lang" on Windows. - * If name of the package contains no dot, then the value - * will be returned unchanged. Because package names cannot - * end in a dot, the return value will never end with a slash. - *

    - * Also see getPath for the URL separator version of this method - * that takes a string instead of a PackageDoc. - * - * @param packageName the name of the package - * @return the platform-dependent directory path for the package - */ - public static String getDirectoryPath(String packageName) { - if (packageName == null || packageName.length() == 0) { - return ""; - } - StringBuilder pathstr = new StringBuilder(); - for (int i = 0; i < packageName.length(); i++) { - char ch = packageName.charAt(i); - if (ch == '.') { - pathstr.append(URL_FILE_SEPARATOR); - } else { - pathstr.append(ch); - } - } - if (pathstr.length() > 0 && ! pathstr.toString().endsWith(URL_FILE_SEPARATOR)) { - pathstr.append(URL_FILE_SEPARATOR); - } - return pathstr.toString(); - } - - /** - * Given a package name (a string), return the path string, - * with the URL separator "/" separating the subdirectory names. - * If name of the package contains no dot, then the value - * will be returned unchanged. Because package names cannot - * end in a dot, the return value will never end with a slash. - *

    - * For example if the string is "com.sun.javadoc" then the URL - * path string will be "com/sun/javadoc". - * - * @param name the package name as a String - * @return the String URL path - */ - public static String getPath(String name) { - if (name == null || name.length() == 0) { - return ""; - } - StringBuilder pathstr = new StringBuilder(); - for (int i = 0; i < name.length(); i++) { - char ch = name.charAt(i); - if (ch == '.') { - pathstr.append(URL_FILE_SEPARATOR); - } else { - pathstr.append(ch); - } - } - return pathstr.toString(); - } - - /** - * Given two package names as strings, return the relative path - * from the package directory corresponding to the first string - * to the package directory corresponding to the second string, - * with the URL file separator "/" separating subdirectory names. - *

    - * For example, if the parameter "from" is "java.lang" - * and parameter "to" is "java.applet", return string - * "../../java/applet". - * - * @param from the package name from which path is calculated - * @param to the package name to which path is calculated - * @return relative path between "from" and "to" with URL - * separators - * @see #getRelativePath(String) - * @see #getPath(String) - */ - public static String getRelativePath(String from, String to) { - StringBuilder pathstr = new StringBuilder(); - pathstr.append(getRelativePath(from)); - pathstr.append(getPath(to)); - pathstr.append(URL_FILE_SEPARATOR); - return pathstr.toString(); - } - - /** - * Given a package name as a string, return relative path string - * from the corresponding package directory to the root of - * the documentation, using the URL separator "/" between - * subdirectory names. - *

    - * For example, if the string "from" is "java.lang", - * return "../../" - * - * @param from the package - * @return String relative path from "from". - * @see #getRelativePath(String, String) - */ - public static String getRelativePath(PackageDoc from) { - return from == null || from.name().length() == 0 ? "" : getRelativePath(from.name()); - } - - /** - * Given a package name as a string, return relative path string - * from the corresponding package directory to the root of - * the documentation, using the URL separator "/" between - * subdirectory names. - *

    - * For example, if the string "from" is "java.lang", - * return "../../" - * - * @param from the package name - * @return String relative path from "from". - * @see #getRelativePath(String, String) - */ - public static String getRelativePath(String from) { - if (from == null || from.length() == 0) { - return ""; - } - StringBuilder pathstr = new StringBuilder(); - for (int i = 0; i < from.length(); i++) { - char ch = from.charAt(i); - if (ch == '.') { - pathstr.append(".." + URL_FILE_SEPARATOR); - } - } - pathstr.append(".." + URL_FILE_SEPARATOR); - return pathstr.toString(); - } - - /** - * Given a relative or absolute path that might be empty, - * convert it to a path that does not end with a - * URL separator "/". Used for converting - * HtmlStandardWriter.relativepath when replacing {@docRoot}. - * - * @param path the path to convert. An empty path represents - * the current directory. - */ - public static String getPathNoTrailingSlash(String path) { - if ( path.equals("") ) { - return "."; - } - if ( path.equals("/") ) { - return "/."; - } - if ( path.endsWith("/") ) { - // Remove trailing slash - path = path.substring(0, path.length() -1); - } - return path; - } - - /** - * Given a path string create all the directories in the path. For example, - * if the path string is "java/applet", the method will create directory - * "java" and then "java/applet" if they don't exist. The file separator - * string "/" is platform dependent system property. - * - * @param path Directory path string. - */ - public static void createDirectory(Configuration configuration, - String path) { - if (path == null || path.length() == 0) { - return; - } - File dir = new File(path); - if (dir.exists()) { - return; - } else { - if (dir.mkdirs()) { - return; - } else { - configuration.message.error( - "doclet.Unable_to_create_directory_0", path); - throw new DocletAbortException(); - } - } - } - - /** - * Given a package name and a file name, return the full path to that file. - * For example, if PackageDoc passed is for "java.lang" and the filename - * passed is "package-summary.html", then the string returned is - * "java/lang/package-summary.html". - * - * @param pd PackageDoc. - * @param filename File name to be appended to the path of the package. - */ - public static String getPathToPackage(PackageDoc pd, String filename) { - StringBuilder buf = new StringBuilder(); - String pathstr = createPathString(pd); - if (pathstr.length() > 0) { - buf.append(pathstr); - buf.append(URL_FILE_SEPARATOR); - } - buf.append(filename); - return buf.toString(); - } - - /** - * Given a class name return the full path to the class file. - * For example, if ClassDoc passed is for "java.lang.Object" then the - * string returned is "java/lang/Object.html". - * - * @param cd ClassDoc. - */ - public static String getPathToClass(ClassDoc cd) { - return getPathToPackage(cd.containingPackage(), cd.name() + ".html"); - } - -} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java new file mode 100644 index 00000000000..07daa6c8dab --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.doclets.internal.toolkit.util; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.PackageDoc; +import java.io.File; + +/** + * Abstraction for immutable relative paths. + * Paths always use '/' as a separator, and never begin or end with '/'. + */ +public class DocPath { + private final String path; + + /** The empty path. */ + public static final DocPath empty = new DocPath(""); + + /** The empty path. */ + public static final DocPath parent = new DocPath(".."); + + /** + * Create a path from a string. + */ + public static DocPath create(String p) { + return (p == null) || p.isEmpty() ? empty : new DocPath(p); + } + + /** + * Return the path for a class. + * For example, if the class is java.lang.Object, + * the path is java/lang/Object.html. + */ + public static DocPath forClass(ClassDoc cd) { + return (cd == null) ? empty : + forPackage(cd.containingPackage()).resolve(forName(cd)); + } + + /** + * Return the path for the simple name of the class. + * For example, if the class is java.lang.Object, + * the path is Object.html. + */ + public static DocPath forName(ClassDoc cd) { + return (cd == null) ? empty : new DocPath(cd.name() + ".html"); + } + + /** + * Return the path for the package of a class. + * For example, if the class is java.lang.Object, + * the path is java/lang. + */ + public static DocPath forPackage(ClassDoc cd) { + return (cd == null) ? empty : forPackage(cd.containingPackage()); + } + + /** + * Return the path for a package. + * For example, if the package is java.lang, + * the path is java/lang. + */ + public static DocPath forPackage(PackageDoc pd) { + return (pd == null) ? empty : DocPath.create(pd.name().replace('.', '/')); + } + + /** + * Return the inverse path for a package. + * For example, if the package is java.lang, + * the inverse path is ../... + */ + public static DocPath forRoot(PackageDoc pd) { + String name = (pd == null) ? "" : pd.name(); + if (name.isEmpty()) + return empty; + return new DocPath(name.replace('.', '/').replaceAll("[^/]+", "..")); + } + + /** + * Return the relative path from one package to another. + */ + public static DocPath relativePath(PackageDoc from, PackageDoc to) { + return forRoot(from).resolve(forPackage(to)); + } + + protected DocPath(String p) { + path = (p.endsWith("/") ? p.substring(0, p.length() - 1) : p); + } + + /** @inheritDoc */ + @Override + public boolean equals(Object other) { + return (other instanceof DocPath) && path.equals(((DocPath)other).path); + } + + /** @inheritDoc */ + @Override + public int hashCode() { + return path.hashCode(); + } + + public DocPath basename() { + int sep = path.lastIndexOf("/"); + return (sep == -1) ? this : new DocPath(path.substring(sep + 1)); + } + + public DocPath parent() { + int sep = path.lastIndexOf("/"); + return (sep == -1) ? empty : new DocPath(path.substring(0, sep)); + } + + /** + * Return the path formed by appending the specified string to the current path. + */ + public DocPath resolve(String p) { + if (p == null || p.isEmpty()) + return this; + if (path.isEmpty()) + return new DocPath(p); + return new DocPath(path + "/" + p); + } + + /** + * Return the path by appending the specified path to the current path. + */ + public DocPath resolve(DocPath p) { + if (p == null || p.isEmpty()) + return this; + if (path.isEmpty()) + return p; + return new DocPath(path + "/" + p.getPath()); + } + + /** + * Get the file created by evaluating the path against a specified directory. + */ + // Temporary: this signature should not use String for dir. + // Eventually, this should involve javax.tools.Location. + public File resolveAgainst(String dir) { + return dir.isEmpty() ? new File(path) : new File(dir, path); + } + + /** + * Return the inverse path for this path. + * For example, if the path is a/b/c, the inverse path is ../../.. + */ + public DocPath invert() { + return new DocPath(path.replaceAll("[^/]+", "..")); + } + + /** + * Return true if this path is empty. + */ + public boolean isEmpty() { + return path.isEmpty(); + } + + /** + * Return this path as a string. + */ + // This is provided instead of using toString() to help catch + // unintended use of toString() in string concatenation sequences. + public String getPath() { + return path; + } +} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPaths.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPaths.java new file mode 100644 index 00000000000..2934298975d --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPaths.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.doclets.internal.toolkit.util; + +/** + * Standard DocPath objects. + * + * @since 8 + */ +public class DocPaths { + + /** The name of the file for all classes, using frames. */ + public static final DocPath ALLCLASSES_FRAME = DocPath.create("allclasses-frame.html"); + + /** The name of the file for all classes, without using frames. */ + public static final DocPath ALLCLASSES_NOFRAME = DocPath.create("allclasses-noframe.html"); + + /** The name of the sub-directory for storing class usage info. */ + public static final DocPath CLASS_USE = DocPath.create("class-use"); + + /** The name of the file for constant values. */ + public static final DocPath CONSTANT_VALUES = DocPath.create("constant-values.html"); + + /** The name of the fie for deprecated elements. */ + public static final DocPath DEPRECATED_LIST = DocPath.create("deprecated-list.html"); + + /** The name of the subdirectory for user-provided additional documentation files. */ + public static final DocPath DOC_FILES = DocPath.create("doc-files"); + + /** The name of the file for help info. */ + public static final DocPath HELP_DOC = DocPath.create("help-doc.html"); + + /** The name of the main index file. */ + public static final DocPath INDEX = DocPath.create("index.html"); + + /** The name of the single index file for all classes. */ + public static final DocPath INDEX_ALL = DocPath.create("index-all.html"); + + /** The name of the directory for the split index files. */ + public static final DocPath INDEX_FILES = DocPath.create("index-files"); + + /** Generate the name of one of the files in the split index. */ + public static final DocPath indexN(int n) { + return DocPath.create("index-" + n + ".html"); + } + + /** The name of the file for the overview frame. */ + public static final DocPath OVERVIEW_FRAME = DocPath.create("overview-frame.html"); + + /** The name of the file for the overview summary. */ + public static final DocPath OVERVIEW_SUMMARY = DocPath.create("overview-summary.html"); + + /** The name of the file for the overview tree. */ + public static final DocPath OVERVIEW_TREE = DocPath.create("overview-tree.html"); + + /** The name of the file for the package frame. */ + public static final DocPath PACKAGE_FRAME = DocPath.create("package-frame.html"); + + /** The name of the file for the package list. */ + public static final DocPath PACKAGE_LIST = DocPath.create("package-list"); + + /** The name of the file for the package summary. */ + public static final DocPath PACKAGE_SUMMARY = DocPath.create("package-summary.html"); + + /** The name of the file for the package tree. */ + public static final DocPath PACKAGE_TREE = DocPath.create("package-tree.html"); + + /** The name of the file for the package usage info. */ + public static final DocPath PACKAGE_USE = DocPath.create("package-use.html"); + + /** The name of the directory in which resources are generated. + * Also the name of the sub-package from which resources are read. + */ + public static final DocPath RESOURCES = DocPath.create("resources"); + + /** The name of the file for the serialized form info. */ + public static final DocPath SERIALIZED_FORM = DocPath.create("serialized-form.html"); + + /** The name of the directory in which HTML versions of the source code + * are generated. + */ + public static final DocPath SOURCE_OUTPUT = DocPath.create("src-html"); + + /** The name of the default stylesheet. */ + public static final DocPath STYLESHEET = DocPath.create("stylesheet.css"); + +} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java index 8f0fd4c446e..878a06bcb3c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java @@ -39,6 +39,16 @@ package com.sun.tools.doclets.internal.toolkit.util; */ public class DocletConstants { + /** + * The default amount of space between tab stops. + */ + public static final int DEFAULT_TAB_STOP_LENGTH = 8; + + /** + * The line separator for the current operating system. + */ + public static final String NL = System.getProperty("line.separator"); + /** * The default package name. */ @@ -53,34 +63,4 @@ public class DocletConstants { * The anchor for the default package. */ public static final String UNNAMED_PACKAGE_ANCHOR = "unnamed_package"; - - /** - * The name of the doc files directory. - */ - public static final String DOC_FILES_DIR_NAME = "doc-files"; - - /** - * The default amount of space between tab stops. - */ - public static final int DEFAULT_TAB_STOP_LENGTH = 8; - - /** - * The name of the directory where we will copy resource files to. - */ - public static final String RESOURE_DIR_NAME = "resources"; - - /** - * The source output directory name - */ - public static final String SOURCE_OUTPUT_DIR_NAME = "src-html/"; - - /** - * The name of the package list file. - */ - public static final String PACKAGE_LIST_FILE_NAME = "package-list"; - - /** - * The line seperator for the current operating system. - */ - public static final String NL = System.getProperty("line.separator"); } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java index 5c1cf1bec24..f4b1f8738ce 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java @@ -142,12 +142,15 @@ public class Extern { * @return if external return converted link else return null */ public String getExternalLink(String pkgName, - String relativepath, String link) { + DocPath relativepath, String link) { Item fnd = findPackageItem(pkgName); if (fnd != null) { String externlink = fnd.path + link; if (fnd.relative) { // it's a relative path. - return relativepath + externlink; + if (relativepath.isEmpty()) + return externlink; + else + return relativepath.getPath() + "/" + externlink; } else { return externlink; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java index 4586deea9ce..fa150401f8b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java @@ -52,8 +52,7 @@ public class PackageListWriter extends PrintWriter { * @param configuration the current configuration of the doclet. */ public PackageListWriter(Configuration configuration) throws IOException { - super(Util.genWriter(configuration, configuration.destDirName, - DocletConstants.PACKAGE_LIST_FILE_NAME, configuration.docencoding)); + super(Util.genWriter(configuration, DocPaths.PACKAGE_LIST)); this.configuration = configuration; } @@ -71,7 +70,7 @@ public class PackageListWriter extends PrintWriter { packgen.close(); } catch (IOException exc) { configuration.message.error("doclet.exception_encountered", - exc.toString(), DocletConstants.PACKAGE_LIST_FILE_NAME); + exc.toString(), DocPaths.PACKAGE_LIST); throw new DocletAbortException(); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java index 64c9d7e5fd5..9a9d9535dfe 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,8 +38,7 @@ import java.io.File; * * @author Atul M Dambalkar */ -public - class SourcePath { +public class SourcePath { private final char dirSeparator = File.pathSeparatorChar; /** @@ -114,9 +113,9 @@ public * @param name Name of the directory to be searched for in the source path. * @return File Return the directory if found else return null. */ - public File getDirectory(String name) { + public File getDirectory(DocPath p) { for (int i = 0; i < sourcePath.length; i++) { - File directoryNeeded = new File(sourcePath[i], name); + File directoryNeeded = new File(sourcePath[i], p.getPath()); if (directoryNeeded.isDirectory()) { return directoryNeeded; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java index c01ac3e58f5..f1e8e842192 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java @@ -51,11 +51,6 @@ public class Util { public static final String[][] HTML_ESCAPE_CHARS = {{"&", "&"}, {"<", "<"}, {">", ">"}}; - /** - * Name of the resource directory. - */ - public static final String RESOURCESDIR = "resources"; - /** * Return array of class members whose documentation is to be generated. * If the member is deprecated do not include such a member in the @@ -236,26 +231,20 @@ public class Util { * @param overwrite Overwrite files if true. */ public static void copyDocFiles(Configuration configuration, - String path, String dir, boolean overwrite) { + File path, DocPath dir, boolean overwrite) { if (checkCopyDocFilesErrors(configuration, path, dir)) { return; } - String destname = configuration.docFileDestDirName; - File srcdir = new File(path + dir); - if (destname.length() > 0 && !destname.endsWith( - DirectoryManager.URL_FILE_SEPARATOR)) { - destname += DirectoryManager.URL_FILE_SEPARATOR; - } - String dest = destname + dir; + File srcdir = new File(path, dir.getPath()); + File destdir = new File(configuration.docFileDestDirName, dir.getPath()); try { - File destdir = new File(dest); - DirectoryManager.createDirectory(configuration, dest); + createDirectory(configuration, destdir); String[] files = srcdir.list(); for (int i = 0; i < files.length; i++) { File srcfile = new File(srcdir, files[i]); File destfile = new File(destdir, files[i]); if (srcfile.isFile()) { - if(destfile.exists() && ! overwrite) { + if (destfile.exists() && ! overwrite) { configuration.message.warning((SourcePosition) null, "doclet.Copy_Overwrite_warning", srcfile.toString(), destdir.toString()); @@ -265,12 +254,11 @@ public class Util { srcfile.toString(), destdir.toString()); Util.copyFile(destfile, srcfile); } - } else if(srcfile.isDirectory()) { - if(configuration.copydocfilesubdirs + } else if (srcfile.isDirectory()) { + if (configuration.copydocfilesubdirs && ! configuration.shouldExcludeDocFileDir( srcfile.getName())){ - copyDocFiles(configuration, path, dir + - DirectoryManager.URL_FILE_SEPARATOR + srcfile.getName(), + copyDocFiles(configuration, path, dir.resolve(files[i]), overwrite); } } @@ -290,7 +278,7 @@ public class Util { * @param dirName The original directory name to copy from. */ private static boolean checkCopyDocFilesErrors (Configuration configuration, - String path, String dirName) { + File path, DocPath dirName) { if ((configuration.sourcepath == null || configuration.sourcepath.length() == 0) && (configuration.destDirName == null || configuration.destDirName.length() == 0)) { //The destination path and source path are definitely equal. @@ -309,7 +297,7 @@ public class Util { } } //Make sure the doc-file being copied exists. - File srcdir = new File(path + dirName); + File srcdir = new File(path, dirName.getPath()); if (! srcdir.exists()) { return true; } @@ -330,8 +318,7 @@ public class Util { */ public static void copyResourceFile(Configuration configuration, String resourcefile, boolean overwrite) { - String destresourcesdir = configuration.destDirName + RESOURCESDIR; - copyFile(configuration, resourcefile, RESOURCESDIR, destresourcesdir, + copyFile(configuration, resourcefile, DocPaths.RESOURCES, DocPaths.RESOURCES, overwrite, false); } @@ -350,15 +337,24 @@ public class Util { * @param replaceNewLine true if the newline needs to be replaced with platform- * specific newline. */ + public static void copyFile(Configuration configuration, String file, DocPath source, + DocPath destination, boolean overwrite, boolean replaceNewLine) { + copyFile(configuration, file, source.getPath(), destination.getPath(), + overwrite, replaceNewLine); + } + public static void copyFile(Configuration configuration, String file, String source, String destination, boolean overwrite, boolean replaceNewLine) { - DirectoryManager.createDirectory(configuration, destination); - File destfile = new File(destination, file); - if(destfile.exists() && (! overwrite)) return; + File destdir = configuration.destDirName.isEmpty() ? + (destination.isEmpty() ? null : new File(destination)) : + new File(configuration.destDirName, destination); + File destfile = (destdir == null) ? new File(file) : new File(destdir, file); + createDirectory(configuration, destfile.getParentFile()); + if (destfile.exists() && (! overwrite)) return; try { InputStream in = Configuration.class.getResourceAsStream( - source + DirectoryManager.URL_FILE_SEPARATOR + file); - if(in==null) return; + source + '/' + file); + if (in == null) return; OutputStream out = new FileOutputStream(destfile); try { if (!replaceNewLine) { @@ -395,27 +391,47 @@ public class Util { } } + /** + * Given a path string create all the directories in the path. For example, + * if the path string is "java/applet", the method will create directory + * "java" and then "java/applet" if they don't exist. The file separator + * string "/" is platform dependent system property. + * + * @param path Directory path string. + */ + public static void createDirectory(Configuration configuration, File dir) { + if (dir == null) { + return; + } + if (dir.exists()) { + return; + } else { + if (dir.mkdirs()) { + return; + } else { + configuration.message.error( + "doclet.Unable_to_create_directory_0", dir.getPath()); + throw new DocletAbortException(); + } + } + } + /** * Given a PackageDoc, return the source path for that package. * @param configuration The Configuration for the current Doclet. - * @param pkgDoc The package to seach the path for. + * @param pkgDoc The package to search the path for. * @return A string representing the path to the given package. */ - public static String getPackageSourcePath(Configuration configuration, - PackageDoc pkgDoc){ - try{ - String pkgPath = DirectoryManager.getDirectoryPath(pkgDoc); - String completePath = new SourcePath(configuration.sourcepath). - getDirectory(pkgPath) + DirectoryManager.URL_FILE_SEPARATOR; - //Make sure that both paths are using the same separators. - completePath = Util.replaceText(completePath, File.separator, - DirectoryManager.URL_FILE_SEPARATOR); - pkgPath = Util.replaceText(pkgPath, File.separator, - DirectoryManager.URL_FILE_SEPARATOR); - return completePath.substring(0, completePath.lastIndexOf(pkgPath)); - } catch (Exception e){ - return ""; - } + public static File getPackageSourcePath(Configuration configuration, + PackageDoc pkgDoc) { + DocPath pkgPath = DocPath.forPackage(pkgDoc); + File pkgDir = new SourcePath(configuration.sourcepath).getDirectory(pkgPath); + if (pkgDir == null) + return null; + //Make sure that both paths are using the same separators. + String completePath = Util.replaceText(pkgDir.getPath(), File.separator, "/"); + String pathForPkg = completePath.substring(0, completePath.lastIndexOf(pkgPath.getPath())); + return new File(pathForPkg); } /** @@ -552,7 +568,7 @@ public class Util { } /** - * Given a package, return it's name. + * Given a package, return its name. * @param packageDoc the package to check. * @return the name of the given package. */ @@ -562,7 +578,7 @@ public class Util { } /** - * Given a package, return it's file name without the extension. + * Given a package, return its file name without the extension. * @param packageDoc the package to check. * @return the file name of the given package. */ @@ -572,7 +588,7 @@ public class Util { } /** - * Given a string, replace all occurraces of 'newStr' with 'oldStr'. + * Given a string, replace all occurrences of 'newStr' with 'oldStr'. * @param originalStr the string to modify. * @param oldStr the string to replace. * @param newStr the string to insert in place of the old string. @@ -637,22 +653,15 @@ public class Util { * @see java.io.FileOutputStream * @see java.io.OutputStreamWriter */ - public static Writer genWriter(Configuration configuration, - String path, String filename, - String docencoding) - throws IOException, UnsupportedEncodingException { - FileOutputStream fos; - if (path != null) { - DirectoryManager.createDirectory(configuration, path); - fos = new FileOutputStream(((path.length() > 0)? - path + File.separator: "") + filename); - } else { - fos = new FileOutputStream(filename); - } - if (docencoding == null) { + public static Writer genWriter(Configuration configuration, DocPath path) + throws IOException, UnsupportedEncodingException { + File file = path.resolveAgainst(configuration.destDirName); + createDirectory(configuration, file.getParentFile()); + FileOutputStream fos = new FileOutputStream(file); + if (configuration.docencoding == null) { return new BufferedWriter(new OutputStreamWriter(fos)); } else { - return new BufferedWriter(new OutputStreamWriter(fos, docencoding)); + return new BufferedWriter(new OutputStreamWriter(fos, configuration.docencoding)); } } diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java b/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java index 559be36a7de..76dc6a08fd7 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java @@ -237,6 +237,9 @@ class SerializedForm { SerialFieldTag[] sfTag = spfDoc.serialFieldTags(); for (int i = 0; i < sfTag.length; i++) { + if (sfTag[i].fieldName() == null || sfTag[i].fieldType() == null) // ignore malformed @serialField tags + continue; + Name fieldName = names.fromString(sfTag[i].fieldName()); // Look for a FieldDocImpl that is documented by serialFieldTagImpl. diff --git a/langtools/test/com/sun/javadoc/testIndex/TestIndex.java b/langtools/test/com/sun/javadoc/testIndex/TestIndex.java index f38982807fa..ae916ba4040 100644 --- a/langtools/test/com/sun/javadoc/testIndex/TestIndex.java +++ b/langtools/test/com/sun/javadoc/testIndex/TestIndex.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,28 +53,28 @@ public class TestIndex extends JavadocTester { //Test index-all.html {BUG_ID + FS + "index-all.html", - "C" + - " - Class in pkg"}, + "C" + + " - Class in pkg"}, {BUG_ID + FS + "index-all.html", - "" + + "" + "Interface - Interface in " + - "pkg"}, + "pkg"}, {BUG_ID + FS + "index-all.html", - "" + + "" + "AnnotationType - Annotation Type in " + - "pkg"}, + "pkg"}, {BUG_ID + FS + "index-all.html", - "" + + "" + "Coin - Enum in " + - "pkg"}, + "pkg"}, {BUG_ID + FS + "index-all.html", - "Class in <Unnamed>"}, + "Class in <Unnamed>"}, {BUG_ID + FS + "index-all.html", - "

    " + NL + "
    " + - "Java - Static variable in class pkg." + NL + "
    " + + "Java - Static variable in class pkg.C
    " + NL + "
     
    " + NL + - "
    JDK " + - "- Static variable in class pkg." + + "
    JDK " + + "- Static variable in class pkg." + "C
    " + NL + "
     
    " + NL + "
    "}, }; private static final String[][] NEGATED_TEST = NO_TEST; diff --git a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java index 059393768a2..0ad0d86e84e 100644 --- a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java +++ b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -663,14 +663,14 @@ public class TestNewLanguageFeatures extends JavadocTester { // TYPE PARAMETER IN INDEX //================================= {BUG_ID + FS + "index-all.html", - "" + + "" + "method(Vector<Object>)" }, //================================= // TYPE PARAMETER IN INDEX //================================= {BUG_ID + FS + "index-all.html", - "" + + "" + "method(Vector<Object>)" }, }; diff --git a/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java b/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java index da0a87f72c5..06cb6eefba9 100644 --- a/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java +++ b/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ public class TestPackagePage extends JavadocTester { "
  • Package
  • " }, {BUG_ID + "-1" + FS + "index-all.html", - "
  • Package
  • " + "
  • Package
  • " }, {BUG_ID + "-1" + FS + "help-doc.html", "
  • Package
  • " From ce1db67272b544d0f1a3b0b4d31da11e8890b65b Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 23 Oct 2012 13:58:56 -0700 Subject: [PATCH 089/241] 8000416: refactor javadoc to provide and use an abstraction for relative URIs Reviewed-by: darcy --- .../html/AnnotationTypeWriterImpl.java | 6 +- .../doclets/formats/html/ClassUseWriter.java | 6 +- .../doclets/formats/html/ClassWriterImpl.java | 6 +- .../html/ConstantsSummaryWriterImpl.java | 8 +- .../formats/html/HtmlDocletWriter.java | 87 +++++++++-------- .../doclets/formats/html/LinkFactoryImpl.java | 5 +- .../formats/html/PackageIndexFrameWriter.java | 6 +- .../formats/html/PackageIndexWriter.java | 2 +- .../formats/html/PackageTreeWriter.java | 2 +- .../formats/html/PackageUseWriter.java | 8 +- .../formats/html/PackageWriterImpl.java | 10 +- .../formats/html/SplitIndexWriter.java | 4 +- .../formats/html/TagletWriterImpl.java | 19 ++-- .../doclets/formats/html/TreeWriter.java | 2 +- .../formats/html/markup/HtmlDocWriter.java | 77 +++++++-------- .../internal/toolkit/util/DocLink.java | 97 +++++++++++++++++++ .../internal/toolkit/util/DocPath.java | 13 +++ .../doclets/internal/toolkit/util/Extern.java | 31 +++--- 18 files changed, 253 insertions(+), 136 deletions(-) create mode 100644 langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocLink.java 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 c804fc9a5de..636522e0cc3 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 @@ -81,7 +81,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -103,7 +103,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * @return a content tree for the class use link */ protected Content getNavLinkClassUse() { - Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), "", useLabel); + Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), useLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -287,7 +287,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter */ protected Content getNavLinkTree() { Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE, - "", treeLabel, "", ""); + treeLabel, "", ""); Content li = HtmlTree.LI(treeLinkContent); return li; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java index 05317cabe8a..5f8001b6fb4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java @@ -465,7 +465,7 @@ public class ClassUseWriter extends SubWriterHolderWriter { */ protected Content getNavLinkPackage() { Content linkContent = - getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_SUMMARY), "", packageLabel); + getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_SUMMARY), packageLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -500,8 +500,8 @@ public class ClassUseWriter extends SubWriterHolderWriter { */ protected Content getNavLinkTree() { Content linkContent = classdoc.containingPackage().isIncluded() ? - getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_TREE), "", treeLabel) : - getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), "", treeLabel); + getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_TREE), treeLabel) : + getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), treeLabel); Content li = HtmlTree.LI(linkContent); return li; } 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 14cf47a1c68..78d8ca88b2c 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 @@ -87,7 +87,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -109,7 +109,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter * @return a content tree for the class use link */ protected Content getNavLinkClassUse() { - Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), "", useLabel); + Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), useLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -565,7 +565,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter */ protected Content getNavLinkTree() { Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE, - "", treeLabel, "", ""); + treeLabel, "", ""); Content li = HtmlTree.LI(treeLinkContent); return li; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java index cd55f087ee3..ec98f180410 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java @@ -107,13 +107,13 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter //add link to summary Content link; if (packageName.length() == 0) { - link = getHyperLink("#" + DocletConstants.UNNAMED_PACKAGE_ANCHOR, - "", defaultPackageLabel, "", ""); + link = getHyperLink(DocLink.fragment(DocletConstants.UNNAMED_PACKAGE_ANCHOR), + defaultPackageLabel, "", ""); } else { Content packageNameContent = getPackageLabel(parsedPackageName); packageNameContent.addContent(".*"); - link = getHyperLink("#" + parsedPackageName, - "", packageNameContent, "", ""); + link = getHyperLink(DocLink.fragment(parsedPackageName), + packageNameContent, "", ""); printedPackageHeaders.add(parsedPackageName); } contentListTree.addContent(HtmlTree.LI(link)); 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 ccaaa463a7f..69b6d8c7dc1 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 @@ -287,7 +287,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ public Content getTargetPackageLink(PackageDoc pd, String target, Content label) { - return getHyperLink(pathString(pd, DocPaths.PACKAGE_SUMMARY), "", label, "", target); + return getHyperLink(pathString(pd, DocPaths.PACKAGE_SUMMARY), label, "", target); } /** @@ -407,9 +407,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { allClassesId += "navbar_top"; Content a = getMarkerAnchor("navbar_top"); navDiv.addContent(a); - Content skipLinkContent = getHyperLink("", - "skip-navbar_top", HtmlTree.EMPTY, configuration.getText( - "doclet.Skip_navigation_links"), ""); + Content skipLinkContent = getHyperLink(DocLink.fragment("skip-navbar_top"), + HtmlTree.EMPTY, + configuration.getText("doclet.Skip_navigation_links"), + ""); navDiv.addContent(skipLinkContent); } else { body.addContent(HtmlConstants.START_OF_BOTTOM_NAVBAR); @@ -417,9 +418,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { allClassesId += "navbar_bottom"; Content a = getMarkerAnchor("navbar_bottom"); navDiv.addContent(a); - Content skipLinkContent = getHyperLink("", - "skip-navbar_bottom", HtmlTree.EMPTY, configuration.getText( - "doclet.Skip_navigation_links"), ""); + Content skipLinkContent = getHyperLink(DocLink.fragment("skip-navbar_bottom"), + HtmlTree.EMPTY, + configuration.getText("doclet.Skip_navigation_links"), + ""); navDiv.addContent(skipLinkContent); } if (header) { @@ -515,7 +517,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ protected Content getNavLinkContents() { Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_SUMMARY), - "", overviewLabel, "", ""); + overviewLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; } @@ -562,7 +564,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { public Content getNavLinkPrevious(DocPath prev) { Content li; if (prev != null) { - li = HtmlTree.LI(getHyperLink(prev, "", prevLabel, "", "")); + li = HtmlTree.LI(getHyperLink(prev, prevLabel, "", "")); } else li = HtmlTree.LI(prevLabel); @@ -579,7 +581,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { public Content getNavLinkNext(DocPath next) { Content li; if (next != null) { - li = HtmlTree.LI(getHyperLink(next, "", nextLabel, "", "")); + li = HtmlTree.LI(getHyperLink(next, nextLabel, "", "")); } else li = HtmlTree.LI(nextLabel); @@ -593,8 +595,8 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavShowLists(DocPath link) { - Content framesContent = getHyperLink(link.getPath() + "?" + path.getPath(), - "", framesLabel, "", "_top"); + DocLink dl = new DocLink(link, path.getPath(), null); + Content framesContent = getHyperLink(dl, framesLabel, "", "_top"); Content li = HtmlTree.LI(framesContent); return li; } @@ -615,7 +617,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavHideLists(DocPath link) { - Content noFramesContent = getHyperLink(link, "", noframesLabel, "", "_top"); + Content noFramesContent = getHyperLink(link, noframesLabel, "", "_top"); Content li = HtmlTree.LI(noFramesContent); return li; } @@ -633,11 +635,11 @@ public class HtmlDocletWriter extends HtmlDocWriter { PackageDoc[] packages = configuration.root.specifiedPackages(); if (packages.length == 1 && configuration.root.specifiedClasses().length == 0) { treeLinkContent = getHyperLink(pathString(packages[0], - DocPaths.PACKAGE_TREE), "", treeLabel, + DocPaths.PACKAGE_TREE), treeLabel, "", ""); } else { treeLinkContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), - "", treeLabel, "", ""); + treeLabel, "", ""); } Content li = HtmlTree.LI(treeLinkContent); return li; @@ -673,7 +675,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ protected Content getNavLinkDeprecated() { Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.DEPRECATED_LIST), - "", deprecatedLabel, "", ""); + deprecatedLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; } @@ -687,7 +689,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ protected Content getNavLinkClassIndex() { Content allClassesContent = getHyperLink(pathToRoot.resolve( - DocPaths.ALLCLASSES_NOFRAME), "", + DocPaths.ALLCLASSES_NOFRAME), allclassesLabel, "", ""); Content li = HtmlTree.LI(allClassesContent); return li; @@ -702,7 +704,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { Content linkContent = getHyperLink(pathToRoot.resolve( (configuration.splitindex ? DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1)) - : DocPaths.INDEX_ALL)), "", + : DocPaths.INDEX_ALL)), indexLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; @@ -723,7 +725,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { } else { helpfilenm = DocPath.create(new File(helpfile).getName()); } - Content linkContent = getHyperLink(pathToRoot.resolve(helpfilenm), "", + Content linkContent = getHyperLink(pathToRoot.resolve(helpfilenm), helpLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; @@ -917,11 +919,11 @@ public class HtmlDocletWriter extends HtmlDocWriter { } if (included || pkg == null) { return getHyperLinkString(pathString(pkg, DocPaths.PACKAGE_SUMMARY), - "", label, isStrong, style); + label, isStrong, style); } else { - String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); + DocLink crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); if (crossPkgLink != null) { - return getHyperLinkString(/*TEMP*/ DocPath.create(crossPkgLink), "", label, isStrong, style); + return getHyperLinkString(crossPkgLink, label, isStrong, style); } else { return label; } @@ -948,11 +950,11 @@ public class HtmlDocletWriter extends HtmlDocWriter { } if (included || pkg == null) { return getHyperLink(pathString(pkg, DocPaths.PACKAGE_SUMMARY), - "", label); + label); } else { - String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); + DocLink crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); if (crossPkgLink != null) { - return getHyperLink(/*TEMP*/ DocPath.create(crossPkgLink), "", label); + return getHyperLink(crossPkgLink, label); } else { return label; } @@ -983,7 +985,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { DocPath href = pathToRoot .resolve(DocPaths.SOURCE_OUTPUT) .resolve(DocPath.forClass(cd)); - Content linkContent = getHyperLink(href, SourceToHTMLConverter.getAnchorName(doc), label, "", ""); + Content linkContent = getHyperLink(href.fragment(SourceToHTMLConverter.getAnchorName(doc)), label, "", ""); htmltree.addContent(linkContent); } @@ -996,7 +998,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ public String getLink(LinkInfoImpl linkInfo) { LinkFactoryImpl factory = new LinkFactoryImpl(this); - String link = ((LinkOutputImpl) factory.getLinkOutput(linkInfo)).toString(); + String link = factory.getLinkOutput(linkInfo).toString(); displayLength += linkInfo.displayLength; return link; } @@ -1009,8 +1011,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ public String getTypeParameterLinks(LinkInfoImpl linkInfo) { LinkFactoryImpl factory = new LinkFactoryImpl(this); - return ((LinkOutputImpl) - factory.getTypeParameterLinks(linkInfo, false)).toString(); + return factory.getTypeParameterLinks(linkInfo, false).toString(); } /************************************************************* @@ -1030,10 +1031,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { public String getCrossClassLink(String qualifiedClassName, String refMemName, String label, boolean strong, String style, boolean code) { - String className = "", - packageName = qualifiedClassName == null ? "" : qualifiedClassName; + String className = ""; + String packageName = qualifiedClassName == null ? "" : qualifiedClassName; int periodIndex; - while((periodIndex = packageName.lastIndexOf('.')) != -1) { + while ((periodIndex = packageName.lastIndexOf('.')) != -1) { className = packageName.substring(periodIndex + 1, packageName.length()) + (className.length() > 0 ? "." + className : ""); String defaultLabel = code ? codeText(className) : className; @@ -1044,11 +1045,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { //the -link option. There are ways to determine if an external package //exists, but no way to determine if the external class exists. We just //have to assume that it does. - return getHyperLinkString( - configuration.extern.getExternalLink(packageName, pathToRoot, - className + ".html?is-external=true"), - refMemName == null ? "" : refMemName, - label == null || label.length() == 0 ? defaultLabel : label, + DocLink link = configuration.extern.getExternalLink(packageName, pathToRoot, + className + ".html", refMemName); + return getHyperLinkString(link, + (label == null) || label.length() == 0 ? defaultLabel : label, + + strong, style, configuration.getText("doclet.Href_Class_Or_Interface_Title", packageName), ""); @@ -1064,9 +1066,9 @@ public class HtmlDocletWriter extends HtmlDocWriter { return configuration.extern.isExternal(cd); } - public String getCrossPackageLink(String pkgName) { + public DocLink getCrossPackageLink(String pkgName) { return configuration.extern.getExternalLink(pkgName, pathToRoot, - "package-summary.html?is-external=true"); + DocPaths.PACKAGE_SUMMARY.getPath()); } /** @@ -1094,7 +1096,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Retrieve the class link with the package portion of the label in - * plain text. If the qualifier is excluded, it willnot be included in the + * plain text. If the qualifier is excluded, it will not be included in the * link label. * * @param cd the class to link to. @@ -1278,10 +1280,11 @@ public class HtmlDocletWriter extends HtmlDocWriter { return getPackageLinkString(refPackage, label, false); } else { //@see is not referencing an included class or package. Check for cross links. - String classCrossLink, packageCrossLink = getCrossPackageLink(refClassName); + String classCrossLink; + DocLink packageCrossLink = getCrossPackageLink(refClassName); if (packageCrossLink != null) { //Package cross link found - return getHyperLinkString(/*TEMP*/ DocPath.create(packageCrossLink), "", + return getHyperLinkString(packageCrossLink, (label.isEmpty() ? text : label), false); } else if ((classCrossLink = getCrossClassLink(refClassName, refMemName, label, false, "", !plain)) != null) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java index 3052f61e7e3..f0d0707be0d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java @@ -81,8 +81,9 @@ public class LinkFactoryImpl extends LinkFactory { DocPath filename = getPath(classLinkInfo); if (linkInfo.linkToSelf || !(DocPath.forName(classDoc)).equals(m_writer.filename)) { - linkOutput.append(m_writer.getHyperLinkString(filename, - classLinkInfo.where, label.toString(), + linkOutput.append(m_writer.getHyperLinkString( + filename.fragment(classLinkInfo.where), + label.toString(), classLinkInfo.isStrong, classLinkInfo.styleName, title, classLinkInfo.target)); if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java index f5a1b1c5212..6e066a8a3a0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java @@ -109,12 +109,12 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { if (pd.name().length() > 0) { packageLabel = getPackageLabel(pd.name()); packageLinkContent = getHyperLink(pathString(pd, - DocPaths.PACKAGE_FRAME), "", packageLabel, "", + DocPaths.PACKAGE_FRAME), packageLabel, "", "packageFrame"); } else { packageLabel = new RawHtml("<unnamed package>"); packageLinkContent = getHyperLink(DocPaths.PACKAGE_FRAME, - "", packageLabel, "", "packageFrame"); + packageLabel, "", "packageFrame"); } Content li = HtmlTree.LI(packageLinkContent); return li; @@ -148,7 +148,7 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { * @param body the Content object to which the all classes link should be added */ protected void addAllClassesLink(Content body) { - Content linkContent = getHyperLink(DocPaths.ALLCLASSES_FRAME, "", + Content linkContent = getHyperLink(DocPaths.ALLCLASSES_FRAME, allclassesLabel, "", "packageFrame"); Content div = HtmlTree.DIV(HtmlStyle.indexHeader, linkContent); body.addContent(div); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java index 15acb974d73..77d2bae2fe4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java @@ -178,7 +178,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { Content see = seeLabel; see.addContent(" "); Content descPara = HtmlTree.P(see); - Content descLink = getHyperLink("", "overview_description", + Content descLink = getHyperLink(DocLink.fragment("overview_description"), descriptionLabel, "", ""); descPara.addContent(descLink); div.addContent(descPara); 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 30147f86916..e95c370502c 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 @@ -198,7 +198,7 @@ public class PackageTreeWriter extends AbstractTreeWriter { * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, packageLabel); Content li = HtmlTree.LI(linkContent); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java index a43ad38ddf6..4545484e451 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java @@ -230,10 +230,10 @@ public class PackageUseWriter extends SubWriterHolderWriter { */ protected void addClassRow(ClassDoc usedClass, String packageName, Content contentTree) { - DocPath path = pathString(usedClass, + DocPath dp = pathString(usedClass, DocPaths.CLASS_USE.resolve(DocPath.forName(usedClass))); Content td = HtmlTree.TD(HtmlStyle.colOne, - getHyperLink(path, packageName, new StringContent(usedClass.name()))); + getHyperLink(dp.fragment(packageName), new StringContent(usedClass.name()))); addIndexComment(usedClass, td); contentTree.addContent(td); } @@ -286,7 +286,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -308,7 +308,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { * @return a content tree for the tree link */ protected Content getNavLinkTree() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_TREE, "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_TREE, treeLabel); Content li = HtmlTree.LI(linkContent); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java index 0153ca6abc3..64f367e62e3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java @@ -112,7 +112,7 @@ public class PackageWriterImpl extends HtmlDocletWriter addSummaryComment(packageDoc, docSummaryDiv); div.addContent(docSummaryDiv); Content space = getSpace(); - Content descLink = getHyperLink("", "package_description", + Content descLink = getHyperLink(DocLink.fragment("package_description"), descriptionLabel, "", ""); Content descPara = new HtmlTree(HtmlTag.P, seeLabel, space, descLink); div.addContent(descPara); @@ -250,7 +250,7 @@ public class PackageWriterImpl extends HtmlDocletWriter * @return a content tree for the class use link */ protected Content getNavLinkClassUse() { - Content useLink = getHyperLink(DocPaths.PACKAGE_USE, "", + Content useLink = getHyperLink(DocPaths.PACKAGE_USE, useLabel, "", ""); Content li = HtmlTree.LI(useLink); return li; @@ -267,7 +267,7 @@ public class PackageWriterImpl extends HtmlDocletWriter li = HtmlTree.LI(prevpackageLabel); } else { DocPath path = DocPath.relativePath(packageDoc, prev); - li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), "", + li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), prevpackageLabel, "", "")); } return li; @@ -284,7 +284,7 @@ public class PackageWriterImpl extends HtmlDocletWriter li = HtmlTree.LI(nextpackageLabel); } else { DocPath path = DocPath.relativePath(packageDoc, next); - li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), "", + li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), nextpackageLabel, "", "")); } return li; @@ -297,7 +297,7 @@ public class PackageWriterImpl extends HtmlDocletWriter * @return a content tree for the tree link */ protected Content getNavLinkTree() { - Content useLink = getHyperLink(DocPaths.PACKAGE_TREE, "", + Content useLink = getHyperLink(DocPaths.PACKAGE_TREE, treeLabel, "", ""); Content li = HtmlTree.LI(useLink); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java index 94b407f4101..d4deedc21f7 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java @@ -158,7 +158,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { return HtmlTree.LI(prevletterLabel); } else { - Content prevLink = getHyperLink(DocPaths.indexN(prev), "", + Content prevLink = getHyperLink(DocPaths.indexN(prev), prevletterLabel); return HtmlTree.LI(prevLink); } @@ -175,7 +175,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { return HtmlTree.LI(nextletterLabel); } else { - Content nextLink = getHyperLink(DocPaths.indexN(next), "", + Content nextLink = getHyperLink(DocPaths.indexN(next), nextletterLabel); return HtmlTree.LI(nextLink); } 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 639ea585a82..ce158d443d0 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 @@ -172,19 +172,24 @@ public class TagletWriterImpl extends TagletWriter { htmlWriter instanceof ClassWriterImpl) { //Automatically add link to constant values page for constant fields. result = addSeeHeader(result); - result += htmlWriter.getHyperLinkString(htmlWriter.pathToRoot.resolve( - DocPaths.CONSTANT_VALUES), - ((ClassWriterImpl) htmlWriter).getClassDoc().qualifiedName() - + "." + ((FieldDoc) holder).name(), - htmlWriter.configuration.getText("doclet.Constants_Summary"), false); + DocPath constantsPath = + htmlWriter.pathToRoot.resolve(DocPaths.CONSTANT_VALUES); + String whichConstant = + ((ClassWriterImpl) htmlWriter).getClassDoc().qualifiedName() + "." + ((FieldDoc) holder).name(); + DocLink link = constantsPath.fragment(whichConstant); + result += htmlWriter.getHyperLinkString(link, + htmlWriter.configuration.getText("doclet.Constants_Summary"), + false); } if (holder.isClass() && ((ClassDoc)holder).isSerializable()) { //Automatically add link to serialized form page for serializable classes. if ((SerializedFormBuilder.serialInclude(holder) && SerializedFormBuilder.serialInclude(((ClassDoc)holder).containingPackage()))) { result = addSeeHeader(result); - result += htmlWriter.getHyperLinkString(htmlWriter.pathToRoot.resolve(DocPaths.SERIALIZED_FORM), - ((ClassDoc)holder).qualifiedName(), htmlWriter.configuration.getText("doclet.Serialized_Form"), false); + DocPath serialPath = htmlWriter.pathToRoot.resolve(DocPaths.SERIALIZED_FORM); + DocLink link = serialPath.fragment(((ClassDoc)holder).qualifiedName()); + result += htmlWriter.getHyperLinkString(link, + htmlWriter.configuration.getText("doclet.Serialized_Form"), false); } } return result.equals("") ? null : new TagletOutputImpl(result + ""); 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 927dbda99b9..f51a834db81 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 @@ -146,7 +146,7 @@ public class TreeWriter extends AbstractTreeWriter { } DocPath link = pathString(packages[i], DocPaths.PACKAGE_TREE); Content li = HtmlTree.LI(getHyperLink( - link, "", new StringContent(packages[i].name()))); + link, new StringContent(packages[i].name()))); if (i < packages.length - 1) { li.addContent(", "); } 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 31abaa881e7..b664484d959 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 @@ -31,6 +31,7 @@ import java.util.*; import com.sun.javadoc.*; import com.sun.tools.doclets.formats.html.ConfigurationImpl; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.DocLink; import com.sun.tools.doclets.internal.toolkit.util.DocPath; import com.sun.tools.doclets.internal.toolkit.util.DocPaths; @@ -80,9 +81,14 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param strong Boolean that sets label to strong. * @return String Hyper Link. */ - public String getHyperLinkString(DocPath link, String where, + public String getHyperLinkString(DocPath link, String label, boolean strong) { - return getHyperLinkString(link, where, label, strong, "", "", ""); + return getHyperLinkString(link, label, strong, "", "", ""); + } + + public String getHyperLinkString(DocLink link, + String label, boolean strong) { + return getHyperLinkString(link, label, strong, "", "", ""); } /** @@ -96,10 +102,16 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param stylename String style of text defined in style sheet. * @return String Hyper Link. */ - public String getHyperLinkString(DocPath link, String where, + public String getHyperLinkString(DocPath link, String label, boolean strong, String stylename) { - return getHyperLinkString(link, where, label, strong, stylename, "", ""); + return getHyperLinkString(link, label, strong, stylename, "", ""); + } + + public String getHyperLinkString(DocLink link, + String label, boolean strong, + String stylename) { + return getHyperLinkString(link, label, strong, stylename, "", ""); } /** @@ -112,7 +124,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { */ public Content getHyperLink(String where, Content label) { - return getHyperLink(DocPath.empty, where, label, "", ""); + return getHyperLink(DocLink.fragment(where), label, "", ""); } /** @@ -124,9 +136,14 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param label Tag for the link. * @return a content tree for the hyper link */ - public Content getHyperLink(DocPath link, String where, + public Content getHyperLink(DocPath link, Content label) { - return getHyperLink(link, where, label, "", ""); + return getHyperLink(link, label, "", ""); + } + + public Content getHyperLink(DocLink link, + Content label) { + return getHyperLink(link, label, "", ""); } /** @@ -138,33 +155,27 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param label Tag for the link. * @param strong Boolean that sets label to strong. * @param stylename String style of text defined in style sheet. - * @param title String that describes the link's content for accessibility. + * @param title String that describes the links content for accessibility. * @param target Target frame. * @return String Hyper Link. */ - public String getHyperLinkString(DocPath link, String where, + public String getHyperLinkString(DocPath link, String label, boolean strong, String stylename, String title, String target) { - return getHyperLinkString(link.getPath(), where, label, strong, + return getHyperLinkString(new DocLink(link), label, strong, stylename, title, target); } - public String getHyperLinkString(String link, String where, + public String getHyperLinkString(DocLink link, String label, boolean strong, String stylename, String title, String target) { StringBuilder retlink = new StringBuilder(); - retlink.append(""); if (stylename != null && stylename.length() != 0) { @@ -197,17 +208,14 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param target Target frame. * @return a content tree for the hyper link. */ - public Content getHyperLink(DocPath link, String where, + public Content getHyperLink(DocPath link, Content label, String title, String target) { - return getHyperLink(link.getPath(), where, label, title, target); + return getHyperLink(new DocLink(link), label, title, target); } - public Content getHyperLink(String link, String where, + + public Content getHyperLink(DocLink link, Content label, String title, String target) { - if (link.startsWith("/")) Thread.dumpStack(); - if (where != null && where.length() != 0) { - link += "#" + where; - } - HtmlTree anchor = HtmlTree.A(link, label); + HtmlTree anchor = HtmlTree.A(link.toString(), label); if (title != null && title.length() != 0) { anchor.addAttr(HtmlAttr.TITLE, title); } @@ -217,17 +225,6 @@ public abstract class HtmlDocWriter extends HtmlWriter { return anchor; } - /** - * Get a hyperlink to a file. - * - * @param link String name of the file - * @param label Label for the link - * @return a content for the hyperlink to the file - */ - public Content getHyperLink(DocPath link, Content label) { - return getHyperLink(link, "", label); - } - /** * Get link string without positioning in the file. * @@ -236,7 +233,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @return Strign Hyper link. */ public String getHyperLinkString(DocPath link, String label) { - return getHyperLinkString(link, "", label, false); + return getHyperLinkString(link, label, false); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocLink.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocLink.java new file mode 100644 index 00000000000..48ff3d492bd --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocLink.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.doclets.internal.toolkit.util; + +/** + * Abstraction for simple relative URIs, consisting of a path, + * an optional query, and an optional fragment. DocLink objects can + * be created by the constructors below or from a DocPath using the + * convenience methods, {@link DocPath#fragment fragment} and + * {@link DocPath#query query}. + * + *

    This is NOT part of any supported API. + * 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 DocLink { + final String path; + final String query; + final String fragment; + + /** Create a DocLink representing the URI {@code #fragment}. */ + public static DocLink fragment(String fragment) { + return new DocLink((String) null, (String) null, fragment); + } + + /** Create a DocLink representing the URI {@code path}. */ + public DocLink(DocPath path) { + this(path.getPath(), null, null); + } + + /** + * Create a DocLink representing the URI {@code path?query#fragment}. + * query and fragment may be null. + */ + public DocLink(DocPath path, String query, String fragment) { + this(path.getPath(), query, fragment); + } + + /** + * Create a DocLink representing the URI {@code path?query#fragment}. + * Any of the component parts may be null. + */ + public DocLink(String path, String query, String fragment) { + this.path = path; + this.query = query; + this.fragment = fragment; + } + + /** + * Return the link in the form "path?query#fragment", omitting any empty + * components. + */ + @Override + public String toString() { + // common fast path + if (path != null && isEmpty(query) && isEmpty(fragment)) + return path; + + StringBuilder sb = new StringBuilder(); + if (path != null) + sb.append(path); + if (!isEmpty(query)) + sb.append("?").append(query); + if (!isEmpty(fragment)) + sb.append("#").append(fragment); + return sb.toString(); + } + + private static boolean isEmpty(String s) { + return (s == null) || s.isEmpty(); + } +} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java index 07daa6c8dab..9a398d52154 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java @@ -32,6 +32,11 @@ import java.io.File; /** * Abstraction for immutable relative paths. * Paths always use '/' as a separator, and never begin or end with '/'. + * + *

    This is NOT part of any supported API. + * 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 DocPath { private final String path; @@ -177,6 +182,14 @@ public class DocPath { return path.isEmpty(); } + public DocLink fragment(String fragment) { + return new DocLink(path, null, fragment); + } + + public DocLink query(String query) { + return new DocLink(path, query, null); + } + /** * Return this path as a string. */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java index f4b1f8738ce..2fe301445e0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java @@ -138,24 +138,25 @@ public class Extern { * * @param pkgName The package name. * @param relativepath The relative path. - * @param link The link to convert. + * @param filename The link to convert. * @return if external return converted link else return null */ - public String getExternalLink(String pkgName, - DocPath relativepath, String link) { + public DocLink getExternalLink(String pkgName, + DocPath relativepath, String filename) { + return getExternalLink(pkgName, relativepath, filename, null); + } + + public DocLink getExternalLink(String pkgName, + DocPath relativepath, String filename, String memberName) { Item fnd = findPackageItem(pkgName); - if (fnd != null) { - String externlink = fnd.path + link; - if (fnd.relative) { // it's a relative path. - if (relativepath.isEmpty()) - return externlink; - else - return relativepath.getPath() + "/" + externlink; - } else { - return externlink; - } - } - return null; + if (fnd == null) + return null; + + DocPath p = fnd.relative ? + relativepath.resolve(fnd.path).resolve(filename) : + DocPath.create(fnd.path).resolve(filename); + + return new DocLink(p, "is-external=true", memberName); } /** From 5d717a96fb998e6ad1b86d4e12dd024576eefa11 Mon Sep 17 00:00:00 2001 From: Andrew Brygin Date: Wed, 24 Oct 2012 05:30:34 +0400 Subject: [PATCH 090/241] 7053526: Upgrade JDK 8 to use Little CMS 2.4 Reviewed-by: prr, jgodinez --- jdk/make/sun/cmm/lcms/FILES_c_unix.gmk | 1 + jdk/make/sun/cmm/lcms/FILES_c_windows.gmk | 1 + .../native/sun/java2d/cmm/lcms/cmscam02.c | 42 +- .../native/sun/java2d/cmm/lcms/cmscgats.c | 211 ++- .../native/sun/java2d/cmm/lcms/cmscnvrt.c | 70 +- .../share/native/sun/java2d/cmm/lcms/cmserr.c | 28 +- .../native/sun/java2d/cmm/lcms/cmsgamma.c | 78 +- .../share/native/sun/java2d/cmm/lcms/cmsgmt.c | 15 +- .../native/sun/java2d/cmm/lcms/cmshalf.c | 564 +++++++ .../native/sun/java2d/cmm/lcms/cmsintrp.c | 349 +++-- .../share/native/sun/java2d/cmm/lcms/cmsio0.c | 112 +- .../share/native/sun/java2d/cmm/lcms/cmsio1.c | 287 +++- .../share/native/sun/java2d/cmm/lcms/cmslut.c | 222 ++- .../share/native/sun/java2d/cmm/lcms/cmsmd5.c | 2 +- .../native/sun/java2d/cmm/lcms/cmsmtrx.c | 3 +- .../native/sun/java2d/cmm/lcms/cmsnamed.c | 190 ++- .../share/native/sun/java2d/cmm/lcms/cmsopt.c | 114 +- .../native/sun/java2d/cmm/lcms/cmspack.c | 1344 ++++++++++++----- .../share/native/sun/java2d/cmm/lcms/cmspcs.c | 1 + .../native/sun/java2d/cmm/lcms/cmsplugin.c | 17 +- .../share/native/sun/java2d/cmm/lcms/cmsps2.c | 88 +- .../native/sun/java2d/cmm/lcms/cmssamp.c | 305 +++- .../share/native/sun/java2d/cmm/lcms/cmssm.c | 14 +- .../native/sun/java2d/cmm/lcms/cmstypes.c | 794 ++++++++-- .../native/sun/java2d/cmm/lcms/cmsvirt.c | 92 +- .../native/sun/java2d/cmm/lcms/cmswtpnt.c | 12 +- .../native/sun/java2d/cmm/lcms/cmsxform.c | 377 +++-- .../share/native/sun/java2d/cmm/lcms/lcms2.h | 153 +- .../sun/java2d/cmm/lcms/lcms2_internal.h | 130 +- .../native/sun/java2d/cmm/lcms/lcms2_plugin.h | 91 +- 30 files changed, 4620 insertions(+), 1087 deletions(-) create mode 100644 jdk/src/share/native/sun/java2d/cmm/lcms/cmshalf.c diff --git a/jdk/make/sun/cmm/lcms/FILES_c_unix.gmk b/jdk/make/sun/cmm/lcms/FILES_c_unix.gmk index f64449a48ad..58e39e3df5a 100644 --- a/jdk/make/sun/cmm/lcms/FILES_c_unix.gmk +++ b/jdk/make/sun/cmm/lcms/FILES_c_unix.gmk @@ -30,6 +30,7 @@ FILES_c = \ cmserr.c \ cmsgamma.c \ cmsgmt.c \ + cmshalf.c \ cmsintrp.c \ cmsio0.c \ cmsio1.c \ diff --git a/jdk/make/sun/cmm/lcms/FILES_c_windows.gmk b/jdk/make/sun/cmm/lcms/FILES_c_windows.gmk index f64449a48ad..58e39e3df5a 100644 --- a/jdk/make/sun/cmm/lcms/FILES_c_windows.gmk +++ b/jdk/make/sun/cmm/lcms/FILES_c_windows.gmk @@ -30,6 +30,7 @@ FILES_c = \ cmserr.c \ cmsgamma.c \ cmsgmt.c \ + cmshalf.c \ cmsintrp.c \ cmsio0.c \ cmsio1.c \ 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 207a272694d..a408497e250 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -409,29 +409,29 @@ cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingCondi switch (lpMod -> surround) { - case CUTSHEET_SURROUND: - lpMod->F = 0.8; - lpMod->c = 0.41; - lpMod->Nc = 0.8; - break; + case CUTSHEET_SURROUND: + lpMod->F = 0.8; + lpMod->c = 0.41; + lpMod->Nc = 0.8; + break; - case DARK_SURROUND: - lpMod -> F = 0.8; - lpMod -> c = 0.525; - lpMod -> Nc = 0.8; - break; + case DARK_SURROUND: + lpMod -> F = 0.8; + lpMod -> c = 0.525; + lpMod -> Nc = 0.8; + break; - case DIM_SURROUND: - lpMod -> F = 0.9; - lpMod -> c = 0.59; - lpMod -> Nc = 0.95; - break; + case DIM_SURROUND: + lpMod -> F = 0.9; + lpMod -> c = 0.59; + lpMod -> Nc = 0.95; + break; - default: - // Average surround - lpMod -> F = 1.0; - lpMod -> c = 0.69; - lpMod -> Nc = 1.0; + default: + // Average surround + lpMod -> F = 1.0; + lpMod -> c = 0.69; + lpMod -> Nc = 1.0; } lpMod -> n = compute_n(lpMod); 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 f3ffbe44d61..15a2439448e 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -73,6 +73,7 @@ # define DIR_CHAR '/' #endif + // Symbols typedef enum { @@ -143,6 +144,8 @@ typedef struct _SubAllocator { // Table. Each individual table can hold properties and rows & cols typedef struct _Table { + char SheetType[MAXSTR]; // The first row of the IT8 (the type) + int nSamples, nPatches; // Cols, Rows int SampleID; // Pos of ID @@ -162,7 +165,6 @@ typedef struct _FileContext { // This struct hold all information about an open IT8 handler. typedef struct { - char SheetType[MAXSTR]; // The first row of the IT8 (the type) cmsUInt32Number TablesCount; // How many tables in this stream cmsUInt32Number nTable; // The actual table @@ -433,6 +435,8 @@ cmsBool isabsolutepath(const char *path) return FALSE; } + + // Makes a file path based on a given reference path // NOTE: this function doesn't check if the path exists or even if it's legal static @@ -574,7 +578,7 @@ void ReadReal(cmsIT8* it8, int inum) if (it8->ch == '.') { // Decimal point cmsFloat64Number frac = 0.0; // fraction - int prec = 0; // precision + int prec = 0; // precision NextCh(it8); // Eats dec. point @@ -621,6 +625,81 @@ void ReadReal(cmsIT8* it8, int inum) } } +// Parses a float number +// This can not call directly atof because it uses locale dependant +// parsing, while CCMX files always use . as decimal separator +static +cmsFloat64Number ParseFloatNumber(const char *Buffer) +{ + cmsFloat64Number dnum = 0.0; + int sign = 1; + + if (*Buffer == '-' || *Buffer == '+') { + + sign = (*Buffer == '-') ? -1 : 1; + Buffer++; + } + + + while (*Buffer && isdigit((int) *Buffer)) { + + dnum = dnum * 10.0 + (*Buffer - '0'); + if (*Buffer) Buffer++; + } + + if (*Buffer == '.') { + + cmsFloat64Number frac = 0.0; // fraction + int prec = 0; // precission + + if (*Buffer) Buffer++; + + while (*Buffer && isdigit((int) *Buffer)) { + + frac = frac * 10.0 + (*Buffer - '0'); + prec++; + if (*Buffer) Buffer++; + } + + dnum = dnum + (frac / xpow10(prec)); + } + + // Exponent, example 34.00E+20 + if (*Buffer && toupper(*Buffer) == 'E') { + + int e; + int sgn; + + if (*Buffer) Buffer++; + sgn = 1; + + if (*Buffer == '-') { + + sgn = -1; + if (*Buffer) Buffer++; + } + else + if (*Buffer == '+') { + + sgn = +1; + if (*Buffer) Buffer++; + } + + e = 0; + while (*Buffer && isdigit((int) *Buffer)) { + + if ((cmsFloat64Number) e * 10L < INT_MAX) + e = e * 10 + (*Buffer - '0'); + + if (*Buffer) Buffer++; + } + + e = sgn*e; + dnum = dnum * xpow10(e); + } + + return sign * dnum; +} // Reads next symbol @@ -1011,7 +1090,7 @@ void* AllocChunk(cmsIT8* it8, cmsUInt32Number size) cmsUInt32Number Free = it8 ->Allocator.BlockSize - it8 ->Allocator.Used; cmsUInt8Number* ptr; - size = _cmsALIGNLONG(size); + size = _cmsALIGNMEM(size); if (size > Free) { @@ -1212,7 +1291,7 @@ cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE IT8, cmsUInt32Number nTable) cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID) { cmsIT8* it8; - int i; + cmsUInt32Number i; it8 = (cmsIT8*) _cmsMallocZero(ContextID, sizeof(cmsIT8)); if (it8 == NULL) return NULL; @@ -1243,7 +1322,7 @@ cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID) it8 -> lineno = 1; strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); - strcpy(it8->SheetType, "CGATS.17"); + cmsIT8SetSheetType((cmsHANDLE) it8, "CGATS.17"); // Initialize predefined properties & data @@ -1260,18 +1339,15 @@ cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID) const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8) { - cmsIT8* it8 = (cmsIT8*) hIT8; - - return it8 ->SheetType; - + return GetTable((cmsIT8*) hIT8)->SheetType; } cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type) { - cmsIT8* it8 = (cmsIT8*) hIT8; + TABLE* t = GetTable((cmsIT8*) hIT8); - strncpy(it8 ->SheetType, Type, MAXSTR-1); - it8 ->SheetType[MAXSTR-1] = 0; + strncpy(t ->SheetType, Type, MAXSTR-1); + t ->SheetType[MAXSTR-1] = 0; return TRUE; } @@ -1285,8 +1361,6 @@ cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* Val) return AddToList(it8, &GetTable(it8)->HeaderList, "# ", NULL, Val, WRITE_UNCOOKED) != NULL; } - - // Sets a property cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const char *Val) { @@ -1298,7 +1372,6 @@ cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const ch return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL; } - cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; @@ -1351,8 +1424,7 @@ cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cPro { const char *v = cmsIT8GetProperty(hIT8, cProp); - if (v) return atof(v); - else return 0.0; + return ParseFloatNumber(v); } const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey) @@ -1553,6 +1625,9 @@ void WriteHeader(cmsIT8* it8, SAVESTREAM* fp) KEYVALUE* p; TABLE* t = GetTable(it8); + // Writes the type + WriteStr(fp, t->SheetType); + WriteStr(fp, "\n"); for (p = t->HeaderList; (p != NULL); p = p->Next) { @@ -1701,8 +1776,6 @@ cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName) sd.stream = fopen(cFileName, "wt"); if (!sd.stream) return FALSE; - WriteStr(&sd, it8->SheetType); - WriteStr(&sd, "\n"); for (i=0; i < it8 ->TablesCount; i++) { cmsIT8SetTable(hIT8, i); @@ -1737,20 +1810,18 @@ cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* else sd.Max = 0; // Just counting the needed bytes - WriteStr(&sd, it8->SheetType); - WriteStr(&sd, "\n"); for (i=0; i < it8 ->TablesCount; i++) { - cmsIT8SetTable(hIT8, i); - WriteHeader(it8, &sd); - WriteDataFormat(&sd, it8); - WriteData(&sd, it8); + cmsIT8SetTable(hIT8, i); + WriteHeader(it8, &sd); + WriteDataFormat(&sd, it8); + WriteData(&sd, it8); } sd.Used++; // The \0 at the very end if (sd.Base) - sd.Ptr = 0; + *sd.Ptr = 0; *BytesNeeded = sd.Used; @@ -1963,12 +2034,8 @@ cmsBool HeaderSection(cmsIT8* it8) static -cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet) +void ReadType(cmsIT8* it8, char* SheetTypePtr) { - char* SheetTypePtr = it8 ->SheetType; - - if (nosheet == 0) { - // First line is a very special case. while (isseparator(it8->ch)) @@ -1979,9 +2046,20 @@ cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet) *SheetTypePtr++= (char) it8 ->ch; NextCh(it8); } - } *SheetTypePtr = 0; +} + + +static +cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet) +{ + char* SheetTypePtr = it8 ->Tab[0].SheetType; + + if (nosheet == 0) { + ReadType(it8, SheetTypePtr); + } + InSymbol(it8); SkipEOLN(it8); @@ -2003,6 +2081,39 @@ cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet) AllocTable(it8); it8 ->nTable = it8 ->TablesCount - 1; + + // Read sheet type if present. We only support identifier and string. + // is a type string + // anything else, is not a type string + if (nosheet == 0) { + + if (it8 ->sy == SIDENT) { + + // May be a type sheet or may be a prop value statement. We cannot use insymbol in + // this special case... + while (isseparator(it8->ch)) + NextCh(it8); + + // If a newline is found, then this is a type string + if (it8 ->ch == '\n') { + + cmsIT8SetSheetType(it8, it8 ->id); + InSymbol(it8); + } + else + { + // It is not. Just continue + cmsIT8SetSheetType(it8, ""); + } + } + else + // Validate quoted strings + if (it8 ->sy == SSTRING) { + cmsIT8SetSheetType(it8, it8 ->str); + InSymbol(it8); + } + } + } break; @@ -2123,14 +2234,14 @@ void CookPointers(cmsIT8* it8) // Try to infere if the file is a CGATS/IT8 file at all. Read first line // that should be something like some printable characters plus a \n - +// returns 0 if this is not like a CGATS, or an integer otherwise. This integer is the number of words in first line? static int IsMyBlock(cmsUInt8Number* Buffer, int n) { - int cols = 1, space = 0, quot = 0; + int words = 1, space = 0, quot = 0; int i; - if (n < 10) return FALSE; // Too small + if (n < 10) return 0; // Too small if (n > 132) n = 132; @@ -2141,7 +2252,7 @@ int IsMyBlock(cmsUInt8Number* Buffer, int n) { case '\n': case '\r': - return quot == 1 || cols > 2 ? 0 : cols; + return ((quot == 1) || (words > 2)) ? 0 : words; case '\t': case ' ': if(!quot && !space) @@ -2153,14 +2264,13 @@ int IsMyBlock(cmsUInt8Number* Buffer, int n) default: if (Buffer[i] < 32) return 0; if (Buffer[i] > 127) return 0; - cols += space; + words += space; space = 0; break; } } - return FALSE; - + return 0; } @@ -2271,7 +2381,7 @@ cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileN it8 ->nTable = 0; if (fclose(it8 ->FileStack[0]->Stream)!= 0) { - cmsIT8Free(hIT8); + cmsIT8Free(hIT8); return NULL; } @@ -2454,13 +2564,7 @@ cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int c Buffer = cmsIT8GetDataRowCol(hIT8, row, col); - if (Buffer) { - - return atof(Buffer); - - } else - return 0; - + return ParseFloatNumber(Buffer); } @@ -2515,14 +2619,7 @@ cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE it8, const char* cPatch, Buffer = cmsIT8GetData(it8, cPatch, cSample); - if (Buffer) { - - return atof(Buffer); - - } else { - - return 0; - } + return ParseFloatNumber(Buffer); } @@ -2680,5 +2777,7 @@ void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter) strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); else strcpy(it8->DoubleFormatter, Formatter); + + it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0; } 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 9bea64f4fd9..d1a1cc99804 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -193,17 +193,21 @@ void ComputeBlackPointCompensation(const cmsCIEXYZ* BlackPointIn, static cmsFloat64Number CHAD2Temp(const cmsMAT3* Chad) { - // Convert D50 across CHAD to get the absolute white point - cmsVEC3 d, s; - cmsCIEXYZ Dest; - cmsCIExyY DestChromaticity; - cmsFloat64Number TempK; + // Convert D50 across inverse CHAD to get the absolute white point + cmsVEC3 d, s; + cmsCIEXYZ Dest; + cmsCIExyY DestChromaticity; + cmsFloat64Number TempK; + cmsMAT3 m1, m2; + + m1 = *Chad; + if (!_cmsMAT3inverse(&m1, &m2)) return FALSE; s.n[VX] = cmsD50_XYZ() -> X; s.n[VY] = cmsD50_XYZ() -> Y; s.n[VZ] = cmsD50_XYZ() -> Z; - _cmsMAT3eval(&d, Chad, &s); + _cmsMAT3eval(&d, &m2, &s); Dest.X = d.n[VX]; Dest.Y = d.n[VY]; @@ -219,15 +223,14 @@ cmsFloat64Number CHAD2Temp(const cmsMAT3* Chad) // Compute a CHAD based on a given temperature static -void Temp2CHAD(cmsMAT3* Chad, cmsFloat64Number Temp) + void Temp2CHAD(cmsMAT3* Chad, cmsFloat64Number Temp) { cmsCIEXYZ White; cmsCIExyY ChromaticityOfWhite; cmsWhitePointFromTemp(&ChromaticityOfWhite, Temp); cmsxyY2XYZ(&White, &ChromaticityOfWhite); - _cmsAdaptationMatrix(Chad, NULL, cmsD50_XYZ(), &White); - + _cmsAdaptationMatrix(Chad, NULL, &White, cmsD50_XYZ()); } // Join scalings to obtain relative input to absolute and then to relative output. @@ -240,7 +243,7 @@ cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState, const cmsMAT3* ChromaticAdaptationMatrixOut, cmsMAT3* m) { - cmsMAT3 Scale, m1, m2, m3; + cmsMAT3 Scale, m1, m2, m3, m4; // Adaptation state if (AdaptationState == 1.0) { @@ -259,23 +262,32 @@ cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState, _cmsVEC3init(&Scale.v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0); _cmsVEC3init(&Scale.v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z); - m1 = *ChromaticAdaptationMatrixIn; - if (!_cmsMAT3inverse(&m1, &m2)) return FALSE; - _cmsMAT3per(&m3, &m2, &Scale); - // m3 holds CHAD from input white to D50 times abs. col. scaling if (AdaptationState == 0.0) { + m1 = *ChromaticAdaptationMatrixOut; + _cmsMAT3per(&m2, &m1, &Scale); + // m2 holds CHAD from output white to D50 times abs. col. scaling + // Observer is not adapted, undo the chromatic adaptation _cmsMAT3per(m, &m3, ChromaticAdaptationMatrixOut); + m3 = *ChromaticAdaptationMatrixIn; + if (!_cmsMAT3inverse(&m3, &m4)) return FALSE; + _cmsMAT3per(m, &m2, &m4); + } else { cmsMAT3 MixedCHAD; cmsFloat64Number TempSrc, TempDest, Temp; - TempSrc = CHAD2Temp(ChromaticAdaptationMatrixIn); // K for source white - TempDest = CHAD2Temp(ChromaticAdaptationMatrixOut); // K for dest white + m1 = *ChromaticAdaptationMatrixIn; + if (!_cmsMAT3inverse(&m1, &m2)) return FALSE; + _cmsMAT3per(&m3, &m2, &Scale); + // m3 holds CHAD from input white to D50 times abs. col. scaling + + TempSrc = CHAD2Temp(ChromaticAdaptationMatrixIn); + TempDest = CHAD2Temp(ChromaticAdaptationMatrixOut); if (TempSrc < 0.0 || TempDest < 0.0) return FALSE; // Something went wrong @@ -285,9 +297,9 @@ cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState, return TRUE; } - Temp = AdaptationState * TempSrc + (1.0 - AdaptationState) * TempDest; + Temp = (1.0 - AdaptationState) * TempDest + AdaptationState * TempSrc; - // Get a CHAD from D50 to whatever output temperature. This replaces output CHAD + // Get a CHAD from whatever output temperature to D50. This replaces output CHAD Temp2CHAD(&MixedCHAD, Temp); _cmsMAT3per(m, &m3, &MixedCHAD); @@ -362,7 +374,7 @@ cmsBool ComputeConversion(int i, cmsHPROFILE hProfiles[], cmsCIEXYZ BlackPointIn, BlackPointOut; cmsDetectBlackPoint(&BlackPointIn, hProfiles[i-1], Intent, 0); - cmsDetectBlackPoint(&BlackPointOut, hProfiles[i], Intent, 0); + cmsDetectDestinationBlackPoint(&BlackPointOut, hProfiles[i], Intent, 0); // If black points are equal, then do nothing if (BlackPointIn.X != BlackPointOut.X || @@ -463,6 +475,10 @@ cmsBool ColorSpaceIsCompatible(cmsColorSpaceSignature a, cmsColorSpaceSignature // If they are same, they are compatible. if (a == b) return TRUE; + // Check for MCH4 substitution of CMYK + if ((a == cmsSig4colorData) && (b == cmsSigCmykData)) return TRUE; + if ((a == cmsSigCmykData) && (b == cmsSig4colorData)) return TRUE; + // Check for XYZ/Lab. Those spaces are interchangeable as they can be computed one from other. if ((a == cmsSigXYZData) && (b == cmsSigLabData)) return TRUE; if ((a == cmsSigLabData) && (b == cmsSigXYZData)) return TRUE; @@ -511,7 +527,7 @@ cmsPipeline* DefaultICCintents(cmsContext ContextID, lIsInput = TRUE; } else { - // Else use profile in the input direction if current space is not PCS + // Else use profile in the input direction if current space is not PCS lIsInput = (CurrentColorSpace != cmsSigXYZData) && (CurrentColorSpace != cmsSigLabData); } @@ -537,7 +553,7 @@ cmsPipeline* DefaultICCintents(cmsContext ContextID, // If devicelink is found, then no custom intent is allowed and we can // read the LUT to be applied. Settings don't apply here. - if (lIsDeviceLink) { + if (lIsDeviceLink || ((ClassSig == cmsSigNamedColorClass) && (nProfiles == 1))) { // Get the involved LUT from the profile Lut = _cmsReadDevicelinkLUT(hProfile, Intent); @@ -876,7 +892,8 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, // Check for non-cmyk profiles if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || - cmsGetColorSpace(hProfiles[nProfiles-1]) != cmsSigCmykData) + !(cmsGetColorSpace(hProfiles[nProfiles-1]) == cmsSigCmykData || + cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigOutputClass)) return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); // Allocate an empty LUT for holding the result @@ -893,6 +910,8 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, // Get total area coverage (in 0..1 domain) bp.MaxTAC = cmsDetectTAC(hProfiles[nProfiles-1]) / 100.0; + if (bp.MaxTAC <= 0) goto Cleanup; + // Create a LUT holding normal ICC transform bp.cmyk2cmyk = DefaultICCintents(ContextID, @@ -902,6 +921,7 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, BPC, AdaptationStates, dwFlags); + if (bp.cmyk2cmyk == NULL) goto Cleanup; // Now the tone curve bp.KTone = _cmsBuildKToneCurve(ContextID, 4096, nProfiles, @@ -910,7 +930,7 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, BPC, AdaptationStates, dwFlags); - + if (bp.KTone == NULL) goto Cleanup; // To measure the output, Last profile to Lab hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); @@ -918,6 +938,7 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, CHANNELS_SH(4)|BYTES_SH(2), hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); + if ( bp.hProofOutput == NULL) goto Cleanup; // Same as anterior, but lab in the 0..1 range bp.cmyk2Lab = cmsCreateTransformTHR(ContextID, hProfiles[nProfiles-1], @@ -925,6 +946,7 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, FLOAT_SH(1)|CHANNELS_SH(3)|BYTES_SH(4), INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); + if (bp.cmyk2Lab == NULL) goto Cleanup; cmsCloseProfile(hLab); // Error estimation (for debug only) 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 ab740e2bdaf..a18a59a1ffa 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -72,17 +72,21 @@ int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2) // long int because C99 specifies ftell in such way (7.19.9.2) long int CMSEXPORT cmsfilelength(FILE* f) { - long int n; + long int p , n; + + p = ftell(f); // register current file position if (fseek(f, 0, SEEK_END) != 0) { return -1; } + n = ftell(f); - fseek(f, 0, SEEK_SET); + fseek(f, p, SEEK_SET); // file position restored return n; } + // Memory handling ------------------------------------------------------------------ // // This is the interface to low-level memory management routines. By default a simple @@ -160,6 +164,12 @@ void* _cmsCallocDefaultFn(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Nu { cmsUInt32Number Total = num * size; + // Preserve calloc behaviour + if (Total == 0) return NULL; + + // Safe check for overflow. + if (num >= UINT_MAX / size) return NULL; + // Check for overflow if (Total < num || Total < size) { return NULL; @@ -269,12 +279,16 @@ void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Numbe // Sub allocation takes care of many pointers of small size. The memory allocated in // this way have be freed at once. Next function allocates a single chunk for linked list // I prefer this method over realloc due to the big inpact on xput realloc may have if -// memory is being swapped to disk. This approach is safer (although thats not true on any platform) +// memory is being swapped to disk. This approach is safer (although that may not be true on all platforms) static _cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32Number Initial) { _cmsSubAllocator_chunk* chunk; + // 20K by default + if (Initial == 0) + Initial = 20*1024; + // Create the container chunk = (_cmsSubAllocator_chunk*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator_chunk)); if (chunk == NULL) return NULL; @@ -288,9 +302,7 @@ _cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32N return NULL; } - // 20K by default - if (Initial == 0) - Initial = 20*1024; + chunk ->BlockSize = Initial; chunk ->Used = 0; @@ -344,7 +356,7 @@ void* _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size) cmsUInt32Number Free = sub -> h ->BlockSize - sub -> h -> Used; cmsUInt8Number* ptr; - size = _cmsALIGNLONG(size); + size = _cmsALIGNMEM(size); // Check for memory. If there is no room, allocate a new chunk of double memory size. if (size > Free) { 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 49dfa9830d7..9ee36e2d538 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -277,18 +277,28 @@ cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Nu switch (Type) { - // X = Y ^ Gamma + // X = Y ^ Gamma case 1: - if (R < 0) - Val = 0; + if (R < 0) { + + if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE) + Val = R; + else + Val = 0; + } else Val = pow(R, Params[0]); break; // Type 1 Reversed: X = Y ^1/gamma case -1: - if (R < 0) - Val = 0; + if (R < 0) { + + if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE) + Val = R; + else + Val = 0; + } else Val = pow(R, 1/Params[0]); break; @@ -552,6 +562,19 @@ cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R) return MINUS_INF; } +// Access to estimated low-res table +cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t) +{ + _cmsAssert(t != NULL); + return t ->nEntries; +} + +const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t) +{ + _cmsAssert(t != NULL); + return t ->Table16; +} + // Create an empty gamma curve, by using tables. This specifies only the limited-precision part, and leaves the // floating point description empty. @@ -828,7 +851,7 @@ int GetInterval(cmsFloat64Number In, const cmsUInt16Number LutTable[], const str cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, const cmsToneCurve* InCurve) { cmsToneCurve *out; - cmsFloat64Number a = 1, b = 0, y, x1, y1, x2, y2; + cmsFloat64Number a = 0, b = 0, y, x1, y1, x2, y2; int i, j; int Ascending; @@ -859,6 +882,7 @@ cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, con j = GetInterval(y, InCurve->Table16, InCurve->InterpParams); if (j >= 0) { + // Get limits of interval x1 = InCurve ->Table16[j]; x2 = InCurve ->Table16[j+1]; @@ -883,6 +907,7 @@ cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, con out ->Table16[i] = _cmsQuickSaturateWord(a* y + b); } + return out; } @@ -891,7 +916,7 @@ cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma) { _cmsAssert(InGamma != NULL); - return cmsReverseToneCurveEx(InGamma -> nEntries, InGamma); + return cmsReverseToneCurveEx(4096, InGamma); } // From: Eilers, P.H.C. (1994) Smoothing and interpolation with finite @@ -1035,20 +1060,42 @@ cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t) { int n; int i, last; + cmsBool lDescending; _cmsAssert(t != NULL); - n = t ->nEntries; - last = t ->Table16[n-1]; + // Degenerated curves are monotonic? Ok, let's pass them + n = t ->nEntries; + if (n < 2) return TRUE; - for (i = n-2; i >= 0; --i) { + // Curve direction + lDescending = cmsIsToneCurveDescending(t); - if (t ->Table16[i] > last) + if (lDescending) { - return FALSE; - else - last = t ->Table16[i]; + last = t ->Table16[0]; + for (i = 1; i < n; i++) { + + if (t ->Table16[i] - last > 2) // We allow some ripple + return FALSE; + else + last = t ->Table16[i]; + + } + } + else { + + last = t ->Table16[n-1]; + + for (i = n-2; i >= 0; --i) { + + if (t ->Table16[i] - last > 2) + return FALSE; + else + last = t ->Table16[i]; + + } } return TRUE; @@ -1163,4 +1210,3 @@ cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Num return (sum / n); // The mean } - 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 504b038c1f4..d7fb6dd274e 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -212,7 +212,6 @@ cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID, // Make sure it is monotonic if (!cmsIsToneCurveMonotonic(KTone)) { - cmsFreeToneCurve(KTone); return NULL; } @@ -246,7 +245,7 @@ int GamutSampler(register const cmsUInt16Number In[], register cmsUInt16Number O GAMUTCHAIN* t = (GAMUTCHAIN* ) Cargo; cmsCIELab LabIn1, LabOut1; cmsCIELab LabIn2, LabOut2; - cmsFloat32Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS]; + cmsUInt16Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS]; cmsFloat64Number dE1, dE2, ErrorRatio; // Assume in-gamut by default. @@ -396,8 +395,8 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, cmsFLAGS_NOCACHE); - // Does create the forward step. Lab double to cmsFloat32Number - dwFormat = (FLOAT_SH(1)|CHANNELS_SH(nChannels)|BYTES_SH(4)); + // Does create the forward step. Lab double to device + dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2)); Chain.hForward = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_DBL, hGamut, dwFormat, @@ -421,10 +420,10 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, if (Gamut != NULL) { - CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL); - cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT); + CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL); + cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT); - cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0); + cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0); } } else diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmshalf.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmshalf.c new file mode 100644 index 00000000000..11efe3adf71 --- /dev/null +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmshalf.c @@ -0,0 +1,564 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// 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: +// +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2012 Marti Maria Saguer +// +// 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. +// +//--------------------------------------------------------------------------------- +// +// +#include "lcms2_internal.h" + +#ifndef CMS_NO_HALF_SUPPORT + +// This code is inspired in the paper "Fast Half Float Conversions" +// by Jeroen van der Zijp + +static cmsUInt32Number Mantissa[2048] = { + +0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34a00000, +0x34c00000, 0x34e00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000, +0x35400000, 0x35500000, 0x35600000, 0x35700000, 0x35800000, 0x35880000, +0x35900000, 0x35980000, 0x35a00000, 0x35a80000, 0x35b00000, 0x35b80000, +0x35c00000, 0x35c80000, 0x35d00000, 0x35d80000, 0x35e00000, 0x35e80000, +0x35f00000, 0x35f80000, 0x36000000, 0x36040000, 0x36080000, 0x360c0000, +0x36100000, 0x36140000, 0x36180000, 0x361c0000, 0x36200000, 0x36240000, +0x36280000, 0x362c0000, 0x36300000, 0x36340000, 0x36380000, 0x363c0000, +0x36400000, 0x36440000, 0x36480000, 0x364c0000, 0x36500000, 0x36540000, +0x36580000, 0x365c0000, 0x36600000, 0x36640000, 0x36680000, 0x366c0000, +0x36700000, 0x36740000, 0x36780000, 0x367c0000, 0x36800000, 0x36820000, +0x36840000, 0x36860000, 0x36880000, 0x368a0000, 0x368c0000, 0x368e0000, +0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369a0000, +0x369c0000, 0x369e0000, 0x36a00000, 0x36a20000, 0x36a40000, 0x36a60000, +0x36a80000, 0x36aa0000, 0x36ac0000, 0x36ae0000, 0x36b00000, 0x36b20000, +0x36b40000, 0x36b60000, 0x36b80000, 0x36ba0000, 0x36bc0000, 0x36be0000, +0x36c00000, 0x36c20000, 0x36c40000, 0x36c60000, 0x36c80000, 0x36ca0000, +0x36cc0000, 0x36ce0000, 0x36d00000, 0x36d20000, 0x36d40000, 0x36d60000, +0x36d80000, 0x36da0000, 0x36dc0000, 0x36de0000, 0x36e00000, 0x36e20000, +0x36e40000, 0x36e60000, 0x36e80000, 0x36ea0000, 0x36ec0000, 0x36ee0000, +0x36f00000, 0x36f20000, 0x36f40000, 0x36f60000, 0x36f80000, 0x36fa0000, +0x36fc0000, 0x36fe0000, 0x37000000, 0x37010000, 0x37020000, 0x37030000, +0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, +0x370a0000, 0x370b0000, 0x370c0000, 0x370d0000, 0x370e0000, 0x370f0000, +0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, +0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371a0000, 0x371b0000, +0x371c0000, 0x371d0000, 0x371e0000, 0x371f0000, 0x37200000, 0x37210000, +0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, +0x37280000, 0x37290000, 0x372a0000, 0x372b0000, 0x372c0000, 0x372d0000, +0x372e0000, 0x372f0000, 0x37300000, 0x37310000, 0x37320000, 0x37330000, +0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, +0x373a0000, 0x373b0000, 0x373c0000, 0x373d0000, 0x373e0000, 0x373f0000, +0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, +0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374a0000, 0x374b0000, +0x374c0000, 0x374d0000, 0x374e0000, 0x374f0000, 0x37500000, 0x37510000, +0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, +0x37580000, 0x37590000, 0x375a0000, 0x375b0000, 0x375c0000, 0x375d0000, +0x375e0000, 0x375f0000, 0x37600000, 0x37610000, 0x37620000, 0x37630000, +0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000, +0x376a0000, 0x376b0000, 0x376c0000, 0x376d0000, 0x376e0000, 0x376f0000, +0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, +0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377a0000, 0x377b0000, +0x377c0000, 0x377d0000, 0x377e0000, 0x377f0000, 0x37800000, 0x37808000, +0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, +0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, +0x37870000, 0x37878000, 0x37880000, 0x37888000, 0x37890000, 0x37898000, +0x378a0000, 0x378a8000, 0x378b0000, 0x378b8000, 0x378c0000, 0x378c8000, +0x378d0000, 0x378d8000, 0x378e0000, 0x378e8000, 0x378f0000, 0x378f8000, +0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, +0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000, +0x37960000, 0x37968000, 0x37970000, 0x37978000, 0x37980000, 0x37988000, +0x37990000, 0x37998000, 0x379a0000, 0x379a8000, 0x379b0000, 0x379b8000, +0x379c0000, 0x379c8000, 0x379d0000, 0x379d8000, 0x379e0000, 0x379e8000, +0x379f0000, 0x379f8000, 0x37a00000, 0x37a08000, 0x37a10000, 0x37a18000, +0x37a20000, 0x37a28000, 0x37a30000, 0x37a38000, 0x37a40000, 0x37a48000, +0x37a50000, 0x37a58000, 0x37a60000, 0x37a68000, 0x37a70000, 0x37a78000, +0x37a80000, 0x37a88000, 0x37a90000, 0x37a98000, 0x37aa0000, 0x37aa8000, +0x37ab0000, 0x37ab8000, 0x37ac0000, 0x37ac8000, 0x37ad0000, 0x37ad8000, +0x37ae0000, 0x37ae8000, 0x37af0000, 0x37af8000, 0x37b00000, 0x37b08000, +0x37b10000, 0x37b18000, 0x37b20000, 0x37b28000, 0x37b30000, 0x37b38000, +0x37b40000, 0x37b48000, 0x37b50000, 0x37b58000, 0x37b60000, 0x37b68000, +0x37b70000, 0x37b78000, 0x37b80000, 0x37b88000, 0x37b90000, 0x37b98000, +0x37ba0000, 0x37ba8000, 0x37bb0000, 0x37bb8000, 0x37bc0000, 0x37bc8000, +0x37bd0000, 0x37bd8000, 0x37be0000, 0x37be8000, 0x37bf0000, 0x37bf8000, +0x37c00000, 0x37c08000, 0x37c10000, 0x37c18000, 0x37c20000, 0x37c28000, +0x37c30000, 0x37c38000, 0x37c40000, 0x37c48000, 0x37c50000, 0x37c58000, +0x37c60000, 0x37c68000, 0x37c70000, 0x37c78000, 0x37c80000, 0x37c88000, +0x37c90000, 0x37c98000, 0x37ca0000, 0x37ca8000, 0x37cb0000, 0x37cb8000, +0x37cc0000, 0x37cc8000, 0x37cd0000, 0x37cd8000, 0x37ce0000, 0x37ce8000, +0x37cf0000, 0x37cf8000, 0x37d00000, 0x37d08000, 0x37d10000, 0x37d18000, +0x37d20000, 0x37d28000, 0x37d30000, 0x37d38000, 0x37d40000, 0x37d48000, +0x37d50000, 0x37d58000, 0x37d60000, 0x37d68000, 0x37d70000, 0x37d78000, +0x37d80000, 0x37d88000, 0x37d90000, 0x37d98000, 0x37da0000, 0x37da8000, +0x37db0000, 0x37db8000, 0x37dc0000, 0x37dc8000, 0x37dd0000, 0x37dd8000, +0x37de0000, 0x37de8000, 0x37df0000, 0x37df8000, 0x37e00000, 0x37e08000, +0x37e10000, 0x37e18000, 0x37e20000, 0x37e28000, 0x37e30000, 0x37e38000, +0x37e40000, 0x37e48000, 0x37e50000, 0x37e58000, 0x37e60000, 0x37e68000, +0x37e70000, 0x37e78000, 0x37e80000, 0x37e88000, 0x37e90000, 0x37e98000, +0x37ea0000, 0x37ea8000, 0x37eb0000, 0x37eb8000, 0x37ec0000, 0x37ec8000, +0x37ed0000, 0x37ed8000, 0x37ee0000, 0x37ee8000, 0x37ef0000, 0x37ef8000, +0x37f00000, 0x37f08000, 0x37f10000, 0x37f18000, 0x37f20000, 0x37f28000, +0x37f30000, 0x37f38000, 0x37f40000, 0x37f48000, 0x37f50000, 0x37f58000, +0x37f60000, 0x37f68000, 0x37f70000, 0x37f78000, 0x37f80000, 0x37f88000, +0x37f90000, 0x37f98000, 0x37fa0000, 0x37fa8000, 0x37fb0000, 0x37fb8000, +0x37fc0000, 0x37fc8000, 0x37fd0000, 0x37fd8000, 0x37fe0000, 0x37fe8000, +0x37ff0000, 0x37ff8000, 0x38000000, 0x38004000, 0x38008000, 0x3800c000, +0x38010000, 0x38014000, 0x38018000, 0x3801c000, 0x38020000, 0x38024000, +0x38028000, 0x3802c000, 0x38030000, 0x38034000, 0x38038000, 0x3803c000, +0x38040000, 0x38044000, 0x38048000, 0x3804c000, 0x38050000, 0x38054000, +0x38058000, 0x3805c000, 0x38060000, 0x38064000, 0x38068000, 0x3806c000, +0x38070000, 0x38074000, 0x38078000, 0x3807c000, 0x38080000, 0x38084000, +0x38088000, 0x3808c000, 0x38090000, 0x38094000, 0x38098000, 0x3809c000, +0x380a0000, 0x380a4000, 0x380a8000, 0x380ac000, 0x380b0000, 0x380b4000, +0x380b8000, 0x380bc000, 0x380c0000, 0x380c4000, 0x380c8000, 0x380cc000, +0x380d0000, 0x380d4000, 0x380d8000, 0x380dc000, 0x380e0000, 0x380e4000, +0x380e8000, 0x380ec000, 0x380f0000, 0x380f4000, 0x380f8000, 0x380fc000, +0x38100000, 0x38104000, 0x38108000, 0x3810c000, 0x38110000, 0x38114000, +0x38118000, 0x3811c000, 0x38120000, 0x38124000, 0x38128000, 0x3812c000, +0x38130000, 0x38134000, 0x38138000, 0x3813c000, 0x38140000, 0x38144000, +0x38148000, 0x3814c000, 0x38150000, 0x38154000, 0x38158000, 0x3815c000, +0x38160000, 0x38164000, 0x38168000, 0x3816c000, 0x38170000, 0x38174000, +0x38178000, 0x3817c000, 0x38180000, 0x38184000, 0x38188000, 0x3818c000, +0x38190000, 0x38194000, 0x38198000, 0x3819c000, 0x381a0000, 0x381a4000, +0x381a8000, 0x381ac000, 0x381b0000, 0x381b4000, 0x381b8000, 0x381bc000, +0x381c0000, 0x381c4000, 0x381c8000, 0x381cc000, 0x381d0000, 0x381d4000, +0x381d8000, 0x381dc000, 0x381e0000, 0x381e4000, 0x381e8000, 0x381ec000, +0x381f0000, 0x381f4000, 0x381f8000, 0x381fc000, 0x38200000, 0x38204000, +0x38208000, 0x3820c000, 0x38210000, 0x38214000, 0x38218000, 0x3821c000, +0x38220000, 0x38224000, 0x38228000, 0x3822c000, 0x38230000, 0x38234000, +0x38238000, 0x3823c000, 0x38240000, 0x38244000, 0x38248000, 0x3824c000, +0x38250000, 0x38254000, 0x38258000, 0x3825c000, 0x38260000, 0x38264000, +0x38268000, 0x3826c000, 0x38270000, 0x38274000, 0x38278000, 0x3827c000, +0x38280000, 0x38284000, 0x38288000, 0x3828c000, 0x38290000, 0x38294000, +0x38298000, 0x3829c000, 0x382a0000, 0x382a4000, 0x382a8000, 0x382ac000, +0x382b0000, 0x382b4000, 0x382b8000, 0x382bc000, 0x382c0000, 0x382c4000, +0x382c8000, 0x382cc000, 0x382d0000, 0x382d4000, 0x382d8000, 0x382dc000, +0x382e0000, 0x382e4000, 0x382e8000, 0x382ec000, 0x382f0000, 0x382f4000, +0x382f8000, 0x382fc000, 0x38300000, 0x38304000, 0x38308000, 0x3830c000, +0x38310000, 0x38314000, 0x38318000, 0x3831c000, 0x38320000, 0x38324000, +0x38328000, 0x3832c000, 0x38330000, 0x38334000, 0x38338000, 0x3833c000, +0x38340000, 0x38344000, 0x38348000, 0x3834c000, 0x38350000, 0x38354000, +0x38358000, 0x3835c000, 0x38360000, 0x38364000, 0x38368000, 0x3836c000, +0x38370000, 0x38374000, 0x38378000, 0x3837c000, 0x38380000, 0x38384000, +0x38388000, 0x3838c000, 0x38390000, 0x38394000, 0x38398000, 0x3839c000, +0x383a0000, 0x383a4000, 0x383a8000, 0x383ac000, 0x383b0000, 0x383b4000, +0x383b8000, 0x383bc000, 0x383c0000, 0x383c4000, 0x383c8000, 0x383cc000, +0x383d0000, 0x383d4000, 0x383d8000, 0x383dc000, 0x383e0000, 0x383e4000, +0x383e8000, 0x383ec000, 0x383f0000, 0x383f4000, 0x383f8000, 0x383fc000, +0x38400000, 0x38404000, 0x38408000, 0x3840c000, 0x38410000, 0x38414000, +0x38418000, 0x3841c000, 0x38420000, 0x38424000, 0x38428000, 0x3842c000, +0x38430000, 0x38434000, 0x38438000, 0x3843c000, 0x38440000, 0x38444000, +0x38448000, 0x3844c000, 0x38450000, 0x38454000, 0x38458000, 0x3845c000, +0x38460000, 0x38464000, 0x38468000, 0x3846c000, 0x38470000, 0x38474000, +0x38478000, 0x3847c000, 0x38480000, 0x38484000, 0x38488000, 0x3848c000, +0x38490000, 0x38494000, 0x38498000, 0x3849c000, 0x384a0000, 0x384a4000, +0x384a8000, 0x384ac000, 0x384b0000, 0x384b4000, 0x384b8000, 0x384bc000, +0x384c0000, 0x384c4000, 0x384c8000, 0x384cc000, 0x384d0000, 0x384d4000, +0x384d8000, 0x384dc000, 0x384e0000, 0x384e4000, 0x384e8000, 0x384ec000, +0x384f0000, 0x384f4000, 0x384f8000, 0x384fc000, 0x38500000, 0x38504000, +0x38508000, 0x3850c000, 0x38510000, 0x38514000, 0x38518000, 0x3851c000, +0x38520000, 0x38524000, 0x38528000, 0x3852c000, 0x38530000, 0x38534000, +0x38538000, 0x3853c000, 0x38540000, 0x38544000, 0x38548000, 0x3854c000, +0x38550000, 0x38554000, 0x38558000, 0x3855c000, 0x38560000, 0x38564000, +0x38568000, 0x3856c000, 0x38570000, 0x38574000, 0x38578000, 0x3857c000, +0x38580000, 0x38584000, 0x38588000, 0x3858c000, 0x38590000, 0x38594000, +0x38598000, 0x3859c000, 0x385a0000, 0x385a4000, 0x385a8000, 0x385ac000, +0x385b0000, 0x385b4000, 0x385b8000, 0x385bc000, 0x385c0000, 0x385c4000, +0x385c8000, 0x385cc000, 0x385d0000, 0x385d4000, 0x385d8000, 0x385dc000, +0x385e0000, 0x385e4000, 0x385e8000, 0x385ec000, 0x385f0000, 0x385f4000, +0x385f8000, 0x385fc000, 0x38600000, 0x38604000, 0x38608000, 0x3860c000, +0x38610000, 0x38614000, 0x38618000, 0x3861c000, 0x38620000, 0x38624000, +0x38628000, 0x3862c000, 0x38630000, 0x38634000, 0x38638000, 0x3863c000, +0x38640000, 0x38644000, 0x38648000, 0x3864c000, 0x38650000, 0x38654000, +0x38658000, 0x3865c000, 0x38660000, 0x38664000, 0x38668000, 0x3866c000, +0x38670000, 0x38674000, 0x38678000, 0x3867c000, 0x38680000, 0x38684000, +0x38688000, 0x3868c000, 0x38690000, 0x38694000, 0x38698000, 0x3869c000, +0x386a0000, 0x386a4000, 0x386a8000, 0x386ac000, 0x386b0000, 0x386b4000, +0x386b8000, 0x386bc000, 0x386c0000, 0x386c4000, 0x386c8000, 0x386cc000, +0x386d0000, 0x386d4000, 0x386d8000, 0x386dc000, 0x386e0000, 0x386e4000, +0x386e8000, 0x386ec000, 0x386f0000, 0x386f4000, 0x386f8000, 0x386fc000, +0x38700000, 0x38704000, 0x38708000, 0x3870c000, 0x38710000, 0x38714000, +0x38718000, 0x3871c000, 0x38720000, 0x38724000, 0x38728000, 0x3872c000, +0x38730000, 0x38734000, 0x38738000, 0x3873c000, 0x38740000, 0x38744000, +0x38748000, 0x3874c000, 0x38750000, 0x38754000, 0x38758000, 0x3875c000, +0x38760000, 0x38764000, 0x38768000, 0x3876c000, 0x38770000, 0x38774000, +0x38778000, 0x3877c000, 0x38780000, 0x38784000, 0x38788000, 0x3878c000, +0x38790000, 0x38794000, 0x38798000, 0x3879c000, 0x387a0000, 0x387a4000, +0x387a8000, 0x387ac000, 0x387b0000, 0x387b4000, 0x387b8000, 0x387bc000, +0x387c0000, 0x387c4000, 0x387c8000, 0x387cc000, 0x387d0000, 0x387d4000, +0x387d8000, 0x387dc000, 0x387e0000, 0x387e4000, 0x387e8000, 0x387ec000, +0x387f0000, 0x387f4000, 0x387f8000, 0x387fc000, 0x38000000, 0x38002000, +0x38004000, 0x38006000, 0x38008000, 0x3800a000, 0x3800c000, 0x3800e000, +0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801a000, +0x3801c000, 0x3801e000, 0x38020000, 0x38022000, 0x38024000, 0x38026000, +0x38028000, 0x3802a000, 0x3802c000, 0x3802e000, 0x38030000, 0x38032000, +0x38034000, 0x38036000, 0x38038000, 0x3803a000, 0x3803c000, 0x3803e000, +0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804a000, +0x3804c000, 0x3804e000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, +0x38058000, 0x3805a000, 0x3805c000, 0x3805e000, 0x38060000, 0x38062000, +0x38064000, 0x38066000, 0x38068000, 0x3806a000, 0x3806c000, 0x3806e000, +0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807a000, +0x3807c000, 0x3807e000, 0x38080000, 0x38082000, 0x38084000, 0x38086000, +0x38088000, 0x3808a000, 0x3808c000, 0x3808e000, 0x38090000, 0x38092000, +0x38094000, 0x38096000, 0x38098000, 0x3809a000, 0x3809c000, 0x3809e000, +0x380a0000, 0x380a2000, 0x380a4000, 0x380a6000, 0x380a8000, 0x380aa000, +0x380ac000, 0x380ae000, 0x380b0000, 0x380b2000, 0x380b4000, 0x380b6000, +0x380b8000, 0x380ba000, 0x380bc000, 0x380be000, 0x380c0000, 0x380c2000, +0x380c4000, 0x380c6000, 0x380c8000, 0x380ca000, 0x380cc000, 0x380ce000, +0x380d0000, 0x380d2000, 0x380d4000, 0x380d6000, 0x380d8000, 0x380da000, +0x380dc000, 0x380de000, 0x380e0000, 0x380e2000, 0x380e4000, 0x380e6000, +0x380e8000, 0x380ea000, 0x380ec000, 0x380ee000, 0x380f0000, 0x380f2000, +0x380f4000, 0x380f6000, 0x380f8000, 0x380fa000, 0x380fc000, 0x380fe000, +0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810a000, +0x3810c000, 0x3810e000, 0x38110000, 0x38112000, 0x38114000, 0x38116000, +0x38118000, 0x3811a000, 0x3811c000, 0x3811e000, 0x38120000, 0x38122000, +0x38124000, 0x38126000, 0x38128000, 0x3812a000, 0x3812c000, 0x3812e000, +0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813a000, +0x3813c000, 0x3813e000, 0x38140000, 0x38142000, 0x38144000, 0x38146000, +0x38148000, 0x3814a000, 0x3814c000, 0x3814e000, 0x38150000, 0x38152000, +0x38154000, 0x38156000, 0x38158000, 0x3815a000, 0x3815c000, 0x3815e000, +0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816a000, +0x3816c000, 0x3816e000, 0x38170000, 0x38172000, 0x38174000, 0x38176000, +0x38178000, 0x3817a000, 0x3817c000, 0x3817e000, 0x38180000, 0x38182000, +0x38184000, 0x38186000, 0x38188000, 0x3818a000, 0x3818c000, 0x3818e000, +0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819a000, +0x3819c000, 0x3819e000, 0x381a0000, 0x381a2000, 0x381a4000, 0x381a6000, +0x381a8000, 0x381aa000, 0x381ac000, 0x381ae000, 0x381b0000, 0x381b2000, +0x381b4000, 0x381b6000, 0x381b8000, 0x381ba000, 0x381bc000, 0x381be000, +0x381c0000, 0x381c2000, 0x381c4000, 0x381c6000, 0x381c8000, 0x381ca000, +0x381cc000, 0x381ce000, 0x381d0000, 0x381d2000, 0x381d4000, 0x381d6000, +0x381d8000, 0x381da000, 0x381dc000, 0x381de000, 0x381e0000, 0x381e2000, +0x381e4000, 0x381e6000, 0x381e8000, 0x381ea000, 0x381ec000, 0x381ee000, +0x381f0000, 0x381f2000, 0x381f4000, 0x381f6000, 0x381f8000, 0x381fa000, +0x381fc000, 0x381fe000, 0x38200000, 0x38202000, 0x38204000, 0x38206000, +0x38208000, 0x3820a000, 0x3820c000, 0x3820e000, 0x38210000, 0x38212000, +0x38214000, 0x38216000, 0x38218000, 0x3821a000, 0x3821c000, 0x3821e000, +0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822a000, +0x3822c000, 0x3822e000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, +0x38238000, 0x3823a000, 0x3823c000, 0x3823e000, 0x38240000, 0x38242000, +0x38244000, 0x38246000, 0x38248000, 0x3824a000, 0x3824c000, 0x3824e000, +0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825a000, +0x3825c000, 0x3825e000, 0x38260000, 0x38262000, 0x38264000, 0x38266000, +0x38268000, 0x3826a000, 0x3826c000, 0x3826e000, 0x38270000, 0x38272000, +0x38274000, 0x38276000, 0x38278000, 0x3827a000, 0x3827c000, 0x3827e000, +0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828a000, +0x3828c000, 0x3828e000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, +0x38298000, 0x3829a000, 0x3829c000, 0x3829e000, 0x382a0000, 0x382a2000, +0x382a4000, 0x382a6000, 0x382a8000, 0x382aa000, 0x382ac000, 0x382ae000, +0x382b0000, 0x382b2000, 0x382b4000, 0x382b6000, 0x382b8000, 0x382ba000, +0x382bc000, 0x382be000, 0x382c0000, 0x382c2000, 0x382c4000, 0x382c6000, +0x382c8000, 0x382ca000, 0x382cc000, 0x382ce000, 0x382d0000, 0x382d2000, +0x382d4000, 0x382d6000, 0x382d8000, 0x382da000, 0x382dc000, 0x382de000, +0x382e0000, 0x382e2000, 0x382e4000, 0x382e6000, 0x382e8000, 0x382ea000, +0x382ec000, 0x382ee000, 0x382f0000, 0x382f2000, 0x382f4000, 0x382f6000, +0x382f8000, 0x382fa000, 0x382fc000, 0x382fe000, 0x38300000, 0x38302000, +0x38304000, 0x38306000, 0x38308000, 0x3830a000, 0x3830c000, 0x3830e000, +0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831a000, +0x3831c000, 0x3831e000, 0x38320000, 0x38322000, 0x38324000, 0x38326000, +0x38328000, 0x3832a000, 0x3832c000, 0x3832e000, 0x38330000, 0x38332000, +0x38334000, 0x38336000, 0x38338000, 0x3833a000, 0x3833c000, 0x3833e000, +0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834a000, +0x3834c000, 0x3834e000, 0x38350000, 0x38352000, 0x38354000, 0x38356000, +0x38358000, 0x3835a000, 0x3835c000, 0x3835e000, 0x38360000, 0x38362000, +0x38364000, 0x38366000, 0x38368000, 0x3836a000, 0x3836c000, 0x3836e000, +0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837a000, +0x3837c000, 0x3837e000, 0x38380000, 0x38382000, 0x38384000, 0x38386000, +0x38388000, 0x3838a000, 0x3838c000, 0x3838e000, 0x38390000, 0x38392000, +0x38394000, 0x38396000, 0x38398000, 0x3839a000, 0x3839c000, 0x3839e000, +0x383a0000, 0x383a2000, 0x383a4000, 0x383a6000, 0x383a8000, 0x383aa000, +0x383ac000, 0x383ae000, 0x383b0000, 0x383b2000, 0x383b4000, 0x383b6000, +0x383b8000, 0x383ba000, 0x383bc000, 0x383be000, 0x383c0000, 0x383c2000, +0x383c4000, 0x383c6000, 0x383c8000, 0x383ca000, 0x383cc000, 0x383ce000, +0x383d0000, 0x383d2000, 0x383d4000, 0x383d6000, 0x383d8000, 0x383da000, +0x383dc000, 0x383de000, 0x383e0000, 0x383e2000, 0x383e4000, 0x383e6000, +0x383e8000, 0x383ea000, 0x383ec000, 0x383ee000, 0x383f0000, 0x383f2000, +0x383f4000, 0x383f6000, 0x383f8000, 0x383fa000, 0x383fc000, 0x383fe000, +0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840a000, +0x3840c000, 0x3840e000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, +0x38418000, 0x3841a000, 0x3841c000, 0x3841e000, 0x38420000, 0x38422000, +0x38424000, 0x38426000, 0x38428000, 0x3842a000, 0x3842c000, 0x3842e000, +0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843a000, +0x3843c000, 0x3843e000, 0x38440000, 0x38442000, 0x38444000, 0x38446000, +0x38448000, 0x3844a000, 0x3844c000, 0x3844e000, 0x38450000, 0x38452000, +0x38454000, 0x38456000, 0x38458000, 0x3845a000, 0x3845c000, 0x3845e000, +0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846a000, +0x3846c000, 0x3846e000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, +0x38478000, 0x3847a000, 0x3847c000, 0x3847e000, 0x38480000, 0x38482000, +0x38484000, 0x38486000, 0x38488000, 0x3848a000, 0x3848c000, 0x3848e000, +0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849a000, +0x3849c000, 0x3849e000, 0x384a0000, 0x384a2000, 0x384a4000, 0x384a6000, +0x384a8000, 0x384aa000, 0x384ac000, 0x384ae000, 0x384b0000, 0x384b2000, +0x384b4000, 0x384b6000, 0x384b8000, 0x384ba000, 0x384bc000, 0x384be000, +0x384c0000, 0x384c2000, 0x384c4000, 0x384c6000, 0x384c8000, 0x384ca000, +0x384cc000, 0x384ce000, 0x384d0000, 0x384d2000, 0x384d4000, 0x384d6000, +0x384d8000, 0x384da000, 0x384dc000, 0x384de000, 0x384e0000, 0x384e2000, +0x384e4000, 0x384e6000, 0x384e8000, 0x384ea000, 0x384ec000, 0x384ee000, +0x384f0000, 0x384f2000, 0x384f4000, 0x384f6000, 0x384f8000, 0x384fa000, +0x384fc000, 0x384fe000, 0x38500000, 0x38502000, 0x38504000, 0x38506000, +0x38508000, 0x3850a000, 0x3850c000, 0x3850e000, 0x38510000, 0x38512000, +0x38514000, 0x38516000, 0x38518000, 0x3851a000, 0x3851c000, 0x3851e000, +0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852a000, +0x3852c000, 0x3852e000, 0x38530000, 0x38532000, 0x38534000, 0x38536000, +0x38538000, 0x3853a000, 0x3853c000, 0x3853e000, 0x38540000, 0x38542000, +0x38544000, 0x38546000, 0x38548000, 0x3854a000, 0x3854c000, 0x3854e000, +0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855a000, +0x3855c000, 0x3855e000, 0x38560000, 0x38562000, 0x38564000, 0x38566000, +0x38568000, 0x3856a000, 0x3856c000, 0x3856e000, 0x38570000, 0x38572000, +0x38574000, 0x38576000, 0x38578000, 0x3857a000, 0x3857c000, 0x3857e000, +0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858a000, +0x3858c000, 0x3858e000, 0x38590000, 0x38592000, 0x38594000, 0x38596000, +0x38598000, 0x3859a000, 0x3859c000, 0x3859e000, 0x385a0000, 0x385a2000, +0x385a4000, 0x385a6000, 0x385a8000, 0x385aa000, 0x385ac000, 0x385ae000, +0x385b0000, 0x385b2000, 0x385b4000, 0x385b6000, 0x385b8000, 0x385ba000, +0x385bc000, 0x385be000, 0x385c0000, 0x385c2000, 0x385c4000, 0x385c6000, +0x385c8000, 0x385ca000, 0x385cc000, 0x385ce000, 0x385d0000, 0x385d2000, +0x385d4000, 0x385d6000, 0x385d8000, 0x385da000, 0x385dc000, 0x385de000, +0x385e0000, 0x385e2000, 0x385e4000, 0x385e6000, 0x385e8000, 0x385ea000, +0x385ec000, 0x385ee000, 0x385f0000, 0x385f2000, 0x385f4000, 0x385f6000, +0x385f8000, 0x385fa000, 0x385fc000, 0x385fe000, 0x38600000, 0x38602000, +0x38604000, 0x38606000, 0x38608000, 0x3860a000, 0x3860c000, 0x3860e000, +0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861a000, +0x3861c000, 0x3861e000, 0x38620000, 0x38622000, 0x38624000, 0x38626000, +0x38628000, 0x3862a000, 0x3862c000, 0x3862e000, 0x38630000, 0x38632000, +0x38634000, 0x38636000, 0x38638000, 0x3863a000, 0x3863c000, 0x3863e000, +0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864a000, +0x3864c000, 0x3864e000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, +0x38658000, 0x3865a000, 0x3865c000, 0x3865e000, 0x38660000, 0x38662000, +0x38664000, 0x38666000, 0x38668000, 0x3866a000, 0x3866c000, 0x3866e000, +0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867a000, +0x3867c000, 0x3867e000, 0x38680000, 0x38682000, 0x38684000, 0x38686000, +0x38688000, 0x3868a000, 0x3868c000, 0x3868e000, 0x38690000, 0x38692000, +0x38694000, 0x38696000, 0x38698000, 0x3869a000, 0x3869c000, 0x3869e000, +0x386a0000, 0x386a2000, 0x386a4000, 0x386a6000, 0x386a8000, 0x386aa000, +0x386ac000, 0x386ae000, 0x386b0000, 0x386b2000, 0x386b4000, 0x386b6000, +0x386b8000, 0x386ba000, 0x386bc000, 0x386be000, 0x386c0000, 0x386c2000, +0x386c4000, 0x386c6000, 0x386c8000, 0x386ca000, 0x386cc000, 0x386ce000, +0x386d0000, 0x386d2000, 0x386d4000, 0x386d6000, 0x386d8000, 0x386da000, +0x386dc000, 0x386de000, 0x386e0000, 0x386e2000, 0x386e4000, 0x386e6000, +0x386e8000, 0x386ea000, 0x386ec000, 0x386ee000, 0x386f0000, 0x386f2000, +0x386f4000, 0x386f6000, 0x386f8000, 0x386fa000, 0x386fc000, 0x386fe000, +0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870a000, +0x3870c000, 0x3870e000, 0x38710000, 0x38712000, 0x38714000, 0x38716000, +0x38718000, 0x3871a000, 0x3871c000, 0x3871e000, 0x38720000, 0x38722000, +0x38724000, 0x38726000, 0x38728000, 0x3872a000, 0x3872c000, 0x3872e000, +0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873a000, +0x3873c000, 0x3873e000, 0x38740000, 0x38742000, 0x38744000, 0x38746000, +0x38748000, 0x3874a000, 0x3874c000, 0x3874e000, 0x38750000, 0x38752000, +0x38754000, 0x38756000, 0x38758000, 0x3875a000, 0x3875c000, 0x3875e000, +0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876a000, +0x3876c000, 0x3876e000, 0x38770000, 0x38772000, 0x38774000, 0x38776000, +0x38778000, 0x3877a000, 0x3877c000, 0x3877e000, 0x38780000, 0x38782000, +0x38784000, 0x38786000, 0x38788000, 0x3878a000, 0x3878c000, 0x3878e000, +0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879a000, +0x3879c000, 0x3879e000, 0x387a0000, 0x387a2000, 0x387a4000, 0x387a6000, +0x387a8000, 0x387aa000, 0x387ac000, 0x387ae000, 0x387b0000, 0x387b2000, +0x387b4000, 0x387b6000, 0x387b8000, 0x387ba000, 0x387bc000, 0x387be000, +0x387c0000, 0x387c2000, 0x387c4000, 0x387c6000, 0x387c8000, 0x387ca000, +0x387cc000, 0x387ce000, 0x387d0000, 0x387d2000, 0x387d4000, 0x387d6000, +0x387d8000, 0x387da000, 0x387dc000, 0x387de000, 0x387e0000, 0x387e2000, +0x387e4000, 0x387e6000, 0x387e8000, 0x387ea000, 0x387ec000, 0x387ee000, +0x387f0000, 0x387f2000, 0x387f4000, 0x387f6000, 0x387f8000, 0x387fa000, +0x387fc000, 0x387fe000 +}; + +static cmsUInt16Number Offset[64] = { +0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0000, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400 +}; + +static cmsUInt32Number Exponent[64] = { +0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, +0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000, +0x06000000, 0x06800000, 0x07000000, 0x07800000, 0x08000000, 0x08800000, +0x09000000, 0x09800000, 0x0a000000, 0x0a800000, 0x0b000000, 0x0b800000, +0x0c000000, 0x0c800000, 0x0d000000, 0x0d800000, 0x0e000000, 0x0e800000, +0x0f000000, 0x47800000, 0x80000000, 0x80800000, 0x81000000, 0x81800000, +0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000, +0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000, +0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8a000000, 0x8a800000, +0x8b000000, 0x8b800000, 0x8c000000, 0x8c800000, 0x8d000000, 0x8d800000, +0x8e000000, 0x8e800000, 0x8f000000, 0xc7800000 +}; + +static cmsUInt16Number Base[512] = { +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, +0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x0c00, 0x1000, 0x1400, 0x1800, 0x1c00, +0x2000, 0x2400, 0x2800, 0x2c00, 0x3000, 0x3400, 0x3800, 0x3c00, 0x4000, 0x4400, +0x4800, 0x4c00, 0x5000, 0x5400, 0x5800, 0x5c00, 0x6000, 0x6400, 0x6800, 0x6c00, +0x7000, 0x7400, 0x7800, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, +0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, 0x8200, 0x8400, +0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00, 0xa000, 0xa400, 0xa800, 0xac00, +0xb000, 0xb400, 0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00, 0xd000, 0xd400, +0xd800, 0xdc00, 0xe000, 0xe400, 0xe800, 0xec00, 0xf000, 0xf400, 0xf800, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00 +}; + +static cmsUInt8Number Shift[512] = { +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, +0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, +0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, +0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x0d +}; + +cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h) +{ + union { + cmsFloat32Number flt; + cmsUInt32Number num; + } out; + + int n = h >> 10; + + out.num = Mantissa[ (h & 0x3ff) + Offset[ n ] ] + Exponent[ n ]; + return out.flt; +} + +cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt) +{ + union { + cmsFloat32Number flt; + cmsUInt32Number num; + } in; + + cmsUInt32Number n, j; + + in.flt = flt; + n = in.num; + j = (n >> 23) & 0x1ff; + + return (cmsUInt16Number) ((cmsUInt32Number) Base[ j ] + (( n & 0x007fffff) >> Shift[ j ])); +} + +#endif 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 258addde7c4..183d2f84d01 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -55,7 +55,7 @@ #include "lcms2_internal.h" -// This module incorporates several interpolation routines, for 1, 3, 4, 5, 6, 7 and 8 channels on input and +// This module incorporates several interpolation routines, for 1 to 8 channels on input and // up to 65535 channels on output. The user may change those by using the interpolation plug-in // Interpolation routines by default @@ -83,7 +83,7 @@ cmsBool _cmsRegisterInterpPlugin(cmsPluginBase* Data) // Set the interpolation method -static + cmsBool _cmsSetInterpolationRoutine(cmsInterpParams* p) { // Invoke factory, possibly in the Plug-in @@ -318,6 +318,116 @@ void Eval1InputFloat(const cmsFloat32Number Value[], } } +// Bilinear interpolation (16 bits) - cmsFloat32Number version +static +void BilinearInterpFloat(const cmsFloat32Number Input[], + cmsFloat32Number Output[], + const cmsInterpParams* p) + +{ +# define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a))) +# define DENS(i,j) (LutTable[(i)+(j)+OutChan]) + + const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; + cmsFloat32Number px, py; + int x0, y0, + X0, Y0, X1, Y1; + int TotalOut, OutChan; + cmsFloat32Number fx, fy, + d00, d01, d10, d11, + dx0, dx1, + dxy; + + TotalOut = p -> nOutputs; + px = Input[0] * p->Domain[0]; + py = Input[1] * p->Domain[1]; + + x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0; + y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0; + + X0 = p -> opta[1] * x0; + X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[1]); + + Y0 = p -> opta[0] * y0; + Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[0]); + + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + d00 = DENS(X0, Y0); + d01 = DENS(X0, Y1); + d10 = DENS(X1, Y0); + d11 = DENS(X1, Y1); + + dx0 = LERP(fx, d00, d10); + dx1 = LERP(fx, d01, d11); + + dxy = LERP(fy, dx0, dx1); + + Output[OutChan] = dxy; + } + + +# undef LERP +# undef DENS +} + +// Bilinear interpolation (16 bits) - optimized version +static +void BilinearInterp16(register const cmsUInt16Number Input[], + register cmsUInt16Number Output[], + register const cmsInterpParams* p) + +{ +#define DENS(i,j) (LutTable[(i)+(j)+OutChan]) +#define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) + + const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; + int OutChan, TotalOut; + cmsS15Fixed16Number fx, fy; + register int rx, ry; + int x0, y0; + register int X0, X1, Y0, Y1; + int d00, d01, d10, d11, + dx0, dx1, + dxy; + + TotalOut = p -> nOutputs; + + fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); + x0 = FIXED_TO_INT(fx); + rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain + + + fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); + y0 = FIXED_TO_INT(fy); + ry = FIXED_REST_TO_INT(fy); + + + X0 = p -> opta[1] * x0; + X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[1]); + + Y0 = p -> opta[0] * y0; + Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[0]); + + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + d00 = DENS(X0, Y0); + d01 = DENS(X0, Y1); + d10 = DENS(X1, Y0); + d11 = DENS(X1, Y1); + + dx0 = LERP(rx, d00, d10); + dx1 = LERP(rx, d01, d11); + + dxy = LERP(ry, dx0, dx1); + + Output[OutChan] = (cmsUInt16Number) dxy; + } + + +# undef LERP +# undef DENS +} // Trilinear interpolation (16 bits) - cmsFloat32Number version @@ -343,9 +453,21 @@ void TrilinearInterpFloat(const cmsFloat32Number Input[], TotalOut = p -> nOutputs; - px = Input[0] * p->Domain[0]; - py = Input[1] * p->Domain[1]; - pz = Input[2] * p->Domain[2]; + // We need some clipping here + px = Input[0]; + py = Input[1]; + pz = Input[2]; + + if (px < 0) px = 0; + if (px > 1) px = 1; + if (py < 0) py = 0; + if (py > 1) py = 1; + if (pz < 0) pz = 0; + if (pz > 1) pz = 1; + + px *= p->Domain[0]; + py *= p->Domain[1]; + pz *= p->Domain[2]; x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0; y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0; @@ -486,9 +608,21 @@ void TetrahedralInterpFloat(const cmsFloat32Number Input[], TotalOut = p -> nOutputs; - px = Input[0] * p->Domain[0]; - py = Input[1] * p->Domain[1]; - pz = Input[2] * p->Domain[2]; + // We need some clipping here + px = Input[0]; + py = Input[1]; + pz = Input[2]; + + if (px < 0) px = 0; + if (px > 1) px = 1; + if (py < 0) py = 0; + if (py > 1) py = 1; + if (pz < 0) pz = 0; + if (pz > 1) pz = 1; + + px *= p->Domain[0]; + py *= p->Domain[1]; + pz *= p->Domain[2]; x0 = (int) _cmsQuickFloor(px); rx = (px - (cmsFloat32Number) x0); y0 = (int) _cmsQuickFloor(py); ry = (py - (cmsFloat32Number) y0); @@ -570,7 +704,6 @@ void TetrahedralInterpFloat(const cmsFloat32Number Input[], -#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static void TetrahedralInterp16(register const cmsUInt16Number Input[], @@ -578,99 +711,131 @@ void TetrahedralInterp16(register const cmsUInt16Number Input[], register const cmsInterpParams* p) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p -> Table; - cmsS15Fixed16Number fx, fy, fz; - cmsS15Fixed16Number rx, ry, rz; - int x0, y0, z0; - cmsS15Fixed16Number c0, c1, c2, c3, Rest; - cmsUInt32Number OutChan; - cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; - cmsUInt32Number TotalOut = p -> nOutputs; + cmsS15Fixed16Number fx, fy, fz; + cmsS15Fixed16Number rx, ry, rz; + int x0, y0, z0; + cmsS15Fixed16Number c0, c1, c2, c3, Rest; + cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; + cmsUInt32Number TotalOut = p -> nOutputs; + fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); + fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); + fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]); - fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); - fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); - fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]); + x0 = FIXED_TO_INT(fx); + y0 = FIXED_TO_INT(fy); + z0 = FIXED_TO_INT(fz); - x0 = FIXED_TO_INT(fx); - y0 = FIXED_TO_INT(fy); - z0 = FIXED_TO_INT(fz); - - rx = FIXED_REST_TO_INT(fx); - ry = FIXED_REST_TO_INT(fy); - rz = FIXED_REST_TO_INT(fz); + rx = FIXED_REST_TO_INT(fx); + ry = FIXED_REST_TO_INT(fy); + rz = FIXED_REST_TO_INT(fz); X0 = p -> opta[2] * x0; - X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[2]); + X1 = (Input[0] == 0xFFFFU ? 0 : p->opta[2]); Y0 = p -> opta[1] * y0; - Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[1]); + Y1 = (Input[1] == 0xFFFFU ? 0 : p->opta[1]); Z0 = p -> opta[0] * z0; - Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta[0]); + Z1 = (Input[2] == 0xFFFFU ? 0 : p->opta[0]); - // These are the 6 Tetrahedral - for (OutChan=0; OutChan < TotalOut; OutChan++) { + LutTable = &LutTable[X0+Y0+Z0]; - c0 = DENS(X0, Y0, Z0); - - if (rx >= ry && ry >= rz) { - - c1 = DENS(X1, Y0, Z0) - c0; - c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); - c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); - - } - else - if (rx >= rz && rz >= ry) { - - c1 = DENS(X1, Y0, Z0) - c0; - c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); - c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)) + // which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16 + // This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16 + // at the cost of being off by one at 7fff and 17ffe. + if (rx >= ry) { + if (ry >= rz) { + Y1 += X1; + Z1 += Y1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c3 -= c2; + c2 -= c1; + c1 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } - else - if (rz >= rx && rx >= ry) { - - c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); - c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); - c3 = DENS(X0, Y0, Z1) - c0; - - } - else - if (ry >= rx && rx >= rz) { - - c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); - c2 = DENS(X0, Y1, Z0) - c0; - c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); - - } - else - if (ry >= rz && rz >= rx) { - - c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); - c2 = DENS(X0, Y1, Z0) - c0; - c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); - - } - else - if (rz >= ry && ry >= rx) { - - c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); - c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); - c3 = DENS(X0, Y0, Z1) - c0; - - } - else { - c1 = c2 = c3 = 0; - } - - Rest = c1 * rx + c2 * ry + c3 * rz; - - Output[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)); + } else if (rz >= rx) { + X1 += Z1; + Y1 += X1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c2 -= c1; + c1 -= c3; + c3 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } else { + Z1 += X1; + Y1 += Z1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c2 -= c3; + c3 -= c1; + c1 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } + } else { + if (rx >= rz) { + X1 += Y1; + Z1 += X1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c3 -= c1; + c1 -= c2; + c2 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } else if (ry >= rz) { + Z1 += Y1; + X1 += Z1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c1 -= c3; + c3 -= c2; + c2 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } else { + Y1 += Z1; + X1 += Y1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c1 -= c2; + c2 -= c3; + c3 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } } - } -#undef DENS #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) @@ -1102,7 +1267,7 @@ void Eval7Inputs(register const cmsUInt16Number Input[], K1 = p16 -> opta[6] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0)); p1 = *p16; - memmove(&p1.Domain[0], &p16 ->Domain[1], 5*sizeof(cmsUInt32Number)); + memmove(&p1.Domain[0], &p16 ->Domain[1], 6*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; @@ -1285,6 +1450,12 @@ cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cm } break; + case 2: // Duotone + if (IsFloat) + Interpolation.LerpFloat = BilinearInterpFloat; + else + Interpolation.Lerp16 = BilinearInterp16; + break; case 3: // RGB et al 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 257a964125d..5bad907e2d7 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -142,6 +142,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID) iohandler ->ContextID = ContextID; iohandler ->stream = (void*) fm; iohandler ->UsedSpace = 0; + iohandler ->ReportedSize = 0; iohandler ->PhysicalFile[0] = 0; iohandler ->Read = NULLRead; @@ -232,13 +233,11 @@ cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, co memmove(ResData ->Block + ResData ->Pointer, Ptr, size); ResData ->Pointer += size; + iohandler->UsedSpace += size; if (ResData ->Pointer > iohandler->UsedSpace) iohandler->UsedSpace = ResData ->Pointer; - - iohandler->UsedSpace += size; - return TRUE; } @@ -297,6 +296,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buff fm ->FreeBlockOnClose = TRUE; fm ->Size = size; fm ->Pointer = 0; + iohandler -> ReportedSize = size; break; case 'w': @@ -307,10 +307,11 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buff fm ->FreeBlockOnClose = FALSE; fm ->Size = size; fm ->Pointer = 0; + iohandler -> ReportedSize = 0; break; default: - cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknow access mode '%c'", *AccessMode); + cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown access mode '%c'", *AccessMode); return NULL; } @@ -407,6 +408,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' not found", FileName); return NULL; } + iohandler -> ReportedSize = cmsfilelength(fm); break; case 'w': @@ -416,11 +418,12 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha cmsSignalError(ContextID, cmsERROR_FILE, "Couldn't create '%s'", FileName); return NULL; } + iohandler -> ReportedSize = 0; break; default: _cmsFree(ContextID, iohandler); - cmsSignalError(ContextID, cmsERROR_FILE, "Unknow access mode '%c'", *AccessMode); + cmsSignalError(ContextID, cmsERROR_FILE, "Unknown access mode '%c'", *AccessMode); return NULL; } @@ -455,6 +458,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* S iohandler -> ContextID = ContextID; iohandler -> stream = (void*) Stream; iohandler -> UsedSpace = 0; + iohandler -> ReportedSize = cmsfilelength(Stream); iohandler -> PhysicalFile[0] = 0; iohandler ->Read = FileRead; @@ -643,12 +647,17 @@ cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc) Icc -> flags = _cmsAdjustEndianess32(Header.flags); Icc -> manufacturer = _cmsAdjustEndianess32(Header.manufacturer); Icc -> model = _cmsAdjustEndianess32(Header.model); - _cmsAdjustEndianess64(&Icc -> attributes, Header.attributes); + _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes); Icc -> Version = _cmsAdjustEndianess32(Header.version); // Get size as reported in header HeaderSize = _cmsAdjustEndianess32(Header.size); + // Make sure HeaderSize is lower than profile size + if (HeaderSize >= Icc ->IOhandler ->ReportedSize) + HeaderSize = Icc ->IOhandler ->ReportedSize; + + // Get creation date/time _cmsDecodeDateTimeNumber(&Header.date, &Icc ->Created); @@ -664,6 +673,7 @@ cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc) return FALSE; } + // Read tag directory Icc -> TagCount = 0; for (i=0; i < TagCount; i++) { @@ -673,7 +683,8 @@ cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc) if (!_cmsReadUInt32Number(io, &Tag.size)) return FALSE; // Perform some sanity check. Offset + size should fall inside file. - if (Tag.offset + Tag.size > HeaderSize) + if (Tag.offset + Tag.size > HeaderSize || + Tag.offset + Tag.size < Tag.offset) continue; Icc -> TagNames[Icc ->TagCount] = Tag.sig; @@ -728,7 +739,7 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace) Header.manufacturer = _cmsAdjustEndianess32(Icc -> manufacturer); Header.model = _cmsAdjustEndianess32(Icc -> model); - _cmsAdjustEndianess64(&Header.attributes, Icc -> attributes); + _cmsAdjustEndianess64(&Header.attributes, &Icc -> attributes); // Rendering intent in the header (for embedded profiles) Header.renderingIntent = _cmsAdjustEndianess32(Icc -> RenderingIntent); @@ -822,7 +833,7 @@ cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile) void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; - Icc -> manufacturer = (cmsUInt32Number) model; + Icc -> model = (cmsUInt32Number) model; } @@ -1138,10 +1149,12 @@ cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig) continue; } - TypeBase = TypeHandler ->Signature; + TypeBase = TypeHandler ->Signature; if (!_cmsWriteTypeBase(io, TypeBase)) return FALSE; + TypeHandler ->ContextID = Icc ->ContextID; + TypeHandler ->ICCVersion = Icc ->Version; if (!TypeHandler ->WritePtr(TypeHandler, io, Data, TagDescriptor ->ElemCount)) { char String[5]; @@ -1317,8 +1330,12 @@ cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile) cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i]; - if (TypeHandler != NULL) + if (TypeHandler != NULL) { + + TypeHandler ->ContextID = Icc ->ContextID; // As an additional parameters + TypeHandler ->ICCVersion = Icc ->Version; TypeHandler ->FreePtr(TypeHandler, Icc -> TagPtrs[i]); + } else _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]); } @@ -1371,7 +1388,6 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig) if (n < 0) return NULL; // Not found, return NULL - // If the element is already in memory, return the pointer if (Icc -> TagPtrs[n]) { @@ -1406,6 +1422,9 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig) // Read the tag Icc -> TagTypeHandlers[n] = TypeHandler; + + TypeHandler ->ContextID = Icc ->ContextID; + TypeHandler ->ICCVersion = Icc ->Version; Icc -> TagPtrs[n] = TypeHandler ->ReadPtr(TypeHandler, io, &ElemCount, TagSize); // The tag type is supported, but something wrong happend and we cannot read the tag. @@ -1463,11 +1482,15 @@ cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const v cmsTagTypeSignature Type; int i; cmsFloat64Number Version; + char TypeString[5], SigString[5]; if (data == NULL) { - cmsSignalError(cmsGetProfileContextID(hProfile), cmsERROR_NULL, "couldn't wite NULL to tag"); + i = _cmsSearchTag(Icc, sig, FALSE); + if (i >= 0) + Icc ->TagNames[i] = (cmsTagSignature) 0; + // Unsupported by now, reserved for future ampliations (delete) return FALSE; } @@ -1482,7 +1505,13 @@ cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const v } else { TypeHandler = Icc ->TagTypeHandlers[i]; - TypeHandler->FreePtr(TypeHandler, Icc -> TagPtrs[i]); + + if (TypeHandler != NULL) { + + TypeHandler ->ContextID = Icc ->ContextID; // As an additional parameter + TypeHandler ->ICCVersion = Icc ->Version; + TypeHandler->FreePtr(TypeHandler, Icc -> TagPtrs[i]); + } } } } @@ -1514,6 +1543,7 @@ cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const v // Now we need to know which type to use. It depends on the version. Version = cmsGetProfileVersion(hProfile); + if (TagDescriptor ->DecideType != NULL) { // Let the tag descriptor to decide the type base on depending on @@ -1525,33 +1555,47 @@ cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const v } else { + Type = TagDescriptor ->SupportedTypes[0]; } // Does the tag support this type? if (!IsTypeSupported(TagDescriptor, Type)) { - cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%x' for tag '%x'", Type, sig); + + _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); + _cmsTagSignature2String(SigString, sig); + + cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString); return FALSE; } // Does we have a handler for this type? TypeHandler = _cmsGetTagTypeHandler(Type); if (TypeHandler == NULL) { - cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%x' for tag '%x'", Type, sig); + + _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); + _cmsTagSignature2String(SigString, sig); + + cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString); return FALSE; // Should never happen } + // Fill fields on icc structure Icc ->TagTypeHandlers[i] = TypeHandler; Icc ->TagNames[i] = sig; Icc ->TagSizes[i] = 0; Icc ->TagOffsets[i] = 0; - Icc ->TagPtrs[i] = TypeHandler ->DupPtr(TypeHandler, data, TagDescriptor ->ElemCount); + + TypeHandler ->ContextID = Icc ->ContextID; + TypeHandler ->ICCVersion = Icc ->Version; + Icc ->TagPtrs[i] = TypeHandler ->DupPtr(TypeHandler, data, TagDescriptor ->ElemCount); if (Icc ->TagPtrs[i] == NULL) { - TypeHandler ->DupPtr(TypeHandler, data, TagDescriptor ->ElemCount); - cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Malformed struct in type '%x' for tag '%x'", Type, sig); + _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); + _cmsTagSignature2String(SigString, sig); + cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Malformed struct in type '%s' for tag '%s'", TypeString, SigString); return FALSE; } @@ -1627,21 +1671,31 @@ cmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig if (data == NULL) { MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile)); } else{ - MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w"); + MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w"); } if (MemIO == NULL) return 0; // Obtain type handling for the tag TypeHandler = Icc ->TagTypeHandlers[i]; TagDescriptor = _cmsGetTagDescriptor(sig); + if (TagDescriptor == NULL) { + cmsCloseIOhandler(MemIO); + return 0; + } // Serialize + TypeHandler ->ContextID = Icc ->ContextID; + TypeHandler ->ICCVersion = Icc ->Version; + if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) { cmsCloseIOhandler(MemIO); return 0; } - if (!TypeHandler ->WritePtr(TypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) return 0; + if (!TypeHandler ->WritePtr(TypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) { + cmsCloseIOhandler(MemIO); + return 0; + } // Get Size and close rc = MemIO ->Tell(MemIO); @@ -1692,3 +1746,17 @@ cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSi return TRUE; } + + +// Returns the tag linked to sig, in the case two tags are sharing same resource +cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + int i; + + // Search for given tag in ICC profile directory + i = _cmsSearchTag(Icc, sig, FALSE); + if (i < 0) return (cmsTagSignature) 0; // Not found, return 0 + + return Icc -> TagLinked[i]; +} 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 b0daaf0e252..2dd12f79b4d 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -150,7 +150,7 @@ cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile) return TRUE; } - return _cmsAdaptationMatrix(Dest, NULL, cmsD50_XYZ(), White); + return _cmsAdaptationMatrix(Dest, NULL, White, cmsD50_XYZ()); } } @@ -261,11 +261,81 @@ cmsPipeline* BuildRGBInputMatrixShaper(cmsHPROFILE hProfile) cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)); cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL)); + + // Note that it is certainly possible a single profile would have a LUT based + // tag for output working in lab and a matrix-shaper for the fallback cases. + // This is not allowed by the spec, but this code is tolerant to those cases + if (cmsGetPCS(hProfile) == cmsSigLabData) { + + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID)); + } + } return Lut; } + + +// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded +/*static +cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); + + if (Lut == NULL) return NULL; + + // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding, + // and since the formatter has already accomodated to 0..1.0, we should undo this change + if ( spc == cmsSigLabData) + { + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)); + } + else + if (spc == cmsSigXYZData) + { + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)); + } + + return Lut; +} +*/ +static +cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); + cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); + + if (Lut == NULL) return NULL; + + // input and output of transform are in lcms 0..1 encoding. If XYZ or Lab spaces are used, + // these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0) + if ( spc == cmsSigLabData) + { + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)); + } + else if (spc == cmsSigXYZData) + { + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)); + } + + if ( PCS == cmsSigLabData) + { + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)); + } + else if( PCS == cmsSigXYZData) + { + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)); + } + + return Lut; +} + + // Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc // is adjusted here in order to create a LUT that takes care of all those details cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent) @@ -275,10 +345,30 @@ cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent) cmsTagSignature tagFloat = Device2PCSFloat[Intent]; cmsContext ContextID = cmsGetProfileContextID(hProfile); + // On named color, take the appropiate tag + if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { + + cmsPipeline* Lut; + cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag); + + if (nc == NULL) return NULL; + + Lut = cmsPipelineAlloc(ContextID, 0, 0); + if (Lut == NULL) { + cmsFreeNamedColorList(nc); + return NULL; + } + + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)); + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)); + return Lut; + } + if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence - // Floating point LUT are always V4, so no adjustment is required - return cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + // Floating point LUT are always V4, but the encoding range is no + // longer 0..1.0, so we need to add an stage depending on the color space + return _cmsReadFloatInputTag(hProfile, tagFloat); } // Revert to perceptual if no tag is found @@ -304,6 +394,10 @@ cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent) if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData) return Lut; + // If the input is Lab, add also a conversion at the begin + if (cmsGetColorSpace(hProfile) == cmsSigLabData) + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)); + // Add a matrix for conversion V2 to V4 Lab PCS cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)); return Lut; @@ -407,6 +501,14 @@ cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile) Lut = cmsPipelineAlloc(ContextID, 3, 3); if (Lut != NULL) { + // Note that it is certainly possible a single profile would have a LUT based + // tag for output working in lab and a matrix-shaper for the fallback cases. + // This is not allowed by the spec, but this code is tolerant to those cases + if (cmsGetPCS(hProfile) == cmsSigLabData) { + + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID)); + } + cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)); cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes)); } @@ -415,6 +517,88 @@ cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile) return Lut; } + +// Change CLUT interpolation to trilinear +static +void ChangeInterpolationToTrilinear(cmsPipeline* Lut) +{ + cmsStage* Stage; + + for (Stage = cmsPipelineGetPtrToFirstStage(Lut); + Stage != NULL; + Stage = cmsStageNext(Stage)) { + + if (cmsStageType(Stage) == cmsSigCLutElemType) { + + _cmsStageCLutData* CLUT = (_cmsStageCLutData*) Stage ->Data; + + CLUT ->Params->dwFlags |= CMS_LERP_FLAGS_TRILINEAR; + _cmsSetInterpolationRoutine(CLUT ->Params); + } + } +} + + +// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded +/*static +cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); + + if (Lut == NULL) return NULL; + + // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding, + // and since the formatter has already accomodated to 0..1.0, we should undo this change + if ( PCS == cmsSigLabData) + { + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)); + } + else + if (PCS == cmsSigXYZData) + { + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)); + } + + return Lut; +}*/ + +static +cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); + cmsColorSpaceSignature dataSpace = cmsGetColorSpace(hProfile); + + if (Lut == NULL) return NULL; + + // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding, + // and since the formatter has already accomodated to 0..1.0, we should undo this change + if ( PCS == cmsSigLabData) + { + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)); + } + else + if (PCS == cmsSigXYZData) + { + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)); + } + + // the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline + if ( dataSpace == cmsSigLabData) + { + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)); + } + else if ( dataSpace == cmsSigXYZData) + { + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)); + } + + return Lut; +} + // Create an output MPE LUT from agiven profile. Version mismatches are handled here cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent) { @@ -425,8 +609,8 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent) if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence - // Floating point LUT are always V4, so no adjustment is required - return cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + // Floating point LUT are always V4 + return _cmsReadFloatOutputTag(hProfile, tagFloat); } // Revert to perceptual if no tag is found @@ -447,6 +631,12 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent) // The profile owns the Lut, so we need to copy it Lut = cmsPipelineDup(Lut); + if (Lut == NULL) return NULL; + + // Now it is time for a controversial stuff. I found that for 3D LUTS using + // Lab used as indexer space, trilinear interpolation should be used + if (cmsGetPCS(hProfile) == cmsSigLabData) + ChangeInterpolationToTrilinear(Lut); // We need to adjust data only for Lab and Lut16 type if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData) @@ -454,6 +644,11 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent) // Add a matrix for conversion V4 to V2 Lab PCS cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)); + + // If the output is Lab, add also a conversion at the end + if (cmsGetColorSpace(hProfile) == cmsSigLabData) + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)); + return Lut; } @@ -467,12 +662,46 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent) return BuildGrayOutputPipeline(hProfile); } - // Not gray, create a normal matrix-shaper + // Not gray, create a normal matrix-shaper, which only operates in XYZ space return BuildRGBOutputMatrixShaper(hProfile); } // --------------------------------------------------------------------------------------------------------------- +// Read the AToD0 tag, adjusting the encoding of Lab or XYZ if neded +static +cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); + cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); + + if (Lut == NULL) return NULL; + + if (spc == cmsSigLabData) + { + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)); + } + else + if (spc == cmsSigXYZData) + { + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)); + } + + if (PCS == cmsSigLabData) + { + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)); + } + else + if (PCS == cmsSigXYZData) + { + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)); + } + + return Lut; +} + // This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The // tag name here may default to AToB0 cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent) @@ -483,10 +712,30 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent) cmsTagSignature tagFloat = Device2PCSFloat[Intent]; cmsContext ContextID = cmsGetProfileContextID(hProfile); + + // On named color, take the appropiate tag + if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { + + cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag); + + if (nc == NULL) return NULL; + + Lut = cmsPipelineAlloc(ContextID, 0, 0); + if (Lut == NULL) { + cmsFreeNamedColorList(nc); + return NULL; + } + + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE)); + if (cmsGetColorSpace(hProfile) == cmsSigLabData) + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)); + return Lut; + } + if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence - // Floating point LUT are always V4, no adjustment is required - return cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + // Floating point LUT are always V + return _cmsReadFloatDevicelinkTag(hProfile, tagFloat); } tagFloat = Device2PCSFloat[0]; @@ -509,6 +758,12 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent) // The profile owns the Lut, so we need to copy it Lut = cmsPipelineDup(Lut); + if (Lut == NULL) return NULL; + + // Now it is time for a controversial stuff. I found that for 3D LUTS using + // Lab used as indexer space, trilinear interpolation should be used + if (cmsGetColorSpace(hProfile) == cmsSigLabData) + ChangeInterpolationToTrilinear(Lut); // After reading it, we have info about the original type OriginalType = _cmsGetTagTrueType(hProfile, tag16); @@ -558,7 +813,7 @@ cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile) } // Returns TRUE if the intent is implemented as CLUT -cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, int UsedDirection) +cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection) { const cmsTagSignature* TagTable; @@ -589,7 +844,7 @@ cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, int U // Return info about supported intents cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, - cmsUInt32Number Intent, int UsedDirection) + cmsUInt32Number Intent, cmsUInt32Number UsedDirection) { if (cmsIsCLUT(hProfile, Intent, UsedDirection)) return TRUE; @@ -607,7 +862,6 @@ cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, // Read both, profile sequence description and profile sequence id if present. Then combine both to // create qa unique structure holding both. Shame on ICC to store things in such complicated way. - cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile) { cmsSEQ* ProfileSeq; @@ -632,12 +886,13 @@ cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile) NewSeq = cmsDupProfileSequenceDescription(ProfileSeq); // Ok, proceed to the mixing - for (i=0; i < ProfileSeq ->n; i++) { + if (NewSeq != NULL) { + for (i=0; i < ProfileSeq ->n; i++) { - memmove(&NewSeq ->seq[i].ProfileID, &ProfileId ->seq[i].ProfileID, sizeof(cmsProfileID)); - NewSeq ->seq[i].Description = cmsMLUdup(ProfileId ->seq[i].Description); + memmove(&NewSeq ->seq[i].ProfileID, &ProfileId ->seq[i].ProfileID, sizeof(cmsProfileID)); + NewSeq ->seq[i].Description = cmsMLUdup(ProfileId ->seq[i].Description); + } } - return NewSeq; } 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 e5534234282..76b14238bf7 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -154,7 +154,7 @@ cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cms for (i=0; i < n; i++) { // Get asked type - Type = va_arg(args, cmsStageSignature); + Type = (cmsStageSignature)va_arg(args, cmsStageSignature); if (mpe ->Type != Type) { va_end(args); // Mismatch. We are done. @@ -197,9 +197,14 @@ void EvaluateCurves(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { - _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data; + _cmsStageToneCurvesData* Data; cmsUInt32Number i; + _cmsAssert(mpe != NULL); + + Data = (_cmsStageToneCurvesData*) mpe ->Data; + if (Data == NULL) return; + if (Data ->TheCurves == NULL) return; for (i=0; i < Data ->nCurves; i++) { @@ -210,9 +215,14 @@ void EvaluateCurves(const cmsFloat32Number In[], static void CurveSetElemTypeFree(cmsStage* mpe) { - _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data; + _cmsStageToneCurvesData* Data; cmsUInt32Number i; + _cmsAssert(mpe != NULL); + + Data = (_cmsStageToneCurvesData*) mpe ->Data; + if (Data == NULL) return; + if (Data ->TheCurves != NULL) { for (i=0; i < Data ->nCurves; i++) { if (Data ->TheCurves[i] != NULL) @@ -275,12 +285,14 @@ cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Numbe EvaluateCurves, CurveSetDup, CurveSetElemTypeFree, NULL ); if (NewMPE == NULL) return NULL; - NewElem = (_cmsStageToneCurvesData*) _cmsMalloc(ContextID, sizeof(_cmsStageToneCurvesData)); + NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(ContextID, sizeof(_cmsStageToneCurvesData)); if (NewElem == NULL) { cmsStageFree(NewMPE); return NULL; } + NewMPE ->Data = (void*) NewElem; + NewElem ->nCurves = nChannels; NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(ContextID, nChannels, sizeof(cmsToneCurve*)); if (NewElem ->TheCurves == NULL) { @@ -301,11 +313,10 @@ cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Numbe cmsStageFree(NewMPE); return NULL; } + } - NewMPE ->Data = (void*) NewElem; - - return NewMPE; + return NewMPE; } @@ -402,6 +413,9 @@ cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number R n = Rows * Cols; // Check for overflow + if (n == 0) return NULL; + if (n >= UINT_MAX / Cols) return NULL; + if (n >= UINT_MAX / Rows) return NULL; if (n < Rows || n < Cols) return NULL; NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigMatrixElemType, Cols, Rows, @@ -479,10 +493,20 @@ void EvaluateCLUTfloatIn16(const cmsFloat32Number In[], cmsFloat32Number Out[], static cmsUInt32Number CubeSize(const cmsUInt32Number Dims[], cmsUInt32Number b) { - cmsUInt32Number rv; + cmsUInt32Number rv, dim; - for (rv = 1; b > 0; b--) - rv *= Dims[b-1]; + _cmsAssert(Dims != NULL); + + for (rv = 1; b > 0; b--) { + + dim = Dims[b-1]; + if (dim == 0) return 0; // Error + + rv *= dim; + + // Check for overflow + if (rv > UINT_MAX / dim) return 0; + } return rv; } @@ -549,17 +573,35 @@ cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, _cmsStageCLutData* NewElem; cmsStage* NewMPE; + _cmsAssert(clutPoints != NULL); + + if (inputChan > MAX_INPUT_DIMENSIONS) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS); + return NULL; + } + NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan, EvaluateCLUTfloatIn16, CLUTElemDup, CLutElemTypeFree, NULL ); if (NewMPE == NULL) return NULL; - NewElem = (_cmsStageCLutData*) _cmsMalloc(ContextID, sizeof(_cmsStageCLutData)); - if (NewElem == NULL) return NULL; + NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData)); + if (NewElem == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + NewMPE ->Data = (void*) NewElem; NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan); NewElem -> HasFloatValues = FALSE; + if (n == 0) { + cmsStageFree(NewMPE); + return NULL; + } + + NewElem ->Tab.T = (cmsUInt16Number*) _cmsCalloc(ContextID, n, sizeof(cmsUInt16Number)); if (NewElem ->Tab.T == NULL) { cmsStageFree(NewMPE); @@ -578,8 +620,6 @@ cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, return NULL; } - NewMPE ->Data = (void*) NewElem; - return NewMPE; } @@ -623,18 +663,37 @@ cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const c { cmsUInt32Number i, n; _cmsStageCLutData* NewElem; - cmsStage* NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan, - EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL); + cmsStage* NewMPE; + _cmsAssert(clutPoints != NULL); + + if (inputChan > MAX_INPUT_DIMENSIONS) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS); + return NULL; + } + + NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan, + EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL); if (NewMPE == NULL) return NULL; - NewElem = (_cmsStageCLutData*) _cmsMalloc(ContextID, sizeof(_cmsStageCLutData)); - if (NewElem == NULL) return NULL; + NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData)); + if (NewElem == NULL) { + cmsStageFree(NewMPE); + return NULL; + } - NewElem -> nEntries = n = outputChan * CubeSize( clutPoints, inputChan); + NewMPE ->Data = (void*) NewElem; + + // There is a potential integer overflow on conputing n and nEntries. + NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan); NewElem -> HasFloatValues = TRUE; + if (n == 0) { + cmsStageFree(NewMPE); + return NULL; + } + NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat32Number)); if (NewElem ->Tab.TFloat == NULL) { cmsStageFree(NewMPE); @@ -647,7 +706,6 @@ cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const c } } - NewMPE ->Data = (void*) NewElem; NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT); if (NewElem ->Params == NULL) { @@ -715,8 +773,13 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v int nInputs, nOutputs; cmsUInt32Number* nSamples; cmsUInt16Number In[cmsMAXCHANNELS], Out[MAX_STAGE_CHANNELS]; - _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data; + _cmsStageCLutData* clut; + if (mpe == NULL) return FALSE; + + clut = (_cmsStageCLutData*) mpe->Data; + + if (clut == NULL) return FALSE; nSamples = clut->Params ->nSamples; nInputs = clut->Params ->nInputs; @@ -726,6 +789,7 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE; nTotalPoints = CubeSize(nSamples, nInputs); + if (nTotalPoints == 0) return FALSE; index = 0; for (i = 0; i < nTotalPoints; i++) { @@ -779,6 +843,7 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE; nTotalPoints = CubeSize(nSamples, nInputs); + if (nTotalPoints == 0) return FALSE; index = 0; for (i = 0; i < nTotalPoints; i++) { @@ -828,6 +893,7 @@ cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number if (nInputs >= cmsMAXCHANNELS) return FALSE; nTotalPoints = CubeSize(clutPoints, nInputs); + if (nTotalPoints == 0) return FALSE; for (i = 0; i < nTotalPoints; i++) { @@ -857,6 +923,7 @@ cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUI if (nInputs >= cmsMAXCHANNELS) return FALSE; nTotalPoints = CubeSize(clutPoints, nInputs); + if (nTotalPoints == 0) return FALSE; for (i = 0; i < nTotalPoints; i++) { @@ -992,6 +1059,89 @@ cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID) } +// To Lab to float. Note that the MPE gives numbers in normal Lab range +// and we need 0..1.0 range for the formatters +// L* : 0...100 => 0...1.0 (L* / 100) +// ab* : -128..+127 to 0..1 ((ab* + 128) / 255) + +cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID) +{ + static const cmsFloat64Number a1[] = { + 1.0/100.0, 0, 0, + 0, 1.0/255.0, 0, + 0, 0, 1.0/255.0 + }; + + static const cmsFloat64Number o1[] = { + 0, + 128.0/255.0, + 128.0/255.0 + }; + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1); + + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigLab2FloatPCS; + return mpe; +} + +// Fom XYZ to floating point PCS +cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID) +{ +#define n (32768.0/65535.0) + static const cmsFloat64Number a1[] = { + n, 0, 0, + 0, n, 0, + 0, 0, n + }; +#undef n + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL); + + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigXYZ2FloatPCS; + return mpe; +} + +cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID) +{ + static const cmsFloat64Number a1[] = { + 100.0, 0, 0, + 0, 255.0, 0, + 0, 0, 255.0 + }; + + static const cmsFloat64Number o1[] = { + 0, + -128.0, + -128.0 + }; + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1); + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigFloatPCS2Lab; + return mpe; +} + +cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID) +{ +#define n (65535.0/32768.0) + + static const cmsFloat64Number a1[] = { + n, 0, 0, + 0, n, 0, + 0, 0, n + }; +#undef n + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL); + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigFloatPCS2XYZ; + return mpe; +} + + + // ******************************************************************************** // Type cmsSigXYZ2LabElemType // ******************************************************************************** @@ -1201,22 +1351,28 @@ cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number In NewLUT ->DupDataFn = NULL; NewLUT ->FreeDataFn = NULL; NewLUT ->Data = NewLUT; - - NewLUT ->ContextID = ContextID; + NewLUT ->ContextID = ContextID; BlessLUT(NewLUT); return NewLUT; } +cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut) +{ + _cmsAssert(lut != NULL); + return lut ->ContextID; +} cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut) { + _cmsAssert(lut != NULL); return lut ->InputChannels; } cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut) { + _cmsAssert(lut != NULL); return lut ->OutputChannels; } @@ -1244,6 +1400,7 @@ void CMSEXPORT cmsPipelineFree(cmsPipeline* lut) // Default to evaluate the LUT on 16 bit-basis. void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut) { + _cmsAssert(lut != NULL); lut ->Eval16Fn(In, Out, lut->Data); } @@ -1251,6 +1408,7 @@ void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out // Does evaluate the LUT on cmsFloat32Number-basis. void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut) { + _cmsAssert(lut != NULL); lut ->EvalFloatFn(In, Out, lut); } @@ -1288,8 +1446,10 @@ cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut) Anterior = NewMPE; } - NewLUT ->DupDataFn = lut ->DupDataFn; - NewLUT ->FreeDataFn = lut ->FreeDataFn; + NewLUT ->Eval16Fn = lut ->Eval16Fn; + NewLUT ->EvalFloatFn = lut ->EvalFloatFn; + NewLUT ->DupDataFn = lut ->DupDataFn; + NewLUT ->FreeDataFn = lut ->FreeDataFn; if (NewLUT ->DupDataFn != NULL) NewLUT ->Data = NewLUT ->DupDataFn(lut ->ContextID, lut->Data); @@ -1306,6 +1466,9 @@ void CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStag { cmsStage* Anterior = NULL, *pt; + _cmsAssert(lut != NULL); + _cmsAssert(mpe != NULL); + switch (loc) { case cmsAT_BEGIN: @@ -1456,13 +1619,13 @@ cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut) return n; } -// This function may be used to set the optional evalueator and a block of private data. If private data is being used, an optional +// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional // duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality. void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut, _cmsOPTeval16Fn Eval16, void* PrivateData, - _cmsOPTfreeDataFn FreePrivateDataFn, - _cmsOPTdupDataFn DupPrivateDataFn) + _cmsFreeUserDataFn FreePrivateDataFn, + _cmsDupUserDataFn DupPrivateDataFn) { Lut ->Eval16Fn = Eval16; @@ -1640,3 +1803,4 @@ cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], return TRUE; } + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c index 881e425d402..ae00376ce3c 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), 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 590020213df..ed9366c05d0 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -202,3 +202,4 @@ void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v) r->n[VZ] = a->v[2].n[VX]*v->n[VX] + a->v[2].n[VY]*v->n[VY] + a->v[2].n[VZ]*v->n[VZ]; } + 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 156f6a54107..93a574e6654 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -117,7 +117,7 @@ cmsBool GrowMLUpool(cmsMLU* mlu) } -// Grows a ntry table for a MLU. Each time this function is called, table size is multiplied times two. +// Grows a entry table for a MLU. Each time this function is called, table size is multiplied times two. static cmsBool GrowMLUtable(cmsMLU* mlu) { @@ -130,7 +130,7 @@ cmsBool GrowMLUtable(cmsMLU* mlu) AllocatedEntries = mlu ->AllocatedEntries * 2; // Check for overflow - if (AllocatedEntries < mlu ->AllocatedEntries) return FALSE; + if (AllocatedEntries / 2 != mlu ->AllocatedEntries) return FALSE; // Reallocate the memory NewPtr = (_cmsMLUentry*)_cmsRealloc(mlu ->ContextID, mlu ->Entries, AllocatedEntries*sizeof(_cmsMLUentry)); @@ -359,9 +359,9 @@ const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu, if (Best == -1) Best = 0; - v = mlu ->Entries + Best; + v = mlu ->Entries + Best; - if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language; + if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language; if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country; if (len != NULL) *len = v ->Len; @@ -372,8 +372,8 @@ const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu, // Obtain an ASCII representation of the wide string. Setting buffer to NULL returns the len cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu, - const char LanguageCode[3], const char CountryCode[3], - char* Buffer, cmsUInt32Number BufferSize) + const char LanguageCode[3], const char CountryCode[3], + char* Buffer, cmsUInt32Number BufferSize) { const wchar_t *Wide; cmsUInt32Number StrLen = 0; @@ -417,8 +417,8 @@ cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu, // Obtain a wide representation of the MLU, on depending on current locale settings cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu, - const char LanguageCode[3], const char CountryCode[3], - wchar_t* Buffer, cmsUInt32Number BufferSize) + const char LanguageCode[3], const char CountryCode[3], + wchar_t* Buffer, cmsUInt32Number BufferSize) { const wchar_t *Wide; cmsUInt32Number StrLen = 0; @@ -491,6 +491,9 @@ cmsBool GrowNamedColorList(cmsNAMEDCOLORLIST* v) else size = v ->Allocated * 2; + // Keep a maximum color lists can grow, 100K entries seems reasonable + if (size > 1024*100) return FALSE; + NewPtr = (_cmsNAMEDCOLOR*) _cmsRealloc(v ->ContextID, v ->List, size * sizeof(_cmsNAMEDCOLOR)); if (NewPtr == NULL) return FALSE; @@ -516,6 +519,8 @@ cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUIn strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)); strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)); + v->Prefix[32] = v->Suffix[32] = 0; + v -> ColorantCount = ColorantCount; return v; @@ -569,9 +574,14 @@ cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList, for (i=0; i < 3; i++) NamedColorList ->List[NamedColorList ->nColors].PCS[i] = PCS == NULL ? 0 : PCS[i]; - if (Name != NULL) + if (Name != NULL) { + strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, sizeof(NamedColorList ->List[NamedColorList ->nColors].Name)); + + NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0; + + } else NamedColorList ->List[NamedColorList ->nColors].Name[0] = 0; @@ -644,6 +654,24 @@ void* DupNamedColorList(cmsStage* mpe) return cmsDupNamedColorList(List); } +static +void EvalNamedColorPCS(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) +{ + cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data; + cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0); + + if (index >= NamedColorList-> nColors) { + cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range; ignored", index); + } + else { + + // Named color always uses Lab + Out[0] = (cmsFloat32Number) (NamedColorList->List[index].PCS[0] / 65535.0); + Out[1] = (cmsFloat32Number) (NamedColorList->List[index].PCS[1] / 65535.0); + Out[2] = (cmsFloat32Number) (NamedColorList->List[index].PCS[2] / 65535.0); + } +} + static void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { @@ -662,15 +690,15 @@ void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const c // Named color lookup element -cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList) +cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS) { return _cmsStageAllocPlaceholder(NamedColorList ->ContextID, - cmsSigNamedColorElemType, - 1, 3, - EvalNamedColor, - DupNamedColorList, - FreeNamedColorList, - cmsDupNamedColorList(NamedColorList)); + cmsSigNamedColorElemType, + 1, UsePCS ? 3 : NamedColorList ->ColorantCount, + UsePCS ? EvalNamedColorPCS : EvalNamedColor, + DupNamedColorList, + FreeNamedColorList, + cmsDupNamedColorList(NamedColorList)); } @@ -771,3 +799,131 @@ Error: return NULL; } +// Dictionaries -------------------------------------------------------------------------------------------------------- + +// Dictionaries are just very simple linked lists + + +typedef struct _cmsDICT_struct { + cmsDICTentry* head; + cmsContext ContextID; +} _cmsDICT; + + +// Allocate an empty dictionary +cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID) +{ + _cmsDICT* dict = (_cmsDICT*) _cmsMallocZero(ContextID, sizeof(_cmsDICT)); + if (dict == NULL) return NULL; + + dict ->ContextID = ContextID; + return (cmsHANDLE) dict; + +} + +// Dispose resources +void CMSEXPORT cmsDictFree(cmsHANDLE hDict) +{ + _cmsDICT* dict = (_cmsDICT*) hDict; + cmsDICTentry *entry, *next; + + _cmsAssert(dict != NULL); + + // Walk the list freeing all nodes + entry = dict ->head; + while (entry != NULL) { + + if (entry ->DisplayName != NULL) cmsMLUfree(entry ->DisplayName); + if (entry ->DisplayValue != NULL) cmsMLUfree(entry ->DisplayValue); + if (entry ->Name != NULL) _cmsFree(dict ->ContextID, entry -> Name); + if (entry ->Value != NULL) _cmsFree(dict ->ContextID, entry -> Value); + + // Don't fall in the habitual trap... + next = entry ->Next; + _cmsFree(dict ->ContextID, entry); + + entry = next; + } + + _cmsFree(dict ->ContextID, dict); +} + + +// Duplicate a wide char string +static +wchar_t* DupWcs(cmsContext ContextID, const wchar_t* ptr) +{ + if (ptr == NULL) return NULL; + return (wchar_t*) _cmsDupMem(ContextID, ptr, (mywcslen(ptr) + 1) * sizeof(wchar_t)); +} + +// Add a new entry to the linked list +cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue) +{ + _cmsDICT* dict = (_cmsDICT*) hDict; + cmsDICTentry *entry; + + _cmsAssert(dict != NULL); + _cmsAssert(Name != NULL); + + entry = (cmsDICTentry*) _cmsMallocZero(dict ->ContextID, sizeof(cmsDICTentry)); + if (entry == NULL) return FALSE; + + entry ->DisplayName = cmsMLUdup(DisplayName); + entry ->DisplayValue = cmsMLUdup(DisplayValue); + entry ->Name = DupWcs(dict ->ContextID, Name); + entry ->Value = DupWcs(dict ->ContextID, Value); + + entry ->Next = dict ->head; + dict ->head = entry; + + return TRUE; +} + + +// Duplicates an existing dictionary +cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict) +{ + _cmsDICT* old_dict = (_cmsDICT*) hDict; + cmsHANDLE hNew; + _cmsDICT* new_dict; + cmsDICTentry *entry; + + _cmsAssert(old_dict != NULL); + + hNew = cmsDictAlloc(old_dict ->ContextID); + if (hNew == NULL) return NULL; + + new_dict = (_cmsDICT*) hNew; + + // Walk the list freeing all nodes + entry = old_dict ->head; + while (entry != NULL) { + + if (!cmsDictAddEntry(hNew, entry ->Name, entry ->Value, entry ->DisplayName, entry ->DisplayValue)) { + + cmsDictFree(hNew); + return NULL; + } + + entry = entry -> Next; + } + + return hNew; +} + +// Get a pointer to the linked list +const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict) +{ + _cmsDICT* dict = (_cmsDICT*) hDict; + + if (dict == NULL) return NULL; + return dict ->head; +} + +// Helper For external languages +const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e) +{ + if (e == NULL) return NULL; + return e ->Next; +} diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c index dab93e24fb7..808e03c0c98 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -223,6 +223,12 @@ cmsBool PreOptimize(cmsPipeline* Lut) // Remove V2 to V4 followed by V4 to V2 Opt |= _Remove2Op(Lut, cmsSigLabV2toV4, cmsSigLabV4toV2); + // Remove float pcs Lab conversions + Opt |= _Remove2Op(Lut, cmsSigLab2FloatPCS, cmsSigFloatPCS2Lab); + + // Remove float pcs Lab conversions + Opt |= _Remove2Op(Lut, cmsSigXYZ2FloatPCS, cmsSigFloatPCS2XYZ); + if (Opt) AnyOpt = TRUE; } while (Opt); @@ -298,7 +304,7 @@ Prelin16Data* PrelinOpt16alloc(cmsContext ContextID, int nOutputs, cmsToneCurve** Out ) { int i; - Prelin16Data* p16 = (Prelin16Data*) _cmsMallocZero(ContextID, sizeof(Prelin16Data)); + Prelin16Data* p16 = _cmsMallocZero(ContextID, sizeof(Prelin16Data)); if (p16 == NULL) return NULL; p16 ->nInputs = nInputs; @@ -411,42 +417,54 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], return FALSE; } - px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; - py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0; - pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0; - pw = ((cmsFloat64Number) At[3] * (p16->Domain[3])) / 65535.0; - - x0 = (int) floor(px); - y0 = (int) floor(py); - z0 = (int) floor(pz); - w0 = (int) floor(pw); - if (nChannelsIn == 4) { + px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; + py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0; + pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0; + pw = ((cmsFloat64Number) At[3] * (p16->Domain[3])) / 65535.0; + + x0 = (int) floor(px); + y0 = (int) floor(py); + z0 = (int) floor(pz); + w0 = (int) floor(pw); + if (((px - x0) != 0) || ((py - y0) != 0) || ((pz - z0) != 0) || ((pw - w0) != 0)) return FALSE; // Not on exact node index = p16 -> opta[3] * x0 + - p16 -> opta[2] * y0 + - p16 -> opta[1] * z0 + - p16 -> opta[0] * w0; + p16 -> opta[2] * y0 + + p16 -> opta[1] * z0 + + p16 -> opta[0] * w0; } else if (nChannelsIn == 3) { + px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; + py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0; + pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0; + + x0 = (int) floor(px); + y0 = (int) floor(py); + z0 = (int) floor(pz); + if (((px - x0) != 0) || ((py - y0) != 0) || ((pz - z0) != 0)) return FALSE; // Not on exact node index = p16 -> opta[2] * x0 + - p16 -> opta[1] * y0 + - p16 -> opta[0] * z0; + p16 -> opta[1] * y0 + + p16 -> opta[0] * z0; } else if (nChannelsIn == 1) { + px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; + + x0 = (int) floor(px); + if (((px - x0) != 0)) return FALSE; // Not on exact node index = p16 -> opta[0] * x0; @@ -462,13 +480,15 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], return TRUE; } -// Auxiliar, to see if two values are equal. +// Auxiliar, to see if two values are equal or very different static cmsBool WhitesAreEqual(int n, cmsUInt16Number White1[], cmsUInt16Number White2[] ) { int i; for (i=0; i < n; i++) { + + if (abs(White1[i] - White2[i]) > 0xf000) return TRUE; // Values are so extremly different that the fixup should be avoided if (White1[i] != White2[i]) return FALSE; } return TRUE; @@ -491,6 +511,8 @@ cmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColor &WhitePointOut, NULL, &nOuts)) return FALSE; // It needs to be fixed? + if (Lut ->InputChannels != nIns) return FALSE; + if (Lut ->OutputChannels != nOuts) return FALSE; cmsPipelineEval16(WhitePointIn, ObtainedOut, Lut); @@ -555,6 +577,7 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3 { cmsPipeline* Src; cmsPipeline* Dest; + cmsStage* mpe; cmsStage* CLUT; cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL; int nGridPoints; @@ -580,6 +603,13 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3 Src = *Lut; + // Named color pipelines cannot be optimized either + for (mpe = cmsPipelineGetPtrToFirstStage(Src); + mpe != NULL; + mpe = cmsStageNext(mpe)) { + if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE; + } + // Allocate an empty LUT Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); if (!Dest) return FALSE; @@ -817,8 +847,8 @@ void PrelinEval8(register const cmsUInt16Number Input[], cmsUInt8Number r, g, b; cmsS15Fixed16Number rx, ry, rz; cmsS15Fixed16Number c0, c1, c2, c3, Rest; - int OutChan; - register cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; + int OutChan; + register cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; Prelin8Data* p8 = (Prelin8Data*) D; register const cmsInterpParams* p = p8 ->p; int TotalOut = p -> nOutputs; @@ -892,15 +922,35 @@ void PrelinEval8(register const cmsUInt16Number Input[], } - Rest = c1 * rx + c2 * ry + c3 * rz; - - Output[OutChan] = (cmsUInt16Number)c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)); + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + Output[OutChan] = (cmsUInt16Number)c0 + ((Rest + (Rest>>16))>>16); } } #undef DENS + +// Curves that contain wide empty areas are not optimizeable +static +cmsBool IsDegenerated(const cmsToneCurve* g) +{ + int i, Zeros = 0, Poles = 0; + int nEntries = g ->nEntries; + + for (i=0; i < nEntries; i++) { + + if (g ->Table16[i] == 0x0000) Zeros++; + if (g ->Table16[i] == 0xffff) Poles++; + } + + if (Zeros == 1 && Poles == 1) return FALSE; // For linear tables + if (Zeros > (nEntries / 4)) return TRUE; // Degenerated, mostly zeros + if (Poles > (nEntries / 4)) return TRUE; // Degenerated, mostly poles + + return FALSE; +} + // -------------------------------------------------------------------------------------------------------------- // We need xput over here @@ -917,6 +967,7 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte cmsStage* OptimizedCLUTmpe; cmsColorSpaceSignature ColorSpace, OutputColorSpace; cmsStage* OptimizedPrelinMpe; + cmsStage* mpe; cmsToneCurve** OptimizedPrelinCurves; _cmsStageCLutData* OptimizedPrelinCLUT; @@ -935,6 +986,14 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte } OriginalLut = *Lut; + + // Named color pipelines cannot be optimized either + for (mpe = cmsPipelineGetPtrToFirstStage(OriginalLut); + mpe != NULL; + mpe = cmsStageNext(mpe)) { + if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE; + } + ColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat)); OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat)); nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags); @@ -981,6 +1040,9 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte // Exclude if non-monotonic if (!cmsIsToneCurveMonotonic(Trans[t])) lIsSuitable = FALSE; + + if (IsDegenerated(Trans[t])) + lIsSuitable = FALSE; } // If it is not suitable, just quit @@ -1413,12 +1475,12 @@ void FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8Bi // first we compute the resulting byte and then we store the byte times // 257. This quantization allows to round very quick by doing a >> 8, but // since the low byte is always equal to msb, we can do a & 0xff and this works! - cmsUInt16Number w = _cmsQuickSaturateWord(Val * 65535.0 + 0.5); + cmsUInt16Number w = _cmsQuickSaturateWord(Val * 65535.0); cmsUInt8Number b = FROM_16_TO_8(w); Table[i] = FROM_8_TO_16(b); } - else Table[i] = _cmsQuickSaturateWord(Val * 65535.0 + 0.5); + else Table[i] = _cmsQuickSaturateWord(Val * 65535.0); } } @@ -1655,3 +1717,5 @@ cmsBool _cmsOptimizePipeline(cmsPipeline** PtrLut, return AnySuccess; } + + 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 72d81a09d5f..0a2ba7b4499 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c @@ -57,8 +57,8 @@ // This module handles all formats supported by lcms. There are two flavors, 16 bits and // floating point. Floating point is supported only in a subset, those formats holding -// cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component as special -// case) +// cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component +// as special case) // --------------------------------------------------------------------------- @@ -73,9 +73,7 @@ // * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256 cmsINLINE cmsUInt16Number FomLabV2ToLabV4(cmsUInt16Number x) { - int a; - - a = (x << 8 | x) >> 8; // * 257 / 256 + int a = (x << 8 | x) >> 8; // * 257 / 256 if ( a > 0xffff) return 0xffff; return (cmsUInt16Number) a; } @@ -90,17 +88,18 @@ cmsINLINE cmsUInt16Number FomLabV4ToLabV2(cmsUInt16Number x) typedef struct { cmsUInt32Number Type; cmsUInt32Number Mask; - cmsFormatter16 Frm; + cmsFormatter16 Frm; } cmsFormatters16; typedef struct { cmsUInt32Number Type; cmsUInt32Number Mask; - cmsFormatterFloat Frm; + cmsFormatterFloat Frm; } cmsFormattersFloat; + #define ANYSPACE COLORSPACE_SH(31) #define ANYCHANNELS CHANNELS_SH(15) #define ANYEXTRA EXTRA_SH(7) @@ -119,6 +118,7 @@ typedef struct { // Unpacking routines (16 bits) ---------------------------------------------------------------------------------------- + // Does almost everything but is slow static cmsUInt8Number* UnrollChunkyBytes(register _cmsTRANSFORM* info, @@ -131,7 +131,7 @@ cmsUInt8Number* UnrollChunkyBytes(register _cmsTRANSFORM* info, int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap && !SwapFirst; + int ExtraFirst = DoSwap ^ SwapFirst; cmsUInt16Number v; int i; @@ -160,6 +160,10 @@ cmsUInt8Number* UnrollChunkyBytes(register _cmsTRANSFORM* info, } return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); + } // Extra channels are just ignored because come in the next planes @@ -169,13 +173,14 @@ cmsUInt8Number* UnrollPlanarBytes(register _cmsTRANSFORM* info, register cmsUInt8Number* accum, register cmsUInt32Number Stride) { - int nChan = T_CHANNELS(info -> InputFormat); - int DoSwap= T_DOSWAP(info ->InputFormat); - int Reverse= T_FLAVOR(info ->InputFormat); + int nChan = T_CHANNELS(info -> InputFormat); + int DoSwap = T_DOSWAP(info ->InputFormat); + int SwapFirst = T_SWAPFIRST(info ->InputFormat); + int Reverse = T_FLAVOR(info ->InputFormat); int i; cmsUInt8Number* Init = accum; - if (DoSwap) { + if (DoSwap ^ SwapFirst) { accum += T_EXTRA(info -> InputFormat) * Stride; } @@ -204,6 +209,9 @@ cmsUInt8Number* Unroll4Bytes(register _cmsTRANSFORM* info, wIn[3] = FROM_8_TO_16(*accum); accum++; // K return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -218,6 +226,9 @@ cmsUInt8Number* Unroll4BytesReverse(register _cmsTRANSFORM* info, wIn[3] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -232,6 +243,9 @@ cmsUInt8Number* Unroll4BytesSwapFirst(register _cmsTRANSFORM* info, wIn[2] = FROM_8_TO_16(*accum); accum++; // Y return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } // KYMC @@ -247,6 +261,9 @@ cmsUInt8Number* Unroll4BytesSwap(register _cmsTRANSFORM* info, wIn[0] = FROM_8_TO_16(*accum); accum++; // C return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -261,6 +278,9 @@ cmsUInt8Number* Unroll4BytesSwapSwapFirst(register _cmsTRANSFORM* info, wIn[3] = FROM_8_TO_16(*accum); accum++; // C return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -274,6 +294,9 @@ cmsUInt8Number* Unroll3Bytes(register _cmsTRANSFORM* info, wIn[2] = FROM_8_TO_16(*accum); accum++; // B return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -288,6 +311,9 @@ cmsUInt8Number* Unroll3BytesSkip1Swap(register _cmsTRANSFORM* info, wIn[0] = FROM_8_TO_16(*accum); accum++; // R return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -302,6 +328,9 @@ cmsUInt8Number* Unroll3BytesSkip1SwapFirst(register _cmsTRANSFORM* info, wIn[2] = FROM_8_TO_16(*accum); accum++; // B return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } @@ -317,6 +346,9 @@ cmsUInt8Number* Unroll3BytesSwap(register _cmsTRANSFORM* info, wIn[0] = FROM_8_TO_16(*accum); accum++; // R return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -330,6 +362,9 @@ cmsUInt8Number* UnrollLabV2_8(register _cmsTRANSFORM* info, wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -344,6 +379,9 @@ cmsUInt8Number* UnrollALabV2_8(register _cmsTRANSFORM* info, wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -357,34 +395,30 @@ cmsUInt8Number* UnrollLabV2_16(register _cmsTRANSFORM* info, wIn[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } - - -// Monochrome + alpha. Alpha is lost +// for duplex static cmsUInt8Number* Unroll2Bytes(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L - wIn[3] = FROM_8_TO_16(*accum); accum++; // alpha - return accum; -} - -static -cmsUInt8Number* Unroll2ByteSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { - wIn[3] = FROM_8_TO_16(*accum); accum++; // alpha - wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L + wIn[0] = FROM_8_TO_16(*accum); accum++; // ch1 + wIn[1] = FROM_8_TO_16(*accum); accum++; // ch2 + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } + + // Monochrome duplicates L into RGB for null-transforms static cmsUInt8Number* Unroll1Byte(register _cmsTRANSFORM* info, @@ -393,7 +427,27 @@ cmsUInt8Number* Unroll1Byte(register _cmsTRANSFORM* info, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Unroll1ByteSkip1(register _cmsTRANSFORM* info, + register cmsUInt16Number wIn[], + register cmsUInt8Number* accum, + register cmsUInt32Number Stride) +{ + wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L + accum += 1; + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -404,7 +458,11 @@ cmsUInt8Number* Unroll1ByteSkip2(register _cmsTRANSFORM* info, { wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L accum += 2; + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -414,7 +472,11 @@ cmsUInt8Number* Unroll1ByteReversed(register _cmsTRANSFORM* info, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(FROM_8_TO_16(*accum)); accum++; // L + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } @@ -430,7 +492,7 @@ cmsUInt8Number* UnrollAnyWords(register _cmsTRANSFORM* info, int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); - int ExtraFirst = DoSwap && !SwapFirst; + int ExtraFirst = DoSwap ^ SwapFirst; int i; if (ExtraFirst) { @@ -463,6 +525,8 @@ cmsUInt8Number* UnrollAnyWords(register _cmsTRANSFORM* info, } return accum; + + cmsUNUSED_PARAMETER(Stride); } static @@ -511,6 +575,9 @@ cmsUInt8Number* Unroll4Words(register _cmsTRANSFORM* info, wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -525,6 +592,9 @@ cmsUInt8Number* Unroll4WordsReverse(register _cmsTRANSFORM* info, wIn[3] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // K return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -539,6 +609,9 @@ cmsUInt8Number* Unroll4WordsSwapFirst(register _cmsTRANSFORM* info, wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } // KYMC @@ -554,6 +627,9 @@ cmsUInt8Number* Unroll4WordsSwap(register _cmsTRANSFORM* info, wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -568,6 +644,9 @@ cmsUInt8Number* Unroll4WordsSwapSwapFirst(register _cmsTRANSFORM* info, wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // C return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -579,7 +658,11 @@ cmsUInt8Number* Unroll3Words(register _cmsTRANSFORM* info, wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C R wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y B + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -591,7 +674,11 @@ cmsUInt8Number* Unroll3WordsSwap(register _cmsTRANSFORM* info, wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // C R wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // Y B + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -606,6 +693,9 @@ cmsUInt8Number* Unroll3WordsSkip1Swap(register _cmsTRANSFORM* info, wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // B return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -620,6 +710,9 @@ cmsUInt8Number* Unroll3WordsSkip1SwapFirst(register _cmsTRANSFORM* info, wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // B return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -629,7 +722,11 @@ cmsUInt8Number* Unroll1Word(register _cmsTRANSFORM* info, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // L + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -639,7 +736,11 @@ cmsUInt8Number* Unroll1WordReversed(register _cmsTRANSFORM* info, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -651,33 +752,29 @@ cmsUInt8Number* Unroll1WordSkip3(register _cmsTRANSFORM* info, wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum += 8; + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll2Words(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) -{ - wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // L - wIn[3] = *(cmsUInt16Number*) accum; accum += 2; // alpha - - return accum; -} - -static -cmsUInt8Number* Unroll2WordSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { - wIn[3] = *(cmsUInt16Number*) accum; accum += 2; // alpha - wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // L + wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // ch1 + wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // ch2 return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } + // This is a conversion of Lab double to 16 bits static cmsUInt8Number* UnrollLabDoubleTo16(register _cmsTRANSFORM* info, @@ -701,7 +798,41 @@ cmsUInt8Number* UnrollLabDoubleTo16(register _cmsTRANSFORM* info, else { cmsFloat2LabEncoded(wIn, (cmsCIELab*) accum); - accum += sizeof(cmsCIELab); + accum += sizeof(cmsCIELab) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); + return accum; + } +} + + +// This is a conversion of Lab float to 16 bits +static +cmsUInt8Number* UnrollLabFloatTo16(register _cmsTRANSFORM* info, + register cmsUInt16Number wIn[], + register cmsUInt8Number* accum, + register cmsUInt32Number Stride) +{ + cmsCIELab Lab; + + if (T_PLANAR(info -> InputFormat)) { + + cmsFloat32Number* Pt = (cmsFloat32Number*) accum; + + + Lab.L = Pt[0]; + Lab.a = Pt[Stride]; + Lab.b = Pt[Stride*2]; + + cmsFloat2LabEncoded(wIn, &Lab); + return accum + sizeof(cmsFloat32Number); + } + else { + + Lab.L = ((cmsFloat32Number*) accum)[0]; + Lab.a = ((cmsFloat32Number*) accum)[1]; + Lab.b = ((cmsFloat32Number*) accum)[2]; + + cmsFloat2LabEncoded(wIn, &Lab); + accum += (3 + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number); return accum; } } @@ -729,7 +860,7 @@ cmsUInt8Number* UnrollXYZDoubleTo16(register _cmsTRANSFORM* info, else { cmsFloat2XYZEncoded(wIn, (cmsCIEXYZ*) accum); - accum += sizeof(cmsCIEXYZ); + accum += sizeof(cmsCIEXYZ) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); return accum; } @@ -761,65 +892,117 @@ cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type) // Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits static cmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info, - register cmsUInt16Number wIn[], - register cmsUInt8Number* accum, - register cmsUInt32Number Stride) + register cmsUInt16Number wIn[], + register cmsUInt8Number* accum, + register cmsUInt32Number Stride) { - cmsFloat64Number* Inks = (cmsFloat64Number*) accum; - int nChan = T_CHANNELS(info -> InputFormat); - int Planar = T_PLANAR(info -> InputFormat); - int i; + + int nChan = T_CHANNELS(info -> InputFormat); + int DoSwap = T_DOSWAP(info ->InputFormat); + int Reverse = T_FLAVOR(info ->InputFormat); + int SwapFirst = T_SWAPFIRST(info -> InputFormat); + int Extra = T_EXTRA(info -> InputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + int Planar = T_PLANAR(info -> InputFormat); cmsFloat64Number v; - cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + cmsUInt16Number vi; + int i, start = 0; + cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + + + if (ExtraFirst) + start = Extra; for (i=0; i < nChan; i++) { + int index = DoSwap ? (nChan - i - 1) : i; + if (Planar) - - v = Inks[i * Stride]; + v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; else - v = Inks[i]; + v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[i + start]; - wIn[i] = _cmsQuickSaturateWord(v * maximum); + vi = _cmsQuickSaturateWord(v * maximum); + + if (Reverse) + vi = REVERSE_FLAVOR_16(vi); + + wIn[index] = vi; + } + + + if (Extra == 0 && SwapFirst) { + cmsUInt16Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); + wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat64Number); else - return accum + (nChan + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat64Number); + return accum + (nChan + Extra) * sizeof(cmsFloat64Number); } + + static cmsUInt8Number* UnrollFloatTo16(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { - cmsFloat32Number* Inks = (cmsFloat32Number*) accum; - int nChan = T_CHANNELS(info -> InputFormat); - int Planar = T_PLANAR(info -> InputFormat); - int i; + + int nChan = T_CHANNELS(info -> InputFormat); + int DoSwap = T_DOSWAP(info ->InputFormat); + int Reverse = T_FLAVOR(info ->InputFormat); + int SwapFirst = T_SWAPFIRST(info -> InputFormat); + int Extra = T_EXTRA(info -> InputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + int Planar = T_PLANAR(info -> InputFormat); cmsFloat32Number v; - cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + cmsUInt16Number vi; + int i, start = 0; + cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + + + if (ExtraFirst) + start = Extra; for (i=0; i < nChan; i++) { + int index = DoSwap ? (nChan - i - 1) : i; + if (Planar) - - v = Inks[i * Stride]; + v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride]; else - v = Inks[i]; + v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start]; - wIn[i] = _cmsQuickSaturateWord(v * maximum); + vi = _cmsQuickSaturateWord(v * maximum); + + if (Reverse) + vi = REVERSE_FLAVOR_16(vi); + + wIn[index] = vi; + } + + + if (Extra == 0 && SwapFirst) { + cmsUInt16Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); + wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat32Number); else - return accum + (nChan + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number); + return accum + (nChan + Extra) * sizeof(cmsFloat32Number); } + + // For 1 channel, we need to duplicate data (it comes in 0..1.0 range) static cmsUInt8Number* UnrollDouble1Chan(register _cmsTRANSFORM* info, @@ -832,12 +1015,13 @@ cmsUInt8Number* UnrollDouble1Chan(register _cmsTRANSFORM* info, wIn[0] = wIn[1] = wIn[2] = _cmsQuickSaturateWord(Inks[0] * 65535.0); return accum + sizeof(cmsFloat64Number); + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } //------------------------------------------------------------------------------------------------------------------- -// True cmsFloat32Number transformation. - // For anything going from cmsFloat32Number static cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, @@ -845,55 +1029,104 @@ cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, cmsUInt8Number* accum, cmsUInt32Number Stride) { - cmsFloat32Number* Inks = (cmsFloat32Number*) accum; - int nChan = T_CHANNELS(info -> InputFormat); - int Planar = T_PLANAR(info -> InputFormat); - int i; - cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0; + + int nChan = T_CHANNELS(info -> InputFormat); + int DoSwap = T_DOSWAP(info ->InputFormat); + int Reverse = T_FLAVOR(info ->InputFormat); + int SwapFirst = T_SWAPFIRST(info -> InputFormat); + int Extra = T_EXTRA(info -> InputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + int Planar = T_PLANAR(info -> InputFormat); + cmsFloat32Number v; + int i, start = 0; + cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; - for (i=0; i < nChan; i++) { + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; if (Planar) - wIn[i] = (cmsFloat32Number) (Inks[i * Stride] / maximum); + v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride]; else - wIn[i] = (cmsFloat32Number) (Inks[i] / maximum); + v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start]; + + v /= maximum; + + wIn[index] = Reverse ? 1 - v : v; + } + + + if (Extra == 0 && SwapFirst) { + cmsFloat32Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); + wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat32Number); else - return accum + (nChan + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number); + return accum + (nChan + Extra) * sizeof(cmsFloat32Number); } // For anything going from double + static cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, - cmsFloat32Number wIn[], - cmsUInt8Number* accum, - cmsUInt32Number Stride) + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) { - cmsFloat64Number* Inks = (cmsFloat64Number*) accum; - int nChan = T_CHANNELS(info -> InputFormat); - int Planar = T_PLANAR(info -> InputFormat); - int i; + + int nChan = T_CHANNELS(info -> InputFormat); + int DoSwap = T_DOSWAP(info ->InputFormat); + int Reverse = T_FLAVOR(info ->InputFormat); + int SwapFirst = T_SWAPFIRST(info -> InputFormat); + int Extra = T_EXTRA(info -> InputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + int Planar = T_PLANAR(info -> InputFormat); + cmsFloat64Number v; + int i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0; - for (i=0; i < nChan; i++) { + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; if (Planar) - wIn[i] = (cmsFloat32Number) (Inks[i * Stride] / maximum); + v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; else - wIn[i] = (cmsFloat32Number) (Inks[i] / maximum); + v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start]; + + v /= maximum; + + wIn[index] = (cmsFloat32Number) (Reverse ? 1.0 - v : v); + } + + + if (Extra == 0 && SwapFirst) { + cmsFloat32Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); + wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat64Number); else - return accum + (nChan + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat64Number); + return accum + (nChan + Extra) * sizeof(cmsFloat64Number); } + // From Lab double to cmsFloat32Number static cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info, @@ -913,11 +1146,11 @@ cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info, } else { - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); - accum += sizeof(cmsFloat64Number)*3; + accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } @@ -933,7 +1166,7 @@ cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info, if (T_PLANAR(info -> InputFormat)) { - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); @@ -941,16 +1174,17 @@ cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info, } else { - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); - accum += sizeof(cmsFloat32Number)*3; + accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } + // 1.15 fixed point, that means maximum value is MAX_ENCODEABLE_XYZ (0xFFFF) static cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info, @@ -974,7 +1208,7 @@ cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info, wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); - accum += sizeof(cmsFloat64Number)*3; + accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } @@ -1001,11 +1235,13 @@ cmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info, wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); - accum += sizeof(cmsFloat32Number)*3; + accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } + + // Packing routines ----------------------------------------------------------------------------------------------------------- @@ -1022,7 +1258,7 @@ cmsUInt8Number* PackAnyBytes(register _cmsTRANSFORM* info, int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int ExtraFirst = DoSwap && !SwapFirst; + int ExtraFirst = DoSwap ^ SwapFirst; cmsUInt8Number* swap1; cmsUInt8Number v = 0; int i; @@ -1057,6 +1293,8 @@ cmsUInt8Number* PackAnyBytes(register _cmsTRANSFORM* info, return output; + + cmsUNUSED_PARAMETER(Stride); } @@ -1073,7 +1311,7 @@ cmsUInt8Number* PackAnyWords(register _cmsTRANSFORM* info, int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int ExtraFirst = DoSwap && !SwapFirst; + int ExtraFirst = DoSwap ^ SwapFirst; cmsUInt16Number* swap1; cmsUInt16Number v = 0; int i; @@ -1113,6 +1351,8 @@ cmsUInt8Number* PackAnyWords(register _cmsTRANSFORM* info, return output; + + cmsUNUSED_PARAMETER(Stride); } @@ -1122,12 +1362,19 @@ cmsUInt8Number* PackPlanarBytes(register _cmsTRANSFORM* info, register cmsUInt8Number* output, register cmsUInt32Number Stride) { - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse= T_FLAVOR(info ->OutputFormat); + int nChan = T_CHANNELS(info -> OutputFormat); + int DoSwap = T_DOSWAP(info ->OutputFormat); + int SwapFirst = T_SWAPFIRST(info ->OutputFormat); + int Reverse = T_FLAVOR(info ->OutputFormat); int i; cmsUInt8Number* Init = output; + + if (DoSwap ^ SwapFirst) { + output += T_EXTRA(info -> OutputFormat) * Stride; + } + + for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; @@ -1138,6 +1385,8 @@ cmsUInt8Number* PackPlanarBytes(register _cmsTRANSFORM* info, } return (Init + 1); + + cmsUNUSED_PARAMETER(Stride); } @@ -1194,6 +1443,9 @@ cmsUInt8Number* Pack6Bytes(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(wOut[5]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } // KCMYcm @@ -1212,6 +1464,9 @@ cmsUInt8Number* Pack6BytesSwap(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(wOut[0]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } // CMYKcm @@ -1235,6 +1490,9 @@ cmsUInt8Number* Pack6Words(register _cmsTRANSFORM* info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } // KCMYcm @@ -1258,6 +1516,9 @@ cmsUInt8Number* Pack6WordsSwap(register _cmsTRANSFORM* info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } @@ -1273,6 +1534,9 @@ cmsUInt8Number* Pack4Bytes(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(wOut[3]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1287,6 +1551,9 @@ cmsUInt8Number* Pack4BytesReverse(register _cmsTRANSFORM* info, *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[3])); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } @@ -1302,6 +1569,9 @@ cmsUInt8Number* Pack4BytesSwapFirst(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(wOut[2]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } // ABGR @@ -1317,6 +1587,9 @@ cmsUInt8Number* Pack4BytesSwap(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(wOut[0]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1331,6 +1604,9 @@ cmsUInt8Number* Pack4BytesSwapSwapFirst(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(wOut[3]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1349,6 +1625,9 @@ cmsUInt8Number* Pack4Words(register _cmsTRANSFORM* info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1367,6 +1646,9 @@ cmsUInt8Number* Pack4WordsReverse(register _cmsTRANSFORM* info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } // ABGR @@ -1386,6 +1668,9 @@ cmsUInt8Number* Pack4WordsSwap(register _cmsTRANSFORM* info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } // CMYK @@ -1405,6 +1690,9 @@ cmsUInt8Number* Pack4WordsBigEndian(register _cmsTRANSFORM* info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } @@ -1419,6 +1707,9 @@ cmsUInt8Number* PackLabV2_8(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1433,6 +1724,9 @@ cmsUInt8Number* PackALabV2_8(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1449,6 +1743,9 @@ cmsUInt8Number* PackLabV2_16(register _cmsTRANSFORM* info, output += 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1462,6 +1759,9 @@ cmsUInt8Number* Pack3Bytes(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(wOut[2]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1475,6 +1775,9 @@ cmsUInt8Number* Pack3BytesOptimized(register _cmsTRANSFORM* info, *output++ = (wOut[2] & 0xFF); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1488,6 +1791,9 @@ cmsUInt8Number* Pack3BytesSwap(register _cmsTRANSFORM* info, *output++ = FROM_16_TO_8(wOut[0]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1501,6 +1807,9 @@ cmsUInt8Number* Pack3BytesSwapOptimized(register _cmsTRANSFORM* info, *output++ = (wOut[0] & 0xFF); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } @@ -1518,6 +1827,9 @@ cmsUInt8Number* Pack3Words(register _cmsTRANSFORM* info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1534,6 +1846,9 @@ cmsUInt8Number* Pack3WordsSwap(register _cmsTRANSFORM* info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static @@ -1550,10 +1865,13 @@ cmsUInt8Number* Pack3WordsBigEndian(register _cmsTRANSFORM* info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3BytesAndSkip1(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3BytesAndSkip1(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1564,10 +1882,13 @@ cmsUInt8Number* Pack3BytesAndSkip1(register _cmsTRANSFORM* Info, output++; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3BytesAndSkip1Optimized(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3BytesAndSkip1Optimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1578,11 +1899,14 @@ cmsUInt8Number* Pack3BytesAndSkip1Optimized(register _cmsTRANSFORM* Info, output++; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1593,10 +1917,13 @@ cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(register _cmsTRANSFORM* Info, *output++ = FROM_16_TO_8(wOut[2]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1607,10 +1934,13 @@ cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(register _cmsTRANSFORM* Inf *output++ = (wOut[2] & 0xFF); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3BytesAndSkip1Swap(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3BytesAndSkip1Swap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1621,10 +1951,13 @@ cmsUInt8Number* Pack3BytesAndSkip1Swap(register _cmsTRANSFORM* Info, *output++ = FROM_16_TO_8(wOut[0]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1635,11 +1968,14 @@ cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(register _cmsTRANSFORM* Info, *output++ = (wOut[0] & 0xFF); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1650,10 +1986,13 @@ cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(register _cmsTRANSFORM* Info, output++; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1664,10 +2003,13 @@ cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(register _cmsTRANSFORM* output++; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3WordsAndSkip1(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3WordsAndSkip1(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1681,10 +2023,13 @@ cmsUInt8Number* Pack3WordsAndSkip1(register _cmsTRANSFORM* Info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3WordsAndSkip1Swap(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3WordsAndSkip1Swap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1698,11 +2043,14 @@ cmsUInt8Number* Pack3WordsAndSkip1Swap(register _cmsTRANSFORM* Info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1716,11 +2064,14 @@ cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(register _cmsTRANSFORM* Info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1734,46 +2085,61 @@ cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(register _cmsTRANSFORM* Info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack1Byte(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack1Byte(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack1ByteReversed(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack1ByteReversed(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(REVERSE_FLAVOR_16(wOut[0])); + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack1ByteSkip1(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack1ByteSkip1(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); output++; + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack1ByteSkip1SwapFirst(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack1ByteSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1782,10 +2148,13 @@ cmsUInt8Number* Pack1ByteSkip1SwapFirst(register _cmsTRANSFORM* Info, *output++ = FROM_16_TO_8(wOut[0]); return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack1Word(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack1Word(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1794,11 +2163,14 @@ cmsUInt8Number* Pack1Word(register _cmsTRANSFORM* Info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack1WordReversed(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack1WordReversed(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1807,10 +2179,13 @@ cmsUInt8Number* Pack1WordReversed(register _cmsTRANSFORM* Info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack1WordBigEndian(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack1WordBigEndian(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1819,11 +2194,14 @@ cmsUInt8Number* Pack1WordBigEndian(register _cmsTRANSFORM* Info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack1WordSkip1(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack1WordSkip1(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1832,10 +2210,13 @@ cmsUInt8Number* Pack1WordSkip1(register _cmsTRANSFORM* Info, output+= 4; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } static -cmsUInt8Number* Pack1WordSkip1SwapFirst(register _cmsTRANSFORM* Info, +cmsUInt8Number* Pack1WordSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) @@ -1845,18 +2226,21 @@ cmsUInt8Number* Pack1WordSkip1SwapFirst(register _cmsTRANSFORM* Info, output+= 2; return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); } // Unencoded Float values -- don't try optimize speed static -cmsUInt8Number* PackLabDoubleFrom16(register _cmsTRANSFORM* Info, +cmsUInt8Number* PackLabDoubleFrom16(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { - if (T_PLANAR(Info -> OutputFormat)) { + if (T_PLANAR(info -> OutputFormat)) { cmsCIELab Lab; cmsFloat64Number* Out = (cmsFloat64Number*) output; @@ -1871,9 +2255,38 @@ cmsUInt8Number* PackLabDoubleFrom16(register _cmsTRANSFORM* Info, else { cmsLabEncoded2Float((cmsCIELab*) output, wOut); - return output + (sizeof(cmsCIELab) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); + return output + (sizeof(cmsCIELab) + T_EXTRA(info ->OutputFormat) * sizeof(cmsFloat64Number)); } +} + +static +cmsUInt8Number* PackLabFloatFrom16(register _cmsTRANSFORM* info, + register cmsUInt16Number wOut[], + register cmsUInt8Number* output, + register cmsUInt32Number Stride) +{ + cmsCIELab Lab; + cmsLabEncoded2Float(&Lab, wOut); + + if (T_PLANAR(info -> OutputFormat)) { + + cmsFloat32Number* Out = (cmsFloat32Number*) output; + + Out[0] = (cmsFloat32Number)Lab.L; + Out[Stride] = (cmsFloat32Number)Lab.a; + Out[Stride*2] = (cmsFloat32Number)Lab.b; + + return output + sizeof(cmsFloat32Number); + } + else { + + ((cmsFloat32Number*) output)[0] = (cmsFloat32Number) Lab.L; + ((cmsFloat32Number*) output)[1] = (cmsFloat32Number) Lab.a; + ((cmsFloat32Number*) output)[2] = (cmsFloat32Number) Lab.b; + + return output + (3 + T_EXTRA(info ->OutputFormat)) * sizeof(cmsFloat32Number); + } } static @@ -1888,7 +2301,7 @@ cmsUInt8Number* PackXYZDoubleFrom16(register _cmsTRANSFORM* Info, cmsFloat64Number* Out = (cmsFloat64Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); - Out[0] = XYZ.X; + Out[0] = XYZ.X; Out[Stride] = XYZ.Y; Out[Stride*2] = XYZ.Z; @@ -1904,96 +2317,135 @@ cmsUInt8Number* PackXYZDoubleFrom16(register _cmsTRANSFORM* Info, } static -cmsUInt8Number* PackDoubleFrom16(register _cmsTRANSFORM* Info, - register cmsUInt16Number wOut[], - register cmsUInt8Number* output, - register cmsUInt32Number Stride) -{ - cmsFloat64Number* Inks = (cmsFloat64Number*) output; - int nChan = T_CHANNELS(Info -> OutputFormat); - int i; - cmsFloat64Number maximum = IsInkSpace(Info ->InputFormat) ? 655.35 : 65535.0; - - if (T_PLANAR(Info -> OutputFormat)) { - - for (i=0; i < nChan; i++) { - - Inks[i*Stride] = wOut[i] / maximum; - } - - return output + sizeof(cmsFloat64Number); - } - else { - - for (i=0; i < nChan; i++) { - - Inks[i] = wOut[i] / maximum; - } - - - return output + (nChan + T_EXTRA(Info ->OutputFormat)) * sizeof(cmsFloat64Number); - } - -} - -static -cmsUInt8Number* PackFloatFrom16(register _cmsTRANSFORM* Info, +cmsUInt8Number* PackDoubleFrom16(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { - cmsFloat32Number* Inks = (cmsFloat32Number*) output; - int nChan = T_CHANNELS(Info -> OutputFormat); - int i; - cmsFloat64Number maximum = IsInkSpace(Info ->OutputFormat) ? 655.35 : 65535.0; + int nChan = T_CHANNELS(info -> OutputFormat); + int DoSwap = T_DOSWAP(info ->OutputFormat); + int Reverse = T_FLAVOR(info ->OutputFormat); + int Extra = T_EXTRA(info -> OutputFormat); + int SwapFirst = T_SWAPFIRST(info -> OutputFormat); + int Planar = T_PLANAR(info -> OutputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0; + cmsFloat64Number v = 0; + cmsFloat64Number* swap1 = (cmsFloat64Number*) output; + int i, start = 0; - if (T_PLANAR(Info -> OutputFormat)) { + if (ExtraFirst) + start = Extra; - for (i=0; i < nChan; i++) { + for (i=0; i < nChan; i++) { - Inks[i*Stride] = (cmsFloat32Number) (wOut[i] / maximum); - } + int index = DoSwap ? (nChan - i - 1) : i; - return output + sizeof(cmsFloat32Number); + v = (cmsFloat64Number) wOut[index] / maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsFloat64Number*) output)[(i + start) * Stride]= v; + else + ((cmsFloat64Number*) output)[i + start] = v; } - else { - for (i=0; i < nChan; i++) { - - Inks[i] = (cmsFloat32Number) (wOut[i] / maximum); - } - - - return output + (nChan + T_EXTRA(Info ->OutputFormat)) * sizeof(cmsFloat32Number); + if (!ExtraFirst) { + output += Extra * sizeof(cmsFloat64Number); } + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number)); + *swap1 = v; + } + + if (T_PLANAR(info -> OutputFormat)) + return output + sizeof(cmsFloat64Number); + else + return output + nChan * sizeof(cmsFloat64Number); + } +static +cmsUInt8Number* PackFloatFrom16(register _cmsTRANSFORM* info, + register cmsUInt16Number wOut[], + register cmsUInt8Number* output, + register cmsUInt32Number Stride) +{ + int nChan = T_CHANNELS(info -> OutputFormat); + int DoSwap = T_DOSWAP(info ->OutputFormat); + int Reverse = T_FLAVOR(info ->OutputFormat); + int Extra = T_EXTRA(info -> OutputFormat); + int SwapFirst = T_SWAPFIRST(info -> OutputFormat); + int Planar = T_PLANAR(info -> OutputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0; + cmsFloat64Number v = 0; + cmsFloat32Number* swap1 = (cmsFloat32Number*) output; + int i, start = 0; + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; + + v = (cmsFloat64Number) wOut[index] / maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsFloat32Number*) output)[(i + start ) * Stride]= (cmsFloat32Number) v; + else + ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v; + } + + if (!ExtraFirst) { + output += Extra * sizeof(cmsFloat32Number); + } + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number)); + *swap1 = (cmsFloat32Number) v; + } + + if (T_PLANAR(info -> OutputFormat)) + return output + sizeof(cmsFloat32Number); + else + return output + nChan * sizeof(cmsFloat32Number); +} + + + // -------------------------------------------------------------------------------------------------------- static -cmsUInt8Number* PackChunkyFloatsFromFloat(_cmsTRANSFORM* info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) +cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int ExtraFirst = DoSwap && !SwapFirst; + int Planar = T_PLANAR(info -> OutputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0; - cmsFloat32Number* swap1; + cmsFloat32Number* swap1 = (cmsFloat32Number*) output; cmsFloat64Number v = 0; - int i; + int i, start = 0; - swap1 = (cmsFloat32Number*) output; - - if (ExtraFirst) { - output += Extra * sizeof(cmsFloat32Number); - } + if (ExtraFirst) + start = Extra; for (i=0; i < nChan; i++) { @@ -2004,42 +2456,48 @@ cmsUInt8Number* PackChunkyFloatsFromFloat(_cmsTRANSFORM* info, if (Reverse) v = maximum - v; - *(cmsFloat32Number*) output = (cmsFloat32Number) v; - - output += sizeof(cmsFloat32Number); + if (Planar) + ((cmsFloat32Number*) output)[(i + start)* Stride]= (cmsFloat32Number) v; + else + ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v; } if (!ExtraFirst) { output += Extra * sizeof(cmsFloat32Number); } - if (Extra == 0 && SwapFirst) { + if (Extra == 0 && SwapFirst) { - memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number)); + memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number)); *swap1 = (cmsFloat32Number) v; } - - return output; + if (T_PLANAR(info -> OutputFormat)) + return output + sizeof(cmsFloat32Number); + else + return output + nChan * sizeof(cmsFloat32Number); } static -cmsUInt8Number* PackPlanarFloatsFromFloat(_cmsTRANSFORM* info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) +cmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) { - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse= T_FLAVOR(info ->OutputFormat); - int i; - cmsUInt8Number* Init = output; + int nChan = T_CHANNELS(info -> OutputFormat); + int DoSwap = T_DOSWAP(info ->OutputFormat); + int Reverse = T_FLAVOR(info ->OutputFormat); + int Extra = T_EXTRA(info -> OutputFormat); + int SwapFirst = T_SWAPFIRST(info -> OutputFormat); + int Planar = T_PLANAR(info -> OutputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0; - cmsFloat64Number v; + cmsFloat64Number v = 0; + cmsFloat64Number* swap1 = (cmsFloat64Number*) output; + int i, start = 0; - if (DoSwap) { - output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsFloat32Number); - } + if (ExtraFirst) + start = Extra; for (i=0; i < nChan; i++) { @@ -2047,101 +2505,33 @@ cmsUInt8Number* PackPlanarFloatsFromFloat(_cmsTRANSFORM* info, v = wOut[index] * maximum; - if (Reverse) - v = maximum - v; - - *(cmsFloat32Number*) output = (cmsFloat32Number) v; - output += (Stride * sizeof(cmsFloat32Number)); - } - - return (Init + sizeof(cmsFloat32Number)); -} - - -static -cmsUInt8Number* PackChunkyDoublesFromFloat(_cmsTRANSFORM* info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse = T_FLAVOR(info ->OutputFormat); - int Extra = T_EXTRA(info -> OutputFormat); - int SwapFirst = T_SWAPFIRST(info -> OutputFormat); - int ExtraFirst = DoSwap && !SwapFirst; - cmsFloat64Number* swap1; - cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0; - cmsFloat64Number v = 0; - int i; - - swap1 = (cmsFloat64Number*) output; - - if (ExtraFirst) { - output += Extra * sizeof(cmsFloat64Number); - } - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = (cmsFloat64Number) wOut[index] * maximum; - if (Reverse) v = maximum - v; - *(cmsFloat64Number*) output = v; - - output += sizeof(cmsFloat64Number); + if (Planar) + ((cmsFloat64Number*) output)[(i + start) * Stride] = v; + else + ((cmsFloat64Number*) output)[i + start] = v; } if (!ExtraFirst) { output += Extra * sizeof(cmsFloat64Number); } - if (Extra == 0 && SwapFirst) { + if (Extra == 0 && SwapFirst) { - memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number)); + memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number)); *swap1 = v; } - return output; + if (T_PLANAR(info -> OutputFormat)) + return output + sizeof(cmsFloat64Number); + else + return output + nChan * sizeof(cmsFloat64Number); + } -static -cmsUInt8Number* PackPlanarDoublesFromFloat(_cmsTRANSFORM* info, - cmsFloat32Number wOut[], - cmsUInt8Number* output, - cmsUInt32Number Stride) -{ - int nChan = T_CHANNELS(info -> OutputFormat); - int DoSwap = T_DOSWAP(info ->OutputFormat); - int Reverse= T_FLAVOR(info ->OutputFormat); - int i; - cmsUInt8Number* Init = output; - cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0; - cmsFloat64Number v; - - if (DoSwap) { - output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsFloat64Number); - } - - for (i=0; i < nChan; i++) { - - int index = DoSwap ? (nChan - i - 1) : i; - - v = (cmsFloat64Number) wOut[index] * maximum; - - if (Reverse) - v = maximum - v; - - *(cmsFloat64Number*) output = v; - output += (Stride * sizeof(cmsFloat64Number)); - } - - return (Init + sizeof(cmsFloat64Number)); -} @@ -2156,7 +2546,7 @@ cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info, if (T_PLANAR(Info -> OutputFormat)) { - Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); + Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); @@ -2173,6 +2563,7 @@ cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info, } + static cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], @@ -2183,7 +2574,7 @@ cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info, if (T_PLANAR(Info -> OutputFormat)) { - Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); + Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); @@ -2212,7 +2603,7 @@ cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info, if (T_PLANAR(Info -> OutputFormat)) { - Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); + Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); @@ -2229,7 +2620,6 @@ cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info, } - // Same, but convert to double static cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info, @@ -2241,7 +2631,7 @@ cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info, if (T_PLANAR(Info -> OutputFormat)) { - Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); + Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); @@ -2259,6 +2649,223 @@ cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info, } +// ---------------------------------------------------------------------------------------------------------------- + +#ifndef CMS_NO_HALF_SUPPORT + +// Decodes an stream of half floats to wIn[] described by input format + +static +cmsUInt8Number* UnrollHalfTo16(register _cmsTRANSFORM* info, + register cmsUInt16Number wIn[], + register cmsUInt8Number* accum, + register cmsUInt32Number Stride) +{ + + int nChan = T_CHANNELS(info -> InputFormat); + int DoSwap = T_DOSWAP(info ->InputFormat); + int Reverse = T_FLAVOR(info ->InputFormat); + int SwapFirst = T_SWAPFIRST(info -> InputFormat); + int Extra = T_EXTRA(info -> InputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + int Planar = T_PLANAR(info -> InputFormat); + cmsFloat32Number v; + int i, start = 0; + cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F; + + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); + else + v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; + + if (Reverse) v = maximum - v; + + wIn[index] = _cmsQuickSaturateWord(v * maximum); + } + + + if (Extra == 0 && SwapFirst) { + cmsUInt16Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); + wIn[nChan-1] = tmp; + } + + if (T_PLANAR(info -> InputFormat)) + return accum + sizeof(cmsUInt16Number); + else + return accum + (nChan + Extra) * sizeof(cmsUInt16Number); +} + +// Decodes an stream of half floats to wIn[] described by input format + +static +cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + + int nChan = T_CHANNELS(info -> InputFormat); + int DoSwap = T_DOSWAP(info ->InputFormat); + int Reverse = T_FLAVOR(info ->InputFormat); + int SwapFirst = T_SWAPFIRST(info -> InputFormat); + int Extra = T_EXTRA(info -> InputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + int Planar = T_PLANAR(info -> InputFormat); + cmsFloat32Number v; + int i, start = 0; + cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; + + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); + else + v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; + + v /= maximum; + + wIn[index] = Reverse ? 1 - v : v; + } + + + if (Extra == 0 && SwapFirst) { + cmsFloat32Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); + wIn[nChan-1] = tmp; + } + + if (T_PLANAR(info -> InputFormat)) + return accum + sizeof(cmsUInt16Number); + else + return accum + (nChan + Extra) * sizeof(cmsUInt16Number); +} + + +static +cmsUInt8Number* PackHalfFrom16(register _cmsTRANSFORM* info, + register cmsUInt16Number wOut[], + register cmsUInt8Number* output, + register cmsUInt32Number Stride) +{ + int nChan = T_CHANNELS(info -> OutputFormat); + int DoSwap = T_DOSWAP(info ->OutputFormat); + int Reverse = T_FLAVOR(info ->OutputFormat); + int Extra = T_EXTRA(info -> OutputFormat); + int SwapFirst = T_SWAPFIRST(info -> OutputFormat); + int Planar = T_PLANAR(info -> OutputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35F : 65535.0F; + cmsFloat32Number v = 0; + cmsUInt16Number* swap1 = (cmsUInt16Number*) output; + int i, start = 0; + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; + + v = (cmsFloat32Number) wOut[index] / maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsUInt16Number*) output)[(i + start ) * Stride]= _cmsFloat2Half(v); + else + ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half(v); + } + + if (!ExtraFirst) { + output += Extra * sizeof(cmsUInt16Number); + } + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); + *swap1 = _cmsFloat2Half(v); + } + + if (T_PLANAR(info -> OutputFormat)) + return output + sizeof(cmsUInt16Number); + else + return output + nChan * sizeof(cmsUInt16Number); +} + + + +static +cmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + int nChan = T_CHANNELS(info -> OutputFormat); + int DoSwap = T_DOSWAP(info ->OutputFormat); + int Reverse = T_FLAVOR(info ->OutputFormat); + int Extra = T_EXTRA(info -> OutputFormat); + int SwapFirst = T_SWAPFIRST(info -> OutputFormat); + int Planar = T_PLANAR(info -> OutputFormat); + int ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0F : 1.0F; + cmsUInt16Number* swap1 = (cmsUInt16Number*) output; + cmsFloat32Number v = 0; + int i, start = 0; + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; + + v = wOut[index] * maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsUInt16Number*) output)[(i + start)* Stride]= _cmsFloat2Half( v ); + else + ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half( v ); + } + + if (!ExtraFirst) { + output += Extra * sizeof(cmsUInt16Number); + } + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); + *swap1 = (cmsUInt16Number) _cmsFloat2Half( v ); + } + + if (T_PLANAR(info -> OutputFormat)) + return output + sizeof(cmsUInt16Number); + else + return output + nChan * sizeof(cmsUInt16Number); +} + +#endif + // ---------------------------------------------------------------------------------------------------------------- @@ -2266,19 +2873,24 @@ static cmsFormatters16 InputFormatters16[] = { // Type Mask Function // ---------------------------- ------------------------------------ ---------------------------- - { TYPE_Lab_DBL, ANYPLANAR, UnrollLabDoubleTo16}, - { TYPE_XYZ_DBL, ANYPLANAR, UnrollXYZDoubleTo16}, + { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleTo16}, + { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleTo16}, + { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatTo16}, { TYPE_GRAY_DBL, 0, UnrollDouble1Chan}, - { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, UnrollDoubleTo16}, - { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, UnrollFloatTo16}, - + { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| + ANYSWAP|ANYEXTRA|ANYSPACE, UnrollDoubleTo16}, + { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| + ANYSWAP|ANYEXTRA|ANYSPACE, UnrollFloatTo16}, +#ifndef CMS_NO_HALF_SUPPORT + { FLOAT_SH(1)|BYTES_SH(2), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| + ANYEXTRA|ANYSWAP|ANYSPACE, UnrollHalfTo16}, +#endif { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Unroll1Byte}, + { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Unroll1ByteSkip1}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(2), ANYSPACE, Unroll1ByteSkip2}, { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll1ByteReversed}, - - { CHANNELS_SH(2)|BYTES_SH(1), ANYSPACE, Unroll2Bytes}, - { CHANNELS_SH(2)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll2ByteSwapFirst}, + { COLORSPACE_SH(PT_MCH2)|CHANNELS_SH(2)|BYTES_SH(1), 0, Unroll2Bytes}, { TYPE_LabV2_8, 0, UnrollLabV2_8 }, { TYPE_ALabV2_8, 0, UnrollALabV2_8 }, @@ -2295,17 +2907,17 @@ static cmsFormatters16 InputFormatters16[] = { { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll4BytesSwap}, { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapSwapFirst}, - { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes}, - { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes}, + { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST| + ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes}, + { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| + ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes}, { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Unroll1Word}, { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll1WordReversed}, { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(3), ANYSPACE, Unroll1WordSkip3}, { CHANNELS_SH(2)|BYTES_SH(2), ANYSPACE, Unroll2Words}, - { CHANNELS_SH(2)|BYTES_SH(2)|SWAPFIRST_SH(1), ANYSPACE, Unroll2WordSwapFirst}, - { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Unroll3Words}, { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Unroll4Words}, @@ -2318,7 +2930,7 @@ static cmsFormatters16 InputFormatters16[] = { { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapSwapFirst}, - { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarWords }, + { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarWords}, { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollAnyWords}, }; @@ -2328,13 +2940,21 @@ static cmsFormattersFloat InputFormattersFloat[] = { // Type Mask Function // ---------------------------- ------------------------------------ ---------------------------- - { TYPE_Lab_DBL, ANYPLANAR, UnrollLabDoubleToFloat}, - { TYPE_Lab_FLT, ANYPLANAR, UnrollLabFloatToFloat}, - { TYPE_XYZ_DBL, ANYPLANAR, UnrollXYZDoubleToFloat}, - { TYPE_XYZ_FLT, ANYPLANAR, UnrollXYZFloatToFloat}, + { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleToFloat}, + { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatToFloat}, - { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollFloatsToFloat}, - { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollDoublesToFloat}, + { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleToFloat}, + { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatToFloat}, + + { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| + ANYCHANNELS|ANYSPACE, UnrollFloatsToFloat}, + + { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| + ANYCHANNELS|ANYSPACE, UnrollDoublesToFloat}, +#ifndef CMS_NO_HALF_SUPPORT + { FLOAT_SH(1)|BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| + ANYCHANNELS|ANYSPACE, UnrollHalfToFloat}, +#endif }; @@ -2345,9 +2965,9 @@ cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number cmsUInt32Number i; cmsFormatter fr; + switch (dwFlags) { - if (!(dwFlags & CMS_PACK_FLAGS_FLOAT)) { - + case CMS_PACK_FLAGS_16BITS: { for (i=0; i < sizeof(InputFormatters16) / sizeof(cmsFormatters16); i++) { cmsFormatters16* f = InputFormatters16 + i; @@ -2357,7 +2977,9 @@ cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number } } } - else { + break; + + case CMS_PACK_FLAGS_FLOAT: { for (i=0; i < sizeof(InputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { cmsFormattersFloat* f = InputFormattersFloat + i; @@ -2367,6 +2989,11 @@ cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number } } } + break; + + default:; + + } fr.Fmt16 = NULL; return fr; @@ -2376,10 +3003,19 @@ static cmsFormatters16 OutputFormatters16[] = { // Type Mask Function // ---------------------------- ------------------------------------ ---------------------------- - { TYPE_Lab_DBL, ANYPLANAR, PackLabDoubleFrom16}, - { TYPE_XYZ_DBL, ANYPLANAR, PackXYZDoubleFrom16}, - { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackDoubleFrom16}, - { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackFloatFrom16}, + { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFrom16}, + { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFrom16}, + + { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFrom16}, + + { FLOAT_SH(1)|BYTES_SH(0), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| + ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackDoubleFrom16}, + { FLOAT_SH(1)|BYTES_SH(4), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| + ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackFloatFrom16}, +#ifndef CMS_NO_HALF_SUPPORT + { FLOAT_SH(1)|BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| + ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackHalfFrom16}, +#endif { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Pack1Byte}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack1ByteSkip1}, @@ -2419,7 +3055,7 @@ static cmsFormatters16 OutputFormatters16[] = { { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapSwapFirst}, { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyBytes}, - { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarBytes}, + { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarBytes}, { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Pack1Word}, { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack1WordSkip1}, @@ -2453,41 +3089,38 @@ static cmsFormatters16 OutputFormatters16[] = { static cmsFormattersFloat OutputFormattersFloat[] = { // Type Mask Function // ---------------------------- --------------------------------------------------- ---------------------------- - { TYPE_Lab_FLT, ANYPLANAR, PackLabFloatFromFloat}, - { TYPE_XYZ_FLT, ANYPLANAR, PackXYZFloatFromFloat}, - { TYPE_Lab_DBL, ANYPLANAR, PackLabDoubleFromFloat}, - { TYPE_XYZ_DBL, ANYPLANAR, PackXYZDoubleFromFloat}, - { FLOAT_SH(1)|BYTES_SH(4), - ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackChunkyFloatsFromFloat }, - { FLOAT_SH(1)|BYTES_SH(4)|PLANAR_SH(1), ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarFloatsFromFloat}, - { FLOAT_SH(1)|BYTES_SH(0), - ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackChunkyDoublesFromFloat }, - { FLOAT_SH(1)|BYTES_SH(0)|PLANAR_SH(1), ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarDoublesFromFloat}, + { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFromFloat}, + { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFromFloat}, + + { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFromFloat}, + { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFromFloat}, + + { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR| + ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackFloatsFromFloat }, + { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR| + ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackDoublesFromFloat }, +#ifndef CMS_NO_HALF_SUPPORT + { FLOAT_SH(1)|BYTES_SH(2), + ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackHalfFromFloat }, +#endif + }; // Bit fields set to one in the mask are not compared +static cmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags) { cmsUInt32Number i; cmsFormatter fr; - if (dwFlags & CMS_PACK_FLAGS_FLOAT) { + switch (dwFlags) + { - for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { - cmsFormattersFloat* f = OutputFormattersFloat + i; - - if ((dwInput & ~f ->Mask) == f ->Type) { - fr.FmtFloat = f ->Frm; - return fr; - } - } - - } - else { + case CMS_PACK_FLAGS_16BITS: { for (i=0; i < sizeof(OutputFormatters16) / sizeof(cmsFormatters16); i++) { cmsFormatters16* f = OutputFormatters16 + i; @@ -2497,6 +3130,24 @@ cmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Numbe return fr; } } + } + break; + + case CMS_PACK_FLAGS_FLOAT: { + + for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { + cmsFormattersFloat* f = OutputFormattersFloat + i; + + if ((dwInput & ~f ->Mask) == f ->Type) { + fr.FmtFloat = f ->Frm; + return fr; + } + } + } + break; + + default:; + } fr.Fmt16 = NULL; @@ -2523,8 +3174,8 @@ cmsBool _cmsRegisterFormattersPlugin(cmsPluginBase* Data) // Reset if (Data == NULL) { - FactoryList = NULL; - return TRUE; + FactoryList = NULL; + return TRUE; } fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(sizeof(cmsFormattersFactoryList)); @@ -2540,7 +3191,7 @@ cmsBool _cmsRegisterFormattersPlugin(cmsPluginBase* Data) cmsFormatter _cmsGetFormatter(cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 cmsFormatterDirection Dir, - cmsUInt32Number dwFlags) // Float or 16 bits + cmsUInt32Number dwFlags) { cmsFormattersFactoryList* f; @@ -2597,3 +3248,4 @@ cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsU // Create a fake formatter for result return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); } + 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 b85de13c0f0..461f253a7b7 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c @@ -898,6 +898,7 @@ cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace) { switch (ColorSpace) { + case cmsSig1colorData: case cmsSigGrayData: return 1; case cmsSig2colorData: return 2; diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c index 8fa37438a5d..1e91d001231 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c @@ -105,12 +105,12 @@ cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number DWord) // 1 2 3 4 5 6 7 8 // 8 7 6 5 4 3 2 1 -void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number QWord) +void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord) { #ifndef CMS_USE_BIG_ENDIAN - cmsUInt8Number* pIn = (cmsUInt8Number*) &QWord; + cmsUInt8Number* pIn = (cmsUInt8Number*) QWord; cmsUInt8Number* pOut = (cmsUInt8Number*) Result; _cmsAssert(Result != NULL); @@ -128,7 +128,7 @@ void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number Q _cmsAssert(Result != NULL); - *Result = QWord; + *Result = *QWord; #endif } @@ -218,7 +218,7 @@ cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n) if (io -> Read(io, &tmp, sizeof(cmsUInt64Number), 1) != 1) return FALSE; - if (n != NULL) _cmsAdjustEndianess64(n, tmp); + if (n != NULL) _cmsAdjustEndianess64(n, &tmp); return TRUE; } @@ -340,7 +340,7 @@ cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n) return TRUE; } -cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number n) +cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n) { cmsUInt64Number tmp; @@ -568,7 +568,7 @@ cmsBool CMSEXPORT cmsPlugin(void* Plug_in) if (Plugin ->ExpectedVersion > LCMS_VERSION) { cmsSignalError(0, cmsERROR_UNKNOWN_EXTENSION, "plugin needs Little CMS %d, current version is %d", - Plugin ->ExpectedVersion, LCMS_VERSION); + Plugin ->ExpectedVersion, LCMS_VERSION); return FALSE; } @@ -610,6 +610,10 @@ cmsBool CMSEXPORT cmsPlugin(void* Plug_in) if (!_cmsRegisterOptimizationPlugin(Plugin)) return FALSE; break; + case cmsPluginTransformSig: + if (!_cmsRegisterTransformPlugin(Plugin)) return FALSE; + break; + default: cmsSignalError(0, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin type '%X'", Plugin -> Type); return FALSE; @@ -633,6 +637,7 @@ void CMSEXPORT cmsUnregisterPlugins(void) _cmsRegisterParametricCurvesPlugin(NULL); _cmsRegisterMultiProcessElementPlugin(NULL); _cmsRegisterOptimizationPlugin(NULL); + _cmsRegisterTransformPlugin(NULL); if (PluginPool != NULL) _cmsSubAllocDestroy(PluginPool); 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 d0d3ef7bd17..a9672bdf71a 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2008 Marti Maria Saguer +// Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -329,9 +329,9 @@ cmsUInt8Number Word2Byte(cmsUInt16Number w) static cmsUInt8Number L2Byte(cmsUInt16Number w) { - int ww = w + 0x0080; + int ww = w + 0x0080; - if (ww > 0xFFFF) return 0xFF; + if (ww > 0xFFFF) return 0xFF; return (cmsUInt8Number) ((cmsUInt16Number) (ww >> 8) & 0xFF); } @@ -498,6 +498,7 @@ void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table) cmsUInt32Number i; cmsFloat64Number gamma; + if (Table == NULL) return; // Error if (Table ->nEntries <= 0) return; // Empty table @@ -577,6 +578,8 @@ void EmitNGamma(cmsIOHANDLER* m, int n, cmsToneCurve* g[]) for( i=0; i < n; i++ ) { + if (g[i] == NULL) return; // Error + if (i > 0 && GammaTableEquals(g[i-1]->Table16, g[i]->Table16, g[i]->nEntries)) { _cmsIOPrintf(m, "dup "); @@ -674,6 +677,7 @@ int OutputValueSampler(register const cmsUInt16Number In[], register cmsUInt16Nu cmsUInt16Number wWordOut = Out[i]; cmsUInt8Number wByteOut; // Value as byte + // We always deal with Lab4 wByteOut = Word2Byte(wWordOut); @@ -771,9 +775,9 @@ int EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** Cu for( i=0; i < 3; i++ ) { - _cmsIOPrintf(m, "%.6f %.6f %.6f ", Matrix[0 + 3*i], - Matrix[1 + 3*i], - Matrix[2 + 3*i]); + _cmsIOPrintf(m, "%.6f %.6f %.6f ", Matrix[i + 3*0], + Matrix[i + 3*1], + Matrix[i + 3*2]); } @@ -857,21 +861,23 @@ int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, int Intent, cmsCIEXY // Generates a curve from a gray profile static -cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, int Intent) + cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, int Intent) { cmsToneCurve* Out = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL); cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsHTRANSFORM xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_GRAY_8, hXYZ, TYPE_XYZ_DBL, Intent, cmsFLAGS_NOOPTIMIZE); int i; - for (i=0; i < 256; i++) { + if (Out != NULL) { + for (i=0; i < 256; i++) { - cmsUInt8Number Gray = (cmsUInt8Number) i; - cmsCIEXYZ XYZ; + cmsUInt8Number Gray = (cmsUInt8Number) i; + cmsCIEXYZ XYZ; - cmsDoTransform(xform, &Gray, &XYZ, 1); + cmsDoTransform(xform, &Gray, &XYZ, 1); - Out ->Table16[i] =_cmsQuickSaturateWord(XYZ.Y * 65535.0); + Out ->Table16[i] =_cmsQuickSaturateWord(XYZ.Y * 65535.0); + } } cmsDeleteTransform(xform); @@ -924,7 +930,7 @@ int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Nu switch (nChannels) { case 1: { - cmsToneCurve* Gray2Y = ExtractGray2Y(m ->ContextID, hProfile, Intent); + cmsToneCurve* Gray2Y = ExtractGray2Y(m ->ContextID, hProfile, Intent); EmitCIEBasedA(m, Gray2Y, &BlackPointAdaptedToD50); cmsFreeToneCurve(Gray2Y); } @@ -932,7 +938,7 @@ int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Nu case 3: case 4: { - cmsUInt32Number OutFrm = TYPE_Lab_16; + cmsUInt32Number OutFrm = TYPE_Lab_16; cmsPipeline* DeviceLink; _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; @@ -984,14 +990,23 @@ int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matr if (ColorSpace == cmsSigGrayData) { cmsToneCurve** ShaperCurve = _cmsStageGetPtrToCurveSet(Shaper); - rc = EmitCIEBasedA(m, ShaperCurve[0], &BlackPointAdaptedToD50); + rc = EmitCIEBasedA(m, ShaperCurve[0], &BlackPointAdaptedToD50); } else if (ColorSpace == cmsSigRgbData) { - rc = EmitCIEBasedABC(m, GetPtrToMatrix(Matrix), - _cmsStageGetPtrToCurveSet(Shaper), + cmsMAT3 Mat; + int i, j; + + memmove(&Mat, GetPtrToMatrix(Matrix), sizeof(Mat)); + + for (i=0; i < 3; i++) + for (j=0; j < 3; j++) + Mat.v[i].n[j] *= MAX_ENCODEABLE_XYZ; + + rc = EmitCIEBasedABC(m, (cmsFloat64Number *) &Mat, + _cmsStageGetPtrToCurveSet(Shaper), &BlackPointAdaptedToD50); } else { @@ -1000,7 +1015,7 @@ int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matr return 0; } - return rc; + return rc; } @@ -1084,8 +1099,8 @@ cmsUInt32Number GenerateCSA(cmsContext ContextID, if (ColorSpace != cmsSigXYZData && ColorSpace != cmsSigLabData) { - cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Invalid output color space"); - goto Error; + cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Invalid output color space"); + goto Error; } @@ -1101,8 +1116,8 @@ cmsUInt32Number GenerateCSA(cmsContext ContextID, } else { - // We need a LUT for the rest - if (!WriteInputLUT(mem, hProfile, Intent, dwFlags)) goto Error; + // We need a LUT for the rest + if (!WriteInputLUT(mem, hProfile, Intent, dwFlags)) goto Error; } } @@ -1211,7 +1226,7 @@ void EmitPQRStage(cmsIOHANDLER* m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsol "{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); + White.X, White.Y, White.Z); return; } @@ -1534,24 +1549,25 @@ cmsUInt32Number GenerateCRD(cmsContext ContextID, cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID, - cmsPSResourceType Type, - cmsHPROFILE hProfile, - cmsUInt32Number Intent, - cmsUInt32Number dwFlags, - cmsIOHANDLER* io) + cmsPSResourceType Type, + cmsHPROFILE hProfile, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags, + cmsIOHANDLER* io) { cmsUInt32Number rc; switch (Type) { - case cmsPS_RESOURCE_CSA: - rc = GenerateCSA(ContextID, hProfile, Intent, dwFlags, io); - break; - default: - case cmsPS_RESOURCE_CRD: - rc = GenerateCRD(ContextID, hProfile, Intent, dwFlags, io); - break; + case cmsPS_RESOURCE_CSA: + rc = GenerateCSA(ContextID, hProfile, Intent, dwFlags, io); + break; + + default: + case cmsPS_RESOURCE_CRD: + rc = GenerateCRD(ContextID, hProfile, Intent, dwFlags, io); + break; } return rc; @@ -1560,7 +1576,7 @@ cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID, cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, - cmsHPROFILE hProfile, + cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen) { 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 a06226e13b9..2dccc5433ff 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c @@ -216,7 +216,6 @@ cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfi // 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. - cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { @@ -292,3 +291,307 @@ cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfil return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags); } + + +// --------------------------------------------------------------------------------------------------------- + +// Least Squares Fit of a Quadratic Curve to Data +// http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html + +static +cmsFloat64Number RootOfLeastSquaresFitQuadraticCurve(int n, cmsFloat64Number x[], cmsFloat64Number y[]) +{ + double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0; + double sum_y = 0, sum_yx = 0, sum_yx2 = 0; + double disc; + int i; + cmsMAT3 m; + cmsVEC3 v, res; + + if (n < 4) return 0; + + for (i=0; i < n; i++) { + + double xn = x[i]; + double yn = y[i]; + + sum_x += xn; + sum_x2 += xn*xn; + sum_x3 += xn*xn*xn; + sum_x4 += xn*xn*xn*xn; + + sum_y += yn; + sum_yx += yn*xn; + sum_yx2 += yn*xn*xn; + } + + _cmsVEC3init(&m.v[0], n, sum_x, sum_x2); + _cmsVEC3init(&m.v[1], sum_x, sum_x2, sum_x3); + _cmsVEC3init(&m.v[2], sum_x2, sum_x3, sum_x4); + + _cmsVEC3init(&v, sum_y, sum_yx, sum_yx2); + + if (!_cmsMAT3solve(&res, &m, &v)) return 0; + + // y = t x2 + u x + c + // x = ( - u + Sqrt( u^2 - 4 t c ) ) / ( 2 t ) + disc = res.n[1]*res.n[1] - 4.0 * res.n[0] * res.n[2]; + if (disc < 0) return -1; + + return ( -1.0 * res.n[1] + sqrt( disc )) / (2.0 * res.n[0]); +} + +static +cmsBool IsMonotonic(int n, const cmsFloat64Number Table[]) +{ + int i; + cmsFloat64Number last; + + last = Table[n-1]; + + for (i = n-2; i >= 0; --i) { + + if (Table[i] > last) + + return FALSE; + else + last = Table[i]; + + } + + return TRUE; +} + +// Calculates the black point of a destination profile. +// This algorithm comes from the Adobe paper disclosing its black point compensation method. +cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) +{ + cmsColorSpaceSignature ColorSpace; + cmsHTRANSFORM hRoundTrip = NULL; + cmsCIELab InitialLab, destLab, Lab; + + cmsFloat64Number MinL, MaxL; + cmsBool NearlyStraightMidRange = FALSE; + cmsFloat64Number L; + cmsFloat64Number x[101], y[101]; + cmsFloat64Number lo, hi, NonMonoMin; + int n, l, i, NonMonoIndx; + + + // Make sure intent is adequate + if (Intent != INTENT_PERCEPTUAL && + Intent != INTENT_RELATIVE_COLORIMETRIC && + Intent != INTENT_SATURATION) { + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + + // v4 + perceptual & saturation intents does have its own black point, and it is + // well specified enough to use it. Black point tag is deprecated in V4. + if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) && + (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) { + + // Matrix shaper share MRC & perceptual intents + if (cmsIsMatrixShaper(hProfile)) + return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0); + + // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents + BlackPoint -> X = cmsPERCEPTUAL_BLACK_X; + BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y; + BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z; + return TRUE; + } + + + // Check if the profile is lut based and gray, rgb or cmyk (7.2 in Adobe's document) + ColorSpace = cmsGetColorSpace(hProfile); + if (!cmsIsCLUT(hProfile, Intent, LCMS_USED_AS_OUTPUT ) || + (ColorSpace != cmsSigGrayData && + ColorSpace != cmsSigRgbData && + ColorSpace != cmsSigCmykData)) { + + // In this case, handle as input case + return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags); + } + + // It is one of the valid cases!, presto chargo hocus pocus, go for the Adobe magic + + // Step 1 + // ====== + + // Set a first guess, that should work on good profiles. + if (Intent == INTENT_RELATIVE_COLORIMETRIC) { + + cmsCIEXYZ IniXYZ; + + // calculate initial Lab as source black point + if (!cmsDetectBlackPoint(&IniXYZ, hProfile, Intent, dwFlags)) { + return FALSE; + } + + // convert the XYZ to lab + cmsXYZ2Lab(NULL, &InitialLab, &IniXYZ); + + } else { + + // set the initial Lab to zero, that should be the black point for perceptual and saturation + InitialLab.L = 0; + InitialLab.a = 0; + InitialLab.b = 0; + } + + + // Step 2 + // ====== + + // Create a roundtrip. Define a Transform BT for all x in L*a*b* + hRoundTrip = CreateRoundtripXForm(hProfile, Intent); + if (hRoundTrip == NULL) return FALSE; + + // Calculate Min L* + Lab = InitialLab; + Lab.L = 0; + cmsDoTransform(hRoundTrip, &Lab, &destLab, 1); + MinL = destLab.L; + + // Calculate Max L* + Lab = InitialLab; + Lab.L = 100; + cmsDoTransform(hRoundTrip, &Lab, &destLab, 1); + MaxL = destLab.L; + + // Step 3 + // ====== + + // check if quadratic estimation needs to be done. + if (Intent == INTENT_RELATIVE_COLORIMETRIC) { + + // Conceptually, this code tests how close the source l and converted L are to one another in the mid-range + // of the values. If the converted ramp of L values is close enough to a straight line y=x, then InitialLab + // is good enough to be the DestinationBlackPoint, + NearlyStraightMidRange = TRUE; + + for (l=0; l <= 100; l++) { + + Lab.L = l; + Lab.a = InitialLab.a; + Lab.b = InitialLab.b; + + cmsDoTransform(hRoundTrip, &Lab, &destLab, 1); + + L = destLab.L; + + // Check the mid range in 20% after MinL + if (L > (MinL + 0.2 * (MaxL - MinL))) { + + // Is close enough? + if (fabs(L - l) > 4.0) { + + // Too far away, profile is buggy! + NearlyStraightMidRange = FALSE; + break; + } + } + } + } + else { + // Check is always performed for perceptual and saturation intents + NearlyStraightMidRange = FALSE; + } + + + // If no furter checking is needed, we are done + if (NearlyStraightMidRange) { + + cmsLab2XYZ(NULL, BlackPoint, &InitialLab); + cmsDeleteTransform(hRoundTrip); + return TRUE; + } + + // The round-trip curve normally looks like a nearly constant section at the black point, + // with a corner and a nearly straight line to the white point. + + // STEP 4 + // ======= + + // find the black point using the least squares error quadratic curve fitting + + if (Intent == INTENT_RELATIVE_COLORIMETRIC) { + lo = 0.1; + hi = 0.5; + } + else { + + // Perceptual and saturation + lo = 0.03; + hi = 0.25; + } + + // Capture points for the fitting. + n = 0; + for (l=0; l <= 100; l++) { + + cmsFloat64Number ff; + + Lab.L = (cmsFloat64Number) l; + Lab.a = InitialLab.a; + Lab.b = InitialLab.b; + + cmsDoTransform(hRoundTrip, &Lab, &destLab, 1); + + ff = (destLab.L - MinL)/(MaxL - MinL); + + if (ff >= lo && ff < hi) { + + x[n] = Lab.L; + y[n] = ff; + n++; + } + + } + + // This part is not on the Adobe paper, but I found is necessary for getting any result. + + if (IsMonotonic(n, y)) { + + // Monotonic means lower point is stil valid + cmsLab2XYZ(NULL, BlackPoint, &InitialLab); + cmsDeleteTransform(hRoundTrip); + return TRUE; + } + + // No suitable points, regret and use safer algorithm + if (n == 0) { + cmsDeleteTransform(hRoundTrip); + return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags); + } + + + NonMonoMin = 100; + NonMonoIndx = 0; + for (i=0; i < n; i++) { + + if (y[i] < NonMonoMin) { + NonMonoIndx = i; + NonMonoMin = y[i]; + } + } + + Lab.L = x[NonMonoIndx]; + + // fit and get the vertex of quadratic curve + Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y); + + if (Lab.L < 0.0 || Lab.L > 50.0) { // clip to zero L* if the vertex is negative + Lab.L = 0; + } + + Lab.a = InitialLab.a; + Lab.b = InitialLab.b; + + cmsLab2XYZ(NULL, BlackPoint, &Lab); + + cmsDeleteTransform(hRoundTrip); + return TRUE; +} diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmssm.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmssm.c index 68e86aa3b26..783f3c31bf5 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmssm.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmssm.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -468,7 +468,8 @@ static int FindNearSectors(cmsGDB* gbd, int alpha, int theta, cmsGDBPoint* Close[]) { int nSectors = 0; - int i, a, t; + int a, t; + cmsUInt32Number i; cmsGDBPoint* pt; for (i=0; i < NSTEPS; i++) { @@ -505,7 +506,7 @@ cmsBool InterpolateMissingSector(cmsGDB* gbd, int alpha, int theta) cmsVEC3 Centre; cmsLine ray; int nCloseSectors; - cmsGDBPoint* Close[NSTEPS]; + cmsGDBPoint* Close[NSTEPS + 1]; cmsSpherical closel, templ; cmsLine edge; int k, m; @@ -582,13 +583,13 @@ cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags) _cmsAssert(hGBD != NULL); // Interpolate black - for (alpha = 0; alpha <= SECTORS; alpha++) { + for (alpha = 0; alpha < SECTORS; alpha++) { if (!InterpolateMissingSector(gbd, alpha, 0)) return FALSE; } // Interpolate white - for (alpha = 0; alpha <= SECTORS; alpha++) { + for (alpha = 0; alpha < SECTORS; alpha++) { if (!InterpolateMissingSector(gbd, alpha, SECTORS-1)) return FALSE; } @@ -596,7 +597,7 @@ cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags) // Interpolate Mid for (theta = 1; theta < SECTORS; theta++) { - for (alpha = 0; alpha <= SECTORS; alpha++) { + for (alpha = 0; alpha < SECTORS; alpha++) { if (!InterpolateMissingSector(gbd, alpha, theta)) return FALSE; } @@ -760,3 +761,4 @@ cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname) return TRUE; } #endif + diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c b/jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c index 102c7ce96c4..79cdda7c43e 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -84,10 +84,10 @@ typedef struct _cmsTagTypeLinkedList_st { #define DUP_FN(x) Type_##x##_Dup // Helper macro to define a handler. Callbacks do have a fixed naming convention. -#define TYPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), DUP_FN(x), FREE_FN(x) } +#define TYPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), DUP_FN(x), FREE_FN(x), NULL, 0 } // Helper macro to define a MPE handler. Callbacks do have a fixed naming convention -#define TYPE_MPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), GenericMPEdup, GenericMPEfree } +#define TYPE_MPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), GenericMPEdup, GenericMPEfree, NULL, 0 } // Register a new type handler. This routine is shared between normal types and MPE static @@ -154,7 +154,7 @@ cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* cmsUInt32Number i; _cmsAssert(io != NULL); - _cmsAssert(Array != NULL); + _cmsAssert(!(Array == NULL && n > 0)); for (i=0; i < n; i++) { if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Array[i])) return FALSE; @@ -163,6 +163,28 @@ cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* return TRUE; } +static +cmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array) +{ + cmsUInt32Number i; + cmsUInt16Number tmp; + + _cmsAssert(io != NULL); + + for (i=0; i < n; i++) { + + if (Array != NULL) { + + if (!_cmsReadUInt16Number(io, &tmp)) return FALSE; + Array[i] = (wchar_t) tmp; + } + else { + if (!_cmsReadUInt16Number(io, NULL)) return FALSE; + } + + } + return TRUE; +} // To deal with position tables typedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self, @@ -171,8 +193,8 @@ typedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self, cmsUInt32Number n, cmsUInt32Number SizeOfTag); -// Helper function to deal with position tables as decribed in several addendums to ICC spec 4.2 -// A table of n elements is written, where first comes n records containing offsets and sizes and +// Helper function to deal with position tables as decribed in ICC spec 4.3 +// A table of n elements is readed, where first comes n records containing offsets and sizes and // then a block containing the data itself. This allows to reuse same data in more than one entry static cmsBool ReadPositionTable(struct _cms_typehandler_struct* self, @@ -224,7 +246,7 @@ Error: static cmsBool WritePositionTable(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, - cmsUInt32Number SizeOfTag, + cmsUInt32Number SizeOfTag, cmsUInt32Number Count, cmsUInt32Number BaseOffset, void *Cargo, @@ -713,6 +735,8 @@ void *Type_Text_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cms *nItems = 0; // We need to store the "\0" at the end, so +1 + if (SizeOfTag == UINT_MAX) goto Error; + Text = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1); if (Text == NULL) goto Error; @@ -807,13 +831,20 @@ void *Type_Data_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cms cmsUInt32Number LenOfData; *nItems = 0; + + if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; + LenOfData = SizeOfTag - sizeof(cmsUInt32Number); + if (LenOfData > INT_MAX) return NULL; BinData = (cmsICCData*) _cmsMalloc(self ->ContextID, sizeof(cmsICCData) + LenOfData - 1); if (BinData == NULL) return NULL; BinData ->len = LenOfData; - if (!_cmsReadUInt32Number(io, &BinData->flag)) return NULL; + if (!_cmsReadUInt32Number(io, &BinData->flag)) { + _cmsFree(self ->ContextID, BinData); + return NULL; + } if (io -> Read(io, BinData ->data, sizeof(cmsUInt8Number), LenOfData) != LenOfData) { @@ -1104,6 +1135,9 @@ void *Type_Curve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cm default: // Curve + if (Count > 0x7FFF) + return NULL; // This is to prevent bad guys for doing bad things + NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, Count, NULL); if (!NewGamma) return NULL; @@ -1219,17 +1253,23 @@ static cmsBool Type_ParametricCurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsToneCurve* Curve = (cmsToneCurve*) Ptr; - int i, nParams; + int i, nParams, typen; static const int ParamsByType[] = { 0, 1, 3, 4, 5, 7 }; + typen = Curve -> Segments[0].Type; - if (Curve ->nSegments > 1 || Curve -> Segments[0].Type < 1) { + if (Curve ->nSegments > 1 || typen < 1) { - cmsSignalError(self->ContextID, 0, "Multisegment or Inverted parametric curves cannot be written"); + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Multisegment or Inverted parametric curves cannot be written"); return FALSE; } - nParams = ParamsByType[Curve ->Segments[0].Type]; + if (typen > 5) { + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported parametric curve"); + return FALSE; + } + + nParams = ParamsByType[typen]; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) (Curve ->Segments[0].Type - 1))) return FALSE; if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Reserved @@ -1394,13 +1434,11 @@ void Type_Measurement_Free(struct _cms_typehandler_struct* self, void* Ptr) // ******************************************************************************** // Type cmsSigMultiLocalizedUnicodeType // ******************************************************************************** - // // Do NOT trust SizeOfTag as there is an issue on the definition of profileSequenceDescTag. See the TechNote from // Max Derhak and Rohit Patil about this: basically the size of the string table should be guessed and cannot be // taken from the size of tag if this tag is embedded as part of bigger structures (profileSequenceDescTag, for instance) // -// FIXME: this doesn't work if sizeof(wchat_t) != 2 !!! static void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) @@ -1410,7 +1448,7 @@ void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsU cmsUInt32Number SizeOfHeader; cmsUInt32Number Len, Offset; cmsUInt32Number i; - cmsUInt16Number* Block; + wchar_t* Block; cmsUInt32Number BeginOfThisString, EndOfThisString, LargestPosition; *nItems = 0; @@ -1438,12 +1476,17 @@ void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsU // Now deal with Len and offset. if (!_cmsReadUInt32Number(io, &Len)) goto Error; - mlu ->Entries[i].Len = Len; - if (!_cmsReadUInt32Number(io, &Offset)) goto Error; + // Check for overflow + if (Offset < (SizeOfHeader + 8)) goto Error; + + // True begin of the string BeginOfThisString = Offset - SizeOfHeader - 8; - mlu ->Entries[i].StrW = BeginOfThisString; + + // Ajust to wchar_t elements + mlu ->Entries[i].Len = (Len * sizeof(wchar_t)) / sizeof(cmsUInt16Number); + mlu ->Entries[i].StrW = (BeginOfThisString * sizeof(wchar_t)) / sizeof(cmsUInt16Number); // To guess maximum size, add offset + len EndOfThisString = BeginOfThisString + Len; @@ -1452,15 +1495,22 @@ void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsU } // Now read the remaining of tag and fill all strings. Substract the directory - SizeOfTag = LargestPosition; + SizeOfTag = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number); + if (SizeOfTag == 0) + { + Block = NULL; + NumOfWchar = 0; - Block = (cmsUInt16Number*) _cmsMalloc(self ->ContextID, SizeOfTag); - if (Block == NULL) goto Error; + } + else + { + Block = (wchar_t*) _cmsMalloc(self ->ContextID, SizeOfTag); + if (Block == NULL) goto Error; + NumOfWchar = SizeOfTag / sizeof(wchar_t); + if (!_cmsReadWCharArray(io, NumOfWchar, Block)) goto Error; + } - NumOfWchar = SizeOfTag / sizeof(cmsUInt16Number); - - if (!_cmsReadUInt16Array(io, NumOfWchar, Block)) goto Error; - mlu ->MemPool = Block; + mlu ->MemPool = Block; mlu ->PoolSize = SizeOfTag; mlu ->PoolUsed = SizeOfTag; @@ -1476,9 +1526,18 @@ static cmsBool Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu =(cmsMLU*) Ptr; - cmsUInt32Number HeaderSize, Offset; + cmsUInt32Number HeaderSize; + cmsUInt32Number Len, Offset; int i; + if (Ptr == NULL) { + + // Empty placeholder + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 12)) return FALSE; + return TRUE; + } + if (!_cmsWriteUInt32Number(io, mlu ->UsedEntries)) return FALSE; if (!_cmsWriteUInt32Number(io, 12)) return FALSE; @@ -1486,16 +1545,19 @@ cmsBool Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, for (i=0; i < mlu ->UsedEntries; i++) { + Len = mlu ->Entries[i].Len; + Offset = mlu ->Entries[i].StrW; + + Len = (Len * sizeof(cmsUInt16Number)) / sizeof(wchar_t); + Offset = (Offset * sizeof(cmsUInt16Number)) / sizeof(wchar_t) + HeaderSize + 8; + if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Language)) return FALSE; if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Country)) return FALSE; - if (!_cmsWriteUInt32Number(io, mlu ->Entries[i].Len)) return FALSE; - - Offset = mlu ->Entries[i].StrW + HeaderSize + 8; - + if (!_cmsWriteUInt32Number(io, Len)) return FALSE; if (!_cmsWriteUInt32Number(io, Offset)) return FALSE; } - if (!_cmsWriteUInt16Array(io, mlu ->PoolUsed / sizeof(cmsUInt16Number), (cmsUInt16Number*) mlu ->MemPool)) return FALSE; + if (!_cmsWriteWCharArray(io, mlu ->PoolUsed / sizeof(wchar_t), (wchar_t*) mlu ->MemPool)) return FALSE; return TRUE; @@ -1584,6 +1646,7 @@ cmsBool Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut cmsToneCurve* Tables[cmsMAXCHANNELS]; if (nChannels > cmsMAXCHANNELS) return FALSE; + if (nChannels <= 0) return FALSE; memset(Tables, 0, sizeof(Tables)); @@ -1604,6 +1667,7 @@ cmsBool Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut } _cmsFree(ContextID, Temp); + Temp = NULL; mpe = cmsStageAllocToneCurves(ContextID, nChannels, Tables); @@ -1658,12 +1722,28 @@ cmsBool Write8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsUInt32Number } +// Check overflow static -unsigned int uipow(cmsUInt32Number a, cmsUInt32Number b) { - cmsUInt32Number rv = 1; - for (; b > 0; b--) +size_t uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b) +{ + cmsUInt32Number rv = 1, rc; + + if (a == 0) return 0; + if (n == 0) return 0; + + for (; b > 0; b--) { + rv *= a; - return rv; + + // Check for overflow + if (rv > UINT_MAX / a) return (size_t) -1; + + } + + rc = rv * n; + + if (rv != rc / n) return (size_t) -1; + return rc; } @@ -1687,6 +1767,8 @@ void *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cms if (!_cmsReadUInt8Number(io, &OutputChannels)) goto Error; if (!_cmsReadUInt8Number(io, &CLUTpoints)) goto Error; + if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least + // Padding if (!_cmsReadUInt8Number(io, NULL)) goto Error; @@ -1722,8 +1804,9 @@ void *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cms // Get input tables if (!Read8bitTables(self ->ContextID, io, NewLUT, InputChannels)) goto Error; - // Get 3D CLUT - nTabSize = (OutputChannels * uipow(CLUTpoints, InputChannels)); + // Get 3D CLUT. Check the overflow.... + nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels); + if (nTabSize == (size_t) -1) goto Error; if (nTabSize > 0) { cmsUInt16Number *PtrW, *T; @@ -1850,15 +1933,18 @@ cmsBool Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, // The prelinearization table if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE; - nTabSize = (NewLUT->OutputChannels * uipow(clutPoints, NewLUT ->InputChannels)); + nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels); + if (nTabSize == (size_t) -1) return FALSE; + if (nTabSize > 0) { - // The 3D CLUT. - if (clut != NULL) { + // The 3D CLUT. + if (clut != NULL) { - for (j=0; j < nTabSize; j++) { + for (j=0; j < nTabSize; j++) { - val = (cmsUInt8Number) FROM_16_TO_8(clut ->Tab.T[j]); - if (!_cmsWriteUInt8Number(io, val)) return FALSE; + val = (cmsUInt8Number) FROM_16_TO_8(clut ->Tab.T[j]); + if (!_cmsWriteUInt8Number(io, val)) return FALSE; + } } } @@ -1905,6 +1991,7 @@ cmsBool Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lu if (nEntries <= 0) return TRUE; // Check for malicious profiles + if (nEntries < 2) return FALSE; if (nChannels > cmsMAXCHANNELS) return FALSE; // Init table to zero @@ -1979,13 +2066,12 @@ void *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cm if (!_cmsReadUInt8Number(io, &InputChannels)) return NULL; if (!_cmsReadUInt8Number(io, &OutputChannels)) return NULL; - if (!_cmsReadUInt8Number(io, &CLUTpoints)) return NULL; + if (!_cmsReadUInt8Number(io, &CLUTpoints)) return NULL; // 255 maximum // Padding if (!_cmsReadUInt8Number(io, NULL)) return NULL; // Do some checking - if (CLUTpoints > 100) goto Error; if (InputChannels > cmsMAXCHANNELS) goto Error; if (OutputChannels > cmsMAXCHANNELS) goto Error; @@ -2006,7 +2092,6 @@ void *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cm // Only operates on 3 channels - if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) { mpemat = cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL); @@ -2014,15 +2099,18 @@ void *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cm cmsPipelineInsertStage(NewLUT, cmsAT_END, mpemat); } - if (!_cmsReadUInt16Number(io, &InputEntries)) return NULL; - if (!_cmsReadUInt16Number(io, &OutputEntries)) return NULL; + if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error; + if (!_cmsReadUInt16Number(io, &OutputEntries)) goto Error; + if (InputEntries > 0x7FFF || OutputEntries > 0x7FFF) goto Error; + if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least // Get input tables if (!Read16bitTables(self ->ContextID, io, NewLUT, InputChannels, InputEntries)) goto Error; // Get 3D CLUT - nTabSize = (OutputChannels * uipow(CLUTpoints, InputChannels)); + nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels); + if (nTabSize == (size_t) -1) goto Error; if (nTabSize > 0) { cmsUInt16Number *T; @@ -2030,10 +2118,17 @@ void *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cm T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number)); if (T == NULL) goto Error; - if (!_cmsReadUInt16Array(io, nTabSize, T)) goto Error; + if (!_cmsReadUInt16Array(io, nTabSize, T)) { + _cmsFree(self ->ContextID, T); + goto Error; + } mpeclut = cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T); - if (mpeclut == NULL) goto Error; + if (mpeclut == NULL) { + _cmsFree(self ->ContextID, T); + goto Error; + } + cmsPipelineInsertStage(NewLUT, cmsAT_END, mpeclut); _cmsFree(self ->ContextID, T); } @@ -2155,11 +2250,13 @@ cmsBool Type_LUT16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE; } - nTabSize = (OutputChannels * uipow(clutPoints, InputChannels)); - - // The 3D CLUT. - if (clut != NULL) { - if (!_cmsWriteUInt16Array(io, nTabSize, clut->Tab.T)) return FALSE; + nTabSize = uipow(OutputChannels, clutPoints, InputChannels); + if (nTabSize == (size_t) -1) return FALSE; + if (nTabSize > 0) { + // The 3D CLUT. + if (clut != NULL) { + if (!_cmsWriteUInt16Array(io, nTabSize, clut->Tab.T)) return FALSE; + } } // The postlinearization table @@ -2246,8 +2343,12 @@ cmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUI if (!io -> Seek(io, Offset)) return NULL; if (io -> Read(io, gridPoints8, cmsMAXCHANNELS, 1) != 1) return NULL; - for (i=0; i < cmsMAXCHANNELS; i++) + + for (i=0; i < cmsMAXCHANNELS; i++) { + + if (gridPoints8[i] == 1) return NULL; // Impossible value, 0 for no CLUT and then 2 at least GridPoints[i] = gridPoints8[i]; + } if (!_cmsReadUInt8Number(io, &Precision)) return NULL; @@ -2256,6 +2357,8 @@ cmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUI if (!_cmsReadUInt8Number(io, NULL)) return NULL; CLUT = cmsStageAllocCLut16bitGranular(self ->ContextID, GridPoints, InputChannels, OutputChannels, NULL); + if (CLUT == NULL) return NULL; + Data = (_cmsStageCLutData*) CLUT ->Data; // Precision can be 1 or 2 bytes @@ -2276,7 +2379,7 @@ cmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUI if (!_cmsReadUInt16Array(io, Data->nEntries, Data ->Tab.T)) return NULL; } else { - cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknow precision of '%d'", Precision); + cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision); return NULL; } @@ -2304,7 +2407,7 @@ cmsToneCurve* ReadEmbeddedCurve(struct _cms_typehandler_struct* self, cmsIOHANDL char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) BaseType); - cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknow curve type '%s'", String); + cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String); } return NULL; } @@ -2313,26 +2416,30 @@ cmsToneCurve* ReadEmbeddedCurve(struct _cms_typehandler_struct* self, cmsIOHANDL // Read a set of curves from specific offset static -cmsStage* ReadSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, int nCurves) +cmsStage* ReadSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, cmsUInt32Number nCurves) { cmsToneCurve* Curves[cmsMAXCHANNELS]; - int i; - cmsStage* Lin; - + cmsUInt32Number i; + cmsStage* Lin = NULL; if (nCurves > cmsMAXCHANNELS) return FALSE; if (!io -> Seek(io, Offset)) return FALSE; + for (i=0; i < nCurves; i++) + Curves[i] = NULL; + for (i=0; i < nCurves; i++) { Curves[i] = ReadEmbeddedCurve(self, io); - if (Curves[i] == NULL) return FALSE; - if (!_cmsReadAlignment(io)) return FALSE; + if (Curves[i] == NULL) goto Error; + if (!_cmsReadAlignment(io)) goto Error; + } Lin = cmsStageAllocToneCurves(self ->ContextID, nCurves, Curves); +Error: for (i=0; i < nCurves; i++) cmsFreeToneCurve(Curves[i]); @@ -2395,26 +2502,31 @@ void* Type_LUTA2B_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, c if (offsetA!= 0) { mpe = ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } if (offsetC != 0) { mpe = ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } if (offsetM != 0) { mpe = ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } if (offsetMat != 0) { mpe = ReadMatrix(self, io, BaseOffset + offsetMat); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } if (offsetB != 0) { mpe = ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } @@ -2441,9 +2553,19 @@ cmsBool WriteMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cms if (!_cmsWrite15Fixed16Number(io, m -> Double[7])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Double[8])) return FALSE; + if (m ->Offset != NULL) { + if (!_cmsWrite15Fixed16Number(io, m -> Offset[0])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Offset[1])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Offset[2])) return FALSE; + } + else { + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + + } + return TRUE; @@ -2468,7 +2590,8 @@ cmsBool WriteSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, // If this is a table-based curve, use curve type even on V4 CurrentType = Type; - if (Curves[i] ->nSegments == 0) + if ((Curves[i] ->nSegments == 0)|| + ((Curves[i]->nSegments == 2) && (Curves[i] ->Segments[1].Type == 0)) ) CurrentType = cmsSigCurveType; else if (Curves[i] ->Segments[0].Type < 0) @@ -2491,7 +2614,7 @@ cmsBool WriteSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) Type); - cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknow curve type '%s'", String); + cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String); } return FALSE; } @@ -2511,6 +2634,11 @@ cmsBool WriteCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUIn cmsUInt32Number i; _cmsStageCLutData* CLUT = ( _cmsStageCLutData*) mpe -> Data; + if (CLUT ->HasFloatValues) { + cmsSignalError(self ->ContextID, cmsERROR_NOT_SUITABLE, "Cannot save floating point data, CLUT are 8 or 16 bit only"); + return FALSE; + } + memset(gridPoints, 0, sizeof(gridPoints)); for (i=0; i < (cmsUInt32Number) CLUT ->Params ->nInputs; i++) gridPoints[i] = (cmsUInt8Number) CLUT ->Params ->nSamples[i]; @@ -2536,7 +2664,7 @@ cmsBool WriteCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUIn if (!_cmsWriteUInt16Array(io, CLUT->nEntries, CLUT ->Tab.T)) return FALSE; } else { - cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknow precision of '%d'", Precision); + cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision); return FALSE; } @@ -2694,26 +2822,31 @@ void* Type_LUTB2A_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, c if (offsetB != 0) { mpe = ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } if (offsetMat != 0) { mpe = ReadMatrix(self, io, BaseOffset + offsetMat); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } if (offsetM != 0) { mpe = ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } if (offsetC != 0) { mpe = ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } if (offsetA!= 0) { mpe = ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan); + if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; } cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe); } @@ -2978,7 +3111,10 @@ void *Type_NamedColor_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* i prefix[31] = suffix[31] = 0; v = cmsAllocNamedColorList(self ->ContextID, count, nDeviceCoords, prefix, suffix); - if (v == NULL) return NULL; + if (v == NULL) { + cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many named colors '%d'", count); + return NULL; + } if (nDeviceCoords > cmsMAXCHANNELS) { cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many device coordinates '%d'", nDeviceCoords); @@ -3076,6 +3212,13 @@ void Type_NamedColor_Free(struct _cms_typehandler_struct* self, void* Ptr) // Type cmsSigProfileSequenceDescType // ******************************************************************************** +// This type is an array of structures, each of which contains information from the +// header fields and tags from the original profiles which were combined to create +// the final profile. The order of the structures is the order in which the profiles +// were combined and includes a structure for the final profile. This provides a +// description of the profile sequence from source to destination, +// typically used with the DeviceLink profile. + static cmsBool ReadEmbeddedText(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU** mlu, cmsUInt32Number SizeOfTag) { @@ -3119,6 +3262,8 @@ void *Type_ProfileSequenceDesc_Read(struct _cms_typehandler_struct* self, cmsIOH *nItems = 0; if (!_cmsReadUInt32Number(io, &Count)) return NULL; + + if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); @@ -3133,40 +3278,42 @@ void *Type_ProfileSequenceDesc_Read(struct _cms_typehandler_struct* self, cmsIOH cmsPSEQDESC* sec = &OutSeq -> seq[i]; - if (!_cmsReadUInt32Number(io, &sec ->deviceMfg)) return NULL; + if (!_cmsReadUInt32Number(io, &sec ->deviceMfg)) goto Error; + if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt32Number); - if (!_cmsReadUInt32Number(io, &sec ->deviceModel)) return NULL; + if (!_cmsReadUInt32Number(io, &sec ->deviceModel)) goto Error; + if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt32Number); - if (!_cmsReadUInt64Number(io, &sec ->attributes)) return NULL; + if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error; + if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt64Number); - if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) return NULL; + if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error; + if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt32Number); - if (!ReadEmbeddedText(self, io, &sec ->Manufacturer, SizeOfTag)) return NULL; - if (!ReadEmbeddedText(self, io, &sec ->Model, SizeOfTag)) return NULL; + if (!ReadEmbeddedText(self, io, &sec ->Manufacturer, SizeOfTag)) goto Error; + if (!ReadEmbeddedText(self, io, &sec ->Model, SizeOfTag)) goto Error; } *nItems = 1; return OutSeq; + +Error: + cmsFreeProfileSequenceDescription(OutSeq); + return NULL; } // Aux--Embed a text description type. It can be of type text description or multilocalized unicode +// and it depends of the version number passed on cmsTagDescriptor structure instead of stack static cmsBool SaveDescription(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* Text) { - if (Text == NULL) { + if (self ->ICCVersion < 0x4000000) { - // Placeholder for a null entry - if (!_cmsWriteTypeBase(io, cmsSigTextDescriptionType)) return FALSE; - return Type_Text_Description_Write(self, io, NULL, 1); - - } - - if (Text->UsedEntries <= 1) { if (!_cmsWriteTypeBase(io, cmsSigTextDescriptionType)) return FALSE; return Type_Text_Description_Write(self, io, Text, 1); } @@ -3191,7 +3338,7 @@ cmsBool Type_ProfileSequenceDesc_Write(struct _cms_typehandler_struct* self, cm if (!_cmsWriteUInt32Number(io, sec ->deviceMfg)) return FALSE; if (!_cmsWriteUInt32Number(io, sec ->deviceModel)) return FALSE; - if (!_cmsWriteUInt64Number(io, sec ->attributes)) return FALSE; + if (!_cmsWriteUInt64Number(io, &sec ->attributes)) return FALSE; if (!_cmsWriteUInt32Number(io, sec ->technology)) return FALSE; if (!SaveDescription(self, io, sec ->Manufacturer)) return FALSE; @@ -3366,26 +3513,33 @@ void *Type_UcrBg_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cm // First curve is Under color removal if (!_cmsReadUInt32Number(io, &CountUcr)) return NULL; + if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); n ->Ucr = cmsBuildTabulatedToneCurve16(self ->ContextID, CountUcr, NULL); if (n ->Ucr == NULL) return NULL; if (!_cmsReadUInt16Array(io, CountUcr, n ->Ucr->Table16)) return NULL; + if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; SizeOfTag -= CountUcr * sizeof(cmsUInt16Number); // Second curve is Black generation if (!_cmsReadUInt32Number(io, &CountBg)) return NULL; + if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); n ->Bg = cmsBuildTabulatedToneCurve16(self ->ContextID, CountBg, NULL); if (n ->Bg == NULL) return NULL; if (!_cmsReadUInt16Array(io, CountBg, n ->Bg->Table16)) return NULL; + if (SizeOfTag < CountBg * sizeof(cmsUInt16Number)) return NULL; SizeOfTag -= CountBg * sizeof(cmsUInt16Number); + if (SizeOfTag == UINT_MAX) return NULL; // Now comes the text. The length is specified by the tag size n ->Desc = cmsMLUalloc(self ->ContextID, 1); - ASCIIString = (char*) _cmsMalloc(self ->ContextID, sizeof(cmsUInt8Number)*(SizeOfTag + 1)); + if (n ->Desc == NULL) return NULL; + + ASCIIString = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1); if (io ->Read(io, ASCIIString, sizeof(char), SizeOfTag) != SizeOfTag) return NULL; ASCIIString[SizeOfTag] = 0; cmsMLUsetASCII(n ->Desc, cmsNoLanguage, cmsNoCountry, ASCIIString); @@ -3482,7 +3636,9 @@ cmsBool ReadCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* i if (!_cmsReadUInt32Number(io, &Count)) return FALSE; + if (Count > UINT_MAX - sizeof(cmsUInt32Number)) return FALSE; if (*SizeOfTag < Count + sizeof(cmsUInt32Number)) return FALSE; + Text = (char*) _cmsMalloc(self ->ContextID, Count+1); if (Text == NULL) return FALSE; @@ -3600,6 +3756,9 @@ void *Type_Screening_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io if (!_cmsReadUInt32Number(io, &sc ->Flag)) goto Error; if (!_cmsReadUInt32Number(io, &sc ->nChannels)) goto Error; + if (sc ->nChannels > cmsMAXCHANNELS - 1) + sc ->nChannels = cmsMAXCHANNELS - 1; + for (i=0; i < sc ->nChannels; i++) { if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].Frequency)) goto Error; @@ -3778,6 +3937,7 @@ cmsToneCurve* ReadSegmentedCurve(struct _cms_typehandler_struct* self, cmsIOHAND if (!_cmsReadUInt16Number(io, &nSegments)) return NULL; if (!_cmsReadUInt16Number(io, NULL)) return NULL; + if (nSegments < 1) return NULL; Segments = (cmsCurveSegment*) _cmsCalloc(self ->ContextID, nSegments, sizeof(cmsCurveSegment)); if (Segments == NULL) return NULL; @@ -4137,7 +4297,7 @@ void *Type_MPEclut_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, // Copy MAX_INPUT_DIMENSIONS at most. Expand to cmsUInt32Number nMaxGrids = InputChans > MAX_INPUT_DIMENSIONS ? MAX_INPUT_DIMENSIONS : InputChans; - for (i=0; i < nMaxGrids; i++) GridPoints[i] = Dimensions8[i]; + for (i=0; i < nMaxGrids; i++) GridPoints[i] = (cmsUInt32Number) Dimensions8[i]; // Allocate the true CLUT mpe = cmsStageAllocCLutFloatGranular(self ->ContextID, GridPoints, InputChans, OutputChans, NULL); @@ -4202,8 +4362,8 @@ cmsBool Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* // This is the list of built-in MPE types static _cmsTagTypeLinkedList SupportedMPEtypes[] = { -{{ (cmsTagTypeSignature) cmsSigBAcsElemType, NULL, NULL, NULL, NULL }, &SupportedMPEtypes[1] }, // Ignore those elements for now -{{ (cmsTagTypeSignature) cmsSigEAcsElemType, NULL, NULL, NULL, NULL }, &SupportedMPEtypes[2] }, // (That's what the spec says) +{{ (cmsTagTypeSignature) cmsSigBAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[1] }, // Ignore those elements for now +{{ (cmsTagTypeSignature) cmsSigEAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[2] }, // (That's what the spec says) {TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCurveSetElemType, MPEcurve), &SupportedMPEtypes[3] }, {TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigMatrixElemType, MPEmatrix), &SupportedMPEtypes[4] }, @@ -4466,6 +4626,11 @@ void *Type_vcgt_Read(struct _cms_typehandler_struct* self, if (!_cmsReadUInt16Number(io, &nElems)) goto Error; if (!_cmsReadUInt16Number(io, &nBytes)) goto Error; + // Adobe's quirk fixup. Fixing broken profiles... + if (nElems == 256 && nBytes == 1 && SizeOfTag == 1576) + nBytes = 2; + + // Populate tone curves for (n=0; n < 3; n++) { @@ -4571,21 +4736,21 @@ cmsBool Type_vcgt_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsGetToneCurveParametricType(Curves[1]) == 5 && cmsGetToneCurveParametricType(Curves[2]) == 5) { - if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE; + if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE; - // Save parameters - for (i=0; i < 3; i++) { + // Save parameters + for (i=0; i < 3; i++) { - _cmsVCGTGAMMA v; + _cmsVCGTGAMMA v; - v.Gamma = Curves[i] ->Segments[0].Params[0]; - v.Min = Curves[i] ->Segments[0].Params[5]; - v.Max = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min; + v.Gamma = Curves[i] ->Segments[0].Params[0]; + v.Min = Curves[i] ->Segments[0].Params[5]; + v.Max = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min; - if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE; - if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE; - if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE; - } + if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE; + } } else { @@ -4639,6 +4804,435 @@ void Type_vcgt_Free(struct _cms_typehandler_struct* self, void* Ptr) _cmsFree(self ->ContextID, Ptr); } + +// ******************************************************************************** +// Type cmsSigDictType +// ******************************************************************************** + +// Single column of the table can point to wchar or MLUC elements. Holds arrays of data +typedef struct { + cmsContext ContextID; + cmsUInt32Number *Offsets; + cmsUInt32Number *Sizes; +} _cmsDICelem; + +typedef struct { + _cmsDICelem Name, Value, DisplayName, DisplayValue; + +} _cmsDICarray; + +// Allocate an empty array element +static +cmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e, cmsUInt32Number Count) +{ + e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number *)); + if (e->Offsets == NULL) return FALSE; + + e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number *)); + if (e->Sizes == NULL) { + + _cmsFree(ContextID, e -> Offsets); + return FALSE; + } + + e ->ContextID = ContextID; + return TRUE; +} + +// Free an array element +static +void FreeElem(_cmsDICelem* e) +{ + if (e ->Offsets != NULL) _cmsFree(e -> ContextID, e -> Offsets); + if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e ->Sizes); + e->Offsets = e ->Sizes = NULL; +} + +// Get rid of whole array +static +void FreeArray( _cmsDICarray* a) +{ + if (a ->Name.Offsets != NULL) FreeElem(&a->Name); + if (a ->Value.Offsets != NULL) FreeElem(&a ->Value); + if (a ->DisplayName.Offsets != NULL) FreeElem(&a->DisplayName); + if (a ->DisplayValue.Offsets != NULL) FreeElem(&a ->DisplayValue); +} + + +// Allocate whole array +static +cmsBool AllocArray(cmsContext ContextID, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length) +{ + // Empty values + memset(a, 0, sizeof(_cmsDICarray)); + + // On depending on record size, create column arrays + if (!AllocElem(ContextID, &a ->Name, Count)) goto Error; + if (!AllocElem(ContextID, &a ->Value, Count)) goto Error; + + if (Length > 16) { + if (!AllocElem(ContextID, &a -> DisplayName, Count)) goto Error; + + } + if (Length > 24) { + if (!AllocElem(ContextID, &a ->DisplayValue, Count)) goto Error; + } + return TRUE; + +Error: + FreeArray(a); + return FALSE; +} + +// Read one element +static +cmsBool ReadOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsUInt32Number BaseOffset) +{ + if (!_cmsReadUInt32Number(io, &e->Offsets[i])) return FALSE; + if (!_cmsReadUInt32Number(io, &e ->Sizes[i])) return FALSE; + + // An offset of zero has special meaning and shal be preserved + if (e ->Offsets[i] > 0) + e ->Offsets[i] += BaseOffset; + return TRUE; +} + + +static +cmsBool ReadOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length, cmsUInt32Number BaseOffset) +{ + cmsUInt32Number i; + + // Read column arrays + for (i=0; i < Count; i++) { + + if (!ReadOneElem(io, &a -> Name, i, BaseOffset)) return FALSE; + if (!ReadOneElem(io, &a -> Value, i, BaseOffset)) return FALSE; + + if (Length > 16) { + + if (!ReadOneElem(io, &a ->DisplayName, i, BaseOffset)) return FALSE; + + } + + if (Length > 24) { + + if (!ReadOneElem(io, & a -> DisplayValue, i, BaseOffset)) return FALSE; + } + } + return TRUE; +} + + +// Write one element +static +cmsBool WriteOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i) +{ + if (!_cmsWriteUInt32Number(io, e->Offsets[i])) return FALSE; + if (!_cmsWriteUInt32Number(io, e ->Sizes[i])) return FALSE; + + return TRUE; +} + +static +cmsBool WriteOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length) +{ + cmsUInt32Number i; + + for (i=0; i < Count; i++) { + + if (!WriteOneElem(io, &a -> Name, i)) return FALSE; + if (!WriteOneElem(io, &a -> Value, i)) return FALSE; + + if (Length > 16) { + + if (!WriteOneElem(io, &a -> DisplayName, i)) return FALSE; + } + + if (Length > 24) { + + if (!WriteOneElem(io, &a -> DisplayValue, i)) return FALSE; + } + } + + return TRUE; +} + +static +cmsBool ReadOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, wchar_t ** wcstr) +{ + + cmsUInt32Number nChars; + + // Special case for undefined strings (see ICC Votable + // Proposal Submission, Dictionary Type and Metadata TAG Definition) + if (e -> Offsets[i] == 0) { + + *wcstr = NULL; + return TRUE; + } + + if (!io -> Seek(io, e -> Offsets[i])) return FALSE; + + nChars = e ->Sizes[i] / sizeof(cmsUInt16Number); + + + *wcstr = (wchar_t*) _cmsMallocZero(e ->ContextID, (nChars + 1) * sizeof(wchar_t)); + if (*wcstr == NULL) return FALSE; + + if (!_cmsReadWCharArray(io, nChars, *wcstr)) { + _cmsFree(e ->ContextID, *wcstr); + return FALSE; + } + + // End of string marker + (*wcstr)[nChars] = 0; + return TRUE; +} + +static +cmsUInt32Number mywcslen(const wchar_t *s) +{ + const wchar_t *p; + + p = s; + while (*p) + p++; + + return (cmsUInt32Number)(p - s); +} + +static +cmsBool WriteOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const wchar_t * wcstr, cmsUInt32Number BaseOffset) +{ + cmsUInt32Number Before = io ->Tell(io); + cmsUInt32Number n; + + e ->Offsets[i] = Before - BaseOffset; + + if (wcstr == NULL) { + e ->Sizes[i] = 0; + e ->Offsets[i] = 0; + return TRUE; + } + + n = mywcslen(wcstr); + if (!_cmsWriteWCharArray(io, n, wcstr)) return FALSE; + + e ->Sizes[i] = io ->Tell(io) - Before; + return TRUE; +} + +static +cmsBool ReadOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsMLU** mlu) +{ + cmsUInt32Number nItems = 0; + + // A way to get null MLUCs + if (e -> Offsets[i] == 0 || e ->Sizes[i] == 0) { + + *mlu = NULL; + return TRUE; + } + + if (!io -> Seek(io, e -> Offsets[i])) return FALSE; + + *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, e ->Sizes[i]); + return *mlu != NULL; +} + +static +cmsBool WriteOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const cmsMLU* mlu, cmsUInt32Number BaseOffset) +{ + cmsUInt32Number Before; + + // Special case for undefined strings (see ICC Votable + // Proposal Submission, Dictionary Type and Metadata TAG Definition) + if (mlu == NULL) { + e ->Sizes[i] = 0; + e ->Offsets[i] = 0; + return TRUE; + } + + Before = io ->Tell(io); + e ->Offsets[i] = Before - BaseOffset; + + if (!Type_MLU_Write(self, io, (void*) mlu, 1)) return FALSE; + + e ->Sizes[i] = io ->Tell(io) - Before; + return TRUE; +} + + +static +void *Type_Dictionary_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsHANDLE hDict; + cmsUInt32Number i, Count, Length; + cmsUInt32Number BaseOffset; + _cmsDICarray a; + wchar_t *NameWCS = NULL, *ValueWCS = NULL; + cmsMLU *DisplayNameMLU = NULL, *DisplayValueMLU=NULL; + cmsBool rc; + + *nItems = 0; + + // Get actual position as a basis for element offsets + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + // Get name-value record count + if (!_cmsReadUInt32Number(io, &Count)) return NULL; + SizeOfTag -= sizeof(cmsUInt32Number); + + // Get rec lenghth + if (!_cmsReadUInt32Number(io, &Length)) return NULL; + SizeOfTag -= sizeof(cmsUInt32Number); + + // Check for valid lengths + if (Length != 16 && Length != 24 && Length != 32) { + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown record length in dictionary '%d'", Length); + return NULL; + } + + // Creates an empty dictionary + hDict = cmsDictAlloc(self -> ContextID); + if (hDict == NULL) return NULL; + + // On depending on record size, create column arrays + if (!AllocArray(self -> ContextID, &a, Count, Length)) goto Error; + + // Read column arrays + if (!ReadOffsetArray(io, &a, Count, Length, BaseOffset)) goto Error; + + // Seek to each element and read it + for (i=0; i < Count; i++) { + + if (!ReadOneWChar(io, &a.Name, i, &NameWCS)) goto Error; + if (!ReadOneWChar(io, &a.Value, i, &ValueWCS)) goto Error; + + if (Length > 16) { + if (!ReadOneMLUC(self, io, &a.DisplayName, i, &DisplayNameMLU)) goto Error; + } + + if (Length > 24) { + if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error; + } + + rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU); + + if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS); + if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS); + if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU); + if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU); + + if (!rc) return FALSE; + } + + FreeArray(&a); + *nItems = 1; + return (void*) hDict; + +Error: + FreeArray(&a); + cmsDictFree(hDict); + return NULL; +} + + +static +cmsBool Type_Dictionary_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsHANDLE hDict = (cmsHANDLE) Ptr; + const cmsDICTentry* p; + cmsBool AnyName, AnyValue; + cmsUInt32Number i, Count, Length; + cmsUInt32Number DirectoryPos, CurrentPos, BaseOffset; + _cmsDICarray a; + + if (hDict == NULL) return FALSE; + + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + // Let's inspect the dictionary + Count = 0; AnyName = FALSE; AnyValue = FALSE; + for (p = cmsDictGetEntryList(hDict); p != NULL; p = cmsDictNextEntry(p)) { + + if (p ->DisplayName != NULL) AnyName = TRUE; + if (p ->DisplayValue != NULL) AnyValue = TRUE; + Count++; + } + + Length = 16; + if (AnyName) Length += 8; + if (AnyValue) Length += 8; + + if (!_cmsWriteUInt32Number(io, Count)) return FALSE; + if (!_cmsWriteUInt32Number(io, Length)) return FALSE; + + // Keep starting position of offsets table + DirectoryPos = io ->Tell(io); + + // Allocate offsets array + if (!AllocArray(self ->ContextID, &a, Count, Length)) goto Error; + + // Write a fake directory to be filled latter on + if (!WriteOffsetArray(io, &a, Count, Length)) goto Error; + + // Write each element. Keep track of the size as well. + p = cmsDictGetEntryList(hDict); + for (i=0; i < Count; i++) { + + if (!WriteOneWChar(io, &a.Name, i, p ->Name, BaseOffset)) goto Error; + if (!WriteOneWChar(io, &a.Value, i, p ->Value, BaseOffset)) goto Error; + + if (p ->DisplayName != NULL) { + if (!WriteOneMLUC(self, io, &a.DisplayName, i, p ->DisplayName, BaseOffset)) goto Error; + } + + if (p ->DisplayValue != NULL) { + if (!WriteOneMLUC(self, io, &a.DisplayValue, i, p ->DisplayValue, BaseOffset)) goto Error; + } + + p = cmsDictNextEntry(p); + } + + // Write the directory + CurrentPos = io ->Tell(io); + if (!io ->Seek(io, DirectoryPos)) goto Error; + + if (!WriteOffsetArray(io, &a, Count, Length)) goto Error; + + if (!io ->Seek(io, CurrentPos)) goto Error; + + FreeArray(&a); + return TRUE; + +Error: + FreeArray(&a); + return FALSE; + + cmsUNUSED_PARAMETER(nItems); +} + + +static +void* Type_Dictionary_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsDictDup((cmsHANDLE) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + + +static +void Type_Dictionary_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsDictFree((cmsHANDLE) Ptr); + cmsUNUSED_PARAMETER(self); +} + + // ******************************************************************************** // Type support main routines // ******************************************************************************** @@ -4676,6 +5270,7 @@ static _cmsTagTypeLinkedList SupportedTagTypes[] = { {TYPE_HANDLER(cmsCorbisBrokenXYZtype, XYZ), &SupportedTagTypes[27] }, {TYPE_HANDLER(cmsMonacoBrokenCurveType, Curve), &SupportedTagTypes[28] }, {TYPE_HANDLER(cmsSigProfileSequenceIdType, ProfileSequenceId), &SupportedTagTypes[29] }, +{TYPE_HANDLER(cmsSigDictType, Dictionary), &SupportedTagTypes[30] }, {TYPE_HANDLER(cmsSigVcgtType, vcgt), NULL } }; @@ -4795,6 +5390,7 @@ static _cmsTagLinkedList SupportedTags[] = { { cmsSigScreeningTag, { 1, 1, { cmsSigScreeningType}, NULL }, &SupportedTags[59]}, { cmsSigVcgtTag, { 1, 1, { cmsSigVcgtType}, NULL }, &SupportedTags[60]}, + { cmsSigMetaTag, { 1, 1, { cmsSigDictType}, NULL }, &SupportedTags[61]}, { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL}, NULL} }; 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 b643e98df4f..ff46a0b3b69 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -143,7 +143,7 @@ cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID, if (!hICC) // can't allocate return NULL; - cmsSetProfileVersion(hICC, 4.2); + cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigDisplayClass); cmsSetColorSpace(hICC, cmsSigRgbData); @@ -247,7 +247,7 @@ cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID, if (!hICC) // can't allocate return NULL; - cmsSetProfileVersion(hICC, 4.2); + cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigDisplayClass); cmsSetColorSpace(hICC, cmsSigGrayData); @@ -310,7 +310,7 @@ cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID, if (!hICC) return NULL; - cmsSetProfileVersion(hICC, 4.2); + cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigLinkClass); cmsSetColorSpace(hICC, ColorSpace); @@ -430,7 +430,7 @@ cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID, if (!hICC) // can't allocate return NULL; - cmsSetProfileVersion(hICC, 4.2); + cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigLinkClass); cmsSetColorSpace(hICC, ColorSpace); @@ -538,7 +538,7 @@ cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIE hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL); if (hProfile == NULL) return NULL; - cmsSetProfileVersion(hProfile, 4.2); + cmsSetProfileVersion(hProfile, 4.3); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigLabData); @@ -583,7 +583,7 @@ cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID) hProfile = cmsCreateRGBProfileTHR(ContextID, cmsD50_xyY(), NULL, NULL); if (hProfile == NULL) return NULL; - cmsSetProfileVersion(hProfile, 4.2); + cmsSetProfileVersion(hProfile, 4.3); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigXYZData); @@ -838,7 +838,7 @@ cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID) if (!hProfile) // can't allocate return NULL; - cmsSetProfileVersion(hProfile, 4.2); + cmsSetProfileVersion(hProfile, 4.3); if (!SetTextTags(hProfile, L"NULL profile built-in")) goto Error; @@ -963,6 +963,11 @@ cmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform) // Colorant count now depends on the output space nc2 ->ColorantCount = cmsPipelineOutputChannels(v ->Lut); + // Make sure we have proper formatters + cmsChangeBuffersFormat(xform, TYPE_NAMED_COLOR_INDEX, + FLOAT_SH(0) | COLORSPACE_SH(_cmsLCMScolorSpace(v ->ExitColorSpace)) + | BYTES_SH(2) | CHANNELS_SH(cmsChannelsOf(v ->ExitColorSpace))); + // Apply the transfor to colorants. for (i=0; i < nColors; i++) { cmsDoTransform(xform, &i, nc2 ->List[i].DeviceColorant, 1); @@ -983,6 +988,7 @@ Error: typedef struct { cmsBool IsV4; // Is a V4 tag? + cmsTagSignature RequiredTag; // Set to 0 for both types cmsTagTypeSignature LutType; // The LUT type int nTypes; // Number of types (up to 5) cmsStageSignature MpeTypes[5]; // 5 is the maximum number @@ -991,16 +997,16 @@ typedef struct { static const cmsAllowedLUT AllowedLUTTypes[] = { - { FALSE, cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}}, - { FALSE, cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}}, - { TRUE , cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType } }, - { TRUE , cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } }, - { TRUE , cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } }, - { TRUE , cmsSigLutAtoBType, 5, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, - { TRUE , cmsSigLutBtoAType, 1, { cmsSigCurveSetElemType }}, - { TRUE , cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, - { TRUE , cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }}, - { TRUE , cmsSigLutBtoAType, 5, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }} + { FALSE, 0, cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}}, + { FALSE, 0, cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}}, + { TRUE , 0, cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType }}, + { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } }, + { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } }, + { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 5, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, + { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 1, { cmsSigCurveSetElemType }}, + { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, + { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }}, + { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 5, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }} }; #define SIZE_OF_ALLOWED_LUT (sizeof(AllowedLUTTypes)/sizeof(cmsAllowedLUT)) @@ -1023,15 +1029,17 @@ cmsBool CheckOne(const cmsAllowedLUT* Tab, const cmsPipeline* Lut) static -const cmsAllowedLUT* FindCombination(const cmsPipeline* Lut, cmsBool IsV4) +const cmsAllowedLUT* FindCombination(const cmsPipeline* Lut, cmsBool IsV4, cmsTagSignature DestinationTag) { - int n; + cmsUInt32Number n; for (n=0; n < SIZE_OF_ALLOWED_LUT; n++) { const cmsAllowedLUT* Tab = AllowedLUTTypes + n; if (IsV4 ^ Tab -> IsV4) continue; + if ((Tab ->RequiredTag != 0) && (Tab ->RequiredTag != DestinationTag)) continue; + if (CheckOne(Tab, Lut)) return Tab; } @@ -1050,6 +1058,7 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat cmsStage* mpe; cmsContext ContextID = cmsGetTransformContextID(hTransform); const cmsAllowedLUT* AllowedLUT; + cmsTagSignature DestinationTag; _cmsAssert(hTransform != NULL); @@ -1080,6 +1089,14 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID)); } + + hProfile = cmsCreateProfilePlaceholder(ContextID); + if (!hProfile) goto Error; // can't allocate + + cmsSetProfileVersion(hProfile, Version); + + FixColorSpaces(hProfile, xform -> EntryColorSpace, xform -> ExitColorSpace, dwFlags); + // Optimize the LUT and precalculate a devicelink ChansIn = cmsChannelsOf(xform -> EntryColorSpace); @@ -1092,17 +1109,22 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2); + if (cmsGetDeviceClass(hProfile) == cmsSigOutputClass) + DestinationTag = cmsSigBToA0Tag; + else + DestinationTag = cmsSigAToB0Tag; + // Check if the profile/version can store the result if (dwFlags & cmsFLAGS_FORCE_CLUT) AllowedLUT = NULL; else - AllowedLUT = FindCombination(LUT, Version >= 4.0); + AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); if (AllowedLUT == NULL) { // Try to optimize _cmsOptimizePipeline(&LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags); - AllowedLUT = FindCombination(LUT, Version >= 4.0); + AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); } @@ -1113,13 +1135,13 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat _cmsOptimizePipeline(&LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags); // Put identity curves if needed - if (cmsPipelineStageCount(LUT) == 1) { + if (cmsPipelineGetPtrToFirstStage(LUT) ->Type != cmsSigCurveSetElemType) + cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)); - cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)); - cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut)); - } + if (cmsPipelineGetPtrToLastStage(LUT) ->Type != cmsSigCurveSetElemType) + cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut)); - AllowedLUT = FindCombination(LUT, Version >= 4.0); + AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); } // Somethings is wrong... @@ -1127,25 +1149,15 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat goto Error; } - hProfile = cmsCreateProfilePlaceholder(ContextID); - if (!hProfile) goto Error; // can't allocate - - cmsSetProfileVersion(hProfile, Version); - - FixColorSpaces(hProfile, xform -> EntryColorSpace, xform -> ExitColorSpace, dwFlags); if (dwFlags & cmsFLAGS_8BITS_DEVICELINK) cmsPipelineSetSaveAs8bitsFlag(LUT, TRUE); // Tag profile with information - if (!SetTextTags(hProfile, L"devicelink")) return NULL; + if (!SetTextTags(hProfile, L"devicelink")) goto Error; - if (cmsGetDeviceClass(hProfile) == cmsSigOutputClass) { - - if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, LUT)) goto Error; - } - else - if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; + // Store result + if (!cmsWriteTag(hProfile, DestinationTag, LUT)) goto Error; if (xform -> InputColorant != NULL) { 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 1a38abbad9c..2a626c66b74 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c @@ -172,7 +172,7 @@ static ISOTEMPERATURE isotempdata[] = { // Robertson's method cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint) { - int j; + cmsUInt32Number j; cmsFloat64Number us,vs; cmsFloat64Number uj,vj,tj,di,dj,mi,mj; cmsFloat64Number xs, ys; @@ -263,10 +263,10 @@ cmsBool ComputeChromaticAdaptation(cmsMAT3* Conversion, cmsBool _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll) { cmsMAT3 LamRigg = {{ // Bradford matrix - {{ 0.8951, 0.2664, -0.1614 }}, - {{ -0.7502, 1.7135, 0.0367 }}, - {{ 0.0389, -0.0685, 1.0296 }} - }}; + {{ 0.8951, 0.2664, -0.1614 }}, + {{ -0.7502, 1.7135, 0.0367 }}, + {{ 0.0389, -0.0685, 1.0296 }} + }}; if (ConeMatrix == NULL) ConeMatrix = &LamRigg; @@ -376,3 +376,5 @@ cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, return TRUE; } + + 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 311eeb4fcba..925a70374d3 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -60,8 +60,8 @@ // Alarm codes for 16-bit transformations, because the fixed range of containers there are // no values left to mark out of gamut. volatile is C99 per 6.2.5 -static volatile cmsUInt16Number Alarm[cmsMAXCHANNELS]; -static volatile cmsFloat64Number GlobalAdaptationState = 0; +static volatile cmsUInt16Number Alarm[cmsMAXCHANNELS] = { 0x7F00, 0x7F00, 0x7F00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static volatile cmsFloat64Number GlobalAdaptationState = 1; // The adaptation state may be defaulted by this function. If you don't like it, use the extended transform routine cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d) @@ -118,11 +118,13 @@ void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform) if (p ->Sequence) cmsFreeProfileSequenceDescription(p ->Sequence); - LCMS_FREE_LOCK(&p->rwlock); + if (p ->UserData) + p ->FreeUserData(p ->ContextID, p ->UserData); + _cmsFree(p ->ContextID, (void *) p); } -// Apply transform +// Apply transform. void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, const void* InputBuffer, void* OutputBuffer, @@ -131,7 +133,20 @@ void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, { _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; - p -> xform(p, InputBuffer, OutputBuffer, Size); + p -> xform(p, InputBuffer, OutputBuffer, Size, Size); +} + + +// Apply transform. +void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number Size, cmsUInt32Number Stride) + +{ + _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; + + p -> xform(p, InputBuffer, OutputBuffer, Size, Stride); } @@ -142,7 +157,7 @@ void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, static void FloatXFORM(_cmsTRANSFORM* p, const void* in, - void* out, cmsUInt32Number Size) + void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; @@ -155,7 +170,7 @@ void FloatXFORM(_cmsTRANSFORM* p, for (i=0; i < Size; i++) { - accum = p -> FromInputFloat(p, fIn, accum, Size); + accum = p -> FromInputFloat(p, fIn, accum, Stride); // Any gamut chack to do? if (p ->GamutCheck != NULL) { @@ -183,7 +198,7 @@ void FloatXFORM(_cmsTRANSFORM* p, } // Back to asked representation - output = p -> ToOutputFloat(p, fOut, output, Size); + output = p -> ToOutputFloat(p, fOut, output, Stride); } } @@ -193,7 +208,8 @@ void FloatXFORM(_cmsTRANSFORM* p, static void NullXFORM(_cmsTRANSFORM* p, const void* in, - void* out, cmsUInt32Number Size) + void* out, cmsUInt32Number Size, + cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; @@ -206,8 +222,8 @@ void NullXFORM(_cmsTRANSFORM* p, for (i=0; i < n; i++) { - accum = p -> FromInput(p, wIn, accum, Size); - output = p -> ToOutput(p, wIn, output, Size); + accum = p -> FromInput(p, wIn, accum, Stride); + output = p -> ToOutput(p, wIn, output, Stride); } } @@ -216,7 +232,7 @@ void NullXFORM(_cmsTRANSFORM* p, static void PrecalculatedXFORM(_cmsTRANSFORM* p, const void* in, - void* out, cmsUInt32Number Size) + void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { register cmsUInt8Number* accum; register cmsUInt8Number* output; @@ -229,9 +245,9 @@ void PrecalculatedXFORM(_cmsTRANSFORM* p, for (i=0; i < n; i++) { - accum = p -> FromInput(p, wIn, accum, Size); + accum = p -> FromInput(p, wIn, accum, Stride); p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data); - output = p -> ToOutput(p, wOut, output, Size); + output = p -> ToOutput(p, wOut, output, Stride); } } @@ -260,7 +276,7 @@ void TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p, static void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p, const void* in, - void* out, cmsUInt32Number Size) + void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; @@ -273,9 +289,9 @@ void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p, for (i=0; i < n; i++) { - accum = p -> FromInput(p, wIn, accum, Size); + accum = p -> FromInput(p, wIn, accum, Stride); TransformOnePixelWithGamutCheck(p, wIn, wOut); - output = p -> ToOutput(p, wOut, output, Size); + output = p -> ToOutput(p, wOut, output, Stride); } } @@ -284,13 +300,13 @@ void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p, static void CachedXFORM(_cmsTRANSFORM* p, const void* in, - void* out, cmsUInt32Number Size) + void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; cmsUInt32Number i, n; - cmsUInt16Number CacheIn[cmsMAXCHANNELS], CacheOut[cmsMAXCHANNELS]; + _cmsCACHE Cache; accum = (cmsUInt8Number*) in; output = (cmsUInt8Number*) out; @@ -300,36 +316,28 @@ void CachedXFORM(_cmsTRANSFORM* p, memset(wIn, 0, sizeof(wIn)); memset(wOut, 0, sizeof(wOut)); - - LCMS_READ_LOCK(&p ->rwlock); - memmove(CacheIn, p ->CacheIn, sizeof(CacheIn)); - memmove(CacheOut, p ->CacheOut, sizeof(CacheOut)); - LCMS_UNLOCK(&p ->rwlock); + // Get copy of zero cache + memcpy(&Cache, &p ->Cache, sizeof(Cache)); for (i=0; i < n; i++) { - accum = p -> FromInput(p, wIn, accum, Size); + accum = p -> FromInput(p, wIn, accum, Stride); - if (memcmp(wIn, CacheIn, sizeof(CacheIn)) == 0) { + if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) { - memmove(wOut, CacheOut, sizeof(CacheOut)); + memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut)); } else { p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data); - memmove(CacheIn, wIn, sizeof(CacheIn)); - memmove(CacheOut, wOut, sizeof(CacheOut)); + memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn)); + memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut)); } - output = p -> ToOutput(p, wOut, output, Size); + output = p -> ToOutput(p, wOut, output, Stride); } - - LCMS_WRITE_LOCK(&p ->rwlock); - memmove(p->CacheIn, CacheIn, sizeof(CacheIn)); - memmove(p->CacheOut, CacheOut, sizeof(CacheOut)); - LCMS_UNLOCK(&p ->rwlock); } @@ -337,13 +345,13 @@ void CachedXFORM(_cmsTRANSFORM* p, static void CachedXFORMGamutCheck(_cmsTRANSFORM* p, const void* in, - void* out, cmsUInt32Number Size) + void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; cmsUInt32Number i, n; - cmsUInt16Number CacheIn[cmsMAXCHANNELS], CacheOut[cmsMAXCHANNELS]; + _cmsCACHE Cache; accum = (cmsUInt8Number*) in; output = (cmsUInt8Number*) out; @@ -353,51 +361,158 @@ void CachedXFORMGamutCheck(_cmsTRANSFORM* p, memset(wIn, 0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); memset(wOut, 0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); - LCMS_READ_LOCK(&p ->rwlock); - memmove(CacheIn, p ->CacheIn, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); - memmove(CacheOut, p ->CacheOut, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); - LCMS_UNLOCK(&p ->rwlock); - + // Get copy of zero cache + memcpy(&Cache, &p ->Cache, sizeof(Cache)); for (i=0; i < n; i++) { - accum = p -> FromInput(p, wIn, accum, Size); + accum = p -> FromInput(p, wIn, accum, Stride); - if (memcmp(wIn, CacheIn, sizeof(cmsUInt16Number) * cmsMAXCHANNELS) == 0) { - memmove(wOut, CacheOut, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); + if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) { + memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut)); } else { TransformOnePixelWithGamutCheck(p, wIn, wOut); - memmove(CacheIn, wIn, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); - memmove(CacheOut, wOut, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); + memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn)); + memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut)); } - output = p -> ToOutput(p, wOut, output, Size); + output = p -> ToOutput(p, wOut, output, Stride); } - LCMS_WRITE_LOCK(&p ->rwlock); - memmove(p->CacheIn, CacheIn, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); - memmove(p->CacheOut, CacheOut, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); - LCMS_UNLOCK(&p ->rwlock); +} + +// ------------------------------------------------------------------------------------------------------------- + +// List of used-defined transform factories +typedef struct _cmsTransformCollection_st { + + _cmsTransformFactory Factory; + struct _cmsTransformCollection_st *Next; + +} _cmsTransformCollection; + +// The linked list head +static _cmsTransformCollection* TransformCollection = NULL; + +// Register new ways to transform +cmsBool _cmsRegisterTransformPlugin(cmsPluginBase* Data) +{ + cmsPluginTransform* Plugin = (cmsPluginTransform*) Data; + _cmsTransformCollection* fl; + + if (Data == NULL) { + + // Free the chain. Memory is safely freed at exit + TransformCollection = NULL; + return TRUE; + } + + // Factory callback is required + if (Plugin ->Factory == NULL) return FALSE; + + + fl = (_cmsTransformCollection*) _cmsPluginMalloc(sizeof(_cmsTransformCollection)); + if (fl == NULL) return FALSE; + + // Copy the parameters + fl ->Factory = Plugin ->Factory; + + // Keep linked list + fl ->Next = TransformCollection; + TransformCollection = fl; + + // All is ok + return TRUE; } - - -// Allocate transform struct and set it to defaults -static -_cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number dwFlags) +void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn) { + _cmsAssert(CMMcargo != NULL); + CMMcargo ->UserData = ptr; + CMMcargo ->FreeUserData = FreePrivateDataFn; +} + +// returns the pointer defined by the plug-in to store private data +void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo) +{ + _cmsAssert(CMMcargo != NULL); + return CMMcargo ->UserData; +} + +// returns the current formatters +void CMSEXPORT _cmsGetTransformFormatters16(struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput) +{ + _cmsAssert(CMMcargo != NULL); + if (FromInput) *FromInput = CMMcargo ->FromInput; + if (ToOutput) *ToOutput = CMMcargo ->ToOutput; +} + +void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput) +{ + _cmsAssert(CMMcargo != NULL); + if (FromInput) *FromInput = CMMcargo ->FromInputFloat; + if (ToOutput) *ToOutput = CMMcargo ->ToOutputFloat; +} + + +// Allocate transform struct and set it to defaults. Ask the optimization plug-in about if those formats are proper +// for separated transforms. If this is the case, +static +_cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut, + cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) +{ + _cmsTransformCollection* Plugin; + // Allocate needed memory _cmsTRANSFORM* p = (_cmsTRANSFORM*) _cmsMallocZero(ContextID, sizeof(_cmsTRANSFORM)); if (!p) return NULL; + // Store the proposed pipeline + p ->Lut = lut; + + // Let's see if any plug-in want to do the transform by itself + for (Plugin = TransformCollection; + Plugin != NULL; + Plugin = Plugin ->Next) { + + if (Plugin ->Factory(&p->xform, &p->UserData, &p ->FreeUserData, &p ->Lut, InputFormat, OutputFormat, dwFlags)) { + + // Last plugin in the declaration order takes control. We just keep + // the original parameters as a logging. + // Note that cmsFLAGS_CAN_CHANGE_FORMATTER is not set, so by default + // an optimized transform is not reusable. The plug-in can, however, change + // the flags and make it suitable. + + p ->ContextID = ContextID; + p ->InputFormat = *InputFormat; + p ->OutputFormat = *OutputFormat; + p ->dwOriginalFlags = *dwFlags; + + // Fill the formatters just in case the optimized routine is interested. + // No error is thrown if the formatter doesn't exist. It is up to the optimization + // factory to decide what to do in those cases. + p ->FromInput = _cmsGetFormatter(*InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; + p ->ToOutput = _cmsGetFormatter(*OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; + p ->FromInputFloat = _cmsGetFormatter(*InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat; + p ->ToOutputFloat = _cmsGetFormatter(*OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat; + + return p; + } + } + + // Not suitable for the transform plug-in, let's check the pipeline plug-in + if (p ->Lut != NULL) + _cmsOptimizePipeline(&p->Lut, Intent, InputFormat, OutputFormat, dwFlags); + // Check whatever this is a true floating point transform - if (_cmsFormatterIsFloat(InputFormat) && _cmsFormatterIsFloat(OutputFormat)) { + if (_cmsFormatterIsFloat(*InputFormat) && _cmsFormatterIsFloat(*OutputFormat)) { // Get formatter function always return a valid union, but the contents of this union may be NULL. - p ->FromInputFloat = _cmsGetFormatter(InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat; - p ->ToOutputFloat = _cmsGetFormatter(OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat; + p ->FromInputFloat = _cmsGetFormatter(*InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat; + p ->ToOutputFloat = _cmsGetFormatter(*OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat; + *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; if (p ->FromInputFloat == NULL || p ->ToOutputFloat == NULL) { @@ -411,31 +526,45 @@ _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsUInt32Number InputFo } else { - p ->FromInput = _cmsGetFormatter(InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; - p ->ToOutput = _cmsGetFormatter(OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; + if (*InputFormat == 0 && *OutputFormat == 0) { + p ->FromInput = p ->ToOutput = NULL; + *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; + } + else { - if (p ->FromInput == NULL || p ->ToOutput == NULL) { + int BytesPerPixelInput; + + p ->FromInput = _cmsGetFormatter(*InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; + p ->ToOutput = _cmsGetFormatter(*OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; + + if (p ->FromInput == NULL || p ->ToOutput == NULL) { + + cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); + _cmsFree(ContextID, p); + return NULL; + } + + BytesPerPixelInput = T_BYTES(p ->InputFormat); + if (BytesPerPixelInput == 0 || BytesPerPixelInput >= 2) + *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; - cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); - _cmsFree(ContextID, p); - return NULL; } - if (dwFlags & cmsFLAGS_NULLTRANSFORM) { + if (*dwFlags & cmsFLAGS_NULLTRANSFORM) { p ->xform = NullXFORM; } else { - if (dwFlags & cmsFLAGS_NOCACHE) { + if (*dwFlags & cmsFLAGS_NOCACHE) { - if (dwFlags & cmsFLAGS_GAMUTCHECK) + if (*dwFlags & cmsFLAGS_GAMUTCHECK) p ->xform = PrecalculatedXFORMGamutCheck; // Gamut check, no caché else p ->xform = PrecalculatedXFORM; // No caché, no gamut check } else { - if (dwFlags & cmsFLAGS_GAMUTCHECK) + if (*dwFlags & cmsFLAGS_GAMUTCHECK) p ->xform = CachedXFORMGamutCheck; // Gamut check, caché else p ->xform = CachedXFORM; // No gamut check, caché @@ -444,14 +573,11 @@ _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsUInt32Number InputFo } } - - // Create a mutex for shared memory - LCMS_CREATE_LOCK(&p->rwlock); - - p ->InputFormat = InputFormat; - p ->OutputFormat = OutputFormat; - p ->dwOriginalFlags = dwFlags; + p ->InputFormat = *InputFormat; + p ->OutputFormat = *OutputFormat; + p ->dwOriginalFlags = *dwFlags; p ->ContextID = ContextID; + p ->UserData = NULL; return p; } @@ -462,12 +588,14 @@ cmsBool GetXFormColorSpaces(int nProfiles, cmsHPROFILE hProfiles[], cmsColorSpac cmsColorSpaceSignature PostColorSpace; int i; + if (nProfiles <= 0) return FALSE; if (hProfiles[0] == NULL) return FALSE; *Input = PostColorSpace = cmsGetColorSpace(hProfiles[0]); for (i=0; i < nProfiles; i++) { + cmsProfileClassSignature cls; cmsHPROFILE hProfile = hProfiles[i]; int lIsInput = (PostColorSpace != cmsSigXYZData) && @@ -475,17 +603,28 @@ cmsBool GetXFormColorSpaces(int nProfiles, cmsHPROFILE hProfiles[], cmsColorSpac if (hProfile == NULL) return FALSE; - if (lIsInput) { + cls = cmsGetDeviceClass(hProfile); + + if (cls == cmsSigNamedColorClass) { + + ColorSpaceIn = cmsSig1colorData; + ColorSpaceOut = (nProfiles > 1) ? cmsGetPCS(hProfile) : cmsGetColorSpace(hProfile); + } + else + if (lIsInput || (cls == cmsSigLinkClass)) { ColorSpaceIn = cmsGetColorSpace(hProfile); ColorSpaceOut = cmsGetPCS(hProfile); } - else { - + else + { ColorSpaceIn = cmsGetPCS(hProfile); ColorSpaceOut = cmsGetColorSpace(hProfile); } + if (i==0) + *Input = ColorSpaceIn; + PostColorSpace = ColorSpaceOut; } @@ -531,6 +670,12 @@ cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, cmsPipeline* Lut; cmsUInt32Number LastIntent = Intents[nProfiles-1]; + // If it is a fake transform + if (dwFlags & cmsFLAGS_NULLTRANSFORM) + { + return AllocEmptyTransform(ContextID, NULL, INTENT_PERCEPTUAL, &InputFormat, &OutputFormat, &dwFlags); + } + // If gamut check is requested, make sure we have a gamut profile if (dwFlags & cmsFLAGS_GAMUTCHECK) { if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK; @@ -566,21 +711,24 @@ cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, return NULL; } - // Optimize the LUT if possible - _cmsOptimizePipeline(&Lut, LastIntent, &InputFormat, &OutputFormat, &dwFlags); + // Check channel count + if ((cmsChannelsOf(EntryColorSpace) != cmsPipelineInputChannels(Lut)) || + (cmsChannelsOf(ExitColorSpace) != cmsPipelineOutputChannels(Lut))) { + cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Channel count doesn't match. Profile is corrupted"); + return NULL; + } // All seems ok - xform = AllocEmptyTransform(ContextID, InputFormat, OutputFormat, dwFlags); + xform = AllocEmptyTransform(ContextID, Lut, LastIntent, &InputFormat, &OutputFormat, &dwFlags); if (xform == NULL) { - cmsPipelineFree(Lut); return NULL; } // Keep values xform ->EntryColorSpace = EntryColorSpace; xform ->ExitColorSpace = ExitColorSpace; - xform ->Lut = Lut; + xform ->RenderingIntent = Intents[nProfiles-1]; // Create a gamut check LUT if requested @@ -627,14 +775,14 @@ cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, // If this is a cached transform, init first value, which is zero (16 bits only) if (!(dwFlags & cmsFLAGS_NOCACHE)) { - memset(&xform ->CacheIn, 0, sizeof(xform ->CacheIn)); + memset(&xform ->Cache.CacheIn, 0, sizeof(xform ->Cache.CacheIn)); if (xform ->GamutCheck != NULL) { - TransformOnePixelWithGamutCheck(xform, xform ->CacheIn, xform->CacheOut); + TransformOnePixelWithGamutCheck(xform, xform ->Cache.CacheIn, xform->Cache.CacheOut); } else { - xform ->Lut ->Eval16Fn(xform ->CacheIn, xform->CacheOut, xform -> Lut->Data); + xform ->Lut ->Eval16Fn(xform ->Cache.CacheIn, xform->Cache.CacheOut, xform -> Lut->Data); } } @@ -643,7 +791,6 @@ cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, } // Multiprofile transforms: Gamut check is not available here, as it is unclear from which profile the gamut comes. - cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID, cmsHPROFILE hProfiles[], cmsUInt32Number nProfiles, @@ -785,3 +932,53 @@ cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform) if (xform == NULL) return NULL; return xform -> ContextID; } + +// Grab the input/output formats +cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + + if (xform == NULL) return 0; + return xform->InputFormat; +} + +cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + + if (xform == NULL) return 0; + return xform->OutputFormat; +} + +// For backwards compatibility +cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat) +{ + + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + cmsFormatter16 FromInput, ToOutput; + + + // We only can afford to change formatters if previous transform is at least 16 bits + if (!(xform ->dwOriginalFlags & cmsFLAGS_CAN_CHANGE_FORMATTER)) { + + cmsSignalError(xform ->ContextID, cmsERROR_NOT_SUITABLE, "cmsChangeBuffersFormat works only on transforms created originally with at least 16 bits of precision"); + return FALSE; + } + + FromInput = _cmsGetFormatter(InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; + ToOutput = _cmsGetFormatter(OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; + + if (FromInput == NULL || ToOutput == NULL) { + + cmsSignalError(xform -> ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); + return FALSE; + } + + xform ->InputFormat = InputFormat; + xform ->OutputFormat = OutputFormat; + xform ->FromInput = FromInput; + xform ->ToOutput = ToOutput; + return TRUE; +} diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h index fcc3998f0a5..aee6cbadb96 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2011 Marti Maria Saguer // // 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,7 @@ // //--------------------------------------------------------------------------------- // -// Version 2.0 +// Version 2.4 // #ifndef _lcms2_H @@ -69,9 +69,6 @@ // Uncomment this if your compiler doesn't work with fast floor function // #define CMS_DONT_USE_FAST_FLOOR 1 -// Uncomment this line if your system does not support multithreading -#define CMS_DONT_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 leave it commented out @@ -84,6 +81,9 @@ // require "KEYWORD" on undefined identifiers, keep it comented out unless needed // #define CMS_STRICT_CGATS 1 +// Uncomment to get rid of the tables for "half" float support +// #define CMS_NO_HALF_SUPPORT 1 + // ********** End of configuration toggles ****************************** // Needed for streams @@ -101,7 +101,7 @@ extern "C" { #endif // Version/release -#define LCMS_VERSION 2000 +#define LCMS_VERSION 2040 // I will give the chance of redefining basic types for compilers that are not fully C99 compliant #ifndef CMS_BASIC_TYPES_ALREADY_DEFINED @@ -110,6 +110,10 @@ extern "C" { typedef unsigned char cmsUInt8Number; // That is guaranteed by the C99 spec typedef signed char cmsInt8Number; // That is guaranteed by the C99 spec +#if CHAR_BIT != 8 +# error "Unable to find 8 bit type, unsupported compiler" +#endif + // IEEE float storage numbers typedef float cmsFloat32Number; typedef double cmsFloat64Number; @@ -211,11 +215,13 @@ typedef int cmsBool; #endif #ifdef TARGET_CPU_PPC +# if TARGET_CPU_PPC # define CMS_USE_BIG_ENDIAN 1 +# endif #endif #ifdef macintosh -# ifndef __LITTLE_ENDIAN__ +# ifdef __BIG_ENDIAN__ # define CMS_USE_BIG_ENDIAN 1 # endif #endif @@ -276,6 +282,7 @@ typedef enum { cmsSigCrdInfoType = 0x63726469, // 'crdi' cmsSigCurveType = 0x63757276, // 'curv' cmsSigDataType = 0x64617461, // 'data' + cmsSigDictType = 0x64696374, // 'dict' cmsSigDateTimeType = 0x6474696D, // 'dtim' cmsSigDeviceSettingsType = 0x64657673, // 'devs' cmsSigLut16Type = 0x6d667432, // 'mft2' @@ -302,9 +309,10 @@ typedef enum { cmsSigUInt32ArrayType = 0x75693332, // 'ui32' cmsSigUInt64ArrayType = 0x75693634, // 'ui64' cmsSigUInt8ArrayType = 0x75693038, // 'ui08' + cmsSigVcgtType = 0x76636774, // 'vcgt' cmsSigViewingConditionsType = 0x76696577, // 'view' - cmsSigXYZType = 0x58595A20, // 'XYZ ' - cmsSigVcgtType = 0x76636774 // 'vcgt' + cmsSigXYZType = 0x58595A20 // 'XYZ ' + } cmsTagTypeSignature; @@ -377,7 +385,8 @@ typedef enum { cmsSigUcrBgTag = 0x62666420, // 'bfd ' cmsSigViewingCondDescTag = 0x76756564, // 'vued' cmsSigViewingConditionsTag = 0x76696577, // 'view' - cmsSigVcgtTag = 0x76636774 // 'vcgt' + cmsSigVcgtTag = 0x76636774, // 'vcgt' + cmsSigMetaTag = 0x6D657461 // 'meta' } cmsTagSignature; @@ -409,7 +418,7 @@ typedef enum { cmsSigMotionPictureFilmScanner = 0x6D706673, // 'mpfs' cmsSigMotionPictureFilmRecorder = 0x6D706672, // 'mpfr' cmsSigDigitalMotionPictureCamera = 0x646D7063, // 'dmpc' - cmsSigDigitalCinemaProjector = 0x64636A70, // 'dcpj' + cmsSigDigitalCinemaProjector = 0x64636A70 // 'dcpj' } cmsTechnologySignature; @@ -436,12 +445,12 @@ typedef enum { cmsSigMCH7Data = 0x4D434837, // 'MCH7' cmsSigMCH8Data = 0x4D434838, // 'MCH8' cmsSigMCH9Data = 0x4D434839, // 'MCH9' - cmsSigMCHAData = 0x4D43483A, // 'MCHA' - cmsSigMCHBData = 0x4D43483B, // 'MCHB' - cmsSigMCHCData = 0x4D43483C, // 'MCHC' - cmsSigMCHDData = 0x4D43483D, // 'MCHD' - cmsSigMCHEData = 0x4D43483E, // 'MCHE' - cmsSigMCHFData = 0x4D43483F, // 'MCHF' + cmsSigMCHAData = 0x4D434841, // 'MCHA' + cmsSigMCHBData = 0x4D434842, // 'MCHB' + cmsSigMCHCData = 0x4D434843, // 'MCHC' + cmsSigMCHDData = 0x4D434844, // 'MCHD' + cmsSigMCHEData = 0x4D434845, // 'MCHE' + cmsSigMCHFData = 0x4D434846, // 'MCHF' cmsSigNamedData = 0x6e6d636c, // 'nmcl' cmsSig1colorData = 0x31434C52, // '1CLR' cmsSig2colorData = 0x32434C52, // '2CLR' @@ -470,7 +479,7 @@ typedef enum { cmsSigLinkClass = 0x6C696E6B, // 'link' cmsSigAbstractClass = 0x61627374, // 'abst' cmsSigColorSpaceClass = 0x73706163, // 'spac' - cmsSigNamedColorClass = 0x6e6d636c, // 'nmcl' + cmsSigNamedColorClass = 0x6e6d636c // 'nmcl' } cmsProfileClassSignature; @@ -512,7 +521,13 @@ typedef enum { cmsSigLabV4toV2 = 0x34203220, // '4 2 ' // Identities - cmsSigIdentityElemType = 0x69646E20 // 'idn ' + cmsSigIdentityElemType = 0x69646E20, // 'idn ' + + // Float to floatPCS + cmsSigLab2FloatPCS = 0x64326C20, // 'd2l ' + cmsSigFloatPCS2Lab = 0x6C326420, // 'l2d ' + cmsSigXYZ2FloatPCS = 0x64327820, // 'd2x ' + cmsSigFloatPCS2XYZ = 0x78326420 // 'x2d ' } cmsStageSignature; @@ -635,7 +650,9 @@ typedef void* cmsHTRANSFORM; // Format of pixel is defined by one cmsUInt32Number, using bit fields as follows // -// A O TTTTT U Y F P X S EEE CCCC BBB +// 2 1 0 +// 3 2 10987 6 5 4 3 2 1 098 7654 321 +// A O TTTTT U Y F P X S EEE CCCC BBB // // A: Floating point -- With this flag we can differentiate 16 bits as float and as int // O: Optimized -- previous optimization already returns the final 8-bit value @@ -743,16 +760,19 @@ typedef void* cmsHTRANSFORM; #define TYPE_RGBA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_ARGB_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_ARGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1)) #define TYPE_ARGB_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)) #define TYPE_ABGR_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_ABGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_ABGR_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_ABGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_ABGR_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_BGRA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_BGRA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1)) #define TYPE_BGRA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) -#define TYPE_BGRA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_BGRA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_CMY_8 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_CMY_8_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) @@ -834,8 +854,8 @@ typedef void* cmsHTRANSFORM; #define TYPE_Lab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_LabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)) -#define TYPE_ALab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)) -#define TYPE_ALabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)) +#define TYPE_ALab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_ALabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)) #define TYPE_Lab_16 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_LabV2_16 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_Yxy_16 (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2)) @@ -874,8 +894,16 @@ typedef void* cmsHTRANSFORM; // Float formatters. #define TYPE_XYZ_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_Lab_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(4)) +#define TYPE_LabA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_GRAY_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4)) #define TYPE_RGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)) + +#define TYPE_RGBA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) +#define TYPE_ARGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1)) +#define TYPE_BGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)) +#define TYPE_BGRA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_ABGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)) + #define TYPE_CMYK_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(4)) // Floating point formatters. @@ -884,8 +912,21 @@ typedef void* cmsHTRANSFORM; #define TYPE_Lab_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0)) #define TYPE_GRAY_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0)) #define TYPE_RGB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)) +#define TYPE_BGR_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)|DOSWAP_SH(1)) #define TYPE_CMYK_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0)) +// IEEE 754-2008 "half" +#define TYPE_GRAY_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)) +#define TYPE_RGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_CMYK_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)) + +#define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_ARGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)) +#define TYPE_BGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_BGRA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_ABGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) + #endif // Colorspaces @@ -1116,6 +1157,10 @@ CMSAPI cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* CMSAPI cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t); CMSAPI cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision); +// Tone curve tabular estimation +CMSAPI cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t); +CMSAPI const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t); + // Implements pipelines of multi-processing elements ------------------------------------------------------------- @@ -1128,6 +1173,7 @@ CMSAPI cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUIn CMSAPI void CMSEXPORT cmsPipelineFree(cmsPipeline* lut); CMSAPI cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* Orig); +CMSAPI cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut); CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut); CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut); @@ -1188,10 +1234,9 @@ typedef cmsInt32Number (* cmsSAMPLERFLOAT)(register const cmsFloat32Number In[], #define SAMPLER_INSPECT 0x01000000 // For CLUT only -CMSAPI cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void* Cargo, cmsUInt32Number dwFlags); +CMSAPI cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void* Cargo, cmsUInt32Number dwFlags); CMSAPI cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void* Cargo, cmsUInt32Number dwFlags); - // Slicers CMSAPI cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsSAMPLER16 Sampler, void * Cargo); @@ -1301,6 +1346,7 @@ CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform); // Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others // come from Profile Sequence Identifier Tag typedef struct { + cmsSignature deviceMfg; cmsSignature deviceModel; cmsUInt64Number attributes; @@ -1324,6 +1370,27 @@ CMSAPI cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext CMSAPI cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq); CMSAPI void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq); +// Dictionaries -------------------------------------------------------------------------------------------------------- + +typedef struct _cmsDICTentry_struct { + + struct _cmsDICTentry_struct* Next; + + cmsMLU *DisplayName; + cmsMLU *DisplayValue; + wchar_t* Name; + wchar_t* Value; + +} cmsDICTentry; + +CMSAPI cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID); +CMSAPI void CMSEXPORT cmsDictFree(cmsHANDLE hDict); +CMSAPI cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict); + +CMSAPI cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue); +CMSAPI const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict); +CMSAPI const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e); + // Access to Profile data ---------------------------------------------------------------------------------------------- CMSAPI cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID); @@ -1336,12 +1403,18 @@ CMSAPI cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignatur CMSAPI void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig); CMSAPI cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data); CMSAPI cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest); +CMSAPI cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig); // Read and write raw data CMSAPI cmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size); // Access header data +#define cmsEmbeddedProfileFalse 0x00000000 +#define cmsEmbeddedProfileTrue 0x00000001 +#define cmsUseAnywhere 0x00000000 +#define cmsUseWithEmbeddedDataOnly 0x00000002 + CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags); CMSAPI void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID); @@ -1377,9 +1450,9 @@ CMSAPI void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, #define LCMS_USED_AS_OUTPUT 1 #define LCMS_USED_AS_PROOF 2 -CMSAPI cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, int UsedDirection); +CMSAPI cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection); CMSAPI cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile); -CMSAPI cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, int UsedDirection); +CMSAPI cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection); // Translate form/to our notation to ICC CMSAPI cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation); @@ -1528,7 +1601,6 @@ CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, c #define cmsFLAGS_NOOPTIMIZE 0x0100 // Inhibit optimizations #define cmsFLAGS_NULLTRANSFORM 0x0200 // Don't transform anyway - // Proofing flags #define cmsFLAGS_GAMUTCHECK 0x1000 // Out of Gamut alarm #define cmsFLAGS_SOFTPROOFING 0x4000 // Do softproofing @@ -1626,14 +1698,32 @@ CMSAPI void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, void * OutputBuffer, cmsUInt32Number Size); +CMSAPI void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform, + const void * InputBuffer, + void * OutputBuffer, + cmsUInt32Number Size, + cmsUInt32Number Stride); + + CMSAPI void CMSEXPORT cmsSetAlarmCodes(cmsUInt16Number NewAlarm[cmsMAXCHANNELS]); CMSAPI void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number NewAlarm[cmsMAXCHANNELS]); // Adaptation state for absolute colorimetric intent CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d); +// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed CMSAPI cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform); +// Grab the input/output formats +CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform); +CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform); + +// For backwards compatibility +CMSAPI cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat); + + // PostScript ColorRenderingDictionary and ColorSpaceArray ---------------------------------------------------- @@ -1677,12 +1767,15 @@ CMSAPI cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* c CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* cProp, const char *Str); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val); +CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer); CMSAPI const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* cProp); CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp); +CMSAPI const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey); CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames); +CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames); // Datasets CMSAPI const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col); @@ -1712,10 +1805,13 @@ CMSAPI cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE hIT8, int n, con CMSAPI int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames); CMSAPI const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer); +CMSAPI int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch); // The LABEL extension CMSAPI int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType); +CMSAPI cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample); + // Formatter for double CMSAPI void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter); @@ -1731,6 +1827,7 @@ CMSAPI cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIEL // Estimate the black point CMSAPI cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags); +CMSAPI cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags); // Estimate total area coverage CMSAPI cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile); diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h index 53a3a4639a7..9477aa33cfc 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -75,16 +75,18 @@ # define M_LOG10E 0.434294481903251827651 #endif -// BorlandC 5.5 is broken on that -#ifdef __BORLANDC__ +// BorlandC 5.5, VC2003 are broken on that +#if defined(__BORLANDC__) || (_MSC_VER < 1400) // 1400 == VC++ 8.0 #define sinf(x) (float)sin((float)x) #define sqrtf(x) (float)sqrt((float)x) #endif // Alignment of ICC file format uses 4 bytes (cmsUInt32Number) -#define _cmsSIZEOFLONGMINUS1 (sizeof(cmsUInt32Number)-1) -#define _cmsALIGNLONG(x) (((x)+_cmsSIZEOFLONGMINUS1) & ~(_cmsSIZEOFLONGMINUS1)) +#define _cmsALIGNLONG(x) (((x)+(sizeof(cmsUInt32Number)-1)) & ~(sizeof(cmsUInt32Number)-1)) + +// Alignment to memory pointer +#define _cmsALIGNMEM(x) (((x)+(sizeof(void *) - 1)) & ~(sizeof(void *) - 1)) // Maximum encodeable values in floating point #define MAX_ENCODEABLE_XYZ (1.0 + 32767.0/32768.0) @@ -94,7 +96,7 @@ #define MAX_ENCODEABLE_ab4 (127.0) // Maximum of channels for internal pipeline evaluation -#define MAX_STAGE_CHANNELS 128 +#define MAX_STAGE_CHANNELS 128 // Unused parameter warning supression #define cmsUNUSED_PARAMETER(x) ((void)x) @@ -117,36 +119,6 @@ # endif #endif -// Pthreads. In windows we use the native WIN32 API instead -#ifdef CMS_DONT_USE_PTHREADS -typedef int LCMS_RWLOCK_T; -# define LCMS_CREATE_LOCK(x) -# define LCMS_FREE_LOCK(x) -# define LCMS_READ_LOCK(x) -# define LCMS_WRITE_LOCK(x) -# define LCMS_UNLOCK(x) -#else -#ifdef CMS_IS_WINDOWS_ -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include - typedef CRITICAL_SECTION LCMS_RWLOCK_T; -# define LCMS_CREATE_LOCK(x) InitializeCriticalSection((x)) -# define LCMS_FREE_LOCK(x) DeleteCriticalSection((x)) -# define LCMS_READ_LOCK(x) EnterCriticalSection((x)) -# define LCMS_WRITE_LOCK(x) EnterCriticalSection((x)) -# define LCMS_UNLOCK(x) LeaveCriticalSection((x)) -#else -# include - typedef pthread_rwlock_t LCMS_RWLOCK_T; -# define LCMS_CREATE_LOCK(x) pthread_rwlock_init((x), NULL) -# define LCMS_FREE_LOCK(x) pthread_rwlock_destroy((x)) -# define LCMS_READ_LOCK(x) pthread_rwlock_rdlock((x)) -# define LCMS_WRITE_LOCK(x) pthread_rwlock_wrlock((x)) -# define LCMS_UNLOCK(x) pthread_rwlock_unlock((x)) -#endif -#endif // A fast way to convert from/to 16 <-> 8 bits #define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb)) @@ -253,6 +225,8 @@ cmsBool _cmsRegisterMultiProcessElementPlugin(cmsPluginBase* Plugin); // Optimization cmsBool _cmsRegisterOptimizationPlugin(cmsPluginBase* Plugin); +// Transform +cmsBool _cmsRegisterTransformPlugin(cmsPluginBase* Plugin); // --------------------------------------------------------------------------------------------------------- @@ -396,6 +370,7 @@ void _cmsTagSignature2String(char String[5], cmsTagSignature sig cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags); cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags); void _cmsFreeInterpParams(cmsInterpParams* p); +cmsBool _cmsSetInterpolationRoutine(cmsInterpParams* p); // Curves ---------------------------------------------------------------------------------------------------------------- @@ -443,37 +418,6 @@ struct _cmsStage_struct { struct _cmsStage_struct* Next; }; -// Data kept in "Element" member of cmsStage - -// Curves -typedef struct { - cmsUInt32Number nCurves; - cmsToneCurve** TheCurves; - -} _cmsStageToneCurvesData; - -// Matrix -typedef struct { - cmsFloat64Number* Double; // floating point for the matrix - cmsFloat64Number* Offset; // The offset - -} _cmsStageMatrixData; - -// CLUT -typedef struct { - - union { // Can have only one of both representations at same time - cmsUInt16Number* T; // Points to the table 16 bits table - cmsFloat32Number* TFloat; // Points to the cmsFloat32Number table - - } Tab; - - cmsInterpParams* Params; - cmsUInt32Number nEntries; - cmsBool HasFloatValues; - -} _cmsStageCLutData; - // Special Stages (cannot be saved) cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID); @@ -482,9 +426,13 @@ cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID); cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID); cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID); cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID); -cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList); +cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS); cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels); cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan); +cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID); +cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID); +cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID); +cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID); // For curve set only cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe); @@ -505,12 +453,12 @@ struct _cmsPipeline_struct { _cmsOPTeval16Fn Eval16Fn; _cmsPipelineEvalFloatFn EvalFloatFn; - _cmsOPTfreeDataFn FreeDataFn; - _cmsOPTdupDataFn DupDataFn; + _cmsFreeUserDataFn FreeDataFn; + _cmsDupUserDataFn DupDataFn; cmsContext ContextID; // Environment - cmsBool SaveAs8Bits; // Implemntation-specific: save as 8 bits if possible + cmsBool SaveAs8Bits; // Implementation-specific: save as 8 bits if possible }; // LUT reading & creation ------------------------------------------------------------------------------------------- @@ -573,6 +521,8 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, // Formatters ------------------------------------------------------------------------------------------------------------ +#define cmsFLAGS_CAN_CHANGE_FORMATTER 0x02000000 // Allow change buffer format + cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type); cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type); @@ -581,21 +531,27 @@ cmsFormatter _cmsGetFormatter(cmsUInt32Number Type, // Specific type cmsUInt32Number dwFlags); +#ifndef CMS_NO_HALF_SUPPORT + +// Half float +cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h); +cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt); + +#endif + // Transform logic ------------------------------------------------------------------------------------------------------ struct _cmstransform_struct; -// Full xform -typedef void (* _cmsTransformFn)(struct _cmstransform_struct *Transform, - const void* InputBuffer, - void* OutputBuffer, cmsUInt32Number Size); - typedef struct { - cmsUInt32Number InputFormat, OutputFormat; // Keep formats for further reference - cmsUInt32Number StrideIn, StrideOut; // Planar support + // 1-pixel cache (16 bits only) + cmsUInt16Number CacheIn[cmsMAXCHANNELS]; + cmsUInt16Number CacheOut[cmsMAXCHANNELS]; + +} _cmsCACHE; + -} cmsFormatterInfo; // Transformation typedef struct _cmstransform_struct { @@ -612,17 +568,13 @@ typedef struct _cmstransform_struct { cmsFormatterFloat FromInputFloat; cmsFormatterFloat ToOutputFloat; - // 1-pixel cache (16 bits only) - cmsUInt16Number CacheIn[cmsMAXCHANNELS]; - cmsUInt16Number CacheOut[cmsMAXCHANNELS]; + // 1-pixel cache seed for zero as input (16 bits, read only) + _cmsCACHE Cache; - // Semaphor for cache - LCMS_RWLOCK_T rwlock; - - // A MPE LUT holding the full (optimized) transform + // A Pipeline holding the full (optimized) transform cmsPipeline* Lut; - // A MPE LUT holding the gamut check. It goes from the input space to bilevel + // A Pipeline holding the gamut check. It goes from the input space to bilevel cmsPipeline* GamutCheck; // Colorant tables @@ -645,6 +597,10 @@ typedef struct _cmstransform_struct { // An id that uniquely identifies the running context. May be null. cmsContext ContextID; + // A user-defined pointer that can be used to store data for transform plug-ins + void* UserData; + _cmsFreeUserDataFn FreeUserData; + } _cmsTRANSFORM; // -------------------------------------------------------------------------------------------------- diff --git a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h index dd1a6d2ed16..1df7cf79b8d 100644 --- a/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h +++ b/jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2010 Marti Maria Saguer +// Copyright (c) 1998-2011 Marti Maria Saguer // // 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,7 @@ struct _cms_io_handler { cmsContext ContextID; cmsUInt32Number UsedSpace; + cmsUInt32Number ReportedSize; char PhysicalFile[cmsMAX_PATH]; cmsUInt32Number (* Read)(struct _cms_io_handler* iohandler, void *Buffer, @@ -159,7 +160,7 @@ struct _cms_io_handler { // Endianess adjust functions CMSAPI cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word); CMSAPI cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number Value); -CMSAPI void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number QWord); +CMSAPI void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord); // Helper IO functions CMSAPI cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n); @@ -175,7 +176,7 @@ CMSAPI cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUI CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n); -CMSAPI cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number n); +CMSAPI cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n); CMSAPI cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array); @@ -209,6 +210,11 @@ CMSAPI cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v); CMSAPI void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source); CMSAPI void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest); +//---------------------------------------------------------------------------------------------------------- + +// Shared callbacks for user data +typedef void (* _cmsFreeUserDataFn)(cmsContext ContextID, void* Data); +typedef void* (* _cmsDupUserDataFn)(cmsContext ContextID, const void* Data); //---------------------------------------------------------------------------------------------------------- @@ -224,6 +230,7 @@ CMSAPI void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeN #define cmsPluginRenderingIntentSig 0x696E7448 // 'intH' #define cmsPluginMultiProcessElementSig 0x6D706548 // 'mpeH' #define cmsPluginOptimizationSig 0x6F707448 // 'optH' +#define cmsPluginTransformSig 0x7A666D48 // 'xfmH' typedef struct _cmsPluginBaseStruct { @@ -414,8 +421,9 @@ typedef struct _cms_typehandler_struct { void (* FreePtr)(struct _cms_typehandler_struct* self, void *Ptr); - // The calling thread - cmsContext ContextID; + // Additional parameters used by the calling thread + cmsContext ContextID; + cmsUInt32Number ICCVersion; } cmsTagTypeHandler; @@ -513,6 +521,39 @@ typedef struct { } cmsPluginMultiProcessElement; + +// Data kept in "Element" member of cmsStage + +// Curves +typedef struct { + cmsUInt32Number nCurves; + cmsToneCurve** TheCurves; + +} _cmsStageToneCurvesData; + +// Matrix +typedef struct { + cmsFloat64Number* Double; // floating point for the matrix + cmsFloat64Number* Offset; // The offset + +} _cmsStageMatrixData; + +// CLUT +typedef struct { + + union { // Can have only one of both representations at same time + cmsUInt16Number* T; // Points to the table 16 bits table + cmsFloat32Number* TFloat; // Points to the cmsFloat32Number table + + } Tab; + + cmsInterpParams* Params; + cmsUInt32Number nEntries; + cmsBool HasFloatValues; + +} _cmsStageCLutData; + + //---------------------------------------------------------------------------------------------------------- // Optimization. Using this plug-in, additional optimization strategies may be implemented. // The function should return TRUE if any optimization is done on the LUT, this terminates @@ -523,9 +564,6 @@ typedef void (* _cmsOPTeval16Fn)(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register const void* Data); -typedef void (* _cmsOPTfreeDataFn)(cmsContext ContextID, void* Data); -typedef void* (* _cmsOPTdupDataFn)(cmsContext ContextID, const void* Data); - typedef cmsBool (* _cmsOPToptimizeFn)(cmsPipeline** Lut, cmsUInt32Number Intent, @@ -539,8 +577,8 @@ typedef cmsBool (* _cmsOPToptimizeFn)(cmsPipeline** Lut, CMSAPI void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut, _cmsOPTeval16Fn Eval16, void* PrivateData, - _cmsOPTfreeDataFn FreePrivateDataFn, - _cmsOPTdupDataFn DupPrivateDataFn); + _cmsFreeUserDataFn FreePrivateDataFn, + _cmsDupUserDataFn DupPrivateDataFn); typedef struct { cmsPluginBase base; @@ -551,6 +589,39 @@ typedef struct { } cmsPluginOptimization; //---------------------------------------------------------------------------------------------------------- +// Full xform +typedef void (* _cmsTransformFn)(struct _cmstransform_struct *CMMcargo, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number Size, + cmsUInt32Number Stride); + +typedef cmsBool (* _cmsTransformFactory)(_cmsTransformFn* xform, + void** UserData, + _cmsFreeUserDataFn* FreePrivateDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + + +// Retrieve user data as specified by the factory +CMSAPI void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn); +CMSAPI void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo); + + +// Retrieve formatters +CMSAPI void CMSEXPORT _cmsGetTransformFormatters16 (struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput); +CMSAPI void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput); + +typedef struct { + cmsPluginBase base; + + // Transform entry point + _cmsTransformFactory Factory; + +} cmsPluginTransform; + #ifndef CMS_USE_CPP_API # ifdef __cplusplus From d96d10ded0b7968f9cd727758fe98d49d3700c1d Mon Sep 17 00:00:00 2001 From: Anton Litvinov Date: Wed, 24 Oct 2012 18:27:14 +0400 Subject: [PATCH 091/241] 7193219: JComboBox serialization fails in JDK 1.7 Reviewed-by: rupashka, anthony --- .../classes/javax/swing/AncestorNotifier.java | 4 +- .../AncestorNotifier/7193219/bug7193219.java | 83 +++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 jdk/test/javax/swing/AncestorNotifier/7193219/bug7193219.java diff --git a/jdk/src/share/classes/javax/swing/AncestorNotifier.java b/jdk/src/share/classes/javax/swing/AncestorNotifier.java index 288d7fdb599..f3cfdd9d0ba 100644 --- a/jdk/src/share/classes/javax/swing/AncestorNotifier.java +++ b/jdk/src/share/classes/javax/swing/AncestorNotifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,7 @@ import java.io.Serializable; @SuppressWarnings("serial") class AncestorNotifier implements ComponentListener, PropertyChangeListener, Serializable { - Component firstInvisibleAncestor; + transient Component firstInvisibleAncestor; EventListenerList listenerList = new EventListenerList(); JComponent root; diff --git a/jdk/test/javax/swing/AncestorNotifier/7193219/bug7193219.java b/jdk/test/javax/swing/AncestorNotifier/7193219/bug7193219.java new file mode 100644 index 00000000000..0db4839dc50 --- /dev/null +++ b/jdk/test/javax/swing/AncestorNotifier/7193219/bug7193219.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + @bug 7193219 + @summary JComboBox serialization fails in JDK 1.7 + @author Anton Litvinov +*/ + +import java.io.*; + +import javax.swing.*; + +public class bug7193219 { + private static byte[] serializeGUI() { + // Create and set up the window. + JFrame frame = new JFrame("Serialization"); + JPanel mainPanel = new JPanel(); + + /** + * If JComboBox is replaced with other component like JLabel + * The issue does not happen. + */ + JComboBox status = new JComboBox(); + status.addItem("123"); + mainPanel.add(status); + frame.getContentPane().add(mainPanel); + frame.pack(); + + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(mainPanel); + oos.flush(); + frame.dispose(); + return baos.toByteArray(); + } catch (IOException ioe) { + throw new RuntimeException(ioe); + } + } + + private static void deserializeGUI(byte[] serializedData) { + try { + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(serializedData)); + JPanel mainPanel = (JPanel)ois.readObject(); + JFrame frame = new JFrame("Deserialization"); + frame.getContentPane().add(mainPanel); + frame.pack(); + frame.dispose(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + deserializeGUI(serializeGUI()); + } + }); + } +} From 6d94ef1ee77a431aa2cdc44f75743d3e3c0964c6 Mon Sep 17 00:00:00 2001 From: Tom Deneau Date: Wed, 24 Oct 2012 14:33:22 -0700 Subject: [PATCH 092/241] 7184394: add intrinsics to use AES instructions Use new x86 AES instructions for AESCrypt. Reviewed-by: twisti, kvn, roland --- hotspot/src/cpu/x86/vm/assembler_x86.cpp | 97 +++ hotspot/src/cpu/x86/vm/assembler_x86.hpp | 25 + .../src/cpu/x86/vm/stubGenerator_x86_32.cpp | 533 +++++++++++++++++ .../src/cpu/x86/vm/stubGenerator_x86_64.cpp | 552 ++++++++++++++++++ .../src/cpu/x86/vm/stubRoutines_x86_32.cpp | 1 + .../src/cpu/x86/vm/stubRoutines_x86_32.hpp | 4 + .../src/cpu/x86/vm/stubRoutines_x86_64.cpp | 1 + .../src/cpu/x86/vm/stubRoutines_x86_64.hpp | 5 + hotspot/src/cpu/x86/vm/vm_version_x86.cpp | 32 +- hotspot/src/cpu/x86/vm/vm_version_x86.hpp | 10 +- hotspot/src/share/vm/classfile/vmSymbols.hpp | 16 + hotspot/src/share/vm/oops/method.cpp | 6 +- hotspot/src/share/vm/opto/callGenerator.cpp | 123 ++++ hotspot/src/share/vm/opto/callGenerator.hpp | 3 + hotspot/src/share/vm/opto/doCall.cpp | 12 +- hotspot/src/share/vm/opto/escape.cpp | 14 +- hotspot/src/share/vm/opto/library_call.cpp | 369 +++++++++++- hotspot/src/share/vm/opto/runtime.cpp | 42 ++ hotspot/src/share/vm/opto/runtime.hpp | 3 + hotspot/src/share/vm/runtime/globals.hpp | 6 + hotspot/src/share/vm/runtime/stubRoutines.cpp | 4 + hotspot/src/share/vm/runtime/stubRoutines.hpp | 10 + .../test/compiler/7184394/TestAESBase.java | 154 +++++ .../test/compiler/7184394/TestAESDecode.java | 57 ++ .../test/compiler/7184394/TestAESEncode.java | 57 ++ .../test/compiler/7184394/TestAESMain.java | 57 ++ 26 files changed, 2181 insertions(+), 12 deletions(-) create mode 100644 hotspot/test/compiler/7184394/TestAESBase.java create mode 100644 hotspot/test/compiler/7184394/TestAESDecode.java create mode 100644 hotspot/test/compiler/7184394/TestAESEncode.java create mode 100644 hotspot/test/compiler/7184394/TestAESMain.java diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index 378c1f8c6e7..6b9677d30c5 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -1007,6 +1007,67 @@ void Assembler::addss(XMMRegister dst, Address src) { emit_simd_arith(0x58, dst, src, VEX_SIMD_F3); } +void Assembler::aesdec(XMMRegister dst, Address src) { + assert(VM_Version::supports_aes(), ""); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xde); + emit_operand(dst, src); +} + +void Assembler::aesdec(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_aes(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xde); + emit_byte(0xC0 | encode); +} + +void Assembler::aesdeclast(XMMRegister dst, Address src) { + assert(VM_Version::supports_aes(), ""); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdf); + emit_operand(dst, src); +} + +void Assembler::aesdeclast(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_aes(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdf); + emit_byte(0xC0 | encode); +} + +void Assembler::aesenc(XMMRegister dst, Address src) { + assert(VM_Version::supports_aes(), ""); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdc); + emit_operand(dst, src); +} + +void Assembler::aesenc(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_aes(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdc); + emit_byte(0xC0 | encode); +} + +void Assembler::aesenclast(XMMRegister dst, Address src) { + assert(VM_Version::supports_aes(), ""); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdd); + emit_operand(dst, src); +} + +void Assembler::aesenclast(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_aes(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdd); + emit_byte(0xC0 | encode); +} + + void Assembler::andl(Address dst, int32_t imm32) { InstructionMark im(this); prefix(dst); @@ -2307,6 +2368,22 @@ void Assembler::prefix(Prefix p) { a_byte(p); } +void Assembler::pshufb(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_ssse3(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0x00); + emit_byte(0xC0 | encode); +} + +void Assembler::pshufb(XMMRegister dst, Address src) { + assert(VM_Version::supports_ssse3(), ""); + assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes"); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0x00); + emit_operand(dst, src); +} + void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) { assert(isByte(mode), "invalid value"); NOT_LP64(assert(VM_Version::supports_sse2(), "")); @@ -8067,6 +8144,15 @@ void MacroAssembler::movptr(Address dst, Register src) { LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src)); } +void MacroAssembler::movdqu(XMMRegister dst, AddressLiteral src) { + if (reachable(src)) { + Assembler::movdqu(dst, as_Address(src)); + } else { + lea(rscratch1, src); + Assembler::movdqu(dst, Address(rscratch1, 0)); + } +} + void MacroAssembler::movsd(XMMRegister dst, AddressLiteral src) { if (reachable(src)) { Assembler::movsd(dst, as_Address(src)); @@ -8357,6 +8443,17 @@ void MacroAssembler::xorps(XMMRegister dst, AddressLiteral src) { } } +void MacroAssembler::pshufb(XMMRegister dst, AddressLiteral src) { + // Used in sign-bit flipping with aligned address. + assert((UseAVX > 0) || (((intptr_t)src.target() & 15) == 0), "SSE mode requires address alignment 16 bytes"); + if (reachable(src)) { + Assembler::pshufb(dst, as_Address(src)); + } else { + lea(rscratch1, src); + Assembler::pshufb(dst, Address(rscratch1, 0)); + } +} + // AVX 3-operands instructions void MacroAssembler::vaddsd(XMMRegister dst, XMMRegister nds, AddressLiteral src) { diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.hpp b/hotspot/src/cpu/x86/vm/assembler_x86.hpp index c936e13f5d8..8a9bbaf424e 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp @@ -875,6 +875,17 @@ private: void addss(XMMRegister dst, Address src); void addss(XMMRegister dst, XMMRegister src); + // AES instructions + void aesdec(XMMRegister dst, Address src); + void aesdec(XMMRegister dst, XMMRegister src); + void aesdeclast(XMMRegister dst, Address src); + void aesdeclast(XMMRegister dst, XMMRegister src); + void aesenc(XMMRegister dst, Address src); + void aesenc(XMMRegister dst, XMMRegister src); + void aesenclast(XMMRegister dst, Address src); + void aesenclast(XMMRegister dst, XMMRegister src); + + void andl(Address dst, int32_t imm32); void andl(Register dst, int32_t imm32); void andl(Register dst, Address src); @@ -1424,6 +1435,10 @@ private: void prefetcht2(Address src); void prefetchw(Address src); + // Shuffle Bytes + void pshufb(XMMRegister dst, XMMRegister src); + void pshufb(XMMRegister dst, Address src); + // Shuffle Packed Doublewords void pshufd(XMMRegister dst, XMMRegister src, int mode); void pshufd(XMMRegister dst, Address src, int mode); @@ -2611,6 +2626,12 @@ public: void divss(XMMRegister dst, Address src) { Assembler::divss(dst, src); } void divss(XMMRegister dst, AddressLiteral src); + // Move Unaligned Double Quadword + void movdqu(Address dst, XMMRegister src) { Assembler::movdqu(dst, src); } + void movdqu(XMMRegister dst, Address src) { Assembler::movdqu(dst, src); } + void movdqu(XMMRegister dst, XMMRegister src) { Assembler::movdqu(dst, src); } + void movdqu(XMMRegister dst, AddressLiteral src); + void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); } void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); } void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); } @@ -2658,6 +2679,10 @@ public: void xorps(XMMRegister dst, Address src) { Assembler::xorps(dst, src); } void xorps(XMMRegister dst, AddressLiteral src); + // Shuffle Bytes + void pshufb(XMMRegister dst, XMMRegister src) { Assembler::pshufb(dst, src); } + void pshufb(XMMRegister dst, Address src) { Assembler::pshufb(dst, src); } + void pshufb(XMMRegister dst, AddressLiteral src); // AVX 3-operands instructions void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddsd(dst, nds, src); } diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp index f149fde83ab..d8b61e0b2fd 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp @@ -2137,6 +2137,529 @@ class StubGenerator: public StubCodeGenerator { } } + // AES intrinsic stubs + enum {AESBlockSize = 16}; + + address generate_key_shuffle_mask() { + __ align(16); + StubCodeMark mark(this, "StubRoutines", "key_shuffle_mask"); + address start = __ pc(); + __ emit_data(0x00010203, relocInfo::none, 0 ); + __ emit_data(0x04050607, relocInfo::none, 0 ); + __ emit_data(0x08090a0b, relocInfo::none, 0 ); + __ emit_data(0x0c0d0e0f, relocInfo::none, 0 ); + return start; + } + + // Utility routine for loading a 128-bit key word in little endian format + // can optionally specify that the shuffle mask is already in an xmmregister + void load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + __ movdqu(xmmdst, Address(key, offset)); + if (xmm_shuf_mask != NULL) { + __ pshufb(xmmdst, xmm_shuf_mask); + } else { + __ pshufb(xmmdst, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + } + } + + // aesenc using specified key+offset + // can optionally specify that the shuffle mask is already in an xmmregister + void aes_enc_key(XMMRegister xmmdst, XMMRegister xmmtmp, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + load_key(xmmtmp, key, offset, xmm_shuf_mask); + __ aesenc(xmmdst, xmmtmp); + } + + // aesdec using specified key+offset + // can optionally specify that the shuffle mask is already in an xmmregister + void aes_dec_key(XMMRegister xmmdst, XMMRegister xmmtmp, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + load_key(xmmtmp, key, offset, xmm_shuf_mask); + __ aesdec(xmmdst, xmmtmp); + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // + address generate_aescrypt_encryptBlock() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "aescrypt_encryptBlock"); + Label L_doLast; + address start = __ pc(); + + const Register from = rsi; // source array address + const Register to = rdx; // destination array address + const Register key = rcx; // key array address + const Register keylen = rax; + const Address from_param(rbp, 8+0); + const Address to_param (rbp, 8+4); + const Address key_param (rbp, 8+8); + + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + const XMMRegister xmm_key_shuf_mask = xmm2; + + __ enter(); // required for proper stackwalking of RuntimeStub frame + __ push(rsi); + __ movptr(from , from_param); + __ movptr(to , to_param); + __ movptr(key , key_param); + + __ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + // keylen = # of 32-bit words, convert to 128-bit words + __ shrl(keylen, 2); + __ subl(keylen, 11); // every key has at least 11 128-bit words, some have more + + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + __ movdqu(xmm_result, Address(from, 0)); // get 16 bytes of input + + // For encryption, the java expanded key ordering is just what we need + + load_key(xmm_temp, key, 0x00, xmm_key_shuf_mask); + __ pxor(xmm_result, xmm_temp); + for (int offset = 0x10; offset <= 0x90; offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, offset, xmm_key_shuf_mask); + } + load_key (xmm_temp, key, 0xa0, xmm_key_shuf_mask); + __ cmpl(keylen, 0); + __ jcc(Assembler::equal, L_doLast); + __ aesenc(xmm_result, xmm_temp); // only in 192 and 256 bit keys + aes_enc_key(xmm_result, xmm_temp, key, 0xb0, xmm_key_shuf_mask); + load_key(xmm_temp, key, 0xc0, xmm_key_shuf_mask); + __ subl(keylen, 2); + __ jcc(Assembler::equal, L_doLast); + __ aesenc(xmm_result, xmm_temp); // only in 256 bit keys + aes_enc_key(xmm_result, xmm_temp, key, 0xd0, xmm_key_shuf_mask); + load_key(xmm_temp, key, 0xe0, xmm_key_shuf_mask); + + __ BIND(L_doLast); + __ aesenclast(xmm_result, xmm_temp); + __ movdqu(Address(to, 0), xmm_result); // store the result + __ xorptr(rax, rax); // return 0 + __ pop(rsi); + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + return start; + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // + address generate_aescrypt_decryptBlock() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "aescrypt_decryptBlock"); + Label L_doLast; + address start = __ pc(); + + const Register from = rsi; // source array address + const Register to = rdx; // destination array address + const Register key = rcx; // key array address + const Register keylen = rax; + const Address from_param(rbp, 8+0); + const Address to_param (rbp, 8+4); + const Address key_param (rbp, 8+8); + + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + const XMMRegister xmm_key_shuf_mask = xmm2; + + __ enter(); // required for proper stackwalking of RuntimeStub frame + __ push(rsi); + __ movptr(from , from_param); + __ movptr(to , to_param); + __ movptr(key , key_param); + + __ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + // keylen = # of 32-bit words, convert to 128-bit words + __ shrl(keylen, 2); + __ subl(keylen, 11); // every key has at least 11 128-bit words, some have more + + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + __ movdqu(xmm_result, Address(from, 0)); + + // for decryption java expanded key ordering is rotated one position from what we want + // so we start from 0x10 here and hit 0x00 last + // we don't know if the key is aligned, hence not using load-execute form + load_key(xmm_temp, key, 0x10, xmm_key_shuf_mask); + __ pxor (xmm_result, xmm_temp); + for (int offset = 0x20; offset <= 0xa0; offset += 0x10) { + aes_dec_key(xmm_result, xmm_temp, key, offset, xmm_key_shuf_mask); + } + __ cmpl(keylen, 0); + __ jcc(Assembler::equal, L_doLast); + // only in 192 and 256 bit keys + aes_dec_key(xmm_result, xmm_temp, key, 0xb0, xmm_key_shuf_mask); + aes_dec_key(xmm_result, xmm_temp, key, 0xc0, xmm_key_shuf_mask); + __ subl(keylen, 2); + __ jcc(Assembler::equal, L_doLast); + // only in 256 bit keys + aes_dec_key(xmm_result, xmm_temp, key, 0xd0, xmm_key_shuf_mask); + aes_dec_key(xmm_result, xmm_temp, key, 0xe0, xmm_key_shuf_mask); + + __ BIND(L_doLast); + // for decryption the aesdeclast operation is always on key+0x00 + load_key(xmm_temp, key, 0x00, xmm_key_shuf_mask); + __ aesdeclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, 0), xmm_result); // store the result + + __ xorptr(rax, rax); // return 0 + __ pop(rsi); + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + return start; + } + + void handleSOERegisters(bool saving) { + const int saveFrameSizeInBytes = 4 * wordSize; + const Address saved_rbx (rbp, -3 * wordSize); + const Address saved_rsi (rbp, -2 * wordSize); + const Address saved_rdi (rbp, -1 * wordSize); + + if (saving) { + __ subptr(rsp, saveFrameSizeInBytes); + __ movptr(saved_rsi, rsi); + __ movptr(saved_rdi, rdi); + __ movptr(saved_rbx, rbx); + } else { + // restoring + __ movptr(rsi, saved_rsi); + __ movptr(rdi, saved_rdi); + __ movptr(rbx, saved_rbx); + } + } + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // + address generate_cipherBlockChaining_encryptAESCrypt() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_encryptAESCrypt"); + address start = __ pc(); + + Label L_exit, L_key_192_256, L_key_256, L_loopTop_128, L_loopTop_192, L_loopTop_256; + const Register from = rsi; // source array address + const Register to = rdx; // destination array address + const Register key = rcx; // key array address + const Register rvec = rdi; // r byte array initialized from initvector array address + // and left with the results of the last encryption block + const Register len_reg = rbx; // src len (must be multiple of blocksize 16) + const Register pos = rax; + + // xmm register assignments for the loops below + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + // first 6 keys preloaded into xmm2-xmm7 + const int XMM_REG_NUM_KEY_FIRST = 2; + const int XMM_REG_NUM_KEY_LAST = 7; + const XMMRegister xmm_key0 = as_XMMRegister(XMM_REG_NUM_KEY_FIRST); + + __ enter(); // required for proper stackwalking of RuntimeStub frame + handleSOERegisters(true /*saving*/); + + // load registers from incoming parameters + const Address from_param(rbp, 8+0); + const Address to_param (rbp, 8+4); + const Address key_param (rbp, 8+8); + const Address rvec_param (rbp, 8+12); + const Address len_param (rbp, 8+16); + __ movptr(from , from_param); + __ movptr(to , to_param); + __ movptr(key , key_param); + __ movptr(rvec , rvec_param); + __ movptr(len_reg , len_param); + + const XMMRegister xmm_key_shuf_mask = xmm_temp; // used temporarily to swap key bytes up front + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + // load up xmm regs 2 thru 7 with keys 0-5 + for (int rnum = XMM_REG_NUM_KEY_FIRST, offset = 0x00; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + load_key(as_XMMRegister(rnum), key, offset, xmm_key_shuf_mask); + offset += 0x10; + } + + __ movdqu(xmm_result, Address(rvec, 0x00)); // initialize xmm_result with r vec + + // now split to different paths depending on the keylen (len in ints of AESCrypt.KLE array (52=192, or 60=256)) + __ movl(rax, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + __ cmpl(rax, 44); + __ jcc(Assembler::notEqual, L_key_192_256); + + // 128 bit code follows here + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_128); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = 0x60; key_offset <= 0x90; key_offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0xa0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_128); + + __ BIND(L_exit); + __ movdqu(Address(rvec, 0), xmm_result); // final value of r stored in rvec of CipherBlockChaining object + + handleSOERegisters(false /*restoring*/); + __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + __ BIND(L_key_192_256); + // here rax = len in ints of AESCrypt.KLE array (52=192, or 60=256) + __ cmpl(rax, 52); + __ jcc(Assembler::notEqual, L_key_256); + + // 192-bit code follows here (could be changed to use more xmm registers) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_192); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = 0x60; key_offset <= 0xb0; key_offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0xc0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_192); + __ jmp(L_exit); + + __ BIND(L_key_256); + // 256-bit code follows here (could be changed to use more xmm registers) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_256); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = 0x60; key_offset <= 0xd0; key_offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0xe0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_256); + __ jmp(L_exit); + + return start; + } + + + // CBC AES Decryption. + // In 32-bit stub, because of lack of registers we do not try to parallelize 4 blocks at a time. + // + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // + + address generate_cipherBlockChaining_decryptAESCrypt() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_decryptAESCrypt"); + address start = __ pc(); + + Label L_exit, L_key_192_256, L_key_256; + Label L_singleBlock_loopTop_128; + Label L_singleBlock_loopTop_192, L_singleBlock_loopTop_256; + const Register from = rsi; // source array address + const Register to = rdx; // destination array address + const Register key = rcx; // key array address + const Register rvec = rdi; // r byte array initialized from initvector array address + // and left with the results of the last encryption block + const Register len_reg = rbx; // src len (must be multiple of blocksize 16) + const Register pos = rax; + + // xmm register assignments for the loops below + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + // first 6 keys preloaded into xmm2-xmm7 + const int XMM_REG_NUM_KEY_FIRST = 2; + const int XMM_REG_NUM_KEY_LAST = 7; + const int FIRST_NON_REG_KEY_offset = 0x70; + const XMMRegister xmm_key_first = as_XMMRegister(XMM_REG_NUM_KEY_FIRST); + + __ enter(); // required for proper stackwalking of RuntimeStub frame + handleSOERegisters(true /*saving*/); + + // load registers from incoming parameters + const Address from_param(rbp, 8+0); + const Address to_param (rbp, 8+4); + const Address key_param (rbp, 8+8); + const Address rvec_param (rbp, 8+12); + const Address len_param (rbp, 8+16); + __ movptr(from , from_param); + __ movptr(to , to_param); + __ movptr(key , key_param); + __ movptr(rvec , rvec_param); + __ movptr(len_reg , len_param); + + // the java expanded key ordering is rotated one position from what we want + // so we start from 0x10 here and hit 0x00 last + const XMMRegister xmm_key_shuf_mask = xmm1; // used temporarily to swap key bytes up front + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + // load up xmm regs 2 thru 6 with first 5 keys + for (int rnum = XMM_REG_NUM_KEY_FIRST, offset = 0x10; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + load_key(as_XMMRegister(rnum), key, offset, xmm_key_shuf_mask); + offset += 0x10; + } + + // inside here, use the rvec register to point to previous block cipher + // with which we xor at the end of each newly decrypted block + const Register prev_block_cipher_ptr = rvec; + + // now split to different paths depending on the keylen (len in ints of AESCrypt.KLE array (52=192, or 60=256)) + __ movl(rax, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + __ cmpl(rax, 44); + __ jcc(Assembler::notEqual, L_key_192_256); + + + // 128-bit code follows here, parallelized + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_128); + __ cmpptr(len_reg, 0); // any blocks left?? + __ jcc(Assembler::equal, L_exit); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = FIRST_NON_REG_KEY_offset; key_offset <= 0xa0; key_offset += 0x10) { // 128-bit runs up to key offset a0 + aes_dec_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0x00); // final key is stored in java expanded array at offset 0 + __ aesdeclast(xmm_result, xmm_temp); + __ movdqu(xmm_temp, Address(prev_block_cipher_ptr, 0x00)); + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ lea(prev_block_cipher_ptr, Address(from, pos, Address::times_1, 0)); // set up new ptr + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jmp(L_singleBlock_loopTop_128); + + + __ BIND(L_exit); + __ movdqu(xmm_temp, Address(prev_block_cipher_ptr, 0x00)); + __ movptr(rvec , rvec_param); // restore this since used in loop + __ movdqu(Address(rvec, 0), xmm_temp); // final value of r stored in rvec of CipherBlockChaining object + handleSOERegisters(false /*restoring*/); + __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + + __ BIND(L_key_192_256); + // here rax = len in ints of AESCrypt.KLE array (52=192, or 60=256) + __ cmpl(rax, 52); + __ jcc(Assembler::notEqual, L_key_256); + + // 192-bit code follows here (could be optimized to use parallelism) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_192); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = FIRST_NON_REG_KEY_offset; key_offset <= 0xc0; key_offset += 0x10) { // 192-bit runs up to key offset c0 + aes_dec_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0x00); // final key is stored in java expanded array at offset 0 + __ aesdeclast(xmm_result, xmm_temp); + __ movdqu(xmm_temp, Address(prev_block_cipher_ptr, 0x00)); + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ lea(prev_block_cipher_ptr, Address(from, pos, Address::times_1, 0)); // set up new ptr + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual,L_singleBlock_loopTop_192); + __ jmp(L_exit); + + __ BIND(L_key_256); + // 256-bit code follows here (could be optimized to use parallelism) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_256); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = FIRST_NON_REG_KEY_offset; key_offset <= 0xe0; key_offset += 0x10) { // 256-bit runs up to key offset e0 + aes_dec_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0x00); // final key is stored in java expanded array at offset 0 + __ aesdeclast(xmm_result, xmm_temp); + __ movdqu(xmm_temp, Address(prev_block_cipher_ptr, 0x00)); + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ lea(prev_block_cipher_ptr, Address(from, pos, Address::times_1, 0)); // set up new ptr + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual,L_singleBlock_loopTop_256); + __ jmp(L_exit); + + return start; + } + + public: // Information about frame layout at time of blocking runtime call. // Note that we only have to preserve callee-saved registers since @@ -2332,6 +2855,16 @@ class StubGenerator: public StubCodeGenerator { generate_arraycopy_stubs(); generate_math_stubs(); + + // don't bother generating these AES intrinsic stubs unless global flag is set + if (UseAESIntrinsics) { + StubRoutines::x86::_key_shuffle_mask_addr = generate_key_shuffle_mask(); // might be needed by the others + + StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock(); + StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock(); + StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt(); + StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt(); + } } diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp index 8ae595a56da..3e223387c94 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp @@ -2941,6 +2941,548 @@ class StubGenerator: public StubCodeGenerator { } } + // AES intrinsic stubs + enum {AESBlockSize = 16}; + + address generate_key_shuffle_mask() { + __ align(16); + StubCodeMark mark(this, "StubRoutines", "key_shuffle_mask"); + address start = __ pc(); + __ emit_data64( 0x0405060700010203, relocInfo::none ); + __ emit_data64( 0x0c0d0e0f08090a0b, relocInfo::none ); + return start; + } + + // Utility routine for loading a 128-bit key word in little endian format + // can optionally specify that the shuffle mask is already in an xmmregister + void load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + __ movdqu(xmmdst, Address(key, offset)); + if (xmm_shuf_mask != NULL) { + __ pshufb(xmmdst, xmm_shuf_mask); + } else { + __ pshufb(xmmdst, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + } + } + + // aesenc using specified key+offset + // can optionally specify that the shuffle mask is already in an xmmregister + void aes_enc_key(XMMRegister xmmdst, XMMRegister xmmtmp, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + load_key(xmmtmp, key, offset, xmm_shuf_mask); + __ aesenc(xmmdst, xmmtmp); + } + + // aesdec using specified key+offset + // can optionally specify that the shuffle mask is already in an xmmregister + void aes_dec_key(XMMRegister xmmdst, XMMRegister xmmtmp, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + load_key(xmmtmp, key, offset, xmm_shuf_mask); + __ aesdec(xmmdst, xmmtmp); + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // + address generate_aescrypt_encryptBlock() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "aescrypt_encryptBlock"); + Label L_doLast; + address start = __ pc(); + + const Register from = c_rarg0; // source array address + const Register to = c_rarg1; // destination array address + const Register key = c_rarg2; // key array address + const Register keylen = rax; + + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + const XMMRegister xmm_key_shuf_mask = xmm2; + + __ enter(); // required for proper stackwalking of RuntimeStub frame + + __ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + // keylen = # of 32-bit words, convert to 128-bit words + __ shrl(keylen, 2); + __ subl(keylen, 11); // every key has at least 11 128-bit words, some have more + + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + __ movdqu(xmm_result, Address(from, 0)); // get 16 bytes of input + + // For encryption, the java expanded key ordering is just what we need + // we don't know if the key is aligned, hence not using load-execute form + + load_key(xmm_temp, key, 0x00, xmm_key_shuf_mask); + __ pxor(xmm_result, xmm_temp); + for (int offset = 0x10; offset <= 0x90; offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, offset, xmm_key_shuf_mask); + } + load_key (xmm_temp, key, 0xa0, xmm_key_shuf_mask); + __ cmpl(keylen, 0); + __ jcc(Assembler::equal, L_doLast); + __ aesenc(xmm_result, xmm_temp); // only in 192 and 256 bit keys + aes_enc_key(xmm_result, xmm_temp, key, 0xb0, xmm_key_shuf_mask); + load_key(xmm_temp, key, 0xc0, xmm_key_shuf_mask); + __ subl(keylen, 2); + __ jcc(Assembler::equal, L_doLast); + __ aesenc(xmm_result, xmm_temp); // only in 256 bit keys + aes_enc_key(xmm_result, xmm_temp, key, 0xd0, xmm_key_shuf_mask); + load_key(xmm_temp, key, 0xe0, xmm_key_shuf_mask); + + __ BIND(L_doLast); + __ aesenclast(xmm_result, xmm_temp); + __ movdqu(Address(to, 0), xmm_result); // store the result + __ xorptr(rax, rax); // return 0 + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + return start; + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // + address generate_aescrypt_decryptBlock() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "aescrypt_decryptBlock"); + Label L_doLast; + address start = __ pc(); + + const Register from = c_rarg0; // source array address + const Register to = c_rarg1; // destination array address + const Register key = c_rarg2; // key array address + const Register keylen = rax; + + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + const XMMRegister xmm_key_shuf_mask = xmm2; + + __ enter(); // required for proper stackwalking of RuntimeStub frame + + __ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + // keylen = # of 32-bit words, convert to 128-bit words + __ shrl(keylen, 2); + __ subl(keylen, 11); // every key has at least 11 128-bit words, some have more + + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + __ movdqu(xmm_result, Address(from, 0)); + + // for decryption java expanded key ordering is rotated one position from what we want + // so we start from 0x10 here and hit 0x00 last + // we don't know if the key is aligned, hence not using load-execute form + load_key(xmm_temp, key, 0x10, xmm_key_shuf_mask); + __ pxor (xmm_result, xmm_temp); + for (int offset = 0x20; offset <= 0xa0; offset += 0x10) { + aes_dec_key(xmm_result, xmm_temp, key, offset, xmm_key_shuf_mask); + } + __ cmpl(keylen, 0); + __ jcc(Assembler::equal, L_doLast); + // only in 192 and 256 bit keys + aes_dec_key(xmm_result, xmm_temp, key, 0xb0, xmm_key_shuf_mask); + aes_dec_key(xmm_result, xmm_temp, key, 0xc0, xmm_key_shuf_mask); + __ subl(keylen, 2); + __ jcc(Assembler::equal, L_doLast); + // only in 256 bit keys + aes_dec_key(xmm_result, xmm_temp, key, 0xd0, xmm_key_shuf_mask); + aes_dec_key(xmm_result, xmm_temp, key, 0xe0, xmm_key_shuf_mask); + + __ BIND(L_doLast); + // for decryption the aesdeclast operation is always on key+0x00 + load_key(xmm_temp, key, 0x00, xmm_key_shuf_mask); + __ aesdeclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, 0), xmm_result); // store the result + + __ xorptr(rax, rax); // return 0 + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + return start; + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // + address generate_cipherBlockChaining_encryptAESCrypt() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_encryptAESCrypt"); + address start = __ pc(); + + Label L_exit, L_key_192_256, L_key_256, L_loopTop_128, L_loopTop_192, L_loopTop_256; + const Register from = c_rarg0; // source array address + const Register to = c_rarg1; // destination array address + const Register key = c_rarg2; // key array address + const Register rvec = c_rarg3; // r byte array initialized from initvector array address + // and left with the results of the last encryption block +#ifndef _WIN64 + const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16) +#else + const Address len_mem(rsp, 6 * wordSize); // length is on stack on Win64 + const Register len_reg = r10; // pick the first volatile windows register +#endif + const Register pos = rax; + + // xmm register assignments for the loops below + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + // keys 0-10 preloaded into xmm2-xmm12 + const int XMM_REG_NUM_KEY_FIRST = 2; + const int XMM_REG_NUM_KEY_LAST = 12; + const XMMRegister xmm_key0 = as_XMMRegister(XMM_REG_NUM_KEY_FIRST); + const XMMRegister xmm_key10 = as_XMMRegister(XMM_REG_NUM_KEY_LAST); + + __ enter(); // required for proper stackwalking of RuntimeStub frame + +#ifdef _WIN64 + // on win64, fill len_reg from stack position + __ movl(len_reg, len_mem); + // save the xmm registers which must be preserved 6-12 + __ subptr(rsp, -rsp_after_call_off * wordSize); + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(xmm_save(i), as_XMMRegister(i)); + } +#endif + + const XMMRegister xmm_key_shuf_mask = xmm_temp; // used temporarily to swap key bytes up front + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + // load up xmm regs 2 thru 12 with key 0x00 - 0xa0 + for (int rnum = XMM_REG_NUM_KEY_FIRST, offset = 0x00; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + load_key(as_XMMRegister(rnum), key, offset, xmm_key_shuf_mask); + offset += 0x10; + } + + __ movdqu(xmm_result, Address(rvec, 0x00)); // initialize xmm_result with r vec + + // now split to different paths depending on the keylen (len in ints of AESCrypt.KLE array (52=192, or 60=256)) + __ movl(rax, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + __ cmpl(rax, 44); + __ jcc(Assembler::notEqual, L_key_192_256); + + // 128 bit code follows here + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_128); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + __ aesenclast(xmm_result, xmm_key10); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_128); + + __ BIND(L_exit); + __ movdqu(Address(rvec, 0), xmm_result); // final value of r stored in rvec of CipherBlockChaining object + +#ifdef _WIN64 + // restore xmm regs belonging to calling function + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(as_XMMRegister(i), xmm_save(i)); + } +#endif + __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + __ BIND(L_key_192_256); + // here rax = len in ints of AESCrypt.KLE array (52=192, or 60=256) + __ cmpl(rax, 52); + __ jcc(Assembler::notEqual, L_key_256); + + // 192-bit code follows here (could be changed to use more xmm registers) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_192); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + aes_enc_key(xmm_result, xmm_temp, key, 0xb0); + load_key(xmm_temp, key, 0xc0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_192); + __ jmp(L_exit); + + __ BIND(L_key_256); + // 256-bit code follows here (could be changed to use more xmm registers) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_256); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + aes_enc_key(xmm_result, xmm_temp, key, 0xb0); + aes_enc_key(xmm_result, xmm_temp, key, 0xc0); + aes_enc_key(xmm_result, xmm_temp, key, 0xd0); + load_key(xmm_temp, key, 0xe0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_256); + __ jmp(L_exit); + + return start; + } + + + + // This is a version of CBC/AES Decrypt which does 4 blocks in a loop at a time + // to hide instruction latency + // + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // + + address generate_cipherBlockChaining_decryptAESCrypt_Parallel() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_decryptAESCrypt"); + address start = __ pc(); + + Label L_exit, L_key_192_256, L_key_256; + Label L_singleBlock_loopTop_128, L_multiBlock_loopTop_128; + Label L_singleBlock_loopTop_192, L_singleBlock_loopTop_256; + const Register from = c_rarg0; // source array address + const Register to = c_rarg1; // destination array address + const Register key = c_rarg2; // key array address + const Register rvec = c_rarg3; // r byte array initialized from initvector array address + // and left with the results of the last encryption block +#ifndef _WIN64 + const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16) +#else + const Address len_mem(rsp, 6 * wordSize); // length is on stack on Win64 + const Register len_reg = r10; // pick the first volatile windows register +#endif + const Register pos = rax; + + // xmm register assignments for the loops below + const XMMRegister xmm_result = xmm0; + // keys 0-10 preloaded into xmm2-xmm12 + const int XMM_REG_NUM_KEY_FIRST = 5; + const int XMM_REG_NUM_KEY_LAST = 15; + const XMMRegister xmm_key_first = as_XMMRegister(XMM_REG_NUM_KEY_FIRST); + const XMMRegister xmm_key_last = as_XMMRegister(XMM_REG_NUM_KEY_LAST); + + __ enter(); // required for proper stackwalking of RuntimeStub frame + +#ifdef _WIN64 + // on win64, fill len_reg from stack position + __ movl(len_reg, len_mem); + // save the xmm registers which must be preserved 6-15 + __ subptr(rsp, -rsp_after_call_off * wordSize); + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(xmm_save(i), as_XMMRegister(i)); + } +#endif + // the java expanded key ordering is rotated one position from what we want + // so we start from 0x10 here and hit 0x00 last + const XMMRegister xmm_key_shuf_mask = xmm1; // used temporarily to swap key bytes up front + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + // load up xmm regs 5 thru 15 with key 0x10 - 0xa0 - 0x00 + for (int rnum = XMM_REG_NUM_KEY_FIRST, offset = 0x10; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + if (rnum == XMM_REG_NUM_KEY_LAST) offset = 0x00; + load_key(as_XMMRegister(rnum), key, offset, xmm_key_shuf_mask); + offset += 0x10; + } + + const XMMRegister xmm_prev_block_cipher = xmm1; // holds cipher of previous block + // registers holding the four results in the parallelized loop + const XMMRegister xmm_result0 = xmm0; + const XMMRegister xmm_result1 = xmm2; + const XMMRegister xmm_result2 = xmm3; + const XMMRegister xmm_result3 = xmm4; + + __ movdqu(xmm_prev_block_cipher, Address(rvec, 0x00)); // initialize with initial rvec + + // now split to different paths depending on the keylen (len in ints of AESCrypt.KLE array (52=192, or 60=256)) + __ movl(rax, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + __ cmpl(rax, 44); + __ jcc(Assembler::notEqual, L_key_192_256); + + + // 128-bit code follows here, parallelized + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_multiBlock_loopTop_128); + __ cmpptr(len_reg, 4*AESBlockSize); // see if at least 4 blocks left + __ jcc(Assembler::less, L_singleBlock_loopTop_128); + + __ movdqu(xmm_result0, Address(from, pos, Address::times_1, 0*AESBlockSize)); // get next 4 blocks into xmmresult registers + __ movdqu(xmm_result1, Address(from, pos, Address::times_1, 1*AESBlockSize)); + __ movdqu(xmm_result2, Address(from, pos, Address::times_1, 2*AESBlockSize)); + __ movdqu(xmm_result3, Address(from, pos, Address::times_1, 3*AESBlockSize)); + +#define DoFour(opc, src_reg) \ + __ opc(xmm_result0, src_reg); \ + __ opc(xmm_result1, src_reg); \ + __ opc(xmm_result2, src_reg); \ + __ opc(xmm_result3, src_reg); + + DoFour(pxor, xmm_key_first); + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + DoFour(aesdec, as_XMMRegister(rnum)); + } + DoFour(aesdeclast, xmm_key_last); + // for each result, xor with the r vector of previous cipher block + __ pxor(xmm_result0, xmm_prev_block_cipher); + __ movdqu(xmm_prev_block_cipher, Address(from, pos, Address::times_1, 0*AESBlockSize)); + __ pxor(xmm_result1, xmm_prev_block_cipher); + __ movdqu(xmm_prev_block_cipher, Address(from, pos, Address::times_1, 1*AESBlockSize)); + __ pxor(xmm_result2, xmm_prev_block_cipher); + __ movdqu(xmm_prev_block_cipher, Address(from, pos, Address::times_1, 2*AESBlockSize)); + __ pxor(xmm_result3, xmm_prev_block_cipher); + __ movdqu(xmm_prev_block_cipher, Address(from, pos, Address::times_1, 3*AESBlockSize)); // this will carry over to next set of blocks + + __ movdqu(Address(to, pos, Address::times_1, 0*AESBlockSize), xmm_result0); // store 4 results into the next 64 bytes of output + __ movdqu(Address(to, pos, Address::times_1, 1*AESBlockSize), xmm_result1); + __ movdqu(Address(to, pos, Address::times_1, 2*AESBlockSize), xmm_result2); + __ movdqu(Address(to, pos, Address::times_1, 3*AESBlockSize), xmm_result3); + + __ addptr(pos, 4*AESBlockSize); + __ subptr(len_reg, 4*AESBlockSize); + __ jmp(L_multiBlock_loopTop_128); + + // registers used in the non-parallelized loops + const XMMRegister xmm_prev_block_cipher_save = xmm2; + const XMMRegister xmm_temp = xmm3; + + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_128); + __ cmpptr(len_reg, 0); // any blocks left?? + __ jcc(Assembler::equal, L_exit); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ movdqa(xmm_prev_block_cipher_save, xmm_result); // save for next r vector + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + __ aesdeclast(xmm_result, xmm_key_last); + __ pxor (xmm_result, xmm_prev_block_cipher); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ movdqa(xmm_prev_block_cipher, xmm_prev_block_cipher_save); // set up next r vector with cipher input from this block + + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jmp(L_singleBlock_loopTop_128); + + + __ BIND(L_exit); + __ movdqu(Address(rvec, 0), xmm_prev_block_cipher); // final value of r stored in rvec of CipherBlockChaining object +#ifdef _WIN64 + // restore regs belonging to calling function + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(as_XMMRegister(i), xmm_save(i)); + } +#endif + __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + + __ BIND(L_key_192_256); + // here rax = len in ints of AESCrypt.KLE array (52=192, or 60=256) + __ cmpl(rax, 52); + __ jcc(Assembler::notEqual, L_key_256); + + // 192-bit code follows here (could be optimized to use parallelism) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_192); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ movdqa(xmm_prev_block_cipher_save, xmm_result); // save for next r vector + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + aes_dec_key(xmm_result, xmm_temp, key, 0xb0); // 192-bit key goes up to c0 + aes_dec_key(xmm_result, xmm_temp, key, 0xc0); + __ aesdeclast(xmm_result, xmm_key_last); // xmm15 always came from key+0 + __ pxor (xmm_result, xmm_prev_block_cipher); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ movdqa(xmm_prev_block_cipher, xmm_prev_block_cipher_save); // set up next r vector with cipher input from this block + + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual,L_singleBlock_loopTop_192); + __ jmp(L_exit); + + __ BIND(L_key_256); + // 256-bit code follows here (could be optimized to use parallelism) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_256); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ movdqa(xmm_prev_block_cipher_save, xmm_result); // save for next r vector + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + aes_dec_key(xmm_result, xmm_temp, key, 0xb0); // 256-bit key goes up to e0 + aes_dec_key(xmm_result, xmm_temp, key, 0xc0); + aes_dec_key(xmm_result, xmm_temp, key, 0xd0); + aes_dec_key(xmm_result, xmm_temp, key, 0xe0); + __ aesdeclast(xmm_result, xmm_key_last); // xmm15 came from key+0 + __ pxor (xmm_result, xmm_prev_block_cipher); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ movdqa(xmm_prev_block_cipher, xmm_prev_block_cipher_save); // set up next r vector with cipher input from this block + + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual,L_singleBlock_loopTop_256); + __ jmp(L_exit); + + return start; + } + + + #undef __ #define __ masm-> @@ -3135,6 +3677,16 @@ class StubGenerator: public StubCodeGenerator { generate_arraycopy_stubs(); generate_math_stubs(); + + // don't bother generating these AES intrinsic stubs unless global flag is set + if (UseAESIntrinsics) { + StubRoutines::x86::_key_shuffle_mask_addr = generate_key_shuffle_mask(); // needed by the others + + StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock(); + StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock(); + StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt(); + StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt_Parallel(); + } } public: diff --git a/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp b/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp index 6ec4121b9e8..cfd4f33a6ca 100644 --- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp @@ -44,3 +44,4 @@ address StubRoutines::x86::_verify_mxcsr_entry = NULL; address StubRoutines::x86::_verify_fpu_cntrl_wrd_entry = NULL; +address StubRoutines::x86::_key_shuffle_mask_addr = NULL; diff --git a/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp b/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp index 64767c8ad40..d53124fc6c8 100644 --- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp +++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp @@ -41,10 +41,14 @@ class x86 { private: static address _verify_mxcsr_entry; static address _verify_fpu_cntrl_wrd_entry; + // shuffle mask for fixing up 128-bit words consisting of big-endian 32-bit integers + static address _key_shuffle_mask_addr; public: static address verify_mxcsr_entry() { return _verify_mxcsr_entry; } static address verify_fpu_cntrl_wrd_entry() { return _verify_fpu_cntrl_wrd_entry; } + static address key_shuffle_mask_addr() { return _key_shuffle_mask_addr; } + }; static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; } diff --git a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp index 084bbf8fb82..cf8ec5d7b4c 100644 --- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp @@ -56,3 +56,4 @@ address StubRoutines::x86::_float_sign_flip = NULL; address StubRoutines::x86::_double_sign_mask = NULL; address StubRoutines::x86::_double_sign_flip = NULL; address StubRoutines::x86::_mxcsr_std = NULL; +address StubRoutines::x86::_key_shuffle_mask_addr = NULL; diff --git a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp index 9b9cede4f2d..c3efeecb759 100644 --- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp +++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp @@ -54,6 +54,8 @@ class x86 { static address _double_sign_mask; static address _double_sign_flip; static address _mxcsr_std; + // shuffle mask for fixing up 128-bit words consisting of big-endian 32-bit integers + static address _key_shuffle_mask_addr; public: @@ -116,6 +118,9 @@ class x86 { { return _mxcsr_std; } + + static address key_shuffle_mask_addr() { return _key_shuffle_mask_addr; } + }; #endif // CPU_X86_VM_STUBROUTINES_X86_64_HPP diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp index bf7b3c213f1..182b0ab1a5f 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp @@ -419,13 +419,16 @@ void VM_Version::get_processor_features() { if (UseAVX < 1) _cpuFeatures &= ~CPU_AVX; + if (!UseAES && !FLAG_IS_DEFAULT(UseAES)) + _cpuFeatures &= ~CPU_AES; + 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%s%s%s%s%s%s", + 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%s%s%s%s%s%s%s", cores_per_cpu(), threads_per_core(), cpu_family(), _model, _stepping, (supports_cmov() ? ", cmov" : ""), @@ -441,6 +444,7 @@ void VM_Version::get_processor_features() { (supports_popcnt() ? ", popcnt" : ""), (supports_avx() ? ", avx" : ""), (supports_avx2() ? ", avx2" : ""), + (supports_aes() ? ", aes" : ""), (supports_mmx_ext() ? ", mmxext" : ""), (supports_3dnow_prefetch() ? ", 3dnowpref" : ""), (supports_lzcnt() ? ", lzcnt": ""), @@ -472,6 +476,29 @@ void VM_Version::get_processor_features() { if (!supports_avx ()) // Drop to 0 if no AVX support UseAVX = 0; + // Use AES instructions if available. + if (supports_aes()) { + if (FLAG_IS_DEFAULT(UseAES)) { + UseAES = true; + } + } else if (UseAES) { + if (!FLAG_IS_DEFAULT(UseAES)) + warning("AES instructions not available on this CPU"); + FLAG_SET_DEFAULT(UseAES, false); + } + + // The AES intrinsic stubs require AES instruction support (of course) + // but also require AVX mode for misaligned SSE access + if (UseAES && (UseAVX > 0)) { + if (FLAG_IS_DEFAULT(UseAESIntrinsics)) { + UseAESIntrinsics = true; + } + } else if (UseAESIntrinsics) { + if (!FLAG_IS_DEFAULT(UseAESIntrinsics)) + warning("AES intrinsics not available on this CPU"); + FLAG_SET_DEFAULT(UseAESIntrinsics, false); + } + #ifdef COMPILER2 if (UseFPUForSpilling) { if (UseSSE < 2) { @@ -714,6 +741,9 @@ void VM_Version::get_processor_features() { if (UseAVX > 0) { tty->print(" UseAVX=%d",UseAVX); } + if (UseAES) { + tty->print(" UseAES=1"); + } tty->cr(); tty->print("Allocation"); if (AllocatePrefetchStyle <= 0 || UseSSE == 0 && !supports_3dnow_prefetch()) { diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86.hpp b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp index 92cdbd3fd03..12bd3b770d5 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86.hpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp @@ -78,7 +78,9 @@ public: sse4_2 : 1, : 2, popcnt : 1, - : 3, + : 1, + aes : 1, + : 1, osxsave : 1, avx : 1, : 3; @@ -244,7 +246,8 @@ protected: CPU_TSC = (1 << 15), CPU_TSCINV = (1 << 16), CPU_AVX = (1 << 17), - CPU_AVX2 = (1 << 18) + CPU_AVX2 = (1 << 18), + CPU_AES = (1 << 19) } cpuFeatureFlags; enum { @@ -420,6 +423,8 @@ protected: result |= CPU_TSC; if (_cpuid_info.ext_cpuid7_edx.bits.tsc_invariance != 0) result |= CPU_TSCINV; + if (_cpuid_info.std_cpuid1_ecx.bits.aes != 0) + result |= CPU_AES; // AMD features. if (is_amd()) { @@ -544,6 +549,7 @@ public: static bool supports_avx() { return (_cpuFeatures & CPU_AVX) != 0; } static bool supports_avx2() { return (_cpuFeatures & CPU_AVX2) != 0; } static bool supports_tsc() { return (_cpuFeatures & CPU_TSC) != 0; } + static bool supports_aes() { return (_cpuFeatures & CPU_AES) != 0; } // Intel features static bool is_intel_family_core() { return is_intel() && diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 06fdb35be19..2febc7b5675 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -110,6 +110,7 @@ template(sun_jkernel_DownloadManager, "sun/jkernel/DownloadManager") \ template(getBootClassPathEntryForClass_name, "getBootClassPathEntryForClass") \ template(sun_misc_PostVMInitHook, "sun/misc/PostVMInitHook") \ + template(sun_misc_Launcher_ExtClassLoader, "sun/misc/Launcher$ExtClassLoader") \ \ /* Java runtime version access */ \ template(sun_misc_Version, "sun/misc/Version") \ @@ -723,6 +724,21 @@ /* java/lang/ref/Reference */ \ do_intrinsic(_Reference_get, java_lang_ref_Reference, get_name, void_object_signature, F_R) \ \ + /* support for com.sum.crypto.provider.AESCrypt and some of its callers */ \ + do_class(com_sun_crypto_provider_aescrypt, "com/sun/crypto/provider/AESCrypt") \ + do_intrinsic(_aescrypt_encryptBlock, com_sun_crypto_provider_aescrypt, encryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ + do_intrinsic(_aescrypt_decryptBlock, com_sun_crypto_provider_aescrypt, decryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ + do_name( encryptBlock_name, "encryptBlock") \ + do_name( decryptBlock_name, "decryptBlock") \ + do_signature(byteArray_int_byteArray_int_signature, "([BI[BI)V") \ + \ + do_class(com_sun_crypto_provider_cipherBlockChaining, "com/sun/crypto/provider/CipherBlockChaining") \ + do_intrinsic(_cipherBlockChaining_encryptAESCrypt, com_sun_crypto_provider_cipherBlockChaining, encrypt_name, byteArray_int_int_byteArray_int_signature, F_R) \ + do_intrinsic(_cipherBlockChaining_decryptAESCrypt, com_sun_crypto_provider_cipherBlockChaining, decrypt_name, byteArray_int_int_byteArray_int_signature, F_R) \ + do_name( encrypt_name, "encrypt") \ + do_name( decrypt_name, "decrypt") \ + do_signature(byteArray_int_int_byteArray_int_signature, "([BII[BI)V") \ + \ /* support for sun.misc.Unsafe */ \ do_class(sun_misc_Unsafe, "sun/misc/Unsafe") \ \ diff --git a/hotspot/src/share/vm/oops/method.cpp b/hotspot/src/share/vm/oops/method.cpp index 5a1032f771e..9849829ea29 100644 --- a/hotspot/src/share/vm/oops/method.cpp +++ b/hotspot/src/share/vm/oops/method.cpp @@ -1155,8 +1155,12 @@ methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int n vmSymbols::SID Method::klass_id_for_intrinsics(Klass* holder) { // if loader is not the default loader (i.e., != NULL), we can't know the intrinsics // because we are not loading from core libraries - if (InstanceKlass::cast(holder)->class_loader() != NULL) + // exception: the AES intrinsics come from lib/ext/sunjce_provider.jar + // which does not use the class default class loader so we check for its loader here + if ((InstanceKlass::cast(holder)->class_loader() != NULL) && + InstanceKlass::cast(holder)->class_loader()->klass()->name() != vmSymbols::sun_misc_Launcher_ExtClassLoader()) { return vmSymbols::NO_SID; // regardless of name, no intrinsics here + } // see if the klass name is well-known: Symbol* klass_name = InstanceKlass::cast(holder)->name(); diff --git a/hotspot/src/share/vm/opto/callGenerator.cpp b/hotspot/src/share/vm/opto/callGenerator.cpp index 547096b3dfc..93f2b859ba0 100644 --- a/hotspot/src/share/vm/opto/callGenerator.cpp +++ b/hotspot/src/share/vm/opto/callGenerator.cpp @@ -670,6 +670,129 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod* } +//------------------------PredictedIntrinsicGenerator------------------------------ +// Internal class which handles all predicted Intrinsic calls. +class PredictedIntrinsicGenerator : public CallGenerator { + CallGenerator* _intrinsic; + CallGenerator* _cg; + +public: + PredictedIntrinsicGenerator(CallGenerator* intrinsic, + CallGenerator* cg) + : CallGenerator(cg->method()) + { + _intrinsic = intrinsic; + _cg = cg; + } + + virtual bool is_virtual() const { return true; } + virtual bool is_inlined() const { return true; } + virtual bool is_intrinsic() const { return true; } + + virtual JVMState* generate(JVMState* jvms); +}; + + +CallGenerator* CallGenerator::for_predicted_intrinsic(CallGenerator* intrinsic, + CallGenerator* cg) { + return new PredictedIntrinsicGenerator(intrinsic, cg); +} + + +JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms) { + GraphKit kit(jvms); + PhaseGVN& gvn = kit.gvn(); + + CompileLog* log = kit.C->log(); + if (log != NULL) { + log->elem("predicted_intrinsic bci='%d' method='%d'", + jvms->bci(), log->identify(method())); + } + + Node* slow_ctl = _intrinsic->generate_predicate(kit.sync_jvms()); + if (kit.failing()) + return NULL; // might happen because of NodeCountInliningCutoff + + SafePointNode* slow_map = NULL; + JVMState* slow_jvms; + if (slow_ctl != NULL) { + PreserveJVMState pjvms(&kit); + kit.set_control(slow_ctl); + if (!kit.stopped()) { + slow_jvms = _cg->generate(kit.sync_jvms()); + if (kit.failing()) + return NULL; // might happen because of NodeCountInliningCutoff + assert(slow_jvms != NULL, "must be"); + kit.add_exception_states_from(slow_jvms); + kit.set_map(slow_jvms->map()); + if (!kit.stopped()) + slow_map = kit.stop(); + } + } + + if (kit.stopped()) { + // Predicate is always false. + kit.set_jvms(slow_jvms); + return kit.transfer_exceptions_into_jvms(); + } + + // Generate intrinsic code: + JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms()); + if (new_jvms == NULL) { + // Intrinsic failed, so use slow code or make a direct call. + if (slow_map == NULL) { + CallGenerator* cg = CallGenerator::for_direct_call(method()); + new_jvms = cg->generate(kit.sync_jvms()); + } else { + kit.set_jvms(slow_jvms); + return kit.transfer_exceptions_into_jvms(); + } + } + kit.add_exception_states_from(new_jvms); + kit.set_jvms(new_jvms); + + // Need to merge slow and fast? + if (slow_map == NULL) { + // The fast path is the only path remaining. + return kit.transfer_exceptions_into_jvms(); + } + + if (kit.stopped()) { + // Intrinsic method threw an exception, so it's just the slow path after all. + kit.set_jvms(slow_jvms); + return kit.transfer_exceptions_into_jvms(); + } + + // Finish the diamond. + kit.C->set_has_split_ifs(true); // Has chance for split-if optimization + RegionNode* region = new (kit.C) RegionNode(3); + region->init_req(1, kit.control()); + region->init_req(2, slow_map->control()); + kit.set_control(gvn.transform(region)); + Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO); + iophi->set_req(2, slow_map->i_o()); + kit.set_i_o(gvn.transform(iophi)); + kit.merge_memory(slow_map->merged_memory(), region, 2); + uint tos = kit.jvms()->stkoff() + kit.sp(); + uint limit = slow_map->req(); + for (uint i = TypeFunc::Parms; i < limit; i++) { + // Skip unused stack slots; fast forward to monoff(); + if (i == tos) { + i = kit.jvms()->monoff(); + if( i >= limit ) break; + } + Node* m = kit.map()->in(i); + Node* n = slow_map->in(i); + if (m != n) { + const Type* t = gvn.type(m)->meet(gvn.type(n)); + Node* phi = PhiNode::make(region, m, t); + phi->set_req(2, n); + kit.map()->set_req(i, gvn.transform(phi)); + } + } + return kit.transfer_exceptions_into_jvms(); +} + //-------------------------UncommonTrapCallGenerator----------------------------- // Internal class which handles all out-of-line calls checking receiver type. class UncommonTrapCallGenerator : public CallGenerator { diff --git a/hotspot/src/share/vm/opto/callGenerator.hpp b/hotspot/src/share/vm/opto/callGenerator.hpp index 3cfd39df63e..ae59173bf7d 100644 --- a/hotspot/src/share/vm/opto/callGenerator.hpp +++ b/hotspot/src/share/vm/opto/callGenerator.hpp @@ -143,6 +143,9 @@ class CallGenerator : public ResourceObj { // Registry for intrinsics: static CallGenerator* for_intrinsic(ciMethod* m); static void register_intrinsic(ciMethod* m, CallGenerator* cg); + static CallGenerator* for_predicted_intrinsic(CallGenerator* intrinsic, + CallGenerator* cg); + virtual Node* generate_predicate(JVMState* jvms) { return NULL; }; static void print_inlining(ciMethod* callee, int inline_level, int bci, const char* msg) { if (PrintInlining) diff --git a/hotspot/src/share/vm/opto/doCall.cpp b/hotspot/src/share/vm/opto/doCall.cpp index 30a01f34b3a..95d14884163 100644 --- a/hotspot/src/share/vm/opto/doCall.cpp +++ b/hotspot/src/share/vm/opto/doCall.cpp @@ -107,7 +107,17 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool // intrinsics handle strict f.p. correctly. if (allow_inline && allow_intrinsics) { CallGenerator* cg = find_intrinsic(callee, call_is_virtual); - if (cg != NULL) return cg; + if (cg != NULL) { + if (cg->is_predicted()) { + // Code without intrinsic but, hopefully, inlined. + CallGenerator* inline_cg = this->call_generator(callee, + vtable_index, call_is_virtual, jvms, allow_inline, prof_factor, false); + if (inline_cg != NULL) { + cg = CallGenerator::for_predicted_intrinsic(cg, inline_cg); + } + } + return cg; + } } // Do method handle calls. diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp index 9fd3180505d..2fd6ad1ceaf 100644 --- a/hotspot/src/share/vm/opto/escape.cpp +++ b/hotspot/src/share/vm/opto/escape.cpp @@ -893,12 +893,16 @@ void ConnectionGraph::process_call_arguments(CallNode *call) { arg_has_oops && (i > TypeFunc::Parms); #ifdef ASSERT if (!(is_arraycopy || - call->as_CallLeaf()->_name != NULL && - (strcmp(call->as_CallLeaf()->_name, "g1_wb_pre") == 0 || - strcmp(call->as_CallLeaf()->_name, "g1_wb_post") == 0 )) - ) { + (call->as_CallLeaf()->_name != NULL && + (strcmp(call->as_CallLeaf()->_name, "g1_wb_pre") == 0 || + strcmp(call->as_CallLeaf()->_name, "g1_wb_post") == 0 || + strcmp(call->as_CallLeaf()->_name, "aescrypt_encryptBlock") == 0 || + strcmp(call->as_CallLeaf()->_name, "aescrypt_decryptBlock") == 0 || + strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_encryptAESCrypt") == 0 || + strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_decryptAESCrypt") == 0) + ))) { call->dump(); - assert(false, "EA: unexpected CallLeaf"); + fatal(err_msg_res("EA unexpected CallLeaf %s", call->as_CallLeaf()->_name)); } #endif // Always process arraycopy's destination object since diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index 4f24d88f1bf..6b90061ff4f 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -44,18 +44,22 @@ class LibraryIntrinsic : public InlineCallGenerator { public: private: bool _is_virtual; + bool _is_predicted; vmIntrinsics::ID _intrinsic_id; public: - LibraryIntrinsic(ciMethod* m, bool is_virtual, vmIntrinsics::ID id) + LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, vmIntrinsics::ID id) : InlineCallGenerator(m), _is_virtual(is_virtual), + _is_predicted(is_predicted), _intrinsic_id(id) { } virtual bool is_intrinsic() const { return true; } virtual bool is_virtual() const { return _is_virtual; } + virtual bool is_predicted() const { return _is_predicted; } virtual JVMState* generate(JVMState* jvms); + virtual Node* generate_predicate(JVMState* jvms); vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; } }; @@ -83,6 +87,7 @@ class LibraryCallKit : public GraphKit { int arg_size() const { return callee()->arg_size(); } bool try_to_inline(); + Node* try_to_predicate(); // Helper functions to inline natives void push_result(RegionNode* region, PhiNode* value); @@ -148,6 +153,7 @@ class LibraryCallKit : public GraphKit { CallJavaNode* generate_method_call_virtual(vmIntrinsics::ID method_id) { return generate_method_call(method_id, true, false); } + Node * load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString, bool is_exact, bool is_static); Node* make_string_method_node(int opcode, Node* str1_start, Node* cnt1, Node* str2_start, Node* cnt2); Node* make_string_method_node(int opcode, Node* str1, Node* str2); @@ -253,6 +259,10 @@ class LibraryCallKit : public GraphKit { bool inline_reverseBytes(vmIntrinsics::ID id); bool inline_reference_get(); + bool inline_aescrypt_Block(vmIntrinsics::ID id); + bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); + Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); + Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); }; @@ -306,6 +316,8 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { } } + bool is_predicted = false; + switch (id) { case vmIntrinsics::_compareTo: if (!SpecialStringCompareTo) return NULL; @@ -413,6 +425,18 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { break; #endif + case vmIntrinsics::_aescrypt_encryptBlock: + case vmIntrinsics::_aescrypt_decryptBlock: + if (!UseAESIntrinsics) return NULL; + break; + + case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: + case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: + if (!UseAESIntrinsics) return NULL; + // these two require the predicated logic + is_predicted = true; + break; + default: assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility"); assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?"); @@ -444,7 +468,7 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { if (!InlineUnsafeOps) return NULL; } - return new LibraryIntrinsic(m, is_virtual, (vmIntrinsics::ID) id); + return new LibraryIntrinsic(m, is_virtual, is_predicted, (vmIntrinsics::ID) id); } //----------------------register_library_intrinsics----------------------- @@ -496,6 +520,47 @@ JVMState* LibraryIntrinsic::generate(JVMState* jvms) { return NULL; } +Node* LibraryIntrinsic::generate_predicate(JVMState* jvms) { + LibraryCallKit kit(jvms, this); + Compile* C = kit.C; + int nodes = C->unique(); +#ifndef PRODUCT + assert(is_predicted(), "sanity"); + if ((PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) && Verbose) { + char buf[1000]; + const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); + tty->print_cr("Predicate for intrinsic %s", str); + } +#endif + + Node* slow_ctl = kit.try_to_predicate(); + if (!kit.failing()) { + if (C->log()) { + C->log()->elem("predicate_intrinsic id='%s'%s nodes='%d'", + vmIntrinsics::name_at(intrinsic_id()), + (is_virtual() ? " virtual='1'" : ""), + C->unique() - nodes); + } + return slow_ctl; // Could be NULL if the check folds. + } + + // The intrinsic bailed out + if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { + if (jvms->has_method()) { + // Not a root compile. + const char* msg = "failed to generate predicate for intrinsic"; + CompileTask::print_inlining(kit.callee(), jvms->depth() - 1, kit.bci(), msg); + } else { + // Root compile + tty->print("Did not generate predicate for intrinsic %s%s at bci:%d in", + vmIntrinsics::name_at(intrinsic_id()), + (is_virtual() ? " (virtual)" : ""), kit.bci()); + } + } + C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); + return NULL; +} + bool LibraryCallKit::try_to_inline() { // Handle symbolic names for otherwise undistinguished boolean switches: const bool is_store = true; @@ -767,6 +832,14 @@ bool LibraryCallKit::try_to_inline() { case vmIntrinsics::_Reference_get: return inline_reference_get(); + case vmIntrinsics::_aescrypt_encryptBlock: + case vmIntrinsics::_aescrypt_decryptBlock: + return inline_aescrypt_Block(intrinsic_id()); + + case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: + case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: + return inline_cipherBlockChaining_AESCrypt(intrinsic_id()); + default: // If you get here, it may be that someone has added a new intrinsic // to the list in vmSymbols.hpp without implementing it here. @@ -780,6 +853,36 @@ bool LibraryCallKit::try_to_inline() { } } +Node* LibraryCallKit::try_to_predicate() { + if (!jvms()->has_method()) { + // Root JVMState has a null method. + assert(map()->memory()->Opcode() == Op_Parm, ""); + // Insert the memory aliasing node + set_all_memory(reset_memory()); + } + assert(merged_memory(), ""); + + switch (intrinsic_id()) { + case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: + return inline_cipherBlockChaining_AESCrypt_predicate(false); + case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: + return inline_cipherBlockChaining_AESCrypt_predicate(true); + + default: + // If you get here, it may be that someone has added a new intrinsic + // to the list in vmSymbols.hpp without implementing it here. +#ifndef PRODUCT + if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) { + tty->print_cr("*** Warning: Unimplemented predicate for intrinsic %s(%d)", + vmIntrinsics::name_at(intrinsic_id()), intrinsic_id()); + } +#endif + Node* slow_ctl = control(); + set_control(top()); // No fast path instrinsic + return slow_ctl; + } +} + //------------------------------push_result------------------------------ // Helper function for finishing intrinsics. void LibraryCallKit::push_result(RegionNode* region, PhiNode* value) { @@ -5613,3 +5716,265 @@ bool LibraryCallKit::inline_reference_get() { push(result); return true; } + + +Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString, + bool is_exact=true, bool is_static=false) { + + const TypeInstPtr* tinst = _gvn.type(fromObj)->isa_instptr(); + assert(tinst != NULL, "obj is null"); + assert(tinst->klass()->is_loaded(), "obj is not loaded"); + assert(!is_exact || tinst->klass_is_exact(), "klass not exact"); + + ciField* field = tinst->klass()->as_instance_klass()->get_field_by_name(ciSymbol::make(fieldName), + ciSymbol::make(fieldTypeString), + is_static); + if (field == NULL) return (Node *) NULL; + assert (field != NULL, "undefined field"); + + // Next code copied from Parse::do_get_xxx(): + + // Compute address and memory type. + int offset = field->offset_in_bytes(); + bool is_vol = field->is_volatile(); + ciType* field_klass = field->type(); + assert(field_klass->is_loaded(), "should be loaded"); + const TypePtr* adr_type = C->alias_type(field)->adr_type(); + Node *adr = basic_plus_adr(fromObj, fromObj, offset); + BasicType bt = field->layout_type(); + + // Build the resultant type of the load + const Type *type = TypeOopPtr::make_from_klass(field_klass->as_klass()); + + // Build the load. + Node* loadedField = make_load(NULL, adr, type, bt, adr_type, is_vol); + return loadedField; +} + + +//------------------------------inline_aescrypt_Block----------------------- +bool LibraryCallKit::inline_aescrypt_Block(vmIntrinsics::ID id) { + address stubAddr; + const char *stubName; + assert(UseAES, "need AES instruction support"); + + switch(id) { + case vmIntrinsics::_aescrypt_encryptBlock: + stubAddr = StubRoutines::aescrypt_encryptBlock(); + stubName = "aescrypt_encryptBlock"; + break; + case vmIntrinsics::_aescrypt_decryptBlock: + stubAddr = StubRoutines::aescrypt_decryptBlock(); + stubName = "aescrypt_decryptBlock"; + break; + } + if (stubAddr == NULL) return false; + + // Restore the stack and pop off the arguments. + int nargs = 5; // this + 2 oop/offset combos + assert(callee()->signature()->size() == nargs-1, "encryptBlock has 4 arguments"); + + Node *aescrypt_object = argument(0); + Node *src = argument(1); + Node *src_offset = argument(2); + Node *dest = argument(3); + Node *dest_offset = argument(4); + + // (1) src and dest are arrays. + const Type* src_type = src->Value(&_gvn); + const Type* dest_type = dest->Value(&_gvn); + const TypeAryPtr* top_src = src_type->isa_aryptr(); + const TypeAryPtr* top_dest = dest_type->isa_aryptr(); + assert (top_src != NULL && top_src->klass() != NULL && top_dest != NULL && top_dest->klass() != NULL, "args are strange"); + + // for the quick and dirty code we will skip all the checks. + // we are just trying to get the call to be generated. + Node* src_start = src; + Node* dest_start = dest; + if (src_offset != NULL || dest_offset != NULL) { + assert(src_offset != NULL && dest_offset != NULL, ""); + src_start = array_element_address(src, src_offset, T_BYTE); + dest_start = array_element_address(dest, dest_offset, T_BYTE); + } + + // now need to get the start of its expanded key array + // this requires a newer class file that has this array as littleEndian ints, otherwise we revert to java + Node* k_start = get_key_start_from_aescrypt_object(aescrypt_object); + if (k_start == NULL) return false; + + // Call the stub. + make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::aescrypt_block_Type(), + stubAddr, stubName, TypePtr::BOTTOM, + src_start, dest_start, k_start); + + return true; +} + +//------------------------------inline_cipherBlockChaining_AESCrypt----------------------- +bool LibraryCallKit::inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id) { + address stubAddr; + const char *stubName; + + assert(UseAES, "need AES instruction support"); + + switch(id) { + case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: + stubAddr = StubRoutines::cipherBlockChaining_encryptAESCrypt(); + stubName = "cipherBlockChaining_encryptAESCrypt"; + break; + case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: + stubAddr = StubRoutines::cipherBlockChaining_decryptAESCrypt(); + stubName = "cipherBlockChaining_decryptAESCrypt"; + break; + } + if (stubAddr == NULL) return false; + + + // Restore the stack and pop off the arguments. + int nargs = 6; // this + oop/offset + len + oop/offset + assert(callee()->signature()->size() == nargs-1, "wrong number of arguments"); + Node *cipherBlockChaining_object = argument(0); + Node *src = argument(1); + Node *src_offset = argument(2); + Node *len = argument(3); + Node *dest = argument(4); + Node *dest_offset = argument(5); + + // (1) src and dest are arrays. + const Type* src_type = src->Value(&_gvn); + const Type* dest_type = dest->Value(&_gvn); + const TypeAryPtr* top_src = src_type->isa_aryptr(); + const TypeAryPtr* top_dest = dest_type->isa_aryptr(); + assert (top_src != NULL && top_src->klass() != NULL + && top_dest != NULL && top_dest->klass() != NULL, "args are strange"); + + // checks are the responsibility of the caller + Node* src_start = src; + Node* dest_start = dest; + if (src_offset != NULL || dest_offset != NULL) { + assert(src_offset != NULL && dest_offset != NULL, ""); + src_start = array_element_address(src, src_offset, T_BYTE); + dest_start = array_element_address(dest, dest_offset, T_BYTE); + } + + // if we are in this set of code, we "know" the embeddedCipher is an AESCrypt object + // (because of the predicated logic executed earlier). + // so we cast it here safely. + // this requires a newer class file that has this array as littleEndian ints, otherwise we revert to java + + Node* embeddedCipherObj = load_field_from_object(cipherBlockChaining_object, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false); + if (embeddedCipherObj == NULL) return false; + + // cast it to what we know it will be at runtime + const TypeInstPtr* tinst = _gvn.type(cipherBlockChaining_object)->isa_instptr(); + assert(tinst != NULL, "CBC obj is null"); + assert(tinst->klass()->is_loaded(), "CBC obj is not loaded"); + ciKlass* klass_AESCrypt = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + if (!klass_AESCrypt->is_loaded()) return false; + + ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); + const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt); + const TypeOopPtr* xtype = aklass->as_instance_type(); + Node* aescrypt_object = new(C) CheckCastPPNode(control(), embeddedCipherObj, xtype); + aescrypt_object = _gvn.transform(aescrypt_object); + + // we need to get the start of the aescrypt_object's expanded key array + Node* k_start = get_key_start_from_aescrypt_object(aescrypt_object); + if (k_start == NULL) return false; + + // similarly, get the start address of the r vector + Node* objRvec = load_field_from_object(cipherBlockChaining_object, "r", "[B", /*is_exact*/ false); + if (objRvec == NULL) return false; + Node* r_start = array_element_address(objRvec, intcon(0), T_BYTE); + + // Call the stub, passing src_start, dest_start, k_start, r_start and src_len + make_runtime_call(RC_LEAF|RC_NO_FP, + OptoRuntime::cipherBlockChaining_aescrypt_Type(), + stubAddr, stubName, TypePtr::BOTTOM, + src_start, dest_start, k_start, r_start, len); + + // return is void so no result needs to be pushed + + return true; +} + +//------------------------------get_key_start_from_aescrypt_object----------------------- +Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) { + Node* objAESCryptKey = load_field_from_object(aescrypt_object, "K", "[I", /*is_exact*/ false); + assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt"); + if (objAESCryptKey == NULL) return (Node *) NULL; + + // now have the array, need to get the start address of the K array + Node* k_start = array_element_address(objAESCryptKey, intcon(0), T_INT); + return k_start; +} + +//----------------------------inline_cipherBlockChaining_AESCrypt_predicate---------------------------- +// Return node representing slow path of predicate check. +// the pseudo code we want to emulate with this predicate is: +// for encryption: +// if (embeddedCipherObj instanceof AESCrypt) do_intrinsic, else do_javapath +// for decryption: +// if ((embeddedCipherObj instanceof AESCrypt) && (cipher!=plain)) do_intrinsic, else do_javapath +// note cipher==plain is more conservative than the original java code but that's OK +// +Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting) { + // First, check receiver for NULL since it is virtual method. + int nargs = arg_size(); + Node* objCBC = argument(0); + _sp += nargs; + objCBC = do_null_check(objCBC, T_OBJECT); + _sp -= nargs; + + if (stopped()) return NULL; // Always NULL + + // Load embeddedCipher field of CipherBlockChaining object. + Node* embeddedCipherObj = load_field_from_object(objCBC, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false); + + // get AESCrypt klass for instanceOf check + // AESCrypt might not be loaded yet if some other SymmetricCipher got us to this compile point + // will have same classloader as CipherBlockChaining object + const TypeInstPtr* tinst = _gvn.type(objCBC)->isa_instptr(); + assert(tinst != NULL, "CBCobj is null"); + assert(tinst->klass()->is_loaded(), "CBCobj is not loaded"); + + // we want to do an instanceof comparison against the AESCrypt class + ciKlass* klass_AESCrypt = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + if (!klass_AESCrypt->is_loaded()) { + // if AESCrypt is not even loaded, we never take the intrinsic fast path + Node* ctrl = control(); + set_control(top()); // no regular fast path + return ctrl; + } + ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); + + _sp += nargs; // gen_instanceof might do an uncommon trap + Node* instof = gen_instanceof(embeddedCipherObj, makecon(TypeKlassPtr::make(instklass_AESCrypt))); + _sp -= nargs; + Node* cmp_instof = _gvn.transform(new (C) CmpINode(instof, intcon(1))); + Node* bool_instof = _gvn.transform(new (C) BoolNode(cmp_instof, BoolTest::ne)); + + Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN); + + // for encryption, we are done + if (!decrypting) + return instof_false; // even if it is NULL + + // for decryption, we need to add a further check to avoid + // taking the intrinsic path when cipher and plain are the same + // see the original java code for why. + RegionNode* region = new(C) RegionNode(3); + region->init_req(1, instof_false); + Node* src = argument(1); + Node *dest = argument(4); + Node* cmp_src_dest = _gvn.transform(new (C) CmpPNode(src, dest)); + Node* bool_src_dest = _gvn.transform(new (C) BoolNode(cmp_src_dest, BoolTest::eq)); + Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN); + region->init_req(2, src_dest_conjoint); + + record_for_igvn(region); + return _gvn.transform(region); + +} + + diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp index bb050533d22..51987e25e32 100644 --- a/hotspot/src/share/vm/opto/runtime.cpp +++ b/hotspot/src/share/vm/opto/runtime.cpp @@ -811,6 +811,48 @@ const TypeFunc* OptoRuntime::array_fill_Type() { return TypeFunc::make(domain, range); } +// for aescrypt encrypt/decrypt operations, just three pointers returning void (length is constant) +const TypeFunc* OptoRuntime::aescrypt_block_Type() { + // create input type (domain) + int num_args = 3; + int argcnt = num_args; + const Type** fields = TypeTuple::fields(argcnt); + int argp = TypeFunc::Parms; + fields[argp++] = TypePtr::NOTNULL; // src + fields[argp++] = TypePtr::NOTNULL; // dest + fields[argp++] = TypePtr::NOTNULL; // k array + assert(argp == TypeFunc::Parms+argcnt, "correct decoding"); + const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields); + + // no result type needed + fields = TypeTuple::fields(1); + fields[TypeFunc::Parms+0] = NULL; // void + const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields); + return TypeFunc::make(domain, range); +} + +// for cipherBlockChaining calls of aescrypt encrypt/decrypt, four pointers and a length, returning void +const TypeFunc* OptoRuntime::cipherBlockChaining_aescrypt_Type() { + // create input type (domain) + int num_args = 5; + int argcnt = num_args; + const Type** fields = TypeTuple::fields(argcnt); + int argp = TypeFunc::Parms; + fields[argp++] = TypePtr::NOTNULL; // src + fields[argp++] = TypePtr::NOTNULL; // dest + fields[argp++] = TypePtr::NOTNULL; // k array + fields[argp++] = TypePtr::NOTNULL; // r array + fields[argp++] = TypeInt::INT; // src len + assert(argp == TypeFunc::Parms+argcnt, "correct decoding"); + const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields); + + // no result type needed + fields = TypeTuple::fields(1); + fields[TypeFunc::Parms+0] = NULL; // void + const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields); + return TypeFunc::make(domain, range); +} + //------------- Interpreter state access for on stack replacement const TypeFunc* OptoRuntime::osr_end_Type() { // create input type (domain) diff --git a/hotspot/src/share/vm/opto/runtime.hpp b/hotspot/src/share/vm/opto/runtime.hpp index c7077726761..13da255b742 100644 --- a/hotspot/src/share/vm/opto/runtime.hpp +++ b/hotspot/src/share/vm/opto/runtime.hpp @@ -280,6 +280,9 @@ private: static const TypeFunc* array_fill_Type(); + static const TypeFunc* aescrypt_block_Type(); + static const TypeFunc* cipherBlockChaining_aescrypt_Type(); + // leaf on stack replacement interpreter accessor types static const TypeFunc* osr_end_Type(); diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index e073cbcd007..42c3cdf6d88 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -533,6 +533,9 @@ class CommandLineFlags { product(intx, UseSSE, 99, \ "Highest supported SSE instructions set on x86/x64") \ \ + product(bool, UseAES, false, \ + "Control whether AES instructions can be used on x86/x64") \ + \ product(uintx, LargePageSizeInBytes, 0, \ "Large page size (0 to let VM choose the page size") \ \ @@ -635,6 +638,9 @@ class CommandLineFlags { product(bool, UseSSE42Intrinsics, false, \ "SSE4.2 versions of intrinsics") \ \ + product(bool, UseAESIntrinsics, false, \ + "use intrinsics for AES versions of crypto") \ + \ develop(bool, TraceCallFixup, false, \ "traces all call fixups") \ \ diff --git a/hotspot/src/share/vm/runtime/stubRoutines.cpp b/hotspot/src/share/vm/runtime/stubRoutines.cpp index 5ca4ba59916..98d428abdab 100644 --- a/hotspot/src/share/vm/runtime/stubRoutines.cpp +++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp @@ -120,6 +120,10 @@ address StubRoutines::_arrayof_jbyte_fill; address StubRoutines::_arrayof_jshort_fill; address StubRoutines::_arrayof_jint_fill; +address StubRoutines::_aescrypt_encryptBlock = NULL; +address StubRoutines::_aescrypt_decryptBlock = NULL; +address StubRoutines::_cipherBlockChaining_encryptAESCrypt = NULL; +address StubRoutines::_cipherBlockChaining_decryptAESCrypt = NULL; double (* StubRoutines::_intrinsic_log )(double) = NULL; double (* StubRoutines::_intrinsic_log10 )(double) = NULL; diff --git a/hotspot/src/share/vm/runtime/stubRoutines.hpp b/hotspot/src/share/vm/runtime/stubRoutines.hpp index 0e583aea0b1..91f273e6515 100644 --- a/hotspot/src/share/vm/runtime/stubRoutines.hpp +++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp @@ -199,6 +199,11 @@ class StubRoutines: AllStatic { // zero heap space aligned to jlong (8 bytes) static address _zero_aligned_words; + static address _aescrypt_encryptBlock; + static address _aescrypt_decryptBlock; + static address _cipherBlockChaining_encryptAESCrypt; + static address _cipherBlockChaining_decryptAESCrypt; + // These are versions of the java.lang.Math methods which perform // the same operations as the intrinsic version. They are used for // constant folding in the compiler to ensure equivalence. If the @@ -330,6 +335,11 @@ class StubRoutines: AllStatic { static address arrayof_jshort_fill() { return _arrayof_jshort_fill; } static address arrayof_jint_fill() { return _arrayof_jint_fill; } + static address aescrypt_encryptBlock() { return _aescrypt_encryptBlock; } + static address aescrypt_decryptBlock() { return _aescrypt_decryptBlock; } + static address cipherBlockChaining_encryptAESCrypt() { return _cipherBlockChaining_encryptAESCrypt; } + static address cipherBlockChaining_decryptAESCrypt() { return _cipherBlockChaining_decryptAESCrypt; } + static address select_fill_function(BasicType t, bool aligned, const char* &name); static address zero_aligned_words() { return _zero_aligned_words; } diff --git a/hotspot/test/compiler/7184394/TestAESBase.java b/hotspot/test/compiler/7184394/TestAESBase.java new file mode 100644 index 00000000000..ad6c835cc84 --- /dev/null +++ b/hotspot/test/compiler/7184394/TestAESBase.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @author Tom Deneau + */ + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.AlgorithmParameters; + +import java.util.Random; +import java.util.Arrays; + +abstract public class TestAESBase { + int msgSize = Integer.getInteger("msgSize", 646); + boolean checkOutput = Boolean.getBoolean("checkOutput"); + boolean noReinit = Boolean.getBoolean("noReinit"); + int keySize = Integer.getInteger("keySize", 128); + String algorithm = System.getProperty("algorithm", "AES"); + String mode = System.getProperty("mode", "CBC"); + byte[] input; + byte[] encode; + byte[] expectedEncode; + byte[] decode; + byte[] expectedDecode; + Random random = new Random(0); + Cipher cipher; + Cipher dCipher; + String paddingStr = "PKCS5Padding"; + AlgorithmParameters algParams; + SecretKey key; + int ivLen; + + static int numThreads = 0; + int threadId; + static synchronized int getThreadId() { + int id = numThreads; + numThreads++; + return id; + } + + abstract public void run(); + + public void prepare() { + try { + System.out.println("\nmsgSize=" + msgSize + ", key size=" + keySize + ", reInit=" + !noReinit + ", checkOutput=" + checkOutput); + + int keyLenBytes = (keySize == 0 ? 16 : keySize/8); + byte keyBytes[] = new byte[keyLenBytes]; + if (keySize == 128) + keyBytes = new byte[] {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}; + else + random.nextBytes(keyBytes); + + key = new SecretKeySpec(keyBytes, algorithm); + if (threadId == 0) { + System.out.println("Algorithm: " + key.getAlgorithm() + "(" + + key.getEncoded().length * 8 + "bit)"); + } + input = new byte[msgSize]; + for (int i=0; i 0 ? Integer.valueOf(args[0]) : 1000000); + System.out.println(iters + " iterations"); + TestAESEncode etest = new TestAESEncode(); + etest.prepare(); + long start = System.nanoTime(); + for (int i=0; i Date: Thu, 25 Oct 2012 09:55:33 +0400 Subject: [PATCH 093/241] 8000486: REGRESSION: Three java2d tests fail since jdk8b58 on Windows 7 with NullPointerException Reviewed-by: flar, art --- jdk/src/windows/classes/sun/java2d/ScreenUpdateManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/windows/classes/sun/java2d/ScreenUpdateManager.java b/jdk/src/windows/classes/sun/java2d/ScreenUpdateManager.java index 27da53ef284..d15e28cb0ad 100644 --- a/jdk/src/windows/classes/sun/java2d/ScreenUpdateManager.java +++ b/jdk/src/windows/classes/sun/java2d/ScreenUpdateManager.java @@ -111,7 +111,7 @@ public class ScreenUpdateManager { SurfaceData oldsd) { SurfaceData surfaceData = peer.getSurfaceData(); - if (surfaceData.isValid()) { + if (surfaceData == null || surfaceData.isValid()) { return surfaceData; } peer.replaceSurfaceData(); From bf6c304c44d4013fb7093dc05086b4fd3d3c0fed Mon Sep 17 00:00:00 2001 From: Oleg Pekhovskiy Date: Thu, 25 Oct 2012 19:50:30 +0400 Subject: [PATCH 094/241] 7082294: nsk/regression/b4265661 crashes on windows Reviewed-by: art, anthony --- jdk/src/windows/native/sun/windows/awt_Font.cpp | 8 +++++--- jdk/src/windows/native/sun/windows/awt_Toolkit.cpp | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/jdk/src/windows/native/sun/windows/awt_Font.cpp b/jdk/src/windows/native/sun/windows/awt_Font.cpp index d07cdae0467..185514c1972 100644 --- a/jdk/src/windows/native/sun/windows/awt_Font.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Font.cpp @@ -150,6 +150,7 @@ AwtFont::AwtFont(int num, JNIEnv *env, jobject javaFont) AwtFont::~AwtFont() { + delete[] m_hFont; } void AwtFont::Dispose() { @@ -160,11 +161,12 @@ void AwtFont::Dispose() { /* NOTE: delete of windows HFONT happens in FontCache::Remove only when the final reference to the font is disposed */ } else if (font != NULL) { - // if font was not in cache, its not shared and we delete it now - VERIFY(::DeleteObject(font)); + // if font was not in cache, its not shared and we delete it now + DASSERT(::GetObjectType(font) == OBJ_FONT); + VERIFY(::DeleteObject(font)); } + m_hFont[i] = NULL; } - delete[] m_hFont; AwtObject::Dispose(); } diff --git a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp index 913540399b5..e8b2d51931a 100644 --- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp @@ -534,7 +534,6 @@ BOOL AwtToolkit::Dispose() { D3DInitializer::GetInstance().Clean(); AwtObjectList::Cleanup(); - AwtFont::Cleanup(); awt_dnd_uninitialize(); awt_clipboard_uninitialize((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2)); @@ -554,6 +553,8 @@ BOOL AwtToolkit::Dispose() { ::DispatchMessage(&msg); } + AwtFont::Cleanup(); + HWND toolkitHWndToDestroy = tk.m_toolkitHWnd; tk.m_toolkitHWnd = 0; VERIFY(::DestroyWindow(toolkitHWndToDestroy) != NULL); From 0b024171d1f580a20a022a07329ebab80ee15fd9 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 25 Oct 2012 09:52:58 -0700 Subject: [PATCH 095/241] Added tag jdk8-b62 for changeset b2bf9e584614 --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 7e43143f19e..0e13db5f97f 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -183,3 +183,4 @@ b85b44cced2406792cfb9baab1377ff03e7001d8 jdk8-b55 dae9821589ccd2611bdf7084269b98e819091770 jdk8-b59 e07f499b9dccb529ecf74172cf6ac11a195ec57a jdk8-b60 20ff117b509075c3aec4ee3a57990ecd5db5df9c jdk8-b61 +8a3fe0ae06a8cc21347da5a18384b0aa6c2349f5 jdk8-b62 From 43443b03d5d51bcd606eb6ca156cf679bccee3c5 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 25 Oct 2012 09:53:01 -0700 Subject: [PATCH 096/241] Added tag jdk8-b62 for changeset fbfe6a11980d --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index 68fb9749256..112110c17d7 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -183,3 +183,4 @@ f3ab4163ae012965fc8acdfc25ce0fece8d6906d jdk8-b57 d54dc53e223ed9ce7d5f4d2cd02ad9d5def3c2db jdk8-b59 207ef43ba69ead6cbbab415d81834545e4d46747 jdk8-b60 0e08ba7648fb3faa0986cb217887d7c4990977f3 jdk8-b61 +08afb9c6f44f11c3595b01fd0985db64b29834dd jdk8-b62 From 86f198088af818d84af49ab99d8ff80b840c4ccf Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 25 Oct 2012 09:53:16 -0700 Subject: [PATCH 097/241] Added tag jdk8-b62 for changeset e3e135066607 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 0da4f9dddd5..4f9539a26aa 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -287,3 +287,4 @@ f2e12eb74117c917c0bb264694c02de4a6a15a10 hs25-b03 b261523fe66c40a02968f0aa7e73602491bb3386 hs25-b05 4547dc71db765276e027b0c2780b724bae0a07d3 jdk8-b61 d0337c31c8be7716369b4e7c3bd5f352983c6a06 hs25-b06 +dccd40de8db1fa96f186e6179907818d75320440 jdk8-b62 From 8ca6d2e3fb65298347e91ff96e937b06bca83e5b Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 25 Oct 2012 09:53:35 -0700 Subject: [PATCH 098/241] Added tag jdk8-b62 for changeset 6fc9f2af5e0d --- jaxp/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 5c329132e45..0ab55b05a3c 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -183,3 +183,4 @@ f19d63b2119a0092f016203981ffef5cc31bc3c5 jdk8-b56 af9e8b0f1900b631a8a0fcccff9f1514fe58c808 jdk8-b59 2d1dff5310daaf226421a8c92823cb8afcf35f31 jdk8-b60 6b1db0b41d2f6e2a7b3bdbc8a8db823b47752906 jdk8-b61 +5d0fa0108d028c05753a47bcf2a598357dabf0c0 jdk8-b62 From 3e547a0921e858a13c0076ef2b43d504b1b45ed4 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 25 Oct 2012 09:53:40 -0700 Subject: [PATCH 099/241] Added tag jdk8-b62 for changeset ea25fe53bbce --- jaxws/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 7d6a6df637a..f3854b4b0c7 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -183,3 +183,4 @@ cac4c393706343df778a13dc6c84cad0f8c237c9 jdk8-b58 ae107401be116f9e384d3a23192f543828e03da5 jdk8-b59 5c5a65ad5291b7cefcdc308f627cf2b195cf2b69 jdk8-b60 97e5e74e2a341d9142ce28043912a3c255e28e03 jdk8-b61 +d265b9b4c0f55c23a1c9fda02a8052fd9df2eec5 jdk8-b62 From bb35ccdbc39d8f72d3346e3a9f167e58a58ea2d9 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 25 Oct 2012 09:54:03 -0700 Subject: [PATCH 100/241] Added tag jdk8-b62 for changeset f0d59eea9c70 --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index c0a4c320b0f..de1a543ff2e 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -183,3 +183,4 @@ d94613ac03d8de375ef60493e2bb76dbd30d875d jdk8-b58 abad1f417bd3df4296631fc943cd3b7f5062c88a jdk8-b59 cec8fa02f15634acd7d02d04b0b2d8c044cdbaaa jdk8-b60 61ddb3fd000a09ab05bff1940b0ac211661e94cf jdk8-b61 +50b8b17449d200c66bfd68fb4f3a9197432c9e2b jdk8-b62 From 431bad33c0f5cfad2ef990eaf968ff010edea2ec Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 25 Oct 2012 09:54:41 -0700 Subject: [PATCH 101/241] Added tag jdk8-b62 for changeset 90de1dc5cd5b --- langtools/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/.hgtags b/langtools/.hgtags index 080bdc4ab61..387f4d68b64 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -183,3 +183,4 @@ e48e7e1f026b82d921433150180799898c088890 jdk8-b55 f299927fc31689385f67ab7322c18eb41d8bd71e jdk8-b59 3d2b98ffcb534b0e5be87bb1f9f68d1518ad7729 jdk8-b60 26020b247ad3806dbca33e029ee12e1b191f59f9 jdk8-b61 +b47bb81ba962ef80bb6f0b863c33a0afcfb0b49e jdk8-b62 From de259994813b2e5d2f05c7c4030aa97da2dfc6ba Mon Sep 17 00:00:00 2001 From: Vicente Romero Date: Thu, 25 Oct 2012 11:09:36 -0700 Subject: [PATCH 102/241] 7200915: convert TypeTags from a series of small ints to an enum Reviewed-by: jjg, mcimadamore --- .../com/sun/tools/javac/code/Attribute.java | 2 - .../com/sun/tools/javac/code/Kinds.java | 4 +- .../com/sun/tools/javac/code/Printer.java | 5 +- .../com/sun/tools/javac/code/Symbol.java | 38 +-- .../com/sun/tools/javac/code/Symtab.java | 31 +-- .../com/sun/tools/javac/code/Type.java | 88 +++++-- .../com/sun/tools/javac/code/TypeTag.java | 226 ++++++++++++++++++ .../com/sun/tools/javac/code/TypeTags.java | 140 ----------- .../com/sun/tools/javac/code/Types.java | 85 +++---- .../com/sun/tools/javac/comp/Annotate.java | 6 +- .../com/sun/tools/javac/comp/Attr.java | 134 ++++++----- .../com/sun/tools/javac/comp/Check.java | 111 ++++----- .../com/sun/tools/javac/comp/ConstFold.java | 17 +- .../sun/tools/javac/comp/DeferredAttr.java | 11 +- .../com/sun/tools/javac/comp/Enter.java | 2 +- .../com/sun/tools/javac/comp/Flow.java | 9 +- .../com/sun/tools/javac/comp/Infer.java | 18 +- .../com/sun/tools/javac/comp/Lower.java | 20 +- .../com/sun/tools/javac/comp/MemberEnter.java | 18 +- .../com/sun/tools/javac/comp/Resolve.java | 54 ++--- .../com/sun/tools/javac/comp/TransTypes.java | 18 +- .../com/sun/tools/javac/jvm/ClassReader.java | 6 +- .../com/sun/tools/javac/jvm/ClassWriter.java | 36 +-- .../classes/com/sun/tools/javac/jvm/Code.java | 27 ++- .../classes/com/sun/tools/javac/jvm/Gen.java | 22 +- .../tools/javac/jvm/UninitializedType.java | 8 +- .../sun/tools/javac/main/JavaCompiler.java | 3 +- .../sun/tools/javac/model/JavacElements.java | 7 +- .../sun/tools/javac/parser/JavacParser.java | 50 ++-- .../com/sun/tools/javac/tree/JCTree.java | 68 ++---- .../com/sun/tools/javac/tree/Pretty.java | 32 +-- .../com/sun/tools/javac/tree/TreeInfo.java | 3 +- .../com/sun/tools/javac/tree/TreeMaker.java | 14 +- .../com/sun/tools/javac/util/Constants.java | 8 +- .../javac/util/RichDiagnosticFormatter.java | 10 +- .../tools/javadoc/AnnotationValueImpl.java | 6 +- .../com/sun/tools/javadoc/ClassDocImpl.java | 10 +- .../com/sun/tools/javadoc/FieldDocImpl.java | 5 +- .../com/sun/tools/javadoc/MethodDocImpl.java | 7 +- .../tools/javadoc/ParameterizedTypeImpl.java | 6 +- .../com/sun/tools/javadoc/TypeMaker.java | 16 +- .../test/tools/javac/6889255/T6889255.java | 6 +- .../tools/javac/tree/MakeLiteralTest.java | 11 +- 43 files changed, 758 insertions(+), 640 deletions(-) create mode 100644 langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java delete mode 100644 langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java b/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java index 0460ac9aa1e..f827006a036 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java @@ -34,8 +34,6 @@ import javax.lang.model.type.DeclaredType; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.util.*; -import static com.sun.tools.javac.code.TypeTags.*; - /** An annotation value. * *

    This is NOT part of any supported API. diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java b/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java index dc0d52f34b6..12d3703d1fd 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java @@ -32,7 +32,9 @@ import com.sun.source.tree.MemberReferenceTree; import com.sun.tools.javac.api.Formattable; import com.sun.tools.javac.api.Messages; import static com.sun.tools.javac.code.Flags.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.PACKAGE; +import static com.sun.tools.javac.code.TypeTag.TYPEVAR; /** Internal symbol kinds, which distinguish between elements of * different subclasses of Symbol. Symbol kinds are organized so they can be 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 index 5d7e430ffeb..3e6b15998c3 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java @@ -32,9 +32,12 @@ import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; + import static com.sun.tools.javac.code.BoundKind.*; import static com.sun.tools.javac.code.Flags.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.ARRAY; +import static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.FORALL; /** * A combined type/symbol visitor for generating non-trivial localized string diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java index 328cfcf6bfe..3c2dce90873 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java @@ -42,7 +42,9 @@ import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.Name; 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 static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.FORALL; +import static com.sun.tools.javac.code.TypeTag.TYPEVAR; /** Root class for Java symbols. It contains subclasses * for specific sorts of symbols, such as variables, methods and operators, @@ -161,7 +163,7 @@ public abstract class Symbol implements Element { if (owner.name == null || owner.name.isEmpty()) { return location(); } - if (owner.type.tag == CLASS) { + if (owner.type.hasTag(CLASS)) { Type ownertype = types.asOuterSuper(site, owner); if (ownertype != null) return ownertype.tsym; } @@ -256,7 +258,7 @@ public abstract class Symbol implements Element { /** A class is an inner class if it it has an enclosing instance class. */ public boolean isInner() { - return type.getEnclosingType().tag == CLASS; + return type.getEnclosingType().hasTag(CLASS); } /** An inner class has an outer instance if it is not an interface @@ -269,7 +271,7 @@ public abstract class Symbol implements Element { */ public boolean hasOuterInstance() { return - type.getEnclosingType().tag == CLASS && (flags() & (INTERFACE | NOOUTERTHIS)) == 0; + type.getEnclosingType().hasTag(CLASS) && (flags() & (INTERFACE | NOOUTERTHIS)) == 0; } /** The closest enclosing class of this symbol's declaration. @@ -277,7 +279,7 @@ public abstract class Symbol implements Element { public ClassSymbol enclClass() { Symbol c = this; while (c != null && - ((c.kind & TYP) == 0 || c.type.tag != CLASS)) { + ((c.kind & TYP) == 0 || !c.type.hasTag(CLASS))) { c = c.owner; } return (ClassSymbol)c; @@ -346,7 +348,7 @@ public abstract class Symbol implements Element { e = e.next(); } Type superType = types.supertype(clazz.type); - if (superType.tag != TypeTags.CLASS) return false; + if (!superType.hasTag(CLASS)) return false; clazz = (ClassSymbol)superType.tsym; } } @@ -373,7 +375,7 @@ public abstract class Symbol implements Element { for (Symbol sup = clazz; sup != null && sup != this.owner; sup = types.supertype(sup.type).tsym) { - while (sup.type.tag == TYPEVAR) + while (sup.type.hasTag(TYPEVAR)) sup = sup.type.getUpperBound().tsym; if (sup.type.isErroneous()) return true; // error recovery @@ -520,7 +522,7 @@ public abstract class Symbol implements Element { if (owner == null) return name; if (((owner.kind != ERR)) && ((owner.kind & (VAR | MTH)) != 0 - || (owner.kind == TYP && owner.type.tag == TYPEVAR) + || (owner.kind == TYP && owner.type.hasTag(TYPEVAR)) )) return name; Name prefix = owner.getQualifiedName(); if (prefix == null || prefix == prefix.table.names.empty) @@ -534,7 +536,7 @@ public abstract class Symbol implements Element { static public Name formFlatName(Name name, Symbol owner) { if (owner == null || (owner.kind & (VAR | MTH)) != 0 - || (owner.kind == TYP && owner.type.tag == TYPEVAR) + || (owner.kind == TYP && owner.type.hasTag(TYPEVAR)) ) return name; char sep = owner.kind == TYP ? '$' : '.'; Name prefix = owner.flatName(); @@ -553,16 +555,16 @@ public abstract class Symbol implements Element { if (this == that) return false; if (this.type.tag == that.type.tag) { - if (this.type.tag == CLASS) { + if (this.type.hasTag(CLASS)) { return types.rank(that.type) < types.rank(this.type) || types.rank(that.type) == types.rank(this.type) && that.getQualifiedName().compareTo(this.getQualifiedName()) < 0; - } else if (this.type.tag == TYPEVAR) { + } else if (this.type.hasTag(TYPEVAR)) { return types.isSubtype(this.type, that.type); } } - return this.type.tag == TYPEVAR; + return this.type.hasTag(TYPEVAR); } // For type params; overridden in subclasses. @@ -572,7 +574,7 @@ public abstract class Symbol implements Element { public java.util.List getEnclosedElements() { List list = List.nil(); - if (kind == TYP && type.tag == TYPEVAR) { + if (kind == TYP && type.hasTag(TYPEVAR)) { return list; } for (Scope.Entry e = members().elems; e != null; e = e.sibling) { @@ -591,7 +593,7 @@ public abstract class Symbol implements Element { } public R accept(ElementVisitor v, P p) { - Assert.check(type.tag == TYPEVAR); // else override will be invoked + Assert.check(type.hasTag(TYPEVAR)); // else override will be invoked return v.visitTypeParameter(this, p); } @@ -798,13 +800,13 @@ public abstract class Symbol implements Element { if (this == base) { return true; } else if ((base.flags() & INTERFACE) != 0) { - for (Type t = type; t.tag == CLASS; t = types.supertype(t)) + for (Type t = type; t.hasTag(CLASS); t = types.supertype(t)) for (List is = types.interfaces(t); is.nonEmpty(); is = is.tail) if (is.head.tsym.isSubClass(base, types)) return true; } else { - for (Type t = type; t.tag == CLASS; t = types.supertype(t)) + for (Type t = type; t.hasTag(CLASS); t = types.supertype(t)) if (t.tsym == base) return true; } return false; @@ -1048,7 +1050,7 @@ public abstract class Symbol implements Element { */ public MethodSymbol(long flags, Name name, Type type, Symbol owner) { super(MTH, flags, name, type, owner); - if (owner.type.tag == TYPEVAR) Assert.error(owner + "." + name); + if (owner.type.hasTag(TYPEVAR)) Assert.error(owner + "." + name); } /** Clone this symbol with new owner. @@ -1074,7 +1076,7 @@ public abstract class Symbol implements Element { ? owner.name.toString() : name.toString(); if (type != null) { - if (type.tag == FORALL) + if (type.hasTag(FORALL)) s = "<" + ((ForAll)type).getTypeArguments() + ">" + s; s += "(" + type.argtypes((flags() & VARARGS) != 0) + ")"; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java index 29ce859361d..dce902ce28c 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java @@ -37,6 +37,7 @@ import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.jvm.ByteCodes.*; +import static com.sun.tools.javac.code.TypeTag.*; /** A class that defines all predefined constants and operators * as well as special classes such as java.lang.Object, which need @@ -64,16 +65,16 @@ public class Symtab { /** Builtin types. */ - public final Type byteType = new Type(TypeTags.BYTE, null); - public final Type charType = new Type(TypeTags.CHAR, null); - public final Type shortType = new Type(TypeTags.SHORT, null); - public final Type intType = new Type(TypeTags.INT, null); - public final Type longType = new Type(TypeTags.LONG, null); - public final Type floatType = new Type(TypeTags.FLOAT, null); - public final Type doubleType = new Type(TypeTags.DOUBLE, null); - public final Type booleanType = new Type(TypeTags.BOOLEAN, null); + public final Type byteType = new Type(BYTE, null); + public final Type charType = new Type(CHAR, null); + public final Type shortType = new Type(SHORT, null); + public final Type intType = new Type(INT, null); + public final Type longType = new Type(LONG, null); + public final Type floatType = new Type(FLOAT, null); + public final Type doubleType = new Type(DOUBLE, null); + public final Type booleanType = new Type(BOOLEAN, null); public final Type botType = new BottomType(); - public final JCNoType voidType = new JCNoType(TypeTags.VOID); + public final JCNoType voidType = new JCNoType(VOID); private final Names names; private final ClassReader reader; @@ -177,11 +178,11 @@ public class Symtab { /** The predefined type that belongs to a tag. */ - public final Type[] typeOfTag = new Type[TypeTags.TypeTagCount]; + public final Type[] typeOfTag = new Type[TypeTag.getTypeTagCount()]; /** The name of the class that belongs to a basix type tag. */ - public final Name[] boxedName = new Name[TypeTags.TypeTagCount]; + public final Name[] boxedName = new Name[TypeTag.getTypeTagCount()]; /** A set containing all operator names. */ @@ -202,7 +203,7 @@ public class Symtab { public void initType(Type type, ClassSymbol c) { type.tsym = c; - typeOfTag[type.tag] = type; + typeOfTag[type.tag.ordinal()] = type; } public void initType(Type type, String name) { @@ -214,7 +215,7 @@ public class Symtab { public void initType(Type type, String name, String bname) { initType(type, name); - boxedName[type.tag] = names.fromString("java.lang." + bname); + boxedName[type.tag.ordinal()] = names.fromString("java.lang." + bname); } /** The class symbol that owns all predefined symbols. @@ -324,7 +325,7 @@ public class Symtab { } public void synthesizeBoxTypeIfMissing(final Type type) { - ClassSymbol sym = reader.enterClass(boxedName[type.tag]); + ClassSymbol sym = reader.enterClass(boxedName[type.tag.ordinal()]); final Completer completer = sym.completer; if (completer != null) { sym.completer = new Completer() { @@ -366,7 +367,7 @@ public class Symtab { target = Target.instance(context); // Create the unknown type - unknownType = new Type(TypeTags.UNKNOWN, null) { + unknownType = new Type(UNKNOWN, null) { @Override public R accept(TypeVisitor v, P p) { return v.visitUnknown(this, p); diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java index 362bb426488..f75bbf3e8b6 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java @@ -38,7 +38,7 @@ import com.sun.tools.javac.util.*; import static com.sun.tools.javac.code.BoundKind.*; 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 static com.sun.tools.javac.code.TypeTag.*; /** This class represents Java types. The class itself defines the behavior of * the following types: @@ -66,7 +66,7 @@ import static com.sun.tools.javac.code.TypeTags.*; * This code and its internal interfaces are subject to change or * deletion without notice. * - * @see TypeTags + * @see TypeTag */ public class Type implements PrimitiveType { @@ -83,14 +83,76 @@ public class Type implements PrimitiveType { /** The tag of this type. * - * @see TypeTags + * @see TypeTag */ - public int tag; + protected TypeTag tag; /** The defining class / interface / package / type variable */ public TypeSymbol tsym; + /** + * Checks if the current type tag is equal to the given tag. + * @return true if tag is equal to the current type tag. + */ + public boolean hasTag(TypeTag tag) { + return this.tag == tag; + } + + /** + * Returns the current type tag. + * @return the value of the current type tag. + */ + public TypeTag getTag() { + return tag; + } + + public boolean isNumeric() { + switch (tag) { + case BYTE: case CHAR: + case SHORT: + case INT: case LONG: + case FLOAT: case DOUBLE: + return true; + default: + return false; + } + } + + public boolean isPrimitive() { + return (isNumeric() || tag == BOOLEAN); + } + + public boolean isPrimitiveOrVoid() { + return (isPrimitive() || tag == VOID); + } + + public boolean isReference() { + switch (tag) { + case CLASS: + case ARRAY: + case TYPEVAR: + case WILDCARD: + case ERROR: + return true; + default: + return false; + } + } + + public boolean isNullOrReference() { + return (tag == BOT || isReference()); + } + + public boolean isPartial() { + switch(tag) { + case ERROR: case UNKNOWN: case UNDETVAR: + return true; + default: + return false; + } + } + /** * The constant value of this type, null if this type does not * have a constant value attribute. Only primitive types and @@ -121,7 +183,7 @@ public class Type implements PrimitiveType { /** Define a type given its tag and type symbol */ - public Type(int tag, TypeSymbol tsym) { + public Type(TypeTag tag, TypeSymbol tsym) { this.tag = tag; this.tsym = tsym; } @@ -162,7 +224,7 @@ public class Type implements PrimitiveType { */ public Type constType(Object constValue) { final Object value = constValue; - Assert.check(tag <= BOOLEAN); + Assert.check(isPrimitive()); return new Type(tag, tsym) { @Override public Object constValue() { @@ -352,10 +414,6 @@ public class Type implements PrimitiveType { return (tsym.flags() & FINAL) != 0; } - public boolean isPrimitive() { - return tag < VOID; - } - /** * Does this type contain occurrences of type t? */ @@ -808,7 +866,7 @@ public class Type implements PrimitiveType { } public int hashCode() { - return (ARRAY << 5) + elemtype.hashCode(); + return (ARRAY.ordinal() << 5) + elemtype.hashCode(); } public boolean isVarargs() { @@ -915,7 +973,7 @@ public class Type implements PrimitiveType { } public int hashCode() { - int h = METHOD; + int h = METHOD.ordinal(); for (List thisargs = this.argtypes; thisargs.tail != null; /*inlined: thisargs.nonEmpty()*/ thisargs = thisargs.tail) @@ -1099,7 +1157,7 @@ public class Type implements PrimitiveType { public static abstract class DelegatedType extends Type { public Type qtype; - public DelegatedType(int tag, Type qtype) { + public DelegatedType(TypeTag tag, Type qtype) { super(tag, qtype.tsym); this.qtype = qtype; } @@ -1285,7 +1343,7 @@ public class Type implements PrimitiveType { /** Represents VOID or NONE. */ static class JCNoType extends Type implements NoType { - public JCNoType(int tag) { + public JCNoType(TypeTag tag) { super(tag, null); } @@ -1307,7 +1365,7 @@ public class Type implements PrimitiveType { static class BottomType extends Type implements NullType { public BottomType() { - super(TypeTags.BOT, null); + super(BOT, null); } @Override diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java new file mode 100644 index 00000000000..6727732a65f --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javac.code; + +import com.sun.source.tree.Tree.Kind; + +import javax.lang.model.type.TypeKind; + +/** An interface for type tag values, which distinguish between different + * sorts of types. + * + *

    This is NOT part of any supported API. + * 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 TypeTag { + /** The tag of the basic type `byte'. + */ + BYTE(1), + + /** The tag of the basic type `char'. + */ + CHAR(2), + + /** The tag of the basic type `short'. + */ + SHORT(3), + + /** The tag of the basic type `int'. + */ + INT(4), + + /** The tag of the basic type `long'. + */ + LONG(5), + + /** The tag of the basic type `float'. + */ + FLOAT(6), + + /** The tag of the basic type `double'. + */ + DOUBLE(7), + + /** The tag of the basic type `boolean'. + */ + BOOLEAN, + + /** The tag of the type `void'. + */ + VOID, + + /** The tag of all class and interface types. + */ + CLASS, + + /** The tag of all array types. + */ + ARRAY, + + /** The tag of all (monomorphic) method types. + */ + METHOD, + + /** The tag of all package "types". + */ + PACKAGE, + + /** The tag of all (source-level) type variables. + */ + TYPEVAR, + + /** The tag of all type arguments. + */ + WILDCARD, + + /** The tag of all polymorphic (method-) types. + */ + FORALL, + + /** The tag of deferred expression types in method context + */ + DEFERRED, + + /** The tag of the bottom type . + */ + BOT, + + /** The tag of a missing type. + */ + NONE, + + /** The tag of the error type. + */ + ERROR, + + /** The tag of an unknown type + */ + UNKNOWN, + + /** The tag of all instantiatable type variables. + */ + UNDETVAR, + + /** Pseudo-types, these are special tags + */ + UNINITIALIZED_THIS, + + UNINITIALIZED_OBJECT; + + /** This field will only be used for tags related with numeric types for + * optimization reasons. + */ + private int order = 0; + + private TypeTag() {} + + private TypeTag(int order) { + this.order = order; + } + + private static final int MIN_NUMERIC_TAG_ORDER = 1; + private static final int MAX_NUMERIC_TAG_ORDER = 7; + + /** Returns the number of type tags. + */ + public static int getTypeTagCount() { + // last two tags are not included in the total as long as they are pseudo-types + return (UNDETVAR.ordinal() + 1); + } + + public boolean isSubRangeOf(TypeTag range) { + return (this == range) || isStrictSubRangeOf(range); + } + + public boolean isStrictSubRangeOf(TypeTag range) { + if (this.order >= MIN_NUMERIC_TAG_ORDER && this.order <= MAX_NUMERIC_TAG_ORDER && + range.order >= MIN_NUMERIC_TAG_ORDER && this.order <= MAX_NUMERIC_TAG_ORDER) { + if (this == range) + return false; + switch (this) { + case BYTE: + return true; + case CHAR: case SHORT: case INT: + case LONG: case FLOAT: + return this.order < range.order && range.order <= MAX_NUMERIC_TAG_ORDER; + default: + return false; + } + } + else + return false; + } + + public Kind getKindLiteral() { + switch (this) { + case INT: + return Kind.INT_LITERAL; + case LONG: + return Kind.LONG_LITERAL; + case FLOAT: + return Kind.FLOAT_LITERAL; + case DOUBLE: + return Kind.DOUBLE_LITERAL; + case BOOLEAN: + return Kind.BOOLEAN_LITERAL; + case CHAR: + return Kind.CHAR_LITERAL; + case CLASS: + return Kind.STRING_LITERAL; + case BOT: + return Kind.NULL_LITERAL; + default: + throw new AssertionError("unknown literal kind " + this); + } + } + + public TypeKind getPrimitiveTypeKind() { + switch (this) { + case BOOLEAN: + return TypeKind.BOOLEAN; + case BYTE: + return TypeKind.BYTE; + case SHORT: + return TypeKind.SHORT; + case INT: + return TypeKind.INT; + case LONG: + return TypeKind.LONG; + case CHAR: + return TypeKind.CHAR; + case FLOAT: + return TypeKind.FLOAT; + case DOUBLE: + return TypeKind.DOUBLE; + case VOID: + return TypeKind.VOID; + default: + throw new AssertionError("unknown primitive type " + this); + } + } +} diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java deleted file mode 100644 index aecf93bb74f..00000000000 --- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javac.code; - - -/** An interface for type tag values, which distinguish between different - * sorts of types. - * - *

    This is NOT part of any supported API. - * 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 TypeTags { - - private TypeTags() {} // uninstantiable - - /** The tag of the basic type `byte'. - */ - public static final int BYTE = 1; - - /** The tag of the basic type `char'. - */ - public static final int CHAR = BYTE+1; - - /** The tag of the basic type `short'. - */ - public static final int SHORT = CHAR+1; - - /** The tag of the basic type `int'. - */ - public static final int INT = SHORT+1; - - /** The tag of the basic type `long'. - */ - public static final int LONG = INT+1; - - /** The tag of the basic type `float'. - */ - public static final int FLOAT = LONG+1; - - /** The tag of the basic type `double'. - */ - public static final int DOUBLE = FLOAT+1; - - /** The tag of the basic type `boolean'. - */ - public static final int BOOLEAN = DOUBLE+1; - - /** The tag of the type `void'. - */ - public static final int VOID = BOOLEAN+1; - - /** The tag of all class and interface types. - */ - public static final int CLASS = VOID+1; - - /** The tag of all array types. - */ - public static final int ARRAY = CLASS+1; - - /** The tag of all (monomorphic) method types. - */ - public static final int METHOD = ARRAY+1; - - /** The tag of all package "types". - */ - public static final int PACKAGE = METHOD+1; - - /** The tag of all (source-level) type variables. - */ - public static final int TYPEVAR = PACKAGE+1; - - /** The tag of all type arguments. - */ - public static final int WILDCARD = TYPEVAR+1; - - /** The tag of all polymorphic (method-) types. - */ - public static final int FORALL = WILDCARD+1; - - /** The tag of deferred expression types in method context - */ - public static final int DEFERRED = FORALL+1; - - /** The tag of the bottom type {@code }. - */ - public static final int BOT = DEFERRED+1; - - /** The tag of a missing type. - */ - public static final int NONE = BOT+1; - - /** The tag of the error type. - */ - public static final int ERROR = NONE+1; - - /** The tag of an unknown type - */ - public static final int UNKNOWN = ERROR+1; - - /** The tag of all instantiatable type variables. - */ - public static final int UNDETVAR = UNKNOWN+1; - - /** The number of type tags. - */ - public static final int TypeTagCount = UNDETVAR+1; - - /** The maximum tag of a basic type. - */ - public static final int lastBaseTag = BOOLEAN; - - /** The minimum tag of a partial type - */ - public static final int firstPartialTag = ERROR; -} 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 9bc13e56bbb..988a25d01ff 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 @@ -40,7 +40,7 @@ import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Scope.*; import static com.sun.tools.javac.code.Symbol.*; import static com.sun.tools.javac.code.Type.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.util.ListBuffer.lb; /** @@ -605,8 +605,8 @@ public class Types { } //where private boolean isSubtypeUncheckedInternal(Type t, Type s, Warner warn) { - if (t.tag == ARRAY && s.tag == ARRAY) { - if (((ArrayType)t).elemtype.tag <= lastBaseTag) { + if (t.hasTag(ARRAY) && s.hasTag(ARRAY)) { + if (((ArrayType)t).elemtype.isPrimitive()) { return isSameType(elemtype(t), elemtype(s)); } else { return isSubtypeUnchecked(elemtype(t), elemtype(s), warn); @@ -664,7 +664,7 @@ public class Types { if (t == s) return true; - if (s.tag >= firstPartialTag) + if (s.isPartial()) return isSuperType(s, t); if (s.isCompound()) { @@ -686,25 +686,27 @@ public class Types { { public Boolean visitType(Type t, Type s) { switch (t.tag) { - case BYTE: case CHAR: - return (t.tag == s.tag || - t.tag + 2 <= s.tag && s.tag <= DOUBLE); - case SHORT: case INT: case LONG: case FLOAT: case DOUBLE: - return t.tag <= s.tag && s.tag <= DOUBLE; - case BOOLEAN: case VOID: - return t.tag == s.tag; - case TYPEVAR: - return isSubtypeNoCapture(t.getUpperBound(), s); - case BOT: - return - s.tag == BOT || s.tag == CLASS || - s.tag == ARRAY || s.tag == TYPEVAR; - case WILDCARD: //we shouldn't be here - avoids crash (see 7034495) - case NONE: - return false; - default: - throw new AssertionError("isSubtype " + t.tag); - } + case BYTE: + return (!s.hasTag(CHAR) && t.getTag().isSubRangeOf(s.getTag())); + case CHAR: + return (!s.hasTag(SHORT) && t.getTag().isSubRangeOf(s.getTag())); + case SHORT: case INT: case LONG: + case FLOAT: case DOUBLE: + return t.getTag().isSubRangeOf(s.getTag()); + case BOOLEAN: case VOID: + return t.hasTag(s.getTag()); + case TYPEVAR: + return isSubtypeNoCapture(t.getUpperBound(), s); + case BOT: + return + s.hasTag(BOT) || s.hasTag(CLASS) || + s.hasTag(ARRAY) || s.hasTag(TYPEVAR); + case WILDCARD: //we shouldn't be here - avoids crash (see 7034495) + case NONE: + return false; + default: + throw new AssertionError("isSubtype " + t.tag); + } } private Set cache = new HashSet(); @@ -774,7 +776,7 @@ public class Types { @Override public Boolean visitArrayType(ArrayType t, Type s) { if (s.tag == ARRAY) { - if (t.elemtype.tag <= lastBaseTag) + if (t.elemtype.isPrimitive()) return isSameType(t.elemtype, elemtype(s)); else return isSubtypeNoCapture(t.elemtype, elemtype(s)); @@ -907,7 +909,7 @@ public class Types { if (t == s) return true; - if (s.tag >= firstPartialTag) + if (s.isPartial()) return visit(s, t); switch (t.tag) { @@ -936,7 +938,7 @@ public class Types { @Override public Boolean visitWildcardType(WildcardType t, Type s) { - if (s.tag >= firstPartialTag) + if (s.isPartial()) return visit(s, t); else return false; @@ -947,7 +949,7 @@ public class Types { if (t == s) return true; - if (s.tag >= firstPartialTag) + if (s.isPartial()) return visit(s, t); if (s.isSuperBound() && !s.isExtendsBound()) @@ -976,10 +978,10 @@ public class Types { if (t == s) return true; - if (s.tag >= firstPartialTag) + if (s.isPartial()) return visit(s, t); - return s.tag == ARRAY + return s.hasTag(ARRAY) && containsTypeEquivalent(t.elemtype, elemtype(s)); } @@ -1120,7 +1122,7 @@ public class Types { } public Boolean visitType(Type t, Type s) { - if (s.tag >= firstPartialTag) + if (s.isPartial()) return containedBy(s, t); else return isSameType(t, s); @@ -1142,7 +1144,7 @@ public class Types { @Override public Boolean visitWildcardType(WildcardType t, Type s) { - if (s.tag >= firstPartialTag) + if (s.isPartial()) return containedBy(s, t); else { // debugContainsType(t, s); @@ -1232,7 +1234,7 @@ public class Types { switch (t.tag) { case BYTE: case CHAR: case SHORT: case INT: case LONG: case FLOAT: case DOUBLE: - return s.tag <= DOUBLE; + return s.isNumeric(); case BOOLEAN: return s.tag == BOOLEAN; case VOID: @@ -1373,8 +1375,7 @@ public class Types { case CLASS: return isSubtype(t, s); case ARRAY: - if (elemtype(t).tag <= lastBaseTag || - elemtype(s).tag <= lastBaseTag) { + if (elemtype(t).isPrimitive() || elemtype(s).isPrimitive()) { return elemtype(t).tag == elemtype(s).tag; } else { return visit(elemtype(t), elemtype(s)); @@ -1648,8 +1649,8 @@ public class Types { */ public ArrayType makeArrayType(Type t) { if (t.tag == VOID || - t.tag >= PACKAGE) { - Assert.error("Type t must not be a a VOID or PACKAGE type, " + t.toString()); + t.tag == PACKAGE) { + Assert.error("Type t must not be a VOID or PACKAGE type, " + t.toString()); } return new ArrayType(t, syms.arrayClass); } @@ -1847,7 +1848,7 @@ public class Types { public boolean isAssignable(Type t, Type s, Warner warn) { if (t.tag == ERROR) return true; - if (t.tag <= INT && t.constValue() != null) { + if (t.tag.isSubRangeOf(INT) && t.constValue() != null) { int value = ((Number)t.constValue()).intValue(); switch (s.tag) { case BYTE: @@ -1891,11 +1892,11 @@ public class Types { // We don't want to erase primitive types and String type as that // operation is idempotent. Also, erasing these could result in loss // of information such as constant values attached to such types. - return (t.tag <= lastBaseTag) || (syms.stringType.tsym == t.tsym); + return (t.isPrimitive()) || (syms.stringType.tsym == t.tsym); } private Type erasure(Type t, boolean recurse) { - if (t.tag <= lastBaseTag) + if (t.isPrimitive()) return t; /* fast special case */ else return erasure.visit(t, recurse); @@ -1903,7 +1904,7 @@ public class Types { // where private SimpleVisitor erasure = new SimpleVisitor() { public Type visitType(Type t, Boolean recurse) { - if (t.tag <= lastBaseTag) + if (t.isPrimitive()) return t; /*fast special case*/ else return t.map(recurse ? erasureRecFun : erasureFun); @@ -3314,7 +3315,7 @@ public class Types { private static final UnaryVisitor hashCode = new UnaryVisitor() { public Integer visitType(Type t, Void ignored) { - return t.tag; + return t.tag.ordinal(); } @Override @@ -3430,7 +3431,7 @@ public class Types { * Return the class that boxes the given primitive. */ public ClassSymbol boxedClass(Type t) { - return reader.enterClass(syms.boxedName[t.tag]); + return reader.enterClass(syms.boxedName[t.tag.ordinal()]); } /** diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java index e9cad76d473..cc3ea1e2f96 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java @@ -34,6 +34,8 @@ import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.tree.*; import com.sun.tools.javac.tree.JCTree.*; +import static com.sun.tools.javac.code.TypeTag.ARRAY; +import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** Enter annotations on symbols. Annotations accumulate in a queue, @@ -289,7 +291,7 @@ public class Annotate { } return enterAnnotation((JCAnnotation)tree, expected, env); } - if (expected.tag == TypeTags.ARRAY) { // should really be isArray() + if (expected.hasTag(ARRAY)) { // should really be isArray() if (!tree.hasTag(NEWARRAY)) { tree = make.at(tree.pos). NewArray(null, List.nil(), List.of(tree)); @@ -309,7 +311,7 @@ public class Annotate { return new Attribute. Array(expected, buf.toArray(new Attribute[buf.length()])); } - if (expected.tag == TypeTags.CLASS && + if (expected.hasTag(CLASS) && (expected.tsym.flags() & Flags.ENUM) != 0) { attr.attribExpr(tree, env, expected); Symbol sym = TreeInfo.symbol(tree); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java index 1274431269d..72cdea25395 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -56,8 +56,8 @@ import static com.sun.tools.javac.code.Flags.ANNOTATION; import static com.sun.tools.javac.code.Flags.BLOCK; import static com.sun.tools.javac.code.Kinds.*; import static com.sun.tools.javac.code.Kinds.ERRONEOUS; -import static com.sun.tools.javac.code.TypeTags.*; -import static com.sun.tools.javac.code.TypeTags.WILDCARD; +import static com.sun.tools.javac.code.TypeTag.*; +import static com.sun.tools.javac.code.TypeTag.WILDCARD; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** This is the main context-dependent analysis phase in GJC. It @@ -234,7 +234,7 @@ public class Attr extends JCTree.Visitor { Type check(final JCTree tree, final Type found, final int ownkind, final ResultInfo resultInfo) { InferenceContext inferenceContext = resultInfo.checkContext.inferenceContext(); Type owntype = found; - if (owntype.tag != ERROR && resultInfo.pt.tag != METHOD && resultInfo.pt.tag != FORALL) { + if (!owntype.hasTag(ERROR) && !resultInfo.pt.hasTag(METHOD) && !resultInfo.pt.hasTag(FORALL)) { if (inferenceContext.free(found)) { inferenceContext.addFreeTypeListener(List.of(found, resultInfo.pt), new FreeTypeListener() { @Override @@ -606,7 +606,7 @@ public class Attr extends JCTree.Visitor { /** Derived visitor method: attribute an expression tree. */ public Type attribExpr(JCTree tree, Env env, Type pt) { - return attribTree(tree, env, new ResultInfo(VAL, pt.tag != ERROR ? pt : Type.noType)); + return attribTree(tree, env, new ResultInfo(VAL, !pt.hasTag(ERROR) ? pt : Type.noType)); } /** Derived visitor method: attribute an expression tree with @@ -806,7 +806,7 @@ public class Attr extends JCTree.Visitor { boolean checkExtensible) { if (t.isErroneous()) return t; - if (t.tag == TYPEVAR && !classExpected && !interfaceExpected) { + if (t.hasTag(TYPEVAR) && !classExpected && !interfaceExpected) { // check that type variable is already visible if (t.getUpperBound() == null) { log.error(tree.pos(), "illegal.forward.ref"); @@ -1208,7 +1208,7 @@ public class Attr extends JCTree.Visitor { } } else { Type pattype = attribExpr(c.pat, switchEnv, seltype); - if (pattype.tag != ERROR) { + if (!pattype.hasTag(ERROR)) { if (pattype.constValue() == null) { log.error(c.pat.pos(), (stringSwitch ? "string.const.req" : "const.expr.req")); @@ -1379,10 +1379,10 @@ public class Attr extends JCTree.Visitor { Type condtype = attribExpr(tree.cond, env, syms.booleanType); boolean standaloneConditional = !allowPoly || - pt().tag == NONE && pt() != Type.recoveryType || + pt().hasTag(NONE) && pt() != Type.recoveryType || isBooleanOrNumeric(env, tree); - if (!standaloneConditional && resultInfo.pt.tag == VOID) { + if (!standaloneConditional && resultInfo.pt.hasTag(VOID)) { //cannot get here (i.e. it means we are returning from void method - which is already an error) result = tree.type = types.createErrorType(resultInfo.pt); return; @@ -1416,7 +1416,8 @@ public class Attr extends JCTree.Visitor { @SuppressWarnings("fallthrough") private boolean isBooleanOrNumeric(Env env, JCExpression tree) { switch (tree.getTag()) { - case LITERAL: return ((JCLiteral)tree).typetag < CLASS; + case LITERAL: return ((JCLiteral)tree).typetag.isSubRangeOf(DOUBLE) || + ((JCLiteral)tree).typetag == BOOLEAN; case LAMBDA: case REFERENCE: return false; case PARENS: return isBooleanOrNumeric(env, ((JCParens)tree).expr); case CONDEXPR: @@ -1426,7 +1427,7 @@ public class Attr extends JCTree.Visitor { default: Type speculativeType = deferredAttr.attribSpeculative(tree, env, unknownExprInfo).type; speculativeType = types.unboxedTypeOrType(speculativeType); - return speculativeType.tag <= BOOLEAN; + return speculativeType.isPrimitive(); } } @@ -1459,16 +1460,19 @@ public class Attr extends JCTree.Visitor { // If one arm has an integer subrange type (i.e., byte, // short, or char), and the other is an integer constant // that fits into the subrange, return the subrange type. - if (thenUnboxed.tag < INT && elseUnboxed.tag == INT && + if (thenUnboxed.getTag().isStrictSubRangeOf(INT) && elseUnboxed.hasTag(INT) && types.isAssignable(elseUnboxed, thenUnboxed)) return thenUnboxed.baseType(); - if (elseUnboxed.tag < INT && thenUnboxed.tag == INT && + if (elseUnboxed.getTag().isStrictSubRangeOf(INT) && thenUnboxed.hasTag(INT) && types.isAssignable(thenUnboxed, elseUnboxed)) return elseUnboxed.baseType(); - for (int i = BYTE; i < VOID; i++) { - Type candidate = syms.typeOfTag[i]; - if (types.isSubtype(thenUnboxed, candidate) && + for (TypeTag tag : TypeTag.values()) { + if (tag.ordinal() >= TypeTag.getTypeTagCount()) break; + Type candidate = syms.typeOfTag[tag.ordinal()]; + if (candidate != null && + candidate.isPrimitive() && + types.isSubtype(thenUnboxed, candidate) && types.isSubtype(elseUnboxed, candidate)) return candidate; } @@ -1487,7 +1491,7 @@ public class Attr extends JCTree.Visitor { if (types.isSubtype(elsetype, thentype)) return thentype.baseType(); - if (!allowBoxing || thentype.tag == VOID || elsetype.tag == VOID) { + if (!allowBoxing || thentype.hasTag(VOID) || elsetype.hasTag(VOID)) { log.error(pos, "neither.conditional.subtype", thentype, elsetype); return thentype.baseType(); @@ -1601,12 +1605,12 @@ public class Attr extends JCTree.Visitor { // Attribute return expression, if it exists, and check that // it conforms to result type of enclosing method. if (tree.expr != null) { - if (env.info.returnResult.pt.tag == VOID) { + if (env.info.returnResult.pt.hasTag(VOID)) { log.error(tree.expr.pos(), "cant.ret.val.from.meth.decl.void"); } attribTree(tree.expr, env, env.info.returnResult); - } else if (env.info.returnResult.pt.tag != VOID) { + } else if (!env.info.returnResult.pt.hasTag(VOID)) { log.error(tree.pos(), "missing.ret.val"); } } @@ -1671,11 +1675,11 @@ public class Attr extends JCTree.Visitor { } } - if (site.tag == CLASS) { + if (site.hasTag(CLASS)) { Type encl = site.getEnclosingType(); - while (encl != null && encl.tag == TYPEVAR) + while (encl != null && encl.hasTag(TYPEVAR)) encl = encl.getUpperBound(); - if (encl.tag == CLASS) { + if (encl.hasTag(CLASS)) { // we are calling a nested class if (tree.meth.hasTag(SELECT)) { @@ -1740,7 +1744,7 @@ public class Attr extends JCTree.Visitor { // Compute the result type. Type restype = mtype.getReturnType(); - if (restype.tag == WILDCARD) + if (restype.hasTag(WILDCARD)) throw new AssertionError(mtype); Type qualifier = (tree.meth.hasTag(SELECT)) @@ -1870,7 +1874,7 @@ public class Attr extends JCTree.Visitor { } } } else if (!clazztype.tsym.isInterface() && - clazztype.getEnclosingType().tag == CLASS) { + clazztype.getEnclosingType().hasTag(CLASS)) { // Check for the existence of an apropos outer instance rs.resolveImplicitThis(tree.pos(), env, clazztype); } @@ -1880,7 +1884,7 @@ public class Attr extends JCTree.Visitor { List typeargtypes = attribTypes(tree.typeargs, localEnv); // If we have made no mistakes in the class type... - if (clazztype.tag == CLASS) { + if (clazztype.hasTag(CLASS)) { // Enums may not be instantiated except implicitly if (allowEnums && (clazztype.tsym.flags_field&Flags.ENUM) != 0 && @@ -2058,7 +2062,7 @@ public class Attr extends JCTree.Visitor { resultInfo.checkContext.inferenceContext().free(resultInfo.pt) ? Type.noType : pt()); Type inferred = deferredAttr.attribSpeculative(tree, env, findDiamondResult).type; if (!inferred.isErroneous() && - types.isAssignable(inferred, pt().tag == NONE ? syms.objectType : pt(), Warner.noWarnings)) { + types.isAssignable(inferred, pt().hasTag(NONE) ? syms.objectType : pt(), Warner.noWarnings)) { String key = types.isSameType(clazztype, inferred) ? "diamond.redundant.args" : "diamond.redundant.args.1"; @@ -2073,8 +2077,8 @@ public class Attr extends JCTree.Visitor { private void checkLambdaCandidate(JCNewClass tree, ClassSymbol csym, Type clazztype) { if (allowLambda && identifyLambdaCandidate && - clazztype.tag == CLASS && - pt().tag != NONE && + clazztype.hasTag(CLASS) && + !pt().hasTag(NONE) && types.isFunctionalInterface(clazztype.tsym)) { Symbol descriptor = types.findDescriptorSymbol(clazztype.tsym); int count = 0; @@ -2125,10 +2129,10 @@ public class Attr extends JCTree.Visitor { } else { // we are seeing an untyped aggregate { ... } // this is allowed only if the prototype is an array - if (pt().tag == ARRAY) { + if (pt().hasTag(ARRAY)) { elemtype = types.elemtype(pt()); } else { - if (pt().tag != ERROR) { + if (!pt().hasTag(ERROR)) { log.error(tree.pos(), "illegal.initializer.for.type", pt()); } @@ -2152,8 +2156,8 @@ public class Attr extends JCTree.Visitor { */ @Override public void visitLambda(final JCLambda that) { - if (pt().isErroneous() || (pt().tag == NONE && pt() != Type.recoveryType)) { - if (pt().tag == NONE) { + if (pt().isErroneous() || (pt().hasTag(NONE) && pt() != Type.recoveryType)) { + if (pt().hasTag(NONE)) { //lambda only allowed in assignment or method invocation/cast context log.error(that.pos(), "unexpected.lambda"); } @@ -2328,7 +2332,7 @@ public class Attr extends JCTree.Visitor { //this amounts at checking that, if a lambda body can complete normally, //the descriptor's return type must be void if (tree.getBodyKind() == JCLambda.BodyKind.STATEMENT && tree.canCompleteNormally && - returnType.tag != VOID && returnType != Type.recoveryType) { + !returnType.hasTag(VOID) && returnType != Type.recoveryType) { checkContext.report(tree, diags.fragment("incompatible.ret.type.in.lambda", diags.fragment("missing.ret.val", returnType))); } @@ -2363,8 +2367,8 @@ public class Attr extends JCTree.Visitor { @Override public void visitReference(final JCMemberReference that) { - if (pt().isErroneous() || (pt().tag == NONE && pt() != Type.recoveryType)) { - if (pt().tag == NONE) { + if (pt().isErroneous() || (pt().hasTag(NONE) && pt() != Type.recoveryType)) { + if (pt().hasTag(NONE)) { //method reference only allowed in assignment or method invocation/cast context log.error(that.pos(), "unexpected.mref"); } @@ -2465,7 +2469,7 @@ public class Attr extends JCTree.Visitor { ResultInfo checkInfo = resultInfo.dup(newMethodTemplate( - desc.getReturnType().tag == VOID ? Type.noType : desc.getReturnType(), + desc.getReturnType().hasTag(VOID) ? Type.noType : desc.getReturnType(), lookupHelper.argtypes, typeargtypes)); @@ -2510,11 +2514,11 @@ public class Attr extends JCTree.Visitor { Type incompatibleReturnType = resType; - if (returnType.tag == VOID) { + if (returnType.hasTag(VOID)) { incompatibleReturnType = null; } - if (returnType.tag != VOID && resType.tag != VOID) { + if (!returnType.hasTag(VOID) && !resType.hasTag(VOID)) { if (resType.isErroneous() || new LambdaReturnContext(checkContext).compatible(resType, returnType, Warner.noWarnings)) { incompatibleReturnType = null; @@ -2711,7 +2715,7 @@ public class Attr extends JCTree.Visitor { attribExpr(tree.index, env, syms.intType); if (types.isArray(atype)) owntype = types.elemtype(atype); - else if (atype.tag != ERROR) + else if (!atype.hasTag(ERROR)) log.error(tree.pos(), "array.req.but.found", atype); if ((pkind() & VAR) == 0) owntype = capture(owntype); result = check(tree, owntype, VAR, resultInfo); @@ -2721,7 +2725,7 @@ public class Attr extends JCTree.Visitor { Symbol sym; // Find symbol - if (pt().tag == METHOD || pt().tag == FORALL) { + if (pt().hasTag(METHOD) || pt().hasTag(FORALL)) { // If we are looking for a method, the prototype `pt' will be a // method type with the type of the call's arguments as parameters. env.info.pendingResolutionPhase = null; @@ -2811,9 +2815,9 @@ public class Attr extends JCTree.Visitor { // don't allow T.class T[].class, etc if (skind == TYP) { Type elt = site; - while (elt.tag == ARRAY) + while (elt.hasTag(ARRAY)) elt = ((ArrayType)elt).elemtype; - if (elt.tag == TYPEVAR) { + if (elt.hasTag(TYPEVAR)) { log.error(tree.pos(), "type.var.cant.be.deref"); result = types.createErrorType(tree.type); return; @@ -2839,8 +2843,8 @@ public class Attr extends JCTree.Visitor { boolean varArgs = env.info.lastResolveVarargs(); tree.sym = sym; - if (site.tag == TYPEVAR && !isType(sym) && sym.kind != ERR) { - while (site.tag == TYPEVAR) site = site.getUpperBound(); + if (site.hasTag(TYPEVAR) && !isType(sym) && sym.kind != ERR) { + while (site.hasTag(TYPEVAR)) site = site.getUpperBound(); site = capture(site); } @@ -2929,14 +2933,14 @@ public class Attr extends JCTree.Visitor { ResultInfo resultInfo) { DiagnosticPosition pos = tree.pos(); Name name = tree.name; - switch (site.tag) { + switch (site.getTag()) { case PACKAGE: return rs.accessBase( rs.findIdentInPackage(env, site.tsym, name, resultInfo.pkind), pos, location, site, name, true); case ARRAY: case CLASS: - if (resultInfo.pt.tag == METHOD || resultInfo.pt.tag == FORALL) { + if (resultInfo.pt.hasTag(METHOD) || resultInfo.pt.hasTag(FORALL)) { return rs.resolveQualifiedMethod( pos, env, location, site, name, resultInfo.pt.getParameterTypes(), resultInfo.pt.getTypeArguments()); } else if (name == names._this || name == names._super) { @@ -3029,7 +3033,7 @@ public class Attr extends JCTree.Visitor { Symbol sym, Env env, ResultInfo resultInfo) { - Type pt = resultInfo.pt.tag == FORALL || resultInfo.pt.tag == METHOD ? + Type pt = resultInfo.pt.hasTag(FORALL) || resultInfo.pt.hasTag(METHOD) ? resultInfo.pt.map(deferredAttr.new DeferredTypeMap(AttrMode.SPECULATIVE, sym, env.info.pendingResolutionPhase)) : resultInfo.pt; @@ -3046,7 +3050,7 @@ public class Attr extends JCTree.Visitor { // For types, the computed type equals the symbol's type, // except for two situations: owntype = sym.type; - if (owntype.tag == CLASS) { + if (owntype.hasTag(CLASS)) { Type ownOuter = owntype.getEnclosingType(); // (a) If the symbol's type is parameterized, erase it @@ -3066,9 +3070,9 @@ public class Attr extends JCTree.Visitor { // // Then the type of the last expression above is // Tree.Visitor. - else if (ownOuter.tag == CLASS && site != ownOuter) { + else if (ownOuter.hasTag(CLASS) && site != ownOuter) { Type normOuter = site; - if (normOuter.tag == CLASS) + if (normOuter.hasTag(CLASS)) normOuter = types.asEnclosingSuper(site, ownOuter.tsym); if (normOuter == null) // perhaps from an import normOuter = types.erasure(ownOuter); @@ -3087,7 +3091,7 @@ public class Attr extends JCTree.Visitor { resultInfo.pkind == VAR && v.owner.kind == TYP && (v.flags() & STATIC) == 0 && - (site.tag == CLASS || site.tag == TYPEVAR)) { + (site.hasTag(CLASS) || site.hasTag(TYPEVAR))) { Type s = types.asOuterSuper(site, v.owner); if (s != null && s.isRaw() && @@ -3266,7 +3270,7 @@ public class Attr extends JCTree.Visitor { // an unchecked warning if its argument types change under erasure. if (allowGenerics && (sym.flags() & STATIC) == 0 && - (site.tag == CLASS || site.tag == TYPEVAR)) { + (site.hasTag(CLASS) || site.hasTag(TYPEVAR))) { Type s = types.asOuterSuper(site, sym.owner); if (s != null && s.isRaw() && !types.isSameTypes(sym.type.getParameterTypes(), @@ -3312,12 +3316,12 @@ public class Attr extends JCTree.Visitor { //where /** Return the type of a literal with given type tag. */ - Type litType(int tag) { - return (tag == TypeTags.CLASS) ? syms.stringType : syms.typeOfTag[tag]; + Type litType(TypeTag tag) { + return (tag == CLASS) ? syms.stringType : syms.typeOfTag[tag.ordinal()]; } public void visitTypeIdent(JCPrimitiveTypeTree tree) { - result = check(tree, syms.typeOfTag[tree.typetag], TYP, resultInfo); + result = check(tree, syms.typeOfTag[tree.typetag.ordinal()], TYP, resultInfo); } public void visitTypeArray(JCArrayTypeTree tree) { @@ -3339,7 +3343,7 @@ public class Attr extends JCTree.Visitor { // Attribute type parameters List actuals = attribTypes(tree.arguments, env); - if (clazztype.tag == CLASS) { + if (clazztype.hasTag(CLASS)) { List formals = clazztype.tsym.type.getTypeArguments(); if (actuals.isEmpty()) //diamond actuals = formals; @@ -3354,7 +3358,7 @@ public class Attr extends JCTree.Visitor { } // Compute the proper generic outer Type clazzOuter = clazztype.getEnclosingType(); - if (clazzOuter.tag == CLASS) { + if (clazzOuter.hasTag(CLASS)) { Type site; JCExpression clazz = TreeInfo.typeIn(tree.clazz); if (clazz.hasTag(IDENT)) { @@ -3362,8 +3366,8 @@ public class Attr extends JCTree.Visitor { } else if (clazz.hasTag(SELECT)) { site = ((JCFieldAccess) clazz).selected.type; } else throw new AssertionError(""+tree); - if (clazzOuter.tag == CLASS && site != clazzOuter) { - if (site.tag == CLASS) + if (clazzOuter.hasTag(CLASS) && site != clazzOuter) { + if (site.hasTag(CLASS)) site = types.asOuterSuper(site, clazzOuter.tsym); if (site == null) site = types.erasure(clazzOuter); @@ -3419,7 +3423,7 @@ public class Attr extends JCTree.Visitor { } } Type t = check(tree, types.lub(multicatchTypes.toList()), TYP, resultInfo); - if (t.tag == CLASS) { + if (t.hasTag(CLASS)) { List alternatives = ((all_multicatchTypes == null) ? multicatchTypes : all_multicatchTypes).toList(); t = new UnionClassType((ClassType) t, alternatives); @@ -3440,7 +3444,7 @@ public class Attr extends JCTree.Visitor { if (b.isErroneous()) { a.bound = b; } - else if (b.tag == TYPEVAR) { + else if (b.hasTag(TYPEVAR)) { // if first bound was a typevar, do not accept further bounds. if (tree.bounds.tail.nonEmpty()) { log.error(tree.bounds.tail.head.pos(), @@ -3456,7 +3460,7 @@ public class Attr extends JCTree.Visitor { Type i = checkBase(bs.head, bound, env, false, true, false); if (i.isErroneous()) a.bound = i; - else if (i.tag == CLASS) + else if (i.hasTag(CLASS)) chk.checkNotRepeated(bound.pos(), types.erasure(i), boundSet); } } @@ -3568,7 +3572,7 @@ public class Attr extends JCTree.Visitor { * @param c The class symbol whose definition will be attributed. */ void attribClass(ClassSymbol c) throws CompletionFailure { - if (c.type.tag == ERROR) return; + if (c.type.hasTag(ERROR)) return; // Check for cycles in the inheritance graph, which can arise from // ill-formed class files. @@ -3577,11 +3581,11 @@ public class Attr extends JCTree.Visitor { Type st = types.supertype(c.type); if ((c.flags_field & Flags.COMPOUND) == 0) { // First, attribute superclass. - if (st.tag == CLASS) + if (st.hasTag(CLASS)) attribClass((ClassSymbol)st.tsym); // Next attribute owner, if it is a class. - if (c.owner.kind == TYP && c.owner.type.tag == CLASS) + if (c.owner.kind == TYP && c.owner.type.hasTag(CLASS)) attribClass((ClassSymbol)c.owner); } @@ -3793,7 +3797,7 @@ public class Attr extends JCTree.Visitor { TreeInfo.diagnosticPositionFor(svuid, tree), "improper.SVUID", c); // check that it is long - else if (svuid.type.tag != TypeTags.LONG) + else if (!svuid.type.hasTag(LONG)) log.warning(LintCategory.SERIAL, TreeInfo.diagnosticPositionFor(svuid, tree), "long.SVUID", c); 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 d1679293569..0346d6d2b6b 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 @@ -48,8 +48,8 @@ import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.ANNOTATION; import static com.sun.tools.javac.code.Flags.SYNCHRONIZED; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; -import static com.sun.tools.javac.code.TypeTags.WILDCARD; +import static com.sun.tools.javac.code.TypeTag.*; +import static com.sun.tools.javac.code.TypeTag.WILDCARD; import static com.sun.tools.javac.tree.JCTree.Tag.*; @@ -280,7 +280,7 @@ public class Check { Type typeTagError(DiagnosticPosition pos, Object required, Object found) { // this error used to be raised by the parser, // but has been delayed to this point: - if (found instanceof Type && ((Type)found).tag == VOID) { + if (found instanceof Type && ((Type)found).hasTag(VOID)) { log.error(pos, "illegal.start.of.type"); return syms.errType; } @@ -358,7 +358,7 @@ public class Check { for (Scope.Entry e = s.next.lookup(c.name); e.scope != null && e.sym.owner == c.owner; e = e.next()) { - if (e.sym.kind == TYP && e.sym.type.tag != TYPEVAR && + if (e.sym.kind == TYP && !e.sym.type.hasTag(TYPEVAR) && (e.sym.owner.kind & (VAR | MTH)) != 0 && c.name != names.error) { duplicateError(pos, e.sym); @@ -527,14 +527,14 @@ public class Check { } }); } - if (req.tag == ERROR) + if (req.hasTag(ERROR)) return req; - if (req.tag == NONE) + if (req.hasTag(NONE)) return found; if (checkContext.compatible(found, req, checkContext.checkWarner(pos, found, req))) { return found; } else { - if (found.tag <= DOUBLE && req.tag <= DOUBLE) { + if (found.getTag().isSubRangeOf(DOUBLE) && req.getTag().isSubRangeOf(DOUBLE)) { checkContext.report(pos, diags.fragment("possible.loss.of.precision", found, req)); return types.createErrorType(found); } @@ -594,7 +594,7 @@ public class Check { * type variables? */ boolean isTypeVar(Type t) { - return t.tag == TYPEVAR || t.tag == ARRAY && isTypeVar(types.elemtype(t)); + return t.hasTag(TYPEVAR) || t.hasTag(ARRAY) && isTypeVar(types.elemtype(t)); } /** Check that a type is within some bounds. @@ -607,7 +607,7 @@ public class Check { private boolean checkExtends(Type a, Type bound) { if (a.isUnbound()) { return true; - } else if (a.tag != WILDCARD) { + } else if (!a.hasTag(WILDCARD)) { a = types.upperBound(a); return types.isSubtype(a, bound); } else if (a.isExtendsBound()) { @@ -623,7 +623,7 @@ public class Check { * @param t The type to be checked. */ Type checkNonVoid(DiagnosticPosition pos, Type t) { - if (t.tag == VOID) { + if (t.hasTag(VOID)) { log.error(pos, "void.not.allowed.here"); return types.createErrorType(t); } else { @@ -636,10 +636,10 @@ public class Check { * @param t The type to be checked. */ Type checkClassType(DiagnosticPosition pos, Type t) { - if (t.tag != CLASS && t.tag != ERROR) + if (!t.hasTag(CLASS) && !t.hasTag(ERROR)) return typeTagError(pos, diags.fragment("type.req.class"), - (t.tag == TYPEVAR) + (t.hasTag(TYPEVAR)) ? diags.fragment("type.parameter", t) : t); else @@ -650,7 +650,7 @@ public class Check { */ Type checkConstructorRefType(DiagnosticPosition pos, Type t) { t = checkClassType(pos, t); - if (t.tag == CLASS) { + if (t.hasTag(CLASS)) { if ((t.tsym.flags() & (ABSTRACT | INTERFACE)) != 0) { log.error(pos, "abstract.cant.be.instantiated"); t = types.createErrorType(t); @@ -672,7 +672,7 @@ public class Check { if (noBounds && t.isParameterized()) { List args = t.getTypeArguments(); while (args.nonEmpty()) { - if (args.head.tag == WILDCARD) + if (args.head.hasTag(WILDCARD)) return typeTagError(pos, diags.fragment("type.req.exact"), args.head); @@ -687,7 +687,7 @@ public class Check { * @param t The type to be checked. */ Type checkReifiableReferenceType(DiagnosticPosition pos, Type t) { - if (t.tag != CLASS && t.tag != ARRAY && t.tag != ERROR) { + if (!t.hasTag(CLASS) && !t.hasTag(ARRAY) && !t.hasTag(ERROR)) { return typeTagError(pos, diags.fragment("type.req.class.array"), t); @@ -705,18 +705,12 @@ public class Check { * @param t The type to be checked. */ Type checkRefType(DiagnosticPosition pos, Type t) { - switch (t.tag) { - case CLASS: - case ARRAY: - case TYPEVAR: - case WILDCARD: - case ERROR: + if (t.isReference()) return t; - default: + else return typeTagError(pos, diags.fragment("type.req.ref"), t); - } } /** Check that each type is a reference type, i.e. a class, interface or array type @@ -738,19 +732,12 @@ public class Check { * @param t The type to be checked. */ Type checkNullOrRefType(DiagnosticPosition pos, Type t) { - switch (t.tag) { - case CLASS: - case ARRAY: - case TYPEVAR: - case WILDCARD: - case BOT: - case ERROR: + if (t.isNullOrReference()) return t; - default: + else return typeTagError(pos, diags.fragment("type.req.ref"), t); - } } /** Check that flag set does not contain elements of two conflicting sets. s @@ -1054,7 +1041,7 @@ public class Check { bounds = bounds_buf.toList(); for (Type arg : types.capture(type).getTypeArguments()) { - if (arg.tag == TYPEVAR && + if (arg.hasTag(TYPEVAR) && arg.getUpperBound().isErroneous() && !bounds.head.isErroneous() && !isTypeArgErroneous(args.head)) { @@ -1309,7 +1296,7 @@ public class Check { @Override public void visitTypeApply(JCTypeApply tree) { - if (tree.type.tag == CLASS) { + if (tree.type.hasTag(CLASS)) { List args = tree.arguments; List forms = tree.type.tsym.type.getTypeArguments(); @@ -1360,7 +1347,7 @@ public class Check { @Override public void visitSelect(JCFieldAccess tree) { - if (tree.type.tag == CLASS) { + if (tree.type.hasTag(CLASS)) { visitSelectInternal(tree); // Check that this type is either fully parameterized, or @@ -1409,7 +1396,7 @@ public class Check { void checkRaw(JCTree tree, Env env) { if (lint.isEnabled(LintCategory.RAW) && - tree.type.tag == CLASS && + tree.type.hasTag(CLASS) && !TreeInfo.isDiamond(tree) && !withinAnonConstr(env) && tree.type.isRaw()) { @@ -1511,9 +1498,9 @@ public class Check { */ boolean isUnchecked(Type exc) { return - (exc.tag == TYPEVAR) ? isUnchecked(types.supertype(exc)) : - (exc.tag == CLASS) ? isUnchecked((ClassSymbol)exc.tsym) : - exc.tag == BOT; + (exc.hasTag(TYPEVAR)) ? isUnchecked(types.supertype(exc)) : + (exc.hasTag(CLASS)) ? isUnchecked((ClassSymbol)exc.tsym) : + exc.hasTag(BOT); } /** Same, but handling completion failures. @@ -1759,7 +1746,7 @@ public class Check { // case, we will have dealt with when examining the supertype classes ClassSymbol mc = m.enclClass(); Type st = types.supertype(origin.type); - if (st.tag != CLASS) + if (!st.hasTag(CLASS)) return true; MethodSymbol stimpl = m.implementation((ClassSymbol)st.tsym, types, false); @@ -1782,7 +1769,7 @@ public class Check { */ public void checkCompatibleConcretes(DiagnosticPosition pos, Type site) { Type sup = types.supertype(site); - if (sup.tag != CLASS) return; + if (!sup.hasTag(CLASS)) return; for (Type t1 = sup; t1.tsym.type.isParameterized(); @@ -1803,7 +1790,7 @@ public class Check { if (st1 == s1.type) continue; for (Type t2 = sup; - t2.tag == CLASS; + t2.hasTag(CLASS); t2 = types.supertype(t2)) { for (Scope.Entry e2 = t2.tsym.members().lookup(s1.name); e2.scope != null; @@ -1876,7 +1863,7 @@ public class Check { /** Compute all the supertypes of t, indexed by type symbol. */ private void closure(Type t, Map typeMap) { - if (t.tag != CLASS) return; + if (!t.hasTag(CLASS)) return; if (typeMap.put(t.tsym, t) == null) { closure(types.supertype(t), typeMap); for (Type i : types.interfaces(t)) @@ -1886,7 +1873,7 @@ public class Check { /** Compute all the supertypes of t, indexed by type symbol (except thise in typesSkip). */ private void closure(Type t, Map typesSkip, Map typeMap) { - if (t.tag != CLASS) return; + if (!t.hasTag(CLASS)) return; if (typesSkip.get(t.tsym) != null) return; if (typeMap.put(t.tsym, t) == null) { closure(types.supertype(t), typesSkip, typeMap); @@ -1916,7 +1903,8 @@ public class Check { Type rt2 = types.subst(st2.getReturnType(), tvars2, tvars1); boolean compat = types.isSameType(rt1, rt2) || - rt1.tag >= CLASS && rt2.tag >= CLASS && + !rt1.isPrimitiveOrVoid() && + !rt2.isPrimitiveOrVoid() && (types.covariantReturnType(rt1, rt2, Warner.noWarnings) || types.covariantReturnType(rt2, rt1, Warner.noWarnings)) || checkCommonOverriderIn(s1,s2,site); @@ -1961,7 +1949,8 @@ public class Check { Type rt13 = types.subst(st3.getReturnType(), tvars3, tvars1); Type rt23 = types.subst(st3.getReturnType(), tvars3, tvars2); boolean compat = - rt13.tag >= CLASS && rt23.tag >= CLASS && + !rt13.isPrimitiveOrVoid() && + !rt23.isPrimitiveOrVoid() && (types.covariantReturnType(rt13, rt1, Warner.noWarnings) && types.covariantReturnType(rt23, rt2, Warner.noWarnings)); if (compat) @@ -1984,7 +1973,7 @@ public class Check { log.error(tree.pos(), "enum.no.finalize"); return; } - for (Type t = origin.type; t.tag == CLASS; + for (Type t = origin.type; t.hasTag(CLASS); t = types.supertype(t)) { if (t != origin.type) { checkOverride(tree, t, origin, m); @@ -2064,7 +2053,7 @@ public class Check { } if (undef == null) { Type st = types.supertype(c.type); - if (st.tag == CLASS) + if (st.hasTag(CLASS)) undef = firstUndef(impl, (ClassSymbol)st.tsym); } for (List l = types.interfaces(c.type); @@ -2155,7 +2144,7 @@ public class Check { } else if (!c.type.isErroneous()) { try { seenClasses = seenClasses.prepend(c); - if (c.type.tag == CLASS) { + if (c.type.hasTag(CLASS)) { if (supertypes.nonEmpty()) { scan(supertypes); } @@ -2200,13 +2189,13 @@ public class Check { private void checkNonCyclic1(DiagnosticPosition pos, Type t, List seen) { final TypeVar tv; - if (t.tag == TYPEVAR && (t.tsym.flags() & UNATTRIBUTED) != 0) + if (t.hasTag(TYPEVAR) && (t.tsym.flags() & UNATTRIBUTED) != 0) return; if (seen.contains(t)) { tv = (TypeVar)t; tv.bound = types.createErrorType(t); log.error(pos, "cyclic.inheritance", t); - } else if (t.tag == TYPEVAR) { + } else if (t.hasTag(TYPEVAR)) { tv = (TypeVar)t; seen = seen.prepend(tv); for (Type b : types.getBounds(tv)) @@ -2232,14 +2221,14 @@ public class Check { } else if (!c.type.isErroneous()) { try { c.flags_field |= LOCKED; - if (c.type.tag == CLASS) { + if (c.type.hasTag(CLASS)) { ClassType clazz = (ClassType)c.type; if (clazz.interfaces_field != null) for (List l=clazz.interfaces_field; l.nonEmpty(); l=l.tail) complete &= checkNonCyclicInternal(pos, l.head); if (clazz.supertype_field != null) { Type st = clazz.supertype_field; - if (st != null && st.tag == CLASS) + if (st != null && st.hasTag(CLASS)) complete &= checkNonCyclicInternal(pos, st); } if (c.owner.kind == TYP) @@ -2261,7 +2250,7 @@ public class Check { for (List l=types.interfaces(c.type); l.nonEmpty(); l=l.tail) l.head = types.createErrorType((ClassSymbol)l.head.tsym, Type.noType); Type st = types.supertype(c.type); - if (st.tag == CLASS) + if (st.hasTag(CLASS)) ((ClassType)c.type).supertype_field = types.createErrorType((ClassSymbol)st.tsym, Type.noType); c.type = types.createErrorType(c, c.type); c.flags_field |= ACYCLIC; @@ -2313,7 +2302,7 @@ public class Check { void checkCompatibleSupertypes(DiagnosticPosition pos, Type c) { List supertypes = types.interfaces(c); Type supertype = types.supertype(c); - if (supertype.tag == CLASS && + if (supertype.hasTag(CLASS) && (supertype.tsym.flags() & ABSTRACT) != 0) supertypes = supertypes.prepend(supertype); for (List l = supertypes; l.nonEmpty(); l = l.tail) { @@ -2542,7 +2531,7 @@ public class Check { * @jls 9.6 Annotation Types */ void validateAnnotationMethod(DiagnosticPosition pos, MethodSymbol m) { - for (Type sup = syms.annotationType; sup.tag == CLASS; sup = types.supertype(sup)) { + for (Type sup = syms.annotationType; sup.hasTag(CLASS); sup = types.supertype(sup)) { Scope s = sup.tsym.members(); for (Scope.Entry e = s.lookup(m.name); e.scope != null; e = e.next()) { if (e.sym.kind == MTH && @@ -2855,7 +2844,7 @@ public class Check { { if (s.kind == TYP || s.kind == VAR || (s.kind == MTH && !s.isConstructor() && - s.type.getReturnType().tag != VOID)) + !s.type.getReturnType().hasTag(VOID))) return true; } else @@ -3016,12 +3005,12 @@ public class Check { } void checkAnnotationResType(DiagnosticPosition pos, Type type) { - switch (type.tag) { - case TypeTags.CLASS: + switch (type.getTag()) { + case CLASS: if ((type.tsym.flags() & ANNOTATION) != 0) checkNonCyclicElementsInternal(pos, type.tsym); break; - case TypeTags.ARRAY: + case ARRAY: checkAnnotationResType(pos, types.elemtype(type)); break; default: @@ -3114,7 +3103,7 @@ public class Check { void checkDivZero(DiagnosticPosition pos, Symbol operator, Type operand) { if (operand.constValue() != null && lint.isEnabled(LintCategory.DIVZERO) - && operand.tag <= LONG + && (operand.getTag().isSubRangeOf(LONG)) && ((Number) (operand.constValue())).longValue() == 0) { int opc = ((OperatorSymbol)operator).opcode; if (opc == ByteCodes.idiv || opc == ByteCodes.imod diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java b/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java index cd017d4e5e6..a0f9ec1b04b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,8 @@ import com.sun.tools.javac.util.*; import com.sun.tools.javac.code.Type.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.BOOLEAN; + import static com.sun.tools.javac.jvm.ByteCodes.*; /** Helper class for constant folding, used by the attribution phase. @@ -176,19 +177,19 @@ strictfp class ConstFold { case imod: return syms.intType.constType(intValue(l) % intValue(r)); case iand: - return (left.tag == BOOLEAN + return (left.hasTag(BOOLEAN) ? syms.booleanType : syms.intType) .constType(intValue(l) & intValue(r)); case bool_and: return syms.booleanType.constType(b2i((intValue(l) & intValue(r)) != 0)); case ior: - return (left.tag == BOOLEAN + return (left.hasTag(BOOLEAN) ? syms.booleanType : syms.intType) .constType(intValue(l) | intValue(r)); case bool_or: return syms.booleanType.constType(b2i((intValue(l) | intValue(r)) != 0)); case ixor: - return (left.tag == BOOLEAN + return (left.hasTag(BOOLEAN) ? syms.booleanType : syms.intType) .constType(intValue(l) ^ intValue(r)); case ishl: case ishll: @@ -326,7 +327,7 @@ strictfp class ConstFold { /** Coerce constant type to target type. * @param etype The source type of the coercion, - * which is assumed to be a constant type compatble with + * which is assumed to be a constant type compatible with * ttype. * @param ttype The target type of the coercion. */ @@ -334,9 +335,9 @@ strictfp class ConstFold { // WAS if (etype.baseType() == ttype.baseType()) if (etype.tsym.type == ttype.tsym.type) return etype; - if (etype.tag <= DOUBLE) { + if (etype.isNumeric()) { Object n = etype.constValue(); - switch (ttype.tag) { + switch (ttype.getTag()) { case BYTE: return syms.byteType.constType(0 + (byte)intValue(n)); case CHAR: diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java index 2b6d0d72e51..d9ef24ffedc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java @@ -44,7 +44,8 @@ import java.util.Queue; import java.util.Set; import java.util.WeakHashMap; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.DEFERRED; +import static com.sun.tools.javac.code.TypeTag.NONE; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** @@ -203,7 +204,7 @@ public class DeferredAttr extends JCTree.Visitor { case SPECULATIVE: Assert.check(mode == null || (mode == AttrMode.SPECULATIVE && - speculativeType(deferredAttrContext.msym, deferredAttrContext.phase).tag == NONE)); + speculativeType(deferredAttrContext.msym, deferredAttrContext.phase).hasTag(NONE))); JCTree speculativeTree = attribSpeculative(tree, env, resultInfo); speculativeCache.put(deferredAttrContext.msym, speculativeTree, deferredAttrContext.phase); return speculativeTree.type; @@ -442,7 +443,7 @@ public class DeferredAttr extends JCTree.Visitor { @Override public Type apply(Type t) { - if (t.tag != DEFERRED) { + if (!t.hasTag(DEFERRED)) { return t.map(this); } else { DeferredType dt = (DeferredType)t; @@ -479,7 +480,7 @@ public class DeferredAttr extends JCTree.Visitor { @Override protected Type typeOf(DeferredType dt) { Type owntype = super.typeOf(dt); - return owntype.tag == NONE ? + return owntype.hasTag(NONE) ? recover(dt) : owntype; } @@ -516,7 +517,7 @@ public class DeferredAttr extends JCTree.Visitor { */ @SuppressWarnings("fallthrough") List stuckVars(JCTree tree, ResultInfo resultInfo) { - if (resultInfo.pt.tag == NONE || resultInfo.pt.isErroneous()) { + if (resultInfo.pt.hasTag(NONE) || resultInfo.pt.isErroneous()) { return List.nil(); } else { StuckChecker sc = new StuckChecker(resultInfo); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java index 00534ce9c46..ccf7a82badd 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java @@ -49,7 +49,7 @@ import static com.sun.tools.javac.code.Kinds.*; * the symbol table. The pass consists of two phases, organized as * follows: * - *

    In the first phase, all class symbols are intered into their + *

    In the first phase, all class symbols are entered into their * enclosing scope, descending recursively down the tree for classes * which are members of other classes. The class symbols are given a * MemberEnter object as completer. diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java index e616097e4f0..3ea31c9b9e8 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java @@ -40,7 +40,8 @@ import com.sun.tools.javac.tree.JCTree.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.BLOCK; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.BOOLEAN; +import static com.sun.tools.javac.code.TypeTag.VOID; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** This pass implements dataflow analysis for Java programs though @@ -473,7 +474,7 @@ public class Flow { alive = true; scanStat(tree.body); - if (alive && tree.sym.type.getReturnType().tag != VOID) + if (alive && !tree.sym.type.getReturnType().hasTag(VOID)) log.error(TreeInfo.diagEndPos(tree.body), "missing.ret.stmt"); List exits = pendingExits.toList(); @@ -1976,8 +1977,8 @@ public class Flow { Bits uninitsBeforeElse = uninitsWhenFalse; inits = initsWhenTrue; uninits = uninitsWhenTrue; - if (tree.truepart.type.tag == BOOLEAN && - tree.falsepart.type.tag == BOOLEAN) { + if (tree.truepart.type.hasTag(BOOLEAN) && + tree.falsepart.type.hasTag(BOOLEAN)) { // if b and c are boolean valued, then // v is (un)assigned after a?b:c when true iff // v is (un)assigned after b when true and diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java index bfd3c4eefeb..31e7ade9185 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java @@ -42,7 +42,7 @@ import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import java.util.HashMap; import java.util.Map; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; /** Helper class for type parameter inference, used by the attribution phase. * @@ -145,7 +145,7 @@ public class Infer { private Filter boundFilter = new Filter() { @Override public boolean accepts(Type t) { - return !t.isErroneous() && t.tag != BOT; + return !t.isErroneous() && !t.hasTag(BOT); } }; @@ -163,7 +163,7 @@ public class Infer { else { that.inst = types.lub(lobounds); } - if (that.inst == null || that.inst.tag == ERROR) + if (that.inst == null || that.inst.hasTag(ERROR)) throw inferenceException .setMessage("no.unique.minimal.instance.exists", that.qtype, lobounds); @@ -189,13 +189,13 @@ public class Infer { Attr.ResultInfo resultInfo, Warner warn) throws InferenceException { Type to = resultInfo.pt; - if (to.tag == NONE || resultInfo.checkContext.inferenceContext().free(resultInfo.pt)) { - to = mtype.getReturnType().tag <= VOID ? + if (to.hasTag(NONE) || resultInfo.checkContext.inferenceContext().free(resultInfo.pt)) { + to = mtype.getReturnType().isPrimitiveOrVoid() ? mtype.getReturnType() : syms.objectType; } Type qtype1 = inferenceContext.asFree(mtype.getReturnType(), types); if (!types.isSubtype(qtype1, - qtype1.tag == UNDETVAR ? types.boxedTypeOrType(to) : to)) { + qtype1.hasTag(UNDETVAR) ? types.boxedTypeOrType(to) : to)) { throw inferenceException .setMessage("infer.no.conforming.instance.exists", inferenceContext.restvars(), mtype.getReturnType(), to); @@ -515,7 +515,7 @@ public class Infer { //for remaining uninferred type-vars in the functional interface type, //simply replace the wildcards with its bound for (Type t : formalInterface.getTypeArguments()) { - if (actualTypeargs.head.tag == WILDCARD) { + if (actualTypeargs.head.hasTag(WILDCARD)) { WildcardType wt = (WildcardType)actualTypeargs.head; typeargs.append(wt.type); } else { @@ -592,7 +592,7 @@ public class Infer { public Type apply(Type t) { t = types.erasure(super.apply(t)); - if (t.tag == BOT) + if (t.hasTag(BOT)) // nulls type as the marker type Null (which has no instances) // infer as java.lang.Void for now t = types.boxedClass(syms.voidType).type; @@ -614,7 +614,7 @@ public class Infer { } public Type apply(Type t) { - if (t.tag == TYPEVAR) return new UndetVar((TypeVar)t, types, includeBounds); + if (t.hasTag(TYPEVAR)) return new UndetVar((TypeVar)t, types, includeBounds); else return t.map(this); } }; 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 120c429e4ef..c52ffb76460 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 @@ -45,7 +45,7 @@ import com.sun.tools.javac.tree.EndPosTable; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.BLOCK; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.jvm.ByteCodes.*; import static com.sun.tools.javac.tree.JCTree.Tag.*; @@ -485,7 +485,7 @@ public class Lower extends TreeTranslator { * @param value The literal's value. */ JCExpression makeLit(Type type, Object value) { - return make.Literal(type.tag, value).setType(type.constType(value)); + return make.Literal(type.getTag(), value).setType(type.constType(value)); } /** Make an attributed tree representing null. @@ -549,7 +549,7 @@ public class Lower extends TreeTranslator { * reference type.. */ JCExpression makeString(JCExpression tree) { - if (tree.type.tag >= CLASS) { + if (!tree.type.isPrimitiveOrVoid()) { return tree; } else { Symbol valueOfSym = lookupMethod(tree.pos(), @@ -1405,7 +1405,7 @@ public class Lower extends TreeTranslator { Name outerThisName(Type type, Symbol owner) { Type t = type.getEnclosingType(); int nestingLevel = 0; - while (t.tag == CLASS) { + while (t.hasTag(CLASS)) { t = t.getEnclosingType(); nestingLevel++; } @@ -1529,7 +1529,7 @@ public class Lower extends TreeTranslator { new VarSymbol(SYNTHETIC | FINAL, makeSyntheticName(names.fromString("twrVar" + depth), twrVars), - (resource.type.tag == TypeTags.BOT) ? + (resource.type.hasTag(BOT)) ? syms.autoCloseableType : resource.type, currentMethodSym); twrVars.enter(syntheticTwrVar); @@ -1992,7 +1992,7 @@ public class Lower extends TreeTranslator { } private JCExpression classOfType(Type type, DiagnosticPosition pos) { - switch (type.tag) { + switch (type.getTag()) { case BYTE: case SHORT: case CHAR: case INT: case LONG: case FLOAT: case DOUBLE: case BOOLEAN: case VOID: // replace with .TYPE @@ -2761,7 +2761,7 @@ public class Lower extends TreeTranslator { } //where private JCTree convert(JCTree tree, Type pt) { - if (tree.type == pt || tree.type.tag == TypeTags.BOT) + if (tree.type == pt || tree.type.hasTag(BOT)) return tree; JCTree result = make_at(tree.pos()).TypeCast(make.Type(pt), (JCExpression)tree); result.type = (tree.type.constValue() != null) ? cfolder.coerce(tree.type, pt) @@ -2934,7 +2934,7 @@ public class Lower extends TreeTranslator { return tree; if (havePrimitive) { Type unboxedTarget = types.unboxedType(type); - if (unboxedTarget.tag != NONE) { + if (!unboxedTarget.hasTag(NONE)) { if (!types.isSubtype(tree.type, unboxedTarget)) //e.g. Character c = 89; tree.type = unboxedTarget.constType(tree.type.constValue()); return (T)boxPrimitive((JCExpression)tree, type); @@ -2974,7 +2974,7 @@ public class Lower extends TreeTranslator { /** Unbox an object to a primitive value. */ JCExpression unbox(JCExpression tree, Type primitive) { Type unboxedType = types.unboxedType(tree.type); - if (unboxedType.tag == NONE) { + if (unboxedType.hasTag(NONE)) { unboxedType = primitive; if (!unboxedType.isPrimitive()) throw new AssertionError(unboxedType); @@ -3292,7 +3292,7 @@ public class Lower extends TreeTranslator { iteratorTarget = types.erasure(iterableType.getTypeArguments().head); Type eType = tree.expr.type; tree.expr.type = types.erasure(eType); - if (eType.tag == TYPEVAR && eType.getUpperBound().isCompound()) + if (eType.hasTag(TYPEVAR) && eType.getUpperBound().isCompound()) tree.expr = make.TypeCast(types.erasure(iterableType), tree.expr); Symbol iterator = lookupMethod(tree.expr.pos(), names.iterator, diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java index 85397fc91b4..d1e09936df0 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java @@ -42,7 +42,9 @@ import com.sun.tools.javac.tree.JCTree.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.ANNOTATION; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.ERROR; +import static com.sun.tools.javac.code.TypeTag.TYPEVAR; import static com.sun.tools.javac.tree.JCTree.Tag.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; @@ -370,7 +372,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { ListBuffer thrownbuf = new ListBuffer(); for (List l = thrown; l.nonEmpty(); l = l.tail) { Type exc = attr.attribType(l.head, env); - if (exc.tag != TYPEVAR) + if (!exc.hasTag(TYPEVAR)) exc = chk.checkClassType(l.head.pos(), exc); thrownbuf.append(exc); } @@ -921,7 +923,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { } for (JCExpression iface : interfaceTrees) { Type i = attr.attribBase(iface, baseEnv, false, true, true); - if (i.tag == CLASS) { + if (i.hasTag(CLASS)) { interfaces.append(i); if (all_interfaces != null) all_interfaces.append(i); chk.checkNotRepeated(iface.pos(), types.erasure(i), interfaceSet); @@ -1006,7 +1008,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { new VarSymbol(FINAL | HASINIT, names._this, c.type, c); thisSym.pos = Position.FIRSTPOS; env.info.scope.enter(thisSym); - if (ct.supertype_field.tag == CLASS) { + if (ct.supertype_field.hasTag(CLASS)) { VarSymbol superSym = new VarSymbol(FINAL | HASINIT, names._super, ct.supertype_field, c); @@ -1094,7 +1096,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { } Type modelMissingTypes(Type t, final JCExpression tree, final boolean interfaceExpected) { - if (t.tag != ERROR) + if (!t.hasTag(ERROR)) return t; return new ErrorType(((ErrorType) t).getOriginalType(), t.tsym) { @@ -1139,7 +1141,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { @Override public void visitIdent(JCIdent tree) { - if (tree.type.tag != ERROR) { + if (!tree.type.hasTag(ERROR)) { result = tree.type; } else { result = synthesizeClass(tree.name, syms.unnamedPackage).type; @@ -1148,7 +1150,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { @Override public void visitSelect(JCFieldAccess tree) { - if (tree.type.tag != ERROR) { + if (!tree.type.hasTag(ERROR)) { result = tree.type; } else { Type selectedType; @@ -1166,7 +1168,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { @Override public void visitTypeApply(JCTypeApply tree) { - if (tree.type.tag != ERROR) { + if (!tree.type.hasTag(ERROR)) { result = tree.type; } else { ClassType clazzType = (ClassType) visit(tree.clazz); 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 ba02bb77e80..448ecfd474a 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 @@ -59,7 +59,7 @@ import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.BLOCK; import static com.sun.tools.javac.code.Kinds.*; import static com.sun.tools.javac.code.Kinds.ERRONEOUS; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.comp.Resolve.MethodResolutionPhase.*; import static com.sun.tools.javac.tree.JCTree.Tag.*; @@ -228,7 +228,7 @@ public class Resolve { JCDiagnostic getVerboseApplicableCandidateDiag(int pos, Symbol sym, Type inst) { JCDiagnostic subDiag = null; - if (sym.type.tag == FORALL) { + if (sym.type.hasTag(FORALL)) { subDiag = diags.fragment("partial.inst.sig", inst); } @@ -331,7 +331,7 @@ public class Resolve { } boolean isAccessible(Env env, Type t, boolean checkInner) { - return (t.tag == ARRAY) + return (t.hasTag(ARRAY)) ? isAccessible(env, types.elemtype(t)) : isAccessible(env, t.tsym, checkInner); } @@ -467,10 +467,10 @@ public class Resolve { // need to inferred. List tvars = List.nil(); if (typeargtypes == null) typeargtypes = List.nil(); - if (mt.tag != FORALL && typeargtypes.nonEmpty()) { + if (!mt.hasTag(FORALL) && typeargtypes.nonEmpty()) { // This is not a polymorphic method, but typeargs are supplied // which is fine, see JLS 15.12.2.1 - } else if (mt.tag == FORALL && typeargtypes.nonEmpty()) { + } else if (mt.hasTag(FORALL) && typeargtypes.nonEmpty()) { ForAll pmt = (ForAll) mt; if (typeargtypes.length() != pmt.tvars.length()) throw inapplicableMethodException.setMessage("arg.length.mismatch"); // not enough args @@ -487,7 +487,7 @@ public class Resolve { actuals = actuals.tail; } mt = types.subst(pmt.qtype, pmt.tvars, typeargtypes); - } else if (mt.tag == FORALL) { + } else if (mt.hasTag(FORALL)) { ForAll pmt = (ForAll) mt; List tvars1 = types.newInstances(pmt.tvars); tvars = tvars.appendList(tvars1); @@ -499,7 +499,7 @@ public class Resolve { for (List l = argtypes; l.tail != null/*inlined: l.nonEmpty()*/ && !instNeeded; l = l.tail) { - if (l.head.tag == FORALL) instNeeded = true; + if (l.head.hasTag(FORALL)) instNeeded = true; } if (instNeeded) @@ -807,7 +807,7 @@ public class Resolve { @Override protected Type check(DiagnosticPosition pos, Type found) { - if (found.tag == DEFERRED) { + if (found.hasTag(DEFERRED)) { DeferredType dt = (DeferredType)found; return dt.check(this); } else { @@ -875,7 +875,7 @@ public class Resolve { Type site, Name name, TypeSymbol c) { - while (c.type.tag == TYPEVAR) + while (c.type.hasTag(TYPEVAR)) c = c.type.getUpperBound().tsym; Symbol bestSoFar = varNotFound; Symbol sym; @@ -888,7 +888,7 @@ public class Resolve { e = e.next(); } Type st = types.supertype(c.type); - if (st != null && (st.tag == CLASS || st.tag == TYPEVAR)) { + if (st != null && (st.hasTag(CLASS) || st.hasTag(TYPEVAR))) { sym = findField(env, site, name, st.tsym); if (sym.kind < bestSoFar.kind) bestSoFar = sym; } @@ -1184,7 +1184,7 @@ public class Resolve { lastFormal2 : formals2.head; //is this a structural actual argument? - boolean isStructuralPoly = actual.tag == DEFERRED && + boolean isStructuralPoly = actual.hasTag(DEFERRED) && (((DeferredType)actual).tree.hasTag(LAMBDA) || ((DeferredType)actual).tree.hasTag(REFERENCE)); @@ -1301,7 +1301,7 @@ public class Resolve { Type rt1 = mt1.getReturnType(); Type rt2 = mt2.getReturnType(); - if (mt1.tag == FORALL && mt2.tag == FORALL) { + if (mt1.hasTag(FORALL) && mt2.hasTag(FORALL)) { //if both are generic methods, adjust return type ahead of subtyping check rt1 = types.subst(rt1, mt1.getTypeArguments(), mt2.getTypeArguments()); } @@ -1448,11 +1448,11 @@ public class Resolve { } TypeSymbol symbolFor(Type t) { - if (t.tag != CLASS && - t.tag != TYPEVAR) { + if (!t.hasTag(CLASS) && + !t.hasTag(TYPEVAR)) { return null; } - while (t.tag == TYPEVAR) + while (t.hasTag(TYPEVAR)) t = t.getUpperBound(); if (seen.contains(t.tsym)) { //degenerate case in which we have a circular @@ -1610,7 +1610,7 @@ public class Resolve { e = e.next(); } Type st = types.supertype(c.type); - if (st != null && st.tag == CLASS) { + if (st != null && st.hasTag(CLASS)) { sym = findMemberType(env, site, name, st.tsym); if (sym.kind < bestSoFar.kind) bestSoFar = sym; } @@ -1660,7 +1660,7 @@ public class Resolve { e = e.next()) { if (e.sym.kind == TYP) { if (staticOnly && - e.sym.type.tag == TYPEVAR && + e.sym.type.hasTag(TYPEVAR) && e.sym.owner.kind == TYP) return new StaticError(e.sym); return e.sym; } @@ -1669,8 +1669,8 @@ public class Resolve { sym = findMemberType(env1, env1.enclClass.sym.type, name, env1.enclClass.sym); if (staticOnly && sym.kind == TYP && - sym.type.tag == CLASS && - sym.type.getEnclosingType().tag == CLASS && + sym.type.hasTag(CLASS) && + sym.type.getEnclosingType().hasTag(CLASS) && env1.enclClass.sym.type.isParameterized() && sym.type.getEnclosingType().isParameterized()) return new StaticError(sym); @@ -1906,7 +1906,7 @@ public class Resolve { //method symbol that can be used for lookups in the speculative cache, //causing problems in Attr.checkId() for (Type t : argtypes) { - if (t.tag == DEFERRED) { + if (t.hasTag(DEFERRED)) { DeferredType dt = (DeferredType)t; dt.speculativeCache.dupAllTo(msym, accessedSym); } @@ -1955,7 +1955,7 @@ public class Resolve { } public void printscopes(Type t) { - while (t.tag == CLASS) { + while (t.hasTag(CLASS)) { printscopes(t.tsym.members()); t = types.supertype(t); } @@ -2259,7 +2259,7 @@ public class Resolve { //- System.out.println(" e " + e.sym); if (sym.kind == MTH && (sym.flags_field & SYNTHETIC) == 0) { - List oldParams = e.sym.type.tag == FORALL ? + List oldParams = e.sym.type.hasTag(FORALL) ? ((ForAll)sym.type).tvars : List.nil(); Type constrType = new ForAll(site.tsym.type.getTypeArguments().appendList(oldParams), @@ -2565,7 +2565,7 @@ public class Resolve { findMethod(env, site, name, argtypes, typeargtypes, phase.isBoxingRequired(), phase.isVarargsRequired(), syms.operatorNames.contains(name)); return sym.kind != MTH || - site.getEnclosingType().tag == NONE || + site.getEnclosingType().hasTag(NONE) || hasEnclosingInstance(env, site) ? sym : new InvalidSymbolError(Kinds.MISSING_ENCL, sym, null) { @Override @@ -2578,7 +2578,7 @@ public class Resolve { @Override ReferenceKind referenceKind(Symbol sym) { - return site.getEnclosingType().tag == NONE ? + return site.getEnclosingType().hasTag(NONE) ? ReferenceKind.TOPLEVEL : ReferenceKind.IMPLICIT_INNER; } } @@ -2847,7 +2847,7 @@ public class Resolve { } else { ListBuffer diagArgs = ListBuffer.lb(); for (Type t : argtypes) { - if (t.tag == DEFERRED) { + if (t.hasTag(DEFERRED)) { diagArgs.append(((DeferredAttr.DeferredType)t).tree); } else { diagArgs.append(t); @@ -3222,7 +3222,7 @@ public class Resolve { Name name, List argtypes, List typeargtypes) { - if (sym.owner.type.tag == ERROR) + if (sym.owner.type.hasTag(ERROR)) return null; if (sym.name == names.init && sym.owner != site.tsym) { @@ -3267,7 +3267,7 @@ public class Resolve { Name name, List argtypes, List typeargtypes) { - Symbol errSym = ((sym.kind == TYP && sym.type.tag == CLASS) + Symbol errSym = ((sym.kind == TYP && sym.type.hasTag(CLASS)) ? types.erasure(sym.type).tsym : sym); return diags.create(dkind, log.currentSource(), pos, diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java index 36f3a25f243..ff89b7696c7 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java @@ -37,7 +37,9 @@ 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 static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.TYPEVAR; +import static com.sun.tools.javac.code.TypeTag.VOID; /** This pass translates Generic Java to conventional Java. * @@ -155,7 +157,7 @@ public class TransTypes extends TreeTranslator { */ JCExpression retype(JCExpression tree, Type erasedType, Type target) { // System.err.println("retype " + tree + " to " + erasedType);//DEBUG - if (erasedType.tag > lastBaseTag) { + if (!erasedType.isPrimitive()) { if (target != null && target.isPrimitive()) target = erasure(tree.type); tree.type = erasedType; @@ -245,7 +247,7 @@ public class TransTypes extends TreeTranslator { make.Select(receiver, impl).setType(calltype), translateArgs(make.Idents(md.params), origErasure.getParameterTypes(), null)) .setType(calltype); - JCStatement stat = (origErasure.getReturnType().tag == VOID) + JCStatement stat = (origErasure.getReturnType().hasTag(VOID)) ? make.Exec(call) : make.Return(coerce(call, bridgeType.getReturnType())); md.body = make.Block(0, List.of(stat)); @@ -400,7 +402,7 @@ public class TransTypes extends TreeTranslator { */ void addBridges(DiagnosticPosition pos, ClassSymbol origin, ListBuffer bridges) { Type st = types.supertype(origin.type); - while (st.tag == CLASS) { + while (st.hasTag(CLASS)) { // if (isSpecialization(st)) addBridges(pos, st.tsym, origin, bridges); st = types.supertype(st); @@ -701,7 +703,7 @@ public class TransTypes extends TreeTranslator { Type et = tree.sym.erasure(types); // Map type variables to their bounds. - if (tree.sym.kind == TYP && tree.sym.type.tag == TYPEVAR) { + if (tree.sym.kind == TYP && tree.sym.type.hasTag(TYPEVAR)) { result = make.at(tree.pos).Type(et); } else // Map constants expressions to themselves. @@ -720,7 +722,7 @@ public class TransTypes extends TreeTranslator { public void visitSelect(JCFieldAccess tree) { Type t = tree.selected.type; - while (t.tag == TYPEVAR) + while (t.hasTag(TYPEVAR)) t = t.getUpperBound(); if (t.isCompound()) { if ((tree.sym.flags() & IPROXY) != 0) { @@ -844,7 +846,7 @@ public class TransTypes extends TreeTranslator { translateArgs(make.Idents(md.params), implErasure.getParameterTypes(), null)) .setType(calltype); - JCStatement stat = (member.getReturnType().tag == VOID) + JCStatement stat = (member.getReturnType().hasTag(VOID)) ? make.Exec(call) : make.Return(coerce(call, member.erasure(types).getReturnType())); md.body = make.Block(0, List.of(stat)); @@ -862,7 +864,7 @@ public class TransTypes extends TreeTranslator { Type st = types.supertype(c.type); // process superclass before derived - if (st.tag == CLASS) + if (st.hasTag(CLASS)) translateClass((ClassSymbol)st.tsym); Env myEnv = enter.typeEnvs.remove(c); 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 b221ba5b705..413030c3f92 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 @@ -55,7 +55,7 @@ import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; 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 static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.jvm.ClassFile.*; import static com.sun.tools.javac.jvm.ClassFile.Version.*; @@ -1870,7 +1870,7 @@ public class ClassReader implements Completer { * `typevars'. */ protected void enterTypevars(Type t) { - if (t.getEnclosingType() != null && t.getEnclosingType().tag == CLASS) + if (t.getEnclosingType() != null && t.getEnclosingType().hasTag(CLASS)) enterTypevars(t.getEnclosingType()); for (List xs = t.getTypeArguments(); xs.nonEmpty(); xs = xs.tail) typevars.enter(xs.head.tsym); @@ -1895,7 +1895,7 @@ public class ClassReader implements Completer { // prepare type variable table typevars = typevars.dup(currentOwner); - if (ct.getEnclosingType().tag == CLASS) + if (ct.getEnclosingType().hasTag(CLASS)) enterTypevars(ct.getEnclosingType()); // read flags, or skip if this is an inner class diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java index 463ce4c07bf..bf9b0d67509 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java @@ -45,7 +45,7 @@ import com.sun.tools.javac.util.*; import static com.sun.tools.javac.code.BoundKind.*; 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 static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.jvm.UninitializedType.*; import static com.sun.tools.javac.main.Option.*; import static javax.tools.StandardLocation.CLASS_OUTPUT; @@ -274,7 +274,7 @@ public class ClassWriter extends ClassFile { /** Assemble signature of given type in string buffer. */ void assembleSig(Type type) { - switch (type.tag) { + switch (type.getTag()) { case BYTE: sigbuf.appendByte('B'); break; @@ -361,13 +361,13 @@ public class ClassWriter extends ClassFile { assembleSig(types.erasure(((UninitializedType)type).qtype)); break; default: - throw new AssertionError("typeSig " + type.tag); + throw new AssertionError("typeSig " + type.getTag()); } } boolean hasTypeVar(List l) { while (l.nonEmpty()) { - if (l.head.tag == TypeTags.TYPEVAR) return true; + if (l.head.hasTag(TYPEVAR)) return true; l = l.tail; } return false; @@ -439,9 +439,9 @@ public class ClassWriter extends ClassFile { * external representation. */ public Name xClassName(Type t) { - if (t.tag == CLASS) { + if (t.hasTag(CLASS)) { return names.fromUtf(externalize(t.tsym.flatName())); - } else if (t.tag == ARRAY) { + } else if (t.hasTag(ARRAY)) { return typeSig(types.erasure(t)); } else { throw new AssertionError("xClassName"); @@ -521,7 +521,7 @@ public class ClassWriter extends ClassFile { ClassSymbol c = (ClassSymbol)value; if (c.owner.kind == TYP) pool.put(c.owner); poolbuf.appendByte(CONSTANT_Class); - if (c.type.tag == ARRAY) { + if (c.type.hasTag(ARRAY)) { poolbuf.appendChar(pool.put(typeSig(c.type))); } else { poolbuf.appendChar(pool.put(names.fromUtf(externalize(c.flatname)))); @@ -555,7 +555,7 @@ public class ClassWriter extends ClassFile { poolbuf.appendChar(pool.put(typeSig(mtype))); } else if (value instanceof Type) { Type type = (Type)value; - if (type.tag == CLASS) enterInner((ClassSymbol)type.tsym); + if (type.hasTag(CLASS)) enterInner((ClassSymbol)type.tsym); poolbuf.appendByte(CONSTANT_Class); poolbuf.appendChar(pool.put(xClassName(type))); } else if (value instanceof Pool.MethodHandle) { @@ -815,7 +815,7 @@ public class ClassWriter extends ClassFile { class AttributeWriter implements Attribute.Visitor { public void visitConstant(Attribute.Constant _value) { Object value = _value.value; - switch (_value.type.tag) { + switch (_value.type.getTag()) { case BYTE: databuf.appendByte('B'); break; @@ -901,7 +901,7 @@ public class ClassWriter extends ClassFile { System.err.println("error: " + c + ": " + ex.getMessage()); throw ex; } - if (c.type.tag != CLASS) return; // arrays + if (!c.type.hasTag(CLASS)) return; // arrays if (pool != null && // pool might be null if called from xClassName c.owner.enclClass() != null && (innerClasses == null || !innerClasses.contains(c))) { @@ -1207,7 +1207,7 @@ public class ClassWriter extends ClassFile { if (debugstackmap) System.out.print("empty"); databuf.appendByte(0); } - else switch(t.tag) { + else switch(t.getTag()) { case BYTE: case CHAR: case SHORT: @@ -1430,7 +1430,7 @@ public class ClassWriter extends ClassFile { } static boolean isInt(Type t) { - return (t.tag < TypeTags.INT || t.tag == TypeTags.BOOLEAN); + return (t.getTag().isStrictSubRangeOf(INT) || t.hasTag(BOOLEAN)); } static boolean isSameType(Type t1, Type t2, Types types) { @@ -1439,15 +1439,15 @@ public class ClassWriter extends ClassFile { if (isInt(t1) && isInt(t2)) { return true; } - if (t1.tag == UNINITIALIZED_THIS) { - return t2.tag == UNINITIALIZED_THIS; - } else if (t1.tag == UNINITIALIZED_OBJECT) { - if (t2.tag == UNINITIALIZED_OBJECT) { + if (t1.hasTag(UNINITIALIZED_THIS)) { + return t2.hasTag(UNINITIALIZED_THIS); + } else if (t1.hasTag(UNINITIALIZED_OBJECT)) { + if (t2.hasTag(UNINITIALIZED_OBJECT)) { return ((UninitializedType)t1).offset == ((UninitializedType)t2).offset; } else { return false; } - } else if (t2.tag == UNINITIALIZED_THIS || t2.tag == UNINITIALIZED_OBJECT) { + } else if (t2.hasTag(UNINITIALIZED_THIS) || t2.hasTag(UNINITIALIZED_OBJECT)) { return false; } @@ -1554,7 +1554,7 @@ public class ClassWriter extends ClassFile { databuf.appendChar(flags); databuf.appendChar(pool.put(c)); - databuf.appendChar(supertype.tag == CLASS ? pool.put(supertype.tsym) : 0); + databuf.appendChar(supertype.hasTag(CLASS) ? pool.put(supertype.tsym) : 0); databuf.appendChar(interfaces.length()); for (List l = interfaces; l.nonEmpty(); l = l.tail) databuf.appendChar(pool.put(l.head.tsym)); diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java index a3cffbc58e1..59788f2a1d5 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java @@ -30,7 +30,8 @@ import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.BOT; +import static com.sun.tools.javac.code.TypeTag.INT; import static com.sun.tools.javac.jvm.ByteCodes.*; import static com.sun.tools.javac.jvm.UninitializedType.*; import static com.sun.tools.javac.jvm.ClassWriter.StackMapTableFrame; @@ -224,7 +225,7 @@ public class Code { * JVM architecture). */ public static int typecode(Type type) { - switch (type.tag) { + switch (type.getTag()) { case BYTE: return BYTEcode; case SHORT: return SHORTcode; case CHAR: return CHARcode; @@ -242,7 +243,7 @@ public class Code { case UNINITIALIZED_THIS: case UNINITIALIZED_OBJECT: return OBJECTcode; - default: throw new AssertionError("typecode " + type.tag); + default: throw new AssertionError("typecode " + type.getTag()); } } @@ -281,7 +282,7 @@ public class Code { /** Given a type, return its code for allocating arrays of that type. */ public static int arraycode(Type type) { - switch (type.tag) { + switch (type.getTag()) { case BYTE: return 8; case BOOLEAN: return 4; case SHORT: return 9; @@ -477,7 +478,7 @@ public class Code { state.pop(1); //sometimes 'null type' is treated as a one-dimensional array type //see Gen.visitLiteral - we should handle this case accordingly - Type stackType = a.tag == BOT ? + Type stackType = a.hasTag(BOT) ? syms.objectType : types.erasure(types.elemtype(a)); state.push(stackType); } @@ -1656,13 +1657,13 @@ public class Code { void push(Type t) { if (debugCode) System.err.println(" pushing " + t); - switch (t.tag) { - case TypeTags.VOID: + switch (t.getTag()) { + case VOID: return; - case TypeTags.BYTE: - case TypeTags.CHAR: - case TypeTags.SHORT: - case TypeTags.BOOLEAN: + case BYTE: + case CHAR: + case SHORT: + case BOOLEAN: t = syms.intType; break; default: @@ -1722,7 +1723,7 @@ public class Code { * of its current type. */ void forceStackTop(Type t) { if (!alive) return; - switch (t.tag) { + switch (t.getTag()) { case CLASS: case ARRAY: int width = width(t); @@ -1824,7 +1825,7 @@ public class Code { } } - static Type jsrReturnValue = new Type(TypeTags.INT, null); + static Type jsrReturnValue = new Type(INT, null); /* ************************************************************************** diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java index 9f99fb6d66f..4bbab1eb709 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java @@ -42,7 +42,7 @@ import com.sun.tools.javac.tree.JCTree.*; 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 static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.jvm.ByteCodes.*; import static com.sun.tools.javac.jvm.CRTFlags.*; import static com.sun.tools.javac.main.Option.*; @@ -258,7 +258,7 @@ public class Gen extends JCTree.Visitor { */ Symbol binaryQualifier(Symbol sym, Type site) { - if (site.tag == ARRAY) { + if (site.hasTag(ARRAY)) { if (sym == syms.lengthVar || sym.owner != syms.arrayClass) return sym; @@ -305,13 +305,13 @@ public class Gen extends JCTree.Visitor { */ int makeRef(DiagnosticPosition pos, Type type) { checkDimension(pos, type); - return pool.put(type.tag == CLASS ? (Object)type.tsym : (Object)type); + return pool.put(type.hasTag(CLASS) ? (Object)type.tsym : (Object)type); } /** Check if the given type is an array with too many dimensions. */ private void checkDimension(DiagnosticPosition pos, Type t) { - switch (t.tag) { + switch (t.getTag()) { case METHOD: checkDimension(pos, t.getReturnType()); for (List args = t.getParameterTypes(); args.nonEmpty(); args = args.tail) @@ -922,7 +922,7 @@ public class Gen extends JCTree.Visitor { if (code.isAlive()) { code.statBegin(TreeInfo.endPos(tree.body)); if (env.enclMethod == null || - env.enclMethod.sym.type.getReturnType().tag == VOID) { + env.enclMethod.sym.type.getReturnType().hasTag(VOID)) { code.emitop0(return_); } else { // sometime dead code seems alive (4415991); @@ -1110,7 +1110,7 @@ public class Gen extends JCTree.Visitor { public void visitSwitch(JCSwitch tree) { int limit = code.nextreg; - Assert.check(tree.selector.type.tag != CLASS); + Assert.check(!tree.selector.type.hasTag(CLASS)); int startpcCrt = genCrt ? code.curPc() : 0; Item sel = genExpr(tree.selector, syms.intType); List cases = tree.cases; @@ -1817,8 +1817,8 @@ public class Gen extends JCTree.Visitor { // proceeding further. if ((tree.hasTag(PLUS_ASG) || tree.hasTag(MINUS_ASG)) && l instanceof LocalItem && - tree.lhs.type.tag <= INT && - tree.rhs.type.tag <= INT && + tree.lhs.type.getTag().isSubRangeOf(INT) && + tree.rhs.type.getTag().isSubRangeOf(INT) && tree.rhs.type.constValue() != null) { int ival = ((Number) tree.rhs.type.constValue()).intValue(); if (tree.hasTag(MINUS_ASG)) ival = -ival; @@ -1969,7 +1969,7 @@ public class Gen extends JCTree.Visitor { */ void appendString(JCTree tree) { Type t = tree.type.baseType(); - if (t.tag > lastBaseTag && t.tsym != syms.stringType.tsym) { + if (!t.isPrimitive() && t.tsym != syms.stringType.tsym) { t = syms.objectType; } items.makeMemberItem(getStringBufferAppend(tree, t), false).invoke(); @@ -2067,7 +2067,7 @@ public class Gen extends JCTree.Visitor { // which is not statically a supertype of the expression's type. // For basic types, the coerce(...) in genExpr(...) will do // the conversion. - if (tree.clazz.type.tag > lastBaseTag && + if (!tree.clazz.type.isPrimitive() && types.asSuper(tree.expr.type, tree.clazz.type.tsym) == null) { code.emitop2(checkcast, makeRef(tree.pos(), tree.clazz.type)); } @@ -2185,7 +2185,7 @@ public class Gen extends JCTree.Visitor { } public void visitLiteral(JCLiteral tree) { - if (tree.type.tag == TypeTags.BOT) { + if (tree.type.hasTag(BOT)) { code.emitop0(aconst_null); if (types.dimensions(pt) > 1) { code.emitop2(checkcast, makeRef(tree.pos(), pt)); diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java index 82ba522cd4b..73614a0c022 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,8 @@ package com.sun.tools.javac.jvm; import com.sun.tools.javac.code.*; +import static com.sun.tools.javac.code.TypeTag.UNINITIALIZED_OBJECT; +import static com.sun.tools.javac.code.TypeTag.UNINITIALIZED_THIS; /** These pseudo-types appear in the generated verifier tables to * indicate objects that have been allocated but not yet constructed. @@ -37,8 +39,6 @@ import com.sun.tools.javac.code.*; * deletion without notice. */ class UninitializedType extends Type.DelegatedType { - public static final int UNINITIALIZED_THIS = TypeTags.TypeTagCount; - public static final int UNINITIALIZED_OBJECT = UNINITIALIZED_THIS + 1; public static UninitializedType uninitializedThis(Type qtype) { return new UninitializedType(UNINITIALIZED_THIS, qtype, -1); @@ -49,7 +49,7 @@ class UninitializedType extends Type.DelegatedType { } public final int offset; // PC where allocation took place - private UninitializedType(int tag, Type qtype, int offset) { + private UninitializedType(TypeTag tag, Type qtype, int offset) { super(tag, qtype); this.offset = offset; } 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 150746a571d..2b127b2cba5 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 @@ -63,6 +63,7 @@ import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.Log.WriterKind; +import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.main.Option.*; import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*; import static com.sun.tools.javac.util.ListBuffer.lb; @@ -1349,7 +1350,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { @Override public void visitClassDef(JCClassDecl node) { Type st = types.supertype(node.sym.type); - if (st.tag == TypeTags.CLASS) { + if (st.hasTag(CLASS)) { ClassSymbol c = st.tsym.outermostClass(); Env stEnv = enter.getEnv(c); if (stEnv != null && env != stEnv) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/model/JavacElements.java b/langtools/src/share/classes/com/sun/tools/javac/model/JavacElements.java index 4f036bd9d17..168cef93e72 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/model/JavacElements.java +++ b/langtools/src/share/classes/com/sun/tools/javac/model/JavacElements.java @@ -38,7 +38,7 @@ import static javax.lang.model.util.ElementFilter.methodsIn; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.code.TypeTags; +import com.sun.tools.javac.code.TypeTag; import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Enter; import com.sun.tools.javac.comp.Env; @@ -50,6 +50,7 @@ import com.sun.tools.javac.tree.TreeInfo; import com.sun.tools.javac.tree.TreeScanner; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.Name; +import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** @@ -124,7 +125,7 @@ public class JavacElements implements Elements { if (result != null || !inherited) break; Type sup = annotated.getSuperclass(); - if (sup.tag != TypeTags.CLASS || sup.isErroneous()) + if (!sup.hasTag(CLASS) || sup.isErroneous()) break; annotated = (ClassSymbol) sup.tsym; } @@ -444,7 +445,7 @@ public class JavacElements implements Elements { List annos = sym.getAnnotationMirrors(); while (sym.getKind() == ElementKind.CLASS) { Type sup = ((ClassSymbol) sym).getSuperclass(); - if (sup.tag != TypeTags.CLASS || sup.isErroneous() || + if (!sup.hasTag(CLASS) || sup.isErroneous() || sup.tsym == syms.objectType.tsym) { break; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java index 616f023dc1f..7e71133db60 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -560,7 +560,7 @@ public class JavacParser implements Parser { case INTLITERAL: try { t = F.at(pos).Literal( - TypeTags.INT, + TypeTag.INT, Convert.string2int(strval(prefix), token.radix())); } catch (NumberFormatException ex) { error(token.pos, "int.number.too.large", strval(prefix)); @@ -569,7 +569,7 @@ public class JavacParser implements Parser { case LONGLITERAL: try { t = F.at(pos).Literal( - TypeTags.LONG, + TypeTag.LONG, new Long(Convert.string2long(strval(prefix), token.radix()))); } catch (NumberFormatException ex) { error(token.pos, "int.number.too.large", strval(prefix)); @@ -591,7 +591,7 @@ public class JavacParser implements Parser { else if (n.floatValue() == Float.POSITIVE_INFINITY) error(token.pos, "fp.number.too.large"); else - t = F.at(pos).Literal(TypeTags.FLOAT, n); + t = F.at(pos).Literal(TypeTag.FLOAT, n); break; } case DOUBLELITERAL: { @@ -610,27 +610,27 @@ public class JavacParser implements Parser { else if (n.doubleValue() == Double.POSITIVE_INFINITY) error(token.pos, "fp.number.too.large"); else - t = F.at(pos).Literal(TypeTags.DOUBLE, n); + t = F.at(pos).Literal(TypeTag.DOUBLE, n); break; } case CHARLITERAL: t = F.at(pos).Literal( - TypeTags.CHAR, + TypeTag.CHAR, token.stringVal().charAt(0) + 0); break; case STRINGLITERAL: t = F.at(pos).Literal( - TypeTags.CLASS, + TypeTag.CLASS, token.stringVal()); break; case TRUE: case FALSE: t = F.at(pos).Literal( - TypeTags.BOOLEAN, + TypeTag.BOOLEAN, (token.kind == TRUE ? 1 : 0)); break; case NULL: t = F.at(pos).Literal( - TypeTags.BOT, + TypeTag.BOT, null); break; default: @@ -814,7 +814,7 @@ public class JavacParser implements Parser { if (t.hasTag(JCTree.Tag.PLUS)) { StringBuilder buf = foldStrings(t); if (buf != null) { - t = toP(F.at(startPos).Literal(TypeTags.CLASS, buf.toString())); + t = toP(F.at(startPos).Literal(TypeTag.CLASS, buf.toString())); } } @@ -846,7 +846,7 @@ public class JavacParser implements Parser { while (true) { if (tree.hasTag(LITERAL)) { JCLiteral lit = (JCLiteral) tree; - if (lit.typetag == TypeTags.CLASS) { + if (lit.typetag == TypeTag.CLASS) { StringBuilder sbuf = new StringBuilder((String)lit.value); while (buf.nonEmpty()) { @@ -859,7 +859,7 @@ public class JavacParser implements Parser { JCBinary op = (JCBinary)tree; if (op.rhs.hasTag(LITERAL)) { JCLiteral lit = (JCLiteral) op.rhs; - if (lit.typetag == TypeTags.CLASS) { + if (lit.typetag == TypeTag.CLASS) { buf = buf.prepend((String) lit.value); tree = op.lhs; continue; @@ -1211,7 +1211,7 @@ public class JavacParser implements Parser { if ((mode & EXPR) != 0) { nextToken(); if (token.kind == DOT) { - JCPrimitiveTypeTree ti = toP(F.at(pos).TypeIdent(TypeTags.VOID)); + JCPrimitiveTypeTree ti = toP(F.at(pos).TypeIdent(TypeTag.VOID)); t = bracketsSuffix(ti); } else { return illegal(pos); @@ -1220,7 +1220,7 @@ public class JavacParser implements Parser { // Support the corner case of myMethodHandle.invoke() by passing // a void type (like other primitive types) to the next phase. // The error will be reported in Attr.attribTypes or Attr.visitApply. - JCPrimitiveTypeTree ti = to(F.at(pos).TypeIdent(TypeTags.VOID)); + JCPrimitiveTypeTree ti = to(F.at(pos).TypeIdent(TypeTag.VOID)); nextToken(); return ti; //return illegal(); @@ -2920,7 +2920,7 @@ public class JavacParser implements Parser { JCExpression type; boolean isVoid = token.kind == VOID; if (isVoid) { - type = to(F.at(pos).TypeIdent(TypeTags.VOID)); + type = to(F.at(pos).TypeIdent(TypeTag.VOID)); nextToken(); } else { type = parseType(); @@ -3283,28 +3283,28 @@ public class JavacParser implements Parser { } /** Return type tag of basic type represented by token, - * -1 if token is not a basic type identifier. + * NONE if token is not a basic type identifier. */ - static int typetag(TokenKind token) { + static TypeTag typetag(TokenKind token) { switch (token) { case BYTE: - return TypeTags.BYTE; + return TypeTag.BYTE; case CHAR: - return TypeTags.CHAR; + return TypeTag.CHAR; case SHORT: - return TypeTags.SHORT; + return TypeTag.SHORT; case INT: - return TypeTags.INT; + return TypeTag.INT; case LONG: - return TypeTags.LONG; + return TypeTag.LONG; case FLOAT: - return TypeTags.FLOAT; + return TypeTag.FLOAT; case DOUBLE: - return TypeTags.DOUBLE; + return TypeTag.DOUBLE; case BOOLEAN: - return TypeTags.BOOLEAN; + return TypeTag.BOOLEAN; default: - return -1; + return TypeTag.NONE; } } diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java index d8008d716b6..22926654a00 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java @@ -81,7 +81,7 @@ import static com.sun.tools.javac.tree.JCTree.Tag.*; public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /* Tree tag values, identifying kinds of trees */ - public enum Tag{ + public enum Tag { /** For methods that return an invalid tag if a given condition is not met */ NO_TAG, @@ -1912,10 +1912,10 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { * A constant value given literally. */ public static class JCLiteral extends JCExpression implements LiteralTree { - public int typetag; + public TypeTag typetag; /** value representation */ public Object value; - protected JCLiteral(int typetag, Object value) { + protected JCLiteral(TypeTag typetag, Object value) { this.typetag = typetag; this.value = value; } @@ -1923,33 +1923,15 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { public void accept(Visitor v) { v.visitLiteral(this); } public Kind getKind() { - switch (typetag) { - case TypeTags.INT: - return Kind.INT_LITERAL; - case TypeTags.LONG: - return Kind.LONG_LITERAL; - case TypeTags.FLOAT: - return Kind.FLOAT_LITERAL; - case TypeTags.DOUBLE: - return Kind.DOUBLE_LITERAL; - case TypeTags.BOOLEAN: - return Kind.BOOLEAN_LITERAL; - case TypeTags.CHAR: - return Kind.CHAR_LITERAL; - case TypeTags.CLASS: - return Kind.STRING_LITERAL; - case TypeTags.BOT: - return Kind.NULL_LITERAL; - default: - throw new AssertionError("unknown literal kind " + this); - } + return typetag.getKindLiteral(); } + public Object getValue() { switch (typetag) { - case TypeTags.BOOLEAN: + case BOOLEAN: int bi = (Integer) value; return (bi != 0); - case TypeTags.CHAR: + case CHAR: int ci = (Integer) value; char c = (char) ci; if (c != ci) @@ -1976,12 +1958,12 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * Identifies a basic type. - * @see TypeTags + * @see TypeTag */ public static class JCPrimitiveTypeTree extends JCExpression implements PrimitiveTypeTree { /** the basic type id */ - public int typetag; - protected JCPrimitiveTypeTree(int typetag) { + public TypeTag typetag; + protected JCPrimitiveTypeTree(TypeTag typetag) { this.typetag = typetag; } @Override @@ -1989,29 +1971,9 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { public Kind getKind() { return Kind.PRIMITIVE_TYPE; } public TypeKind getPrimitiveTypeKind() { - switch (typetag) { - case TypeTags.BOOLEAN: - return TypeKind.BOOLEAN; - case TypeTags.BYTE: - return TypeKind.BYTE; - case TypeTags.SHORT: - return TypeKind.SHORT; - case TypeTags.INT: - return TypeKind.INT; - case TypeTags.LONG: - return TypeKind.LONG; - case TypeTags.CHAR: - return TypeKind.CHAR; - case TypeTags.FLOAT: - return TypeKind.FLOAT; - case TypeTags.DOUBLE: - return TypeKind.DOUBLE; - case TypeTags.VOID: - return TypeKind.VOID; - default: - throw new AssertionError("unknown primitive type " + this); - } + return typetag.getPrimitiveTypeKind(); } + @Override public R accept(TreeVisitor v, D d) { return v.visitPrimitiveType(this, d); @@ -2161,7 +2123,7 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { } @Override public Tag getTag() { - return WILDCARD; + return Tag.WILDCARD; } } @@ -2362,8 +2324,8 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { JCArrayAccess Indexed(JCExpression indexed, JCExpression index); JCFieldAccess Select(JCExpression selected, Name selector); JCIdent Ident(Name idname); - JCLiteral Literal(int tag, Object value); - JCPrimitiveTypeTree TypeIdent(int typetag); + JCLiteral Literal(TypeTag tag, Object value); + JCPrimitiveTypeTree TypeIdent(TypeTag typetag); JCArrayTypeTree TypeArray(JCExpression elemtype); JCTypeApply TypeApply(JCExpression clazz, List arguments); JCTypeParameter TypeParameter(Name name, List bounds); diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java b/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java index c501f7a2e3a..5fc31dc733f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java @@ -1133,28 +1133,28 @@ public class Pretty extends JCTree.Visitor { public void visitLiteral(JCLiteral tree) { try { switch (tree.typetag) { - case TypeTags.INT: + case INT: print(tree.value.toString()); break; - case TypeTags.LONG: + case LONG: print(tree.value + "L"); break; - case TypeTags.FLOAT: + case FLOAT: print(tree.value + "F"); break; - case TypeTags.DOUBLE: + case DOUBLE: print(tree.value.toString()); break; - case TypeTags.CHAR: + case CHAR: print("\'" + Convert.quote( String.valueOf((char)((Number)tree.value).intValue())) + "\'"); break; - case TypeTags.BOOLEAN: + case BOOLEAN: print(((Number)tree.value).intValue() == 1 ? "true" : "false"); break; - case TypeTags.BOT: + case BOT: print("null"); break; default: @@ -1169,31 +1169,31 @@ public class Pretty extends JCTree.Visitor { public void visitTypeIdent(JCPrimitiveTypeTree tree) { try { switch(tree.typetag) { - case TypeTags.BYTE: + case BYTE: print("byte"); break; - case TypeTags.CHAR: + case CHAR: print("char"); break; - case TypeTags.SHORT: + case SHORT: print("short"); break; - case TypeTags.INT: + case INT: print("int"); break; - case TypeTags.LONG: + case LONG: print("long"); break; - case TypeTags.FLOAT: + case FLOAT: print("float"); break; - case TypeTags.DOUBLE: + case DOUBLE: print("double"); break; - case TypeTags.BOOLEAN: + case BOOLEAN: print("boolean"); break; - case TypeTags.VOID: + case VOID: print("void"); break; default: diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java index 3111b6af042..a68c719a7dc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java @@ -34,6 +34,7 @@ import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.code.TypeTag.BOT; import static com.sun.tools.javac.tree.JCTree.Tag.*; import static com.sun.tools.javac.tree.JCTree.Tag.BLOCK; import static com.sun.tools.javac.tree.JCTree.Tag.SYNCHRONIZED; @@ -300,7 +301,7 @@ public class TreeInfo { if (!tree.hasTag(LITERAL)) return false; JCLiteral lit = (JCLiteral) tree; - return (lit.typetag == TypeTags.BOT); + return (lit.typetag == BOT); } public static String getCommentText(Env env, JCTree tree) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java index 25f064ec85b..3182d6ed954 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java @@ -35,7 +35,7 @@ import com.sun.tools.javac.tree.JCTree.*; 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 static com.sun.tools.javac.code.TypeTag.*; /** Factory class for trees. * @@ -426,13 +426,13 @@ public class TreeMaker implements JCTree.Factory { return tree; } - public JCLiteral Literal(int tag, Object value) { + public JCLiteral Literal(TypeTag tag, Object value) { JCLiteral tree = new JCLiteral(tag, value); tree.pos = pos; return tree; } - public JCPrimitiveTypeTree TypeIdent(int typetag) { + public JCPrimitiveTypeTree TypeIdent(TypeTag typetag) { JCPrimitiveTypeTree tree = new JCPrimitiveTypeTree(typetag); tree.pos = pos; return tree; @@ -629,10 +629,10 @@ public class TreeMaker implements JCTree.Factory { public JCExpression Type(Type t) { if (t == null) return null; JCExpression tp; - switch (t.tag) { + switch (t.getTag()) { case BYTE: case CHAR: case SHORT: case INT: case LONG: case FLOAT: case DOUBLE: case BOOLEAN: case VOID: - tp = TypeIdent(t.tag); + tp = TypeIdent(t.getTag()); break; case TYPEVAR: tp = Ident(t.tsym); @@ -644,7 +644,7 @@ public class TreeMaker implements JCTree.Factory { } case CLASS: Type outer = t.getEnclosingType(); - JCExpression clazz = outer.tag == CLASS && t.tsym.owner.kind == TYP + JCExpression clazz = outer.hasTag(CLASS) && t.tsym.owner.kind == TYP ? Select(Type(outer), t.tsym) : QualIdent(t.tsym); tp = t.getTypeArguments().isEmpty() @@ -849,7 +849,7 @@ public class TreeMaker implements JCTree.Factory { * depending on whether the method invocation expression's type is void. */ public JCStatement Call(JCExpression apply) { - return apply.type.tag == VOID ? Exec(apply) : Return(apply); + return apply.type.hasTag(VOID) ? Exec(apply) : Return(apply); } /** Construct an assignment from a variable symbol and a right hand side. diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Constants.java b/langtools/src/share/classes/com/sun/tools/javac/util/Constants.java index 36a473df5c7..30753d7dfec 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Constants.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Constants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,8 +27,6 @@ package com.sun.tools.javac.util; import com.sun.tools.javac.code.Type; -import static com.sun.tools.javac.code.TypeTags.*; - /** * Utilities for operating on constant values. * @@ -48,7 +46,7 @@ public class Constants { public static Object decode(Object value, Type type) { if (value instanceof Integer) { int i = (Integer) value; - switch (type.tag) { + switch (type.getTag()) { case BOOLEAN: return i != 0; case CHAR: return (char) i; case BYTE: return (byte) i; @@ -64,7 +62,7 @@ public class Constants { */ public static String format(Object value, Type type) { value = decode(value, type); - switch (type.tag) { + switch (type.getTag()) { case BYTE: return formatByte((Byte) value); case LONG: return formatLong((Long) value); case FLOAT: return formatFloat((Float) value); diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java index 106fbcb52fd..6cdbb2447db 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java @@ -39,7 +39,7 @@ import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.code.Types; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.util.LayoutCharacters.*; import static com.sun.tools.javac.util.RichDiagnosticFormatter.RichConfiguration.*; @@ -295,7 +295,7 @@ public class RichDiagnosticFormatter extends conflicts.contains(s))) { List l = List.nil(); Symbol s2 = s; - while (s2.type.getEnclosingType().tag == CLASS + while (s2.type.getEnclosingType().hasTag(CLASS) && s2.owner.kind == Kinds.TYP) { l = l.prepend(s2.getSimpleName()); s2 = s2.owner; @@ -414,7 +414,7 @@ public class RichDiagnosticFormatter extends ? ownerName : s.name.toString(); if (s.type != null) { - if (s.type.tag == FORALL) { + if (s.type.hasTag(FORALL)) { ms = "<" + visitTypes(s.type.getTypeArguments(), locale) + ">" + ms; } ms += "(" + printMethodArgs( @@ -532,8 +532,8 @@ public class RichDiagnosticFormatter extends nameSimplifier.addUsage(t.tsym); boolean boundErroneous = bounds.head == null || - bounds.head.tag == NONE || - bounds.head.tag == ERROR; + bounds.head.hasTag(NONE) || + bounds.head.hasTag(ERROR); if ((t.tsym.flags() & SYNTHETIC) == 0) { //this is a true typevar diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java index 6a8818c47a1..20ed8fdbd5d 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java @@ -29,8 +29,8 @@ import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.code.TypeTags; +import static com.sun.tools.javac.code.TypeTag.BOOLEAN; /** * Represents a value of an annotation type element. @@ -76,7 +76,7 @@ public class AnnotationValueImpl implements AnnotationValue { public Object value; public void visitConstant(Attribute.Constant c) { - if (c.type.tag == TypeTags.BOOLEAN) { + if (c.type.hasTag(BOOLEAN)) { // javac represents false and true as integers 0 and 1 value = Boolean.valueOf( ((Integer)c.value).intValue() != 0); @@ -133,7 +133,7 @@ public class AnnotationValueImpl implements AnnotationValue { } public void visitConstant(Attribute.Constant c) { - if (c.type.tag == TypeTags.BOOLEAN) { + if (c.type.hasTag(BOOLEAN)) { // javac represents false and true as integers 0 and 1 sb.append(((Integer)c.value).intValue() != 0); } else { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java index efaf4a49793..37b3547e590 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java @@ -45,7 +45,6 @@ import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.ClassType; -import com.sun.tools.javac.code.TypeTags; import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Env; @@ -63,6 +62,7 @@ import com.sun.tools.javac.util.Names; import com.sun.tools.javac.util.Position; import static com.sun.tools.javac.code.Kinds.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** @@ -164,7 +164,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { if (isEnum() || isInterface() || isAnnotationType()) { return false; } - for (Type t = type; t.tag == TypeTags.CLASS; t = env.types.supertype(t)) { + for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { if (t.tsym == env.syms.errorType.tsym || t.tsym == env.syms.exceptionType.tsym) { return false; @@ -201,7 +201,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { if (isEnum() || isInterface() || isAnnotationType()) { return false; } - for (Type t = type; t.tag == TypeTags.CLASS; t = env.types.supertype(t)) { + for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { if (t.tsym == env.syms.exceptionType.tsym) { return true; } @@ -217,7 +217,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { if (isEnum() || isInterface() || isAnnotationType()) { return false; } - for (Type t = type; t.tag == TypeTags.CLASS; t = env.types.supertype(t)) { + for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { if (t.tsym == env.syms.errorType.tsym) { return true; } @@ -232,7 +232,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { if (isEnum() || isInterface() || isAnnotationType()) { return false; } - for (Type t = type; t.tag == TypeTags.CLASS; t = env.types.supertype(t)) { + for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { if (t.tsym == env.syms.throwableType.tsym) { return true; } diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java index c76dd7a87d6..b10992a99b9 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java @@ -32,12 +32,13 @@ import com.sun.javadoc.*; import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.VarSymbol; -import com.sun.tools.javac.code.TypeTags; import com.sun.tools.javac.tree.JCTree.JCVariableDecl; import com.sun.tools.javac.util.Position; +import static com.sun.tools.javac.code.TypeTag.BOOLEAN; + /** * Represents a field in a java class. * @@ -103,7 +104,7 @@ public class FieldDocImpl extends MemberDocImpl implements FieldDoc { */ public Object constantValue() { Object result = sym.getConstValue(); - if (result != null && sym.type.tag == TypeTags.BOOLEAN) + if (result != null && sym.type.hasTag(BOOLEAN)) // javac represents false and true as Integers 0 and 1 result = Boolean.valueOf(((Integer)result).intValue() != 0); return result; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java index f90b1641cc3..025463cf136 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java @@ -31,10 +31,11 @@ import com.sun.javadoc.*; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type; -import com.sun.tools.javac.code.TypeTags; import com.sun.tools.javac.tree.JCTree.JCMethodDecl; import com.sun.tools.javac.util.Position; +import static com.sun.tools.javac.code.TypeTag.CLASS; + /** * Represents a method of a java class. * @@ -129,7 +130,7 @@ public class MethodDocImpl ClassSymbol origin = (ClassSymbol)sym.owner; for (Type t = env.types.supertype(origin.type); - t.tag == TypeTags.CLASS; + t.hasTag(CLASS); t = env.types.supertype(t)) { ClassSymbol c = (ClassSymbol)t.tsym; for (Scope.Entry e = c.members().lookup(sym.name); e.scope != null; e = e.next()) { @@ -161,7 +162,7 @@ public class MethodDocImpl ClassSymbol origin = (ClassSymbol)sym.owner; for (Type t = env.types.supertype(origin.type); - t.tag == TypeTags.CLASS; + t.hasTag(CLASS); t = env.types.supertype(t)) { ClassSymbol c = (ClassSymbol)t.tsym; for (Scope.Entry e = c.members().lookup(sym.name); e.scope != null; e = e.next()) { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java index 1974ec10ad7..2fac11119d3 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java @@ -31,7 +31,7 @@ import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.ClassType; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; /** @@ -95,7 +95,7 @@ public class ParameterizedTypeImpl * Return null is this is a top-level type. */ public com.sun.javadoc.Type containingType() { - if (type.getEnclosingType().tag == CLASS) { + if (type.getEnclosingType().hasTag(CLASS)) { // This is the type of an inner class. return TypeMaker.getType(env, type.getEnclosingType()); } @@ -134,7 +134,7 @@ public class ParameterizedTypeImpl return TypeMaker.getTypeName(cl, full); } StringBuilder s = new StringBuilder(); - if (cl.getEnclosingType().tag != CLASS) { // if not an inner class... + if (!(cl.getEnclosingType().hasTag(CLASS))) { // if not an inner class... s.append(TypeMaker.getTypeName(cl, full)); } else { ClassType encl = (ClassType)cl.getEnclosingType(); diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java index 63ada2b9b50..dd0f355fa24 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java @@ -33,7 +33,7 @@ import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.code.Type.ClassType; import com.sun.tools.javac.code.Type.TypeVar; import com.sun.tools.javac.util.List; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.ARRAY; /** *

    This is NOT part of any supported API. @@ -57,7 +57,7 @@ public class TypeMaker { if (env.legacyDoclet) { t = env.types.erasure(t); } - switch (t.tag) { + switch (t.getTag()) { case CLASS: if (ClassDocImpl.isGeneric((ClassSymbol)t.tsym)) { return env.getParameterizedType((ClassType)t); @@ -107,10 +107,10 @@ public class TypeMaker { } public static String getTypeName(Type t, boolean full) { - switch (t.tag) { + switch (t.getTag()) { case ARRAY: StringBuilder s = new StringBuilder(); - while (t.tag == ARRAY) { + while (t.hasTag(ARRAY)) { s.append("[]"); t = ((ArrayType)t).elemtype; } @@ -129,10 +129,10 @@ public class TypeMaker { * Class names are qualified if "full" is true. */ static String getTypeString(DocEnv env, Type t, boolean full) { - switch (t.tag) { + switch (t.getTag()) { case ARRAY: StringBuilder s = new StringBuilder(); - while (t.tag == ARRAY) { + while (t.hasTag(ARRAY)) { s.append("[]"); t = env.types.elemtype(t); } @@ -203,7 +203,7 @@ public class TypeMaker { private com.sun.javadoc.Type skipArrays() { if (skipArraysCache == null) { Type t; - for (t = arrayType; t.tag == ARRAY; t = env.types.elemtype(t)) { } + for (t = arrayType; t.hasTag(ARRAY); t = env.types.elemtype(t)) { } skipArraysCache = TypeMaker.getType(env, t); } return skipArraysCache; @@ -216,7 +216,7 @@ public class TypeMaker { */ public String dimension() { StringBuilder dimension = new StringBuilder(); - for (Type t = arrayType; t.tag == ARRAY; t = env.types.elemtype(t)) { + for (Type t = arrayType; t.hasTag(ARRAY); t = env.types.elemtype(t)) { dimension.append("[]"); } return dimension.toString(); diff --git a/langtools/test/tools/javac/6889255/T6889255.java b/langtools/test/tools/javac/6889255/T6889255.java index 5d77d8c40ed..8c820bcd3bc 100644 --- a/langtools/test/tools/javac/6889255/T6889255.java +++ b/langtools/test/tools/javac/6889255/T6889255.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ import com.sun.tools.javac.code.Scope; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.ClassType; -import com.sun.tools.javac.code.TypeTags; +import com.sun.tools.javac.code.TypeTag; import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.jvm.ClassReader; import com.sun.tools.javac.util.Context; @@ -436,7 +436,7 @@ public class T6889255 { // The rest of this method assumes the local conventions in the test program Type t = v.type; String s; - if (t.tag == TypeTags.CLASS) + if (t.hasTag(TypeTag.CLASS)) s = ((ClassType) t).tsym.name.toString(); else s = t.toString(); diff --git a/langtools/test/tools/javac/tree/MakeLiteralTest.java b/langtools/test/tools/javac/tree/MakeLiteralTest.java index c205bf7da4c..782a2cd0958 100644 --- a/langtools/test/tools/javac/tree/MakeLiteralTest.java +++ b/langtools/test/tools/javac/tree/MakeLiteralTest.java @@ -1,7 +1,5 @@ - - /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,13 +28,14 @@ */ import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.code.TypeTag; import com.sun.tools.javac.code.Symtab; import com.sun.tools.javac.code.Types; import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.tree.JCTree.JCLiteral; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.tree.TreeMaker; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; public class MakeLiteralTest { public static void main(String... args) throws Exception { @@ -65,9 +64,9 @@ public class MakeLiteralTest { throw new Exception(errors + " errors found"); } - void test(Object value, int tag, Type type, Object constValue) { + void test(Object value, TypeTag tag, Type type, Object constValue) { JCLiteral l = maker.Literal(value); - if (l.type.tag != tag) + if (!l.type.hasTag(tag)) error("unexpected tag: " + l.getTag() + ": expected: " + tag); if (!types.isSameType(l.type, type)) error("unexpected type: " + l.type + ": expected: " + type); From 0c42ca44f37e1bff33a0b8885fca0a0f0703e2cd Mon Sep 17 00:00:00 2001 From: Jon Masamitsu Date: Thu, 25 Oct 2012 12:59:37 -0700 Subject: [PATCH 103/241] 8001584: NPG: Incorrect assertion in BinaryTreeDictionary::get_chunk() Reviewed-by: johnc, tamao --- hotspot/src/share/vm/memory/binaryTreeDictionary.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp b/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp index 5efe8aaa46a..757eb4fdac9 100644 --- a/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp +++ b/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp @@ -259,7 +259,7 @@ class BinaryTreeDictionary: public FreeBlockDictionary { assert(res == NULL || res->is_free(), "Should be returning a free chunk"); assert(dither != FreeBlockDictionary::exactly || - res->size() == size, "Not correct size"); + res == NULL || res->size() == size, "Not correct size"); return res; } From fc938fcbd971ff03c3d33a618ae98086d77f9db0 Mon Sep 17 00:00:00 2001 From: Harold Seigel Date: Thu, 25 Oct 2012 16:33:15 -0400 Subject: [PATCH 104/241] 7188234: Deprecate VM command line options Remove support for the UseVectoredExceptions flag Reviewed-by: jcoomes, kamg --- hotspot/src/os/windows/vm/os_windows.cpp | 78 +++---------------- .../src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp | 2 - .../os_cpu/bsd_zero/vm/globals_bsd_zero.hpp | 1 - .../linux_sparc/vm/globals_linux_sparc.hpp | 2 - .../os_cpu/linux_x86/vm/globals_linux_x86.hpp | 2 - .../linux_zero/vm/globals_linux_zero.hpp | 1 - .../vm/globals_solaris_sparc.hpp | 2 - .../solaris_x86/vm/globals_solaris_x86.hpp | 2 - .../windows_x86/vm/globals_windows_x86.hpp | 2 - .../os_cpu/windows_x86/vm/os_windows_x86.cpp | 3 - hotspot/src/share/vm/runtime/arguments.cpp | 1 + hotspot/src/share/vm/runtime/globals.hpp | 3 - 12 files changed, 10 insertions(+), 89 deletions(-) diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp index dc31e27a6b7..420368f1010 100644 --- a/hotspot/src/os/windows/vm/os_windows.cpp +++ b/hotspot/src/os/windows/vm/os_windows.cpp @@ -22,7 +22,7 @@ * */ -// Must be at least Windows 2000 or XP to use VectoredExceptions and IsDebuggerPresent +// Must be at least Windows 2000 or XP to use IsDebuggerPresent #define _WIN32_WINNT 0x500 // no precompiled headers @@ -110,10 +110,6 @@ static FILETIME process_exit_time; static FILETIME process_user_time; static FILETIME process_kernel_time; -#ifdef _WIN64 -PVOID topLevelVectoredExceptionHandler = NULL; -#endif - #ifdef _M_IA64 #define __CPU__ ia64 #elif _M_AMD64 @@ -136,12 +132,6 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) { case DLL_PROCESS_DETACH: if(ForceTimeHighResolution) timeEndPeriod(1L); -#ifdef _WIN64 - if (topLevelVectoredExceptionHandler != NULL) { - RemoveVectoredExceptionHandler(topLevelVectoredExceptionHandler); - topLevelVectoredExceptionHandler = NULL; - } -#endif break; default: break; @@ -408,20 +398,14 @@ static unsigned __stdcall java_start(Thread* thread) { } - if (UseVectoredExceptions) { - // If we are using vectored exception we don't need to set a SEH - thread->run(); - } - else { - // Install a win32 structured exception handler around every thread created - // by VM, so VM can genrate error dump when an exception occurred in non- - // Java thread (e.g. VM thread). - __try { - thread->run(); - } __except(topLevelExceptionFilter( - (_EXCEPTION_POINTERS*)_exception_info())) { - // Nothing to do. - } + // Install a win32 structured exception handler around every thread created + // by VM, so VM can genrate error dump when an exception occurred in non- + // Java thread (e.g. VM thread). + __try { + thread->run(); + } __except(topLevelExceptionFilter( + (_EXCEPTION_POINTERS*)_exception_info())) { + // Nothing to do. } // One less thread is executing @@ -2489,16 +2473,6 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { } #endif -#ifdef _WIN64 - // Windows will sometimes generate an access violation - // when we call malloc. Since we use VectoredExceptions - // on 64 bit platforms, we see this exception. We must - // pass this exception on so Windows can recover. - // We check to see if the pc of the fault is in NTDLL.DLL - // if so, we pass control on to Windows for handling. - if (UseVectoredExceptions && _addr_in_ntdll(pc)) return EXCEPTION_CONTINUE_SEARCH; -#endif - // Stack overflow or null pointer exception in native code. report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, exceptionInfo->ContextRecord); @@ -2527,30 +2501,8 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { } if (exception_code != EXCEPTION_BREAKPOINT) { -#ifndef _WIN64 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, exceptionInfo->ContextRecord); -#else - // Itanium Windows uses a VectoredExceptionHandler - // Which means that C++ programatic exception handlers (try/except) - // will get here. Continue the search for the right except block if - // the exception code is not a fatal code. - switch ( exception_code ) { - case EXCEPTION_ACCESS_VIOLATION: - case EXCEPTION_STACK_OVERFLOW: - case EXCEPTION_ILLEGAL_INSTRUCTION: - case EXCEPTION_ILLEGAL_INSTRUCTION_2: - case EXCEPTION_INT_OVERFLOW: - case EXCEPTION_INT_DIVIDE_BY_ZERO: - case EXCEPTION_UNCAUGHT_CXX_EXCEPTION: - { report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, - exceptionInfo->ContextRecord); - } - break; - default: - break; - } -#endif } return EXCEPTION_CONTINUE_SEARCH; } @@ -3706,18 +3658,6 @@ jint os::init_2(void) { // Setup Windows Exceptions - // On Itanium systems, Structured Exception Handling does not - // work since stack frames must be walkable by the OS. Since - // much of our code is dynamically generated, and we do not have - // proper unwind .xdata sections, the system simply exits - // rather than delivering the exception. To work around - // this we use VectorExceptions instead. -#ifdef _WIN64 - if (UseVectoredExceptions) { - topLevelVectoredExceptionHandler = AddVectoredExceptionHandler( 1, topLevelExceptionFilter); - } -#endif - // for debugging float code generation bugs if (ForceFloatExceptions) { #ifndef _WIN64 diff --git a/hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp b/hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp index 5a19fed3f58..3a8d42ab68e 100644 --- a/hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp +++ b/hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp @@ -48,7 +48,5 @@ define_pd_global(uintx, JVMInvokeMethodSlack, 8192); // Used on 64 bit platforms for UseCompressedOops base address or CDS define_pd_global(uintx, HeapBaseMinAddress, 2*G); -// Only used on 64 bit Windows platforms -define_pd_global(bool, UseVectoredExceptions, false); #endif // OS_CPU_BSD_X86_VM_GLOBALS_BSD_X86_HPP diff --git a/hotspot/src/os_cpu/bsd_zero/vm/globals_bsd_zero.hpp b/hotspot/src/os_cpu/bsd_zero/vm/globals_bsd_zero.hpp index 6b1f6af5efc..9c988eb743b 100644 --- a/hotspot/src/os_cpu/bsd_zero/vm/globals_bsd_zero.hpp +++ b/hotspot/src/os_cpu/bsd_zero/vm/globals_bsd_zero.hpp @@ -41,7 +41,6 @@ define_pd_global(intx, VMThreadStackSize, 512); define_pd_global(intx, CompilerThreadStackSize, 0); define_pd_global(uintx, JVMInvokeMethodSlack, 8192); -define_pd_global(bool, UseVectoredExceptions, false); // Used on 64 bit platforms for UseCompressedOops base address or CDS define_pd_global(uintx, HeapBaseMinAddress, 2*G); diff --git a/hotspot/src/os_cpu/linux_sparc/vm/globals_linux_sparc.hpp b/hotspot/src/os_cpu/linux_sparc/vm/globals_linux_sparc.hpp index ab9d8cdeb25..4ac5ead1946 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/globals_linux_sparc.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/globals_linux_sparc.hpp @@ -35,7 +35,5 @@ define_pd_global(intx, CompilerThreadStackSize, 0); // Used on 64 bit platforms for UseCompressedOops base address or CDS define_pd_global(uintx, HeapBaseMinAddress, CONST64(4)*G); -// Only used on 64 bit Windows platforms -define_pd_global(bool, UseVectoredExceptions, false); #endif // OS_CPU_LINUX_SPARC_VM_GLOBALS_LINUX_SPARC_HPP diff --git a/hotspot/src/os_cpu/linux_x86/vm/globals_linux_x86.hpp b/hotspot/src/os_cpu/linux_x86/vm/globals_linux_x86.hpp index a7c94c00f82..b11a6f3aa27 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/globals_linux_x86.hpp +++ b/hotspot/src/os_cpu/linux_x86/vm/globals_linux_x86.hpp @@ -46,7 +46,5 @@ define_pd_global(uintx,JVMInvokeMethodSlack, 8192); // Used on 64 bit platforms for UseCompressedOops base address or CDS define_pd_global(uintx,HeapBaseMinAddress, 2*G); -// Only used on 64 bit Windows platforms -define_pd_global(bool, UseVectoredExceptions, false); #endif // OS_CPU_LINUX_X86_VM_GLOBALS_LINUX_X86_HPP diff --git a/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp b/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp index 14003011d3e..56495d176d1 100644 --- a/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp +++ b/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp @@ -41,7 +41,6 @@ define_pd_global(intx, VMThreadStackSize, 512); define_pd_global(intx, CompilerThreadStackSize, 0); define_pd_global(uintx, JVMInvokeMethodSlack, 8192); -define_pd_global(bool, UseVectoredExceptions, false); // Used on 64 bit platforms for UseCompressedOops base address or CDS define_pd_global(uintx, HeapBaseMinAddress, 2*G); diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/globals_solaris_sparc.hpp b/hotspot/src/os_cpu/solaris_sparc/vm/globals_solaris_sparc.hpp index 76695e9442c..e6cb0dddb01 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/globals_solaris_sparc.hpp +++ b/hotspot/src/os_cpu/solaris_sparc/vm/globals_solaris_sparc.hpp @@ -39,8 +39,6 @@ define_pd_global(uintx, HeapBaseMinAddress, CONST64(4)*G); #else define_pd_global(uintx, HeapBaseMinAddress, 2*G); #endif -// Only used on 64 bit Windows platforms -define_pd_global(bool, UseVectoredExceptions, false); diff --git a/hotspot/src/os_cpu/solaris_x86/vm/globals_solaris_x86.hpp b/hotspot/src/os_cpu/solaris_x86/vm/globals_solaris_x86.hpp index 780df544cc4..5d99a09c447 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/globals_solaris_x86.hpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/globals_solaris_x86.hpp @@ -45,7 +45,5 @@ define_pd_global(intx, CompilerThreadStackSize, 0); // Used on 64 bit platforms for UseCompressedOops base address or CDS define_pd_global(uintx,HeapBaseMinAddress, 256*M); -// Only used on 64 bit Windows platforms -define_pd_global(bool, UseVectoredExceptions, false); #endif // OS_CPU_SOLARIS_X86_VM_GLOBALS_SOLARIS_X86_HPP diff --git a/hotspot/src/os_cpu/windows_x86/vm/globals_windows_x86.hpp b/hotspot/src/os_cpu/windows_x86/vm/globals_windows_x86.hpp index 57e0ac34c75..f4167f5eb5c 100644 --- a/hotspot/src/os_cpu/windows_x86/vm/globals_windows_x86.hpp +++ b/hotspot/src/os_cpu/windows_x86/vm/globals_windows_x86.hpp @@ -47,7 +47,5 @@ define_pd_global(uintx, JVMInvokeMethodSlack, 8192); // Used on 64 bit platforms for UseCompressedOops base address or CDS define_pd_global(uintx, HeapBaseMinAddress, 2*G); -// Only used on 64 bit Windows platforms -define_pd_global(bool, UseVectoredExceptions, false); #endif // OS_CPU_WINDOWS_X86_VM_GLOBALS_WINDOWS_X86_HPP 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 434929f30d2..d0fad7da799 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 @@ -175,9 +175,6 @@ bool os::register_code_area(char *low, char *high) { PRUNTIME_FUNCTION prt; PUNWIND_INFO_EH_ONLY punwind; - // If we are using Vectored Exceptions we don't need this registration - if (UseVectoredExceptions) return true; - BufferBlob* blob = BufferBlob::create("CodeCache Exception Handler", sizeof(DynamicCodeData)); CodeBuffer cb(blob); MacroAssembler* masm = new MacroAssembler(&cb); diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 6da63245335..79fc67876b3 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -257,6 +257,7 @@ static ObsoleteFlag obsolete_jvm_flags[] = { { "MaxPermHeapExpansion", JDK_Version::jdk(8), JDK_Version::jdk(9) }, { "CMSRevisitStackSize", JDK_Version::jdk(8), JDK_Version::jdk(9) }, { "PrintRevisitStats", JDK_Version::jdk(8), JDK_Version::jdk(9) }, + { "UseVectoredExceptions", JDK_Version::jdk(8), JDK_Version::jdk(9) }, #ifdef PRODUCT { "DesiredMethodLimit", JDK_Version::jdk_update(7, 2), JDK_Version::jdk(8) }, diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index e783883ebe0..ad48aa1ae24 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -851,9 +851,6 @@ class CommandLineFlags { develop(bool, BreakAtWarning, false, \ "Execute breakpoint upon encountering VM warning") \ \ - product_pd(bool, UseVectoredExceptions, \ - "Temp Flag - Use Vectored Exceptions rather than SEH (Windows Only)") \ - \ develop(bool, TraceVMOperation, false, \ "Trace vm operations") \ \ From 044dcef0e693487176faa3700cf675cbecbe4301 Mon Sep 17 00:00:00 2001 From: Vicente Romero Date: Thu, 25 Oct 2012 13:33:27 -0700 Subject: [PATCH 105/241] 6725230: Java Compilation with Jsr199 ignores Class-Path in manifest Reviewed-by: jjg, mcimadamore --- .../com/sun/tools/javac/file/Locations.java | 29 ++-- .../Paths/TestCompileJARInClassPath.java | 132 ++++++++++++++++++ 2 files changed, 150 insertions(+), 11 deletions(-) create mode 100644 langtools/test/tools/javac/Paths/TestCompileJARInClassPath.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java b/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java index 6e0472c97dc..7ee850bb4d5 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java +++ b/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java @@ -420,14 +420,10 @@ public class Locations { if (!options.contains(option)) return false; searchPath = value == null ? null : - Collections.unmodifiableCollection(computePath(value)); + Collections.unmodifiableCollection(createPath().addFiles(value)); return true; } - protected Path computePath(String value) { - return new Path().addFiles(value); - } - @Override Collection getLocation() { return searchPath; @@ -439,10 +435,18 @@ public class Locations { if (files == null) { p = computePath(null); } else { - p = new Path().addFiles(files); + p = createPath().addFiles(files); } searchPath = Collections.unmodifiableCollection(p); } + + protected Path computePath(String value) { + return createPath().addFiles(value); + } + + protected Path createPath() { + return new Path(); + } } /** @@ -477,11 +481,15 @@ public class Locations { // Default to current working directory. if (cp == null) cp = "."; + return createPath().addFiles(cp); + } + + @Override + protected Path createPath() { return new Path() - .expandJarClassPaths(true) // Only search user jars for Class-Paths - .emptyPathDefault(new File(".")) // Empty path elt ==> current directory - .addFiles(cp); - } + .expandJarClassPaths(true) // Only search user jars for Class-Paths + .emptyPathDefault(new File(".")); // Empty path elt ==> current directory + } private void lazy() { if (searchPath == null) @@ -591,7 +599,6 @@ public class Locations { String extdirsOpt = optionValues.get(EXTDIRS); String xbootclasspathPrependOpt = optionValues.get(XBOOTCLASSPATH_PREPEND); String xbootclasspathAppendOpt = optionValues.get(XBOOTCLASSPATH_APPEND); - path.addFiles(xbootclasspathPrependOpt); if (endorseddirsOpt != null) diff --git a/langtools/test/tools/javac/Paths/TestCompileJARInClassPath.java b/langtools/test/tools/javac/Paths/TestCompileJARInClassPath.java new file mode 100644 index 00000000000..96347c2ac31 --- /dev/null +++ b/langtools/test/tools/javac/Paths/TestCompileJARInClassPath.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6725230 + * @summary Test to make sure that java Compilation with JSR199 does not ignore + * Class-Path in manifest + * @author vicente.romero + * @build TestCompileJARInClassPath + * @run main TestCompileJARInClassPath + */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; +import javax.tools.DiagnosticCollector; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; +import javax.tools.ToolProvider; + +public class TestCompileJARInClassPath { + + public static void main(String args[]) throws Exception { + TestCompileJARInClassPath theTest = new TestCompileJARInClassPath(); + theTest.run(); + } + + void run() throws Exception { + try { + clean(); + generateFilesNeeded(); + compileWithJSR199(); + } finally { + clean(); + } + } + + void writeFile(String f, String contents) throws IOException { + PrintStream s = new PrintStream(new FileOutputStream(f)); + s.println(contents); + s.close(); + } + + void rm(String filename) throws Exception { + File f = new File(filename); + f.delete(); + if (f.exists()) + throw new Exception(filename + ": couldn't remove"); + } + + void clean() throws Exception { + rm("C1.java"); + rm("C1.class"); + rm("C1.jar"); + + rm("C2.java"); + rm("C2.class"); + rm("C2.jar"); + rm("MANIFEST.MF"); + + rm("C3.java"); + rm("C3.class"); + } + + void generateFilesNeeded() throws Exception { + sun.tools.jar.Main jarGenerator = new sun.tools.jar.Main(System.out, System.err, "jar"); + + writeFile("C1.java", + "public class C1 {public static void f() {}}"); + com.sun.tools.javac.Main.compile(new String[]{"C1.java"}); + jarGenerator.run(new String[] {"cf", "C1.jar", "C1.class"}); + + writeFile("C2.java", + "public class C2 {public static void g() {}}"); + writeFile("MANIFEST.MF", + "Manifest-Version: 1.0\n" + + "Class-Path: C1.jar\n" + + "Main-Class: C2"); + com.sun.tools.javac.Main.compile(new String[]{"C2.java"}); + jarGenerator.run(new String[] {"cfm", "C2.jar", "MANIFEST.MF", "C2.class"}); + + writeFile("C3.java", + "public class C3 {public static void h() {C2.g(); C1.f();}}"); + } + + void compileWithJSR199() throws IOException { + String cpath = "C2.jar"; + File clientJarFile = new File(cpath); + File sourceFileToCompile = new File("C3.java"); + + + javax.tools.JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + DiagnosticCollector diagnostics = new DiagnosticCollector<>(); + StandardJavaFileManager stdFileManager = javac.getStandardFileManager(diagnostics, null, null); + + List files = new ArrayList<>(); + files.add(clientJarFile); + + stdFileManager.setLocation(StandardLocation.CLASS_PATH, files); + + Iterable sourceFiles = stdFileManager.getJavaFileObjects(sourceFileToCompile); + + if (!javac.getTask(null, stdFileManager, diagnostics, null, null, sourceFiles).call()) { + throw new AssertionError("compilation failed"); + } + } +} From 4e5ebae2d3065904a4c06285ddb3675991f22cef Mon Sep 17 00:00:00 2001 From: Harold Seigel Date: Thu, 25 Oct 2012 16:33:40 -0400 Subject: [PATCH 106/241] 7191817: -XX:+UseSerialGC -XX:+UseLargePages crashes with SIGFPE on MacOS X Disable -XX:+UseLargePages for MacOS X Reviewed-by: dholmes, coleenp, sla --- hotspot/src/share/vm/runtime/arguments.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 79fc67876b3..d27bf0ef47d 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -2569,7 +2569,9 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize); } +#ifndef _ALLBSD_SOURCE // UseLargePages is not yet supported on BSD. FLAG_SET_DEFAULT(UseLargePages, true); +#endif // Increase some data structure sizes for efficiency FLAG_SET_CMDLINE(uintx, BaseFootPrintEstimate, MaxHeapSize); @@ -3134,6 +3136,10 @@ jint Arguments::parse(const JavaVMInitArgs* args) { UNSUPPORTED_OPTION(UseG1GC, "G1 GC"); #endif +#ifdef _ALLBSD_SOURCE // UseLargePages is not yet supported on BSD. + UNSUPPORTED_OPTION(UseLargePages, "-XX:+UseLargePages"); +#endif + #if !INCLUDE_ALTERNATE_GCS if (UseParallelGC) { warning("Parallel GC is not supported in this VM. Using Serial GC."); From 4531e51fc4e8c573efd75cdbe995dffa1c084dbb Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Thu, 25 Oct 2012 17:32:03 -0700 Subject: [PATCH 107/241] 7163534: VM could crashes assert(false) failed: infinite EA connection graph build In case of time or iterations limit reached C2 stops EA and continue compilation without EA as it does in product VM already. Reviewed-by: twisti --- hotspot/src/share/vm/opto/c2_globals.hpp | 3 +++ hotspot/src/share/vm/opto/escape.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/opto/c2_globals.hpp b/hotspot/src/share/vm/opto/c2_globals.hpp index 80996a5d713..4fdebf526cb 100644 --- a/hotspot/src/share/vm/opto/c2_globals.hpp +++ b/hotspot/src/share/vm/opto/c2_globals.hpp @@ -439,6 +439,9 @@ product(bool, DoEscapeAnalysis, true, \ "Perform escape analysis") \ \ + develop(bool, ExitEscapeAnalysisOnTimeout, true, \ + "Exit or throw assert in EA when it reaches time limit") \ + \ notproduct(bool, PrintEscapeAnalysis, false, \ "Print the results of escape analysis") \ \ diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp index 2fd6ad1ceaf..a5aa47119da 100644 --- a/hotspot/src/share/vm/opto/escape.cpp +++ b/hotspot/src/share/vm/opto/escape.cpp @@ -1084,7 +1084,7 @@ bool ConnectionGraph::complete_connection_graph( C->log()->text("%s", (iterations >= CG_BUILD_ITER_LIMIT) ? "iterations" : "time"); C->log()->end_elem(" limit'"); } - assert(false, err_msg_res("infinite EA connection graph build (%f sec, %d iterations) with %d nodes and worklist size %d", + assert(ExitEscapeAnalysisOnTimeout, err_msg_res("infinite EA connection graph build (%f sec, %d iterations) with %d nodes and worklist size %d", time.seconds(), iterations, nodes_size(), ptnodes_worklist.length())); // Possible infinite build_connection_graph loop, // bailout (no changes to ideal graph were made). From fc84b1122737400731aa586793e1122dd72654bc Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Fri, 26 Oct 2012 11:48:04 -0700 Subject: [PATCH 108/241] 8001635: assert(in_bb(n)) failed: must be Added missed check that Load node is in processed loop block. Reviewed-by: twisti --- hotspot/src/share/vm/opto/superword.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp index c21c1e3ab16..f53c6483750 100644 --- a/hotspot/src/share/vm/opto/superword.cpp +++ b/hotspot/src/share/vm/opto/superword.cpp @@ -1809,7 +1809,7 @@ void SuperWord::compute_vector_element_type() { const Type* vt = vtn; if (VectorNode::is_shift(in)) { Node* load = in->in(1); - if (load->is_Load() && (velt_type(load)->basic_type() == T_INT)) { + if (load->is_Load() && in_bb(load) && (velt_type(load)->basic_type() == T_INT)) { vt = velt_type(load); } else if (in->Opcode() != Op_LShiftI) { // Widen type to Int to avoid creation of right shift vector From 4d410669724611787a3ea69c9641ec5bea5415db Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Fri, 26 Oct 2012 13:10:56 -0700 Subject: [PATCH 109/241] 8001219: Clean up use of URLs in javadoc Extern class Reviewed-by: darcy --- .../internal/toolkit/Configuration.java | 4 +- .../doclets/internal/toolkit/util/Extern.java | 92 +++++++++---------- 2 files changed, 46 insertions(+), 50 deletions(-) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java index d3cf97c5c4e..5f952f1b142 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java @@ -408,11 +408,11 @@ public abstract class Configuration { group.checkPackageGroups(os[1], os[2]); } else if (opt.equals("-link")) { String url = os[1]; - extern.url(url, url, root, false); + extern.link(url, url, root, false); } else if (opt.equals("-linkoffline")) { String url = os[1]; String pkglisturl = os[2]; - extern.url(url, pkglisturl, root, true); + extern.link(url, pkglisturl, root, true); } } if (sourcepath.length() == 0) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java index 2fe301445e0..57c54799d1c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java @@ -167,17 +167,38 @@ public class Extern { * @param pkglisturl This can be another URL for "package-list" or ordinary * file. * @param reporter The DocErrorReporter used to report errors. - * @param linkoffline True if -linkoffline isused and false if -link is used. + * @param linkoffline True if -linkoffline is used and false if -link is used. */ - public boolean url(String url, String pkglisturl, + public boolean link(String url, String pkglisturl, DocErrorReporter reporter, boolean linkoffline) { this.linkoffline = linkoffline; - String errMsg = composeExternPackageList(url, pkglisturl); - if (errMsg != null) { - reporter.printWarning(errMsg); - return false; - } else { + try { + url = adjustEndFileSeparator(url); + if (isUrl(pkglisturl)) { + readPackageListFromURL(url, toURL(pkglisturl)); + } else { + readPackageListFromFile(url, new File(pkglisturl)); + } return true; + } catch (Fault f) { + reporter.printWarning(f.getMessage()); + return false; + } + } + + private URL toURL(String url) throws Fault { + try { + return new URL(url); + } catch (MalformedURLException e) { + throw new Fault(configuration.getText("doclet.MalformedURL", url), e); + } + } + + private class Fault extends Exception { + private static final long serialVersionUID = 0; + + Fault(String msg, Exception cause) { + super(msg, cause); } } @@ -193,32 +214,11 @@ public class Extern { return packageToItemMap.get(pkgName); } - /** - * Adjusts the end file separator if it is missing from the URL or the - * directory path and depending upon the URL or file path, fetch or - * read the "package-list" file. - * - * @param urlOrDirPath URL or the directory path. - * @param pkgListUrlOrDirPath URL or directory path for the "package-list" file or the "package-list" - * file itself. - */ - private String composeExternPackageList(String urlOrDirPath, String pkgListUrlOrDirPath) { - urlOrDirPath = adjustEndFileSeparator(urlOrDirPath); - pkgListUrlOrDirPath = adjustEndFileSeparator(pkgListUrlOrDirPath); - return isUrl(pkgListUrlOrDirPath) ? - fetchURLComposeExternPackageList(urlOrDirPath, pkgListUrlOrDirPath) : - readFileComposeExternPackageList(urlOrDirPath, pkgListUrlOrDirPath); - } - /** * If the URL or Directory path is missing end file separator, add that. */ private String adjustEndFileSeparator(String url) { - String filesep = "/"; - if (!url.endsWith(filesep)) { - url += filesep; - } - return url; + return url.endsWith("/") ? url : url + '/'; } /** @@ -227,17 +227,18 @@ public class Extern { * @param urlpath Path to the packages. * @param pkglisturlpath URL or the path to the "package-list" file. */ - private String fetchURLComposeExternPackageList(String urlpath, - String pkglisturlpath) { - String link = pkglisturlpath + "package-list"; + private void readPackageListFromURL(String urlpath, URL pkglisturlpath) + throws Fault { try { - readPackageList((new URL(link)).openStream(), urlpath, false); + URL link = pkglisturlpath.toURI().resolve(DocPaths.PACKAGE_LIST.getPath()).toURL(); + readPackageList(link.openStream(), urlpath, false); + } catch (URISyntaxException exc) { + throw new Fault(configuration.getText("doclet.MalformedURL", pkglisturlpath.toString()), exc); } catch (MalformedURLException exc) { - return configuration.getText("doclet.MalformedURL", link); + throw new Fault(configuration.getText("doclet.MalformedURL", pkglisturlpath.toString()), exc); } catch (IOException exc) { - return configuration.getText("doclet.URL_error", link); + throw new Fault(configuration.getText("doclet.URL_error", pkglisturlpath.toString()), exc); } - return null; } /** @@ -246,27 +247,22 @@ public class Extern { * @param path URL or directory path to the packages. * @param pkgListPath Path to the local "package-list" file. */ - private String readFileComposeExternPackageList(String path, - String pkgListPath) { - - String link = pkgListPath + "package-list"; - if (! ((new File(pkgListPath)).isAbsolute() || linkoffline)){ - link = configuration.destDirName + link; + private void readPackageListFromFile(String path, File pkgListPath) + throws Fault { + File file = new File(pkgListPath, "package-list"); + if (! (file.isAbsolute() || linkoffline)){ + file = new File(configuration.destDirName, file.getPath()); } try { - File file = new File(link); if (file.exists() && file.canRead()) { readPackageList(new FileInputStream(file), path, ! ((new File(path)).isAbsolute() || isUrl(path))); } else { - return configuration.getText("doclet.File_error", link); + throw new Fault(configuration.getText("doclet.File_error", file.getPath()), null); } - } catch (FileNotFoundException exc) { - return configuration.getText("doclet.File_error", link); } catch (IOException exc) { - return configuration.getText("doclet.File_error", link); + throw new Fault(configuration.getText("doclet.File_error", file.getPath()), exc); } - return null; } /** From 97c1b9deaeb2d68b5fc49d2035559b7952ffe22c Mon Sep 17 00:00:00 2001 From: Alejandro Murillo Date: Fri, 26 Oct 2012 14:09:53 -0700 Subject: [PATCH 110/241] Added tag hs25-b07 for changeset 490cfcf46c7d --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 4f9539a26aa..e4f8bc77a7d 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -288,3 +288,4 @@ b261523fe66c40a02968f0aa7e73602491bb3386 hs25-b05 4547dc71db765276e027b0c2780b724bae0a07d3 jdk8-b61 d0337c31c8be7716369b4e7c3bd5f352983c6a06 hs25-b06 dccd40de8db1fa96f186e6179907818d75320440 jdk8-b62 +dc16fe422c535ecd4e9f80fb814a1bb9704da6f5 hs25-b07 From f0534ca47014226e75d064c00f803f89d2e18f27 Mon Sep 17 00:00:00 2001 From: Alejandro Murillo Date: Fri, 26 Oct 2012 14:18:57 -0700 Subject: [PATCH 111/241] 8001663: new hotspot build - hs25-b08 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 1f72e227aae..59320dbec54 100644 --- a/hotspot/make/hotspot_version +++ b/hotspot/make/hotspot_version @@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2012 HS_MAJOR_VER=25 HS_MINOR_VER=0 -HS_BUILD_NUMBER=07 +HS_BUILD_NUMBER=08 JDK_MAJOR_VER=1 JDK_MINOR_VER=8 From 38c629a354d2251dabe3022ce3042afdfd36de46 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Fri, 26 Oct 2012 14:23:29 -0700 Subject: [PATCH 112/241] 8000992: Update new build-infra makefiles Build-infra project integration. Multiple authors on this work: erikj and ihse primarily, also changes from ohair, tbell, and dholmes. Special credit to ohstrom for his smartjavac work. Reviewed-by: erikj, ihse, dholmes, tbell --- jdk/makefiles/BuildJdk.gmk | 124 ++ jdk/makefiles/Bundles.gmk | 141 ++ jdk/makefiles/CompileDemos.gmk | 13 +- jdk/makefiles/CompileJavaClasses.gmk | 155 +-- jdk/makefiles/CompileLaunchers.gmk | 1148 ++++++++-------- jdk/makefiles/CompileNativeLibraries.gmk | 357 ++--- jdk/makefiles/CopyFiles.gmk | 10 +- jdk/makefiles/CopyIntoClasses.gmk | 10 +- jdk/makefiles/CreateJars.gmk | 153 ++- jdk/makefiles/GendataBreakIterator.gmk | 4 +- jdk/makefiles/GendataFontConfig.gmk | 1 - jdk/makefiles/GendataHtml32dtd.gmk | 4 +- jdk/makefiles/GenerateClasses.gmk | 10 +- jdk/makefiles/GenerateJavaSources.gmk | 41 +- jdk/makefiles/GensrcBuffer.gmk | 12 +- jdk/makefiles/GensrcCLDR.gmk | 2 +- jdk/makefiles/GensrcCharacterData.gmk | 18 +- jdk/makefiles/GensrcCharsetCoder.gmk | 4 +- jdk/makefiles/GensrcCharsetMapping.gmk | 26 +- jdk/makefiles/GensrcExceptions.gmk | 10 +- jdk/makefiles/GensrcIcons.gmk | 107 +- jdk/makefiles/GensrcJDWP.gmk | 9 +- jdk/makefiles/GensrcJObjC.gmk | 15 +- jdk/makefiles/GensrcLocaleDataMetaInfo.gmk | 12 +- jdk/makefiles/GensrcMisc.gmk | 49 +- jdk/makefiles/GensrcProperties.gmk | 17 +- jdk/makefiles/GensrcSwing.gmk | 24 +- jdk/makefiles/GensrcX11Wrappers.gmk | 11 +- jdk/makefiles/Images.gmk | 462 +++---- jdk/makefiles/Import.gmk | 13 +- jdk/makefiles/Makefile | 117 +- jdk/makefiles/Tools.gmk | 13 +- jdk/makefiles/docs/CORE_PKGS.gmk | 293 ---- jdk/makefiles/docs/Makefile | 1174 ----------------- jdk/makefiles/docs/NON_CORE_PKGS.gmk | 104 -- jdk/makefiles/docs/Notes.html | 49 - .../mapfiles/launchers/mapfile-amd64 | 39 - jdk/makefiles/mapfiles/launchers/mapfile-i586 | 48 - .../mapfiles/libawt_headless/reorder-i586 | 1 - jdk/makefiles/mapfiles/libjava/reorder-i586 | 109 -- jdk/makefiles/mapfiles/libjpeg/reorder-i586 | 119 -- jdk/makefiles/mapfiles/libnio/mapfile-bsd | 179 --- jdk/makefiles/mapfiles/libnio/reorder-i586 | 17 - jdk/makefiles/mapfiles/libverify/reorder-i586 | 40 - jdk/makefiles/mapfiles/libzip/reorder-i586 | 49 - .../sun/{xawt => awt/X11}/ToBin.java | 0 jdk/makefiles/sun/osxapp/ToBin.java | 50 + 47 files changed, 1705 insertions(+), 3658 deletions(-) create mode 100644 jdk/makefiles/BuildJdk.gmk create mode 100644 jdk/makefiles/Bundles.gmk delete mode 100644 jdk/makefiles/docs/CORE_PKGS.gmk delete mode 100644 jdk/makefiles/docs/Makefile delete mode 100644 jdk/makefiles/docs/NON_CORE_PKGS.gmk delete mode 100644 jdk/makefiles/docs/Notes.html delete mode 100644 jdk/makefiles/mapfiles/launchers/mapfile-amd64 delete mode 100644 jdk/makefiles/mapfiles/launchers/mapfile-i586 delete mode 100644 jdk/makefiles/mapfiles/libawt_headless/reorder-i586 delete mode 100644 jdk/makefiles/mapfiles/libjava/reorder-i586 delete mode 100644 jdk/makefiles/mapfiles/libjpeg/reorder-i586 delete mode 100644 jdk/makefiles/mapfiles/libnio/mapfile-bsd delete mode 100644 jdk/makefiles/mapfiles/libnio/reorder-i586 delete mode 100644 jdk/makefiles/mapfiles/libverify/reorder-i586 delete mode 100644 jdk/makefiles/mapfiles/libzip/reorder-i586 rename jdk/makefiles/sun/{xawt => awt/X11}/ToBin.java (100%) create mode 100644 jdk/makefiles/sun/osxapp/ToBin.java diff --git a/jdk/makefiles/BuildJdk.gmk b/jdk/makefiles/BuildJdk.gmk new file mode 100644 index 00000000000..b5bad77bb38 --- /dev/null +++ b/jdk/makefiles/BuildJdk.gmk @@ -0,0 +1,124 @@ +# +# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This must be the first rule +default: all + +# Inclusion of this pseudo-target will cause make to execute this file +# serially, regardless of -j. Recursively called makefiles will not be +# affected, however. This is required for correct dependency management. +.NOTPARALLEL: + +include $(SPEC) +include MakeBase.gmk +include JavaCompilation.gmk +include NativeCompilation.gmk + +# Setup the java compilers for the JDK build. +include Setup.gmk + +# Setup the build tools. +include Tools.gmk + +import: $(BUILD_TOOLS) import-only +import-only: +# Import (corba jaxp jaxws langtools hotspot) + +$(MAKE) -f Import.gmk + +gensrc: import gensrc-only +gensrc-only: + +$(MAKE) -f GenerateJavaSources.gmk +# Ok, now gensrc is fully populated. + +gendata: gensrc gendata-only +gendata-only: + +$(MAKE) -f GenerateData.gmk + +classes: gendata classes-only +classes-only: + +$(MAKE) -f CompileJavaClasses.gmk +# The classes are now built and +# any javah files have now been generated. + +libs: classes libs-only +libs-only: + +$(MAKE) -f CompileNativeLibraries.gmk + +launchers: libs launchers-only +launchers-only: +# Finally compile the launchers. + +$(MAKE) -f CompileLaunchers.gmk + +genclasses: launchers genclasses-only +genclasses-only: +# Generate classes that have other sources. Needs +# to execute launchers. + +$(MAKE) -f GenerateClasses.gmk + +jdk: genclasses +# Now we have a complete jdk, which you can run. +# It is not yet wrapped up as an installed image. + +demos: +# The demos are compiled against this jdk. + +$(MAKE) -f CompileDemos.gmk +# Now copy the sample sources into the jdk. + +$(MAKE) -f CopySamples.gmk + +# Create the final jdk and jre images, to be wrapped up +# into packages, or installed. +images: + +$(MAKE) -f CreateJars.gmk + +$(MAKE) -f Images.gmk + +overlay-images: + +$(MAKE) -f CompileLaunchers.gmk OVERLAY_IMAGES=true + +$(MAKE) -f Images.gmk overlay-images + +# Create platform specific image layouts +bundles: + +$(MAKE) -f Bundles.gmk + +BINARIES:=$(notdir $(wildcard $(IMAGES_OUTPUTDIR)/j2sdk-image/bin/*)) +INSTALLDIR:=openjdk-$(RELEASE) + +# Install the jdk image, in a very crude way. Not taking into +# account, how to install properly on macosx or windows etc. +install: + echo Installing jdk image into $(INSTALL_PREFIX)/jvm/$(INSTALLDIR) + echo and creating $(words $(BINARIES)) links from $(INSTALL_PREFIX)/bin into the jdk. + $(MKDIR) -p $(INSTALL_PREFIX)/jvm/$(INSTALLDIR) + $(RM) -r $(INSTALL_PREFIX)/jvm/$(INSTALLDIR)/* + $(CP) -rp $(IMAGES_OUTPUTDIR)/j2sdk-image/* $(INSTALL_PREFIX)/jvm/$(INSTALLDIR) + $(MKDIR) -p $(INSTALL_PREFIX)/bin + $(RM) $(addprefix $(INSTALL_PREFIX)/bin/,$(BINARIES)) + $(foreach b,$(BINARIES),$(LN) -s $(INSTALL_PREFIX)/jvm/$(INSTALLDIR)/bin/$b $(INSTALL_PREFIX)/bin/$b &&) true + +# The all target builds the JDK, but not the images +all: jdk + +.PHONY: import gensrc gendata classes libs launchers genclasses +.PHONY: import-only gensrc-only gendata-only classes-only libs-only launchers-only genclasses-only +.PHONY: all jdk demos images overlay-images bundles install diff --git a/jdk/makefiles/Bundles.gmk b/jdk/makefiles/Bundles.gmk new file mode 100644 index 00000000000..8b1183a554d --- /dev/null +++ b/jdk/makefiles/Bundles.gmk @@ -0,0 +1,141 @@ +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +include $(SPEC) +include MakeBase.gmk + +default: bundles + +# Only macosx has bundles defined. +ifeq ($(OPENJDK_TARGET_OS), macosx) + +bundles: jre-bundle jdk-bundle + + +JDK_BUNDLE_DIR := $(IMAGES_OUTPUTDIR)/j2sdk-bundle/jdk$(JDK_VERSION).jdk/Contents +JRE_BUNDLE_DIR := $(IMAGES_OUTPUTDIR)/j2re-bundle/jre$(JDK_VERSION).jre/Contents + +MACOSX_SRC := $(JDK_TOPDIR)/src/macosx + +# All these OPENJDK checks are needed since there is no coherency between +# these values in open and closed. Should probably be fixed. +ifndef OPENJDK + BUNDLE_ID := $(MACOSX_BUNDLE_ID_BASE).$(JDK_MINOR_VERSION)u$(JDK_UPDATE_VERSION) +else + BUNDLE_ID := $(MACOSX_BUNDLE_ID_BASE) +endif +BUNDLE_ID_JRE := $(BUNDLE_ID).jre +BUNDLE_ID_JDK := $(BUNDLE_ID).jdk + +BUNDLE_NAME := $(MACOSX_BUNDLE_NAME_BASE) $(JDK_MINOR_VERSION) +BUNDLE_NAME_JRE := $(BUNDLE_NAME) +BUNDLE_NAME_JDK := $(BUNDLE_NAME) + +ifndef OPENJDK + BUNDLE_INFO := $(MACOSX_BUNDLE_NAME_BASE) $(JDK_VERSION) +else + BUNDLE_INFO := $(MACOSX_BUNDLE_NAME_BASE) ($(JDK_VERSION)) +endif +BUNDLE_INFO_JRE := $(BUNDLE_INFO) +BUNDLE_INFO_JDK := $(BUNDLE_INFO) + +BUNDLE_PLATFORM_VERSION := $(JDK_MAJOR_VERSION).$(JDK_MINOR_VERSION) +BUNDLE_VERSION := $(JDK_VERSION) +ifeq ($(COMPANY_NAME),N/A) + BUNDLE_VENDOR := UNDEFINED +else + BUNDLE_VENDOR := $(COMPANY_NAME) +endif + + +JDK_FILE_LIST := $(shell $(FIND) $(IMAGES_OUTPUTDIR)/j2sdk-image ! -type d) +JRE_FILE_LIST := $(shell $(FIND) $(IMAGES_OUTPUTDIR)/j2re-image ! -type d) + +JDK_TARGET_LIST := $(subst $(IMAGES_OUTPUTDIR)/j2sdk-image,$(JDK_BUNDLE_DIR)/Home,$(JDK_FILE_LIST)) +JRE_TARGET_LIST := $(subst $(IMAGES_OUTPUTDIR)/j2re-image,$(JRE_BUNDLE_DIR)/Home,$(JRE_FILE_LIST)) + +# The old builds implementation of this did not preserve symlinks so +# make sure they are followed and the contents copied instead. +# To fix this, just replace copy with install-file macro. +$(JDK_BUNDLE_DIR)/Home/%: $(IMAGES_OUTPUTDIR)/j2sdk-image/% + $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(MKDIR) -p $(@D) + $(CP) -f -R -L '$<' '$@' + +$(JRE_BUNDLE_DIR)/Home/%: $(IMAGES_OUTPUTDIR)/j2re-image/% + $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(MKDIR) -p $(@D) + $(CP) -f -R -L '$<' '$@' + +$(JDK_BUNDLE_DIR)/MacOS/libjli.dylib: + $(ECHO) Creating link $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(MKDIR) -p $(@D) + $(RM) $@ + $(LN) -s ../Home/lib/jli/libjli.dylib $@ + +$(JRE_BUNDLE_DIR)/MacOS/libjli.dylib: + $(ECHO) Creating link $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(MKDIR) -p $(@D) + $(RM) $@ + $(LN) -s ../Home/lib/jli/libjli.dylib $@ + +$(JDK_BUNDLE_DIR)/Info.plist: $(SPEC) + $(ECHO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(MKDIR) -p $(@D) + $(SED) -e "s/@@ID@@/$(BUNDLE_ID_JDK)/g" \ + -e "s/@@NAME@@/$(BUNDLE_NAME_JDK)/g" \ + -e "s/@@INFO@@/$(BUNDLE_INFO_JDK)/g" \ + -e "s/@@PLATFORM_VERSION@@/$(BUNDLE_PLATFORM_VERSION)/g" \ + -e "s/@@VERSION@@/$(BUNDLE_VERSION)/g" \ + -e "s/@@VENDOR@@/$(BUNDLE_VENDOR)/g" \ + < $(MACOSX_SRC)/bundle/JDK-Info.plist > $@ + +$(JRE_BUNDLE_DIR)/Info.plist: $(SPEC) + $(ECHO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(MKDIR) -p $(@D) + $(SED) -e "s/@@ID@@/$(BUNDLE_ID_JRE)/g" \ + -e "s/@@NAME@@/$(BUNDLE_NAME_JRE)/g" \ + -e "s/@@INFO@@/$(BUNDLE_INFO_JRE)/g" \ + -e "s/@@PLATFORM_VERSION@@/$(BUNDLE_PLATFORM_VERSION)/g" \ + -e "s/@@VERSION@@/$(BUNDLE_VERSION)/g" \ + -e "s/@@VENDOR@@/$(BUNDLE_VENDOR)/g" \ + < $(MACOSX_SRC)/bundle/JRE-Info.plist > $@ + +jdk-bundle: $(JDK_TARGET_LIST) $(JDK_BUNDLE_DIR)/MacOS/libjli.dylib \ + $(JDK_BUNDLE_DIR)/Info.plist + $(SETFILE) -a B $(dir $(JDK_BUNDLE_DIR)) + +jre-bundle: $(JRE_TARGET_LIST) $(JRE_BUNDLE_DIR)/MacOS/libjli.dylib \ + $(JRE_BUNDLE_DIR)/Info.plist + $(SETFILE) -a B $(dir $(JRE_BUNDLE_DIR)) + +else # Not macosx + +bundles: + $(ECHO) "No bundles defined for $(OPENJDK_TARGET_OS)" + +endif # macosx + +.PHONY: jdk-bundle jre-bundle bundles diff --git a/jdk/makefiles/CompileDemos.gmk b/jdk/makefiles/CompileDemos.gmk index 4f84b5cb1a2..7de9166cffe 100644 --- a/jdk/makefiles/CompileDemos.gmk +++ b/jdk/makefiles/CompileDemos.gmk @@ -107,10 +107,7 @@ define SetupDemo $1_JARFILE := $1.jar endif - # Compile java classes if there are any. - $1_JAVA_FILES_EXIST := $$(shell $$(FIND) $$($1_MAIN_SRC) -name "*.java") - - ifneq ($$($1_JAVA_FILES_EXIST),) + ifeq ($(findstring $1,Laffy SwingSet3),) $$(eval $$(call SetupJavaCompilation,BUILD_DEMO_$1,\ SETUP:=GENERATE_USINGJDKBYTECODE,\ ADD_JAVAC_FLAGS:=$3,\ @@ -264,9 +261,9 @@ define SetupJVMTIDemo LDFLAGS_SUFFIX_linux:=$8,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$$(RC_FLAGS) \ - /D "JDK_FNAME=$1.dll" \ - /D "JDK_INTERNAL_NAME=$1" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=$1.dll" \ + -D "JDK_INTERNAL_NAME=$1" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/demoobjs/jvmti/$1,\ OUTPUT_DIR:=$(JDK_OUTPUTDIR)/demo/jvmti/$1/lib,\ LIBRARY:=$1)) @@ -456,7 +453,7 @@ ifndef OPENJDK $(JDK_OUTPUTDIR)/demo/_the.db.unzipped: $(DB_DEMO_ZIPFILE) $(MKDIR) -p $(@D) $(RM) -r $(JDK_OUTPUTDIR)/demo/db $(JDK_OUTPUTDIR)/demo/demo - $(CD) $(JDK_OUTPUTDIR)/demo && $(UNZIP) -o $< + $(CD) $(JDK_OUTPUTDIR)/demo && $(UNZIP) -q -o $< $(MV) $(JDK_OUTPUTDIR)/demo/demo $(JDK_OUTPUTDIR)/demo/db $(TOUCH) $@ diff --git a/jdk/makefiles/CompileJavaClasses.gmk b/jdk/makefiles/CompileJavaClasses.gmk index 879ffadfed1..460d9e22685 100644 --- a/jdk/makefiles/CompileJavaClasses.gmk +++ b/jdk/makefiles/CompileJavaClasses.gmk @@ -76,9 +76,14 @@ ifneq ($(OPENJDK_TARGET_OS),solaris) SolarisAclFileAttributeView.java \ SolarisLoginModule.java \ SolarisSystem.java \ + sun/nio/ch/DevPollArrayWrapper.java \ + sun/nio/ch/DevPollSelectorImpl.java \ + sun/nio/ch/DevPollSelectorProvider.java \ sun/nio/ch/EventPortSelectorImpl.java \ sun/nio/ch/EventPortSelectorProvider.java \ sun/nio/ch/EventPortWrapper.java \ + sun/nio/ch/SolarisAsynchronousChannelProvider.java \ + sun/nio/ch/SolarisEventPort.java \ sun/tools/attach/SolarisAttachProvider.java \ sun/tools/attach/SolarisVirtualMachine.java endif @@ -105,18 +110,27 @@ endif ifneq ($(OPENJDK_TARGET_OS),linux) EXFILES+=sun/tools/attach/LinuxAttachProvider.java \ - sun/tools/attach/LinuxVirtualMachine.java \ - sun/nio/fs/LinuxDosFileAttributeView.java \ - sun/nio/fs/LinuxFileStore.java \ - sun/nio/fs/LinuxFileSystem.java \ - sun/nio/fs/LinuxFileSystemProvider.java \ - sun/nio/fs/LinuxNativeDispatcher.java \ - sun/nio/fs/LinuxUserDefinedFileAttributeView.java \ - sun/nio/fs/LinuxWatchService.java + sun/tools/attach/LinuxVirtualMachine.java \ + sun/nio/ch/EPoll.java \ + sun/nio/ch/EPollArrayWrapper.java \ + sun/nio/ch/EPollPort.java \ + sun/nio/ch/EPollSelectorImpl.java \ + sun/nio/ch/EPollSelectorProvider.java \ + sun/nio/ch/LinuxAsynchronousChannelProvider.java \ + sun/nio/fs/LinuxDosFileAttributeView.java \ + sun/nio/fs/LinuxFileStore.java \ + sun/nio/fs/LinuxFileSystem.java \ + sun/nio/fs/LinuxFileSystemProvider.java \ + sun/nio/fs/LinuxNativeDispatcher.java \ + sun/nio/fs/LinuxUserDefinedFileAttributeView.java \ + sun/nio/fs/LinuxWatchService.java endif ifneq ($(OPENJDK_TARGET_OS),macosx) - EXFILES+=sun/nio/fs/BsdFileStore.java \ + EXFILES+=sun/nio/ch/BsdAsynchronousChannelProvider.java \ + sun/nio/ch/KQueue.java \ + sun/nio/ch/KQueuePort.java \ + sun/nio/fs/BsdFileStore.java \ sun/nio/fs/BsdFileSystem.java \ sun/nio/fs/BsdFileSystemProvider.java \ sun/nio/fs/BsdNativeDispatcher.java \ @@ -147,51 +161,48 @@ ifeq (,$(filter $(OPENJDK_TARGET_OS), windows macosx)) endif ifneq ($(OPENJDK_TARGET_OS), macosx) -# -# Not in rt.jar on solaris and linux...(windows not checked) -# in rt.jar on macosx ?? -EXFILES+=sun/awt/X11/ScreenFormat.java \ - sun/awt/X11/XArc.java \ - sun/awt/X11/XChar2b.java \ - sun/awt/X11/XCharStruct.java \ - sun/awt/X11/XClassHint.java \ - sun/awt/X11/XComposeStatus.java \ - sun/awt/X11/XExtCodes.java \ - sun/awt/X11/XFontProp.java \ - sun/awt/X11/XFontSetExtents.java \ - sun/awt/X11/XFontStruct.java \ - sun/awt/X11/XGCValues.java \ - sun/awt/X11/XHostAddress.java \ - sun/awt/X11/XIMCallback.java \ - sun/awt/X11/XIMHotKeyTrigger.java \ - sun/awt/X11/XIMHotKeyTriggers.java \ - sun/awt/X11/XIMPreeditCaretCallbackStruct.java \ - sun/awt/X11/XIMPreeditDrawCallbackStruct.java \ - sun/awt/X11/XIMPreeditStateNotifyCallbackStruct.java \ - sun/awt/X11/XIMStatusDrawCallbackStruct.java \ - sun/awt/X11/XIMStringConversionCallbackStruct.java \ - sun/awt/X11/XIMStringConversionText.java \ - sun/awt/X11/XIMStyles.java \ - sun/awt/X11/XIMText.java \ - sun/awt/X11/XIMValuesList.java \ - sun/awt/X11/XImage.java \ - sun/awt/X11/XKeyboardControl.java \ - sun/awt/X11/XKeyboardState.java \ - sun/awt/X11/XOMCharSetList.java \ - sun/awt/X11/XOMFontInfo.java \ - sun/awt/X11/XOMOrientation.java \ - sun/awt/X11/XPoint.java \ - sun/awt/X11/XRectangle.java \ - sun/awt/X11/XSegment.java \ - sun/awt/X11/XStandardColormap.java \ - sun/awt/X11/XTextItem.java \ - sun/awt/X11/XTextItem16.java \ - sun/awt/X11/XTextProperty.java \ - sun/awt/X11/XTimeCoord.java \ - sun/awt/X11/XWindowChanges.java \ - sun/awt/X11/XdbeSwapInfo.java \ - sun/awt/X11/XmbTextItem.java \ - sun/awt/X11/XwcTextItem.java + EXFILES+=sun/awt/X11/ScreenFormat.java \ + sun/awt/X11/XArc.java \ + sun/awt/X11/XChar2b.java \ + sun/awt/X11/XCharStruct.java \ + sun/awt/X11/XClassHint.java \ + sun/awt/X11/XComposeStatus.java \ + sun/awt/X11/XExtCodes.java \ + sun/awt/X11/XFontProp.java \ + sun/awt/X11/XFontSetExtents.java \ + sun/awt/X11/XFontStruct.java \ + sun/awt/X11/XGCValues.java \ + sun/awt/X11/XHostAddress.java \ + sun/awt/X11/XIMCallback.java \ + sun/awt/X11/XIMHotKeyTrigger.java \ + sun/awt/X11/XIMHotKeyTriggers.java \ + sun/awt/X11/XIMPreeditCaretCallbackStruct.java \ + sun/awt/X11/XIMPreeditDrawCallbackStruct.java \ + sun/awt/X11/XIMPreeditStateNotifyCallbackStruct.java \ + sun/awt/X11/XIMStatusDrawCallbackStruct.java \ + sun/awt/X11/XIMStringConversionCallbackStruct.java \ + sun/awt/X11/XIMStringConversionText.java \ + sun/awt/X11/XIMStyles.java \ + sun/awt/X11/XIMText.java \ + sun/awt/X11/XIMValuesList.java \ + sun/awt/X11/XImage.java \ + sun/awt/X11/XKeyboardControl.java \ + sun/awt/X11/XKeyboardState.java \ + sun/awt/X11/XOMCharSetList.java \ + sun/awt/X11/XOMFontInfo.java \ + sun/awt/X11/XOMOrientation.java \ + sun/awt/X11/XPoint.java \ + sun/awt/X11/XRectangle.java \ + sun/awt/X11/XSegment.java \ + sun/awt/X11/XStandardColormap.java \ + sun/awt/X11/XTextItem.java \ + sun/awt/X11/XTextItem16.java \ + sun/awt/X11/XTextProperty.java \ + sun/awt/X11/XTimeCoord.java \ + sun/awt/X11/XWindowChanges.java \ + sun/awt/X11/XdbeSwapInfo.java \ + sun/awt/X11/XmbTextItem.java \ + sun/awt/X11/XwcTextItem.java endif # Exclude another implicitly not included file. @@ -229,31 +240,24 @@ else EXFILES+=sun/net/www/protocol/http/ntlm/NTLMAuthSequence.java endif -ifdef DISABLE_NIMBUS - # TODO: need to check when it happens - # Exclude nimus if disabled - EXCLUDES+= javax/swing/plaf/nimbus \ - com/sun/java/swing/plaf/nimbus -else -# -# These are never put into rt.jar -# -EXFILES+= javax/swing/plaf/nimbus/InternalFrameTitlePanePainter.java \ - javax/swing/plaf/nimbus/OptionPaneMessageAreaPainter.java \ - javax/swing/plaf/nimbus/ScrollBarPainter.java \ - javax/swing/plaf/nimbus/SliderPainter.java \ - javax/swing/plaf/nimbus/SpinnerPainter.java \ - javax/swing/plaf/nimbus/SplitPanePainter.java \ - javax/swing/plaf/nimbus/TabbedPanePainter.java -endif +# Exclude nimbus files from rt.jar +EXFILES+=javax/swing/plaf/nimbus/InternalFrameTitlePanePainter.java \ + javax/swing/plaf/nimbus/OptionPaneMessageAreaPainter.java \ + javax/swing/plaf/nimbus/ScrollBarPainter.java \ + javax/swing/plaf/nimbus/SliderPainter.java \ + javax/swing/plaf/nimbus/SpinnerPainter.java \ + javax/swing/plaf/nimbus/SplitPanePainter.java \ + javax/swing/plaf/nimbus/TabbedPanePainter.java # Acquire a list of files that should be copied straight over to the classes. include CopyIntoClasses.gmk # Now we have COPY_PATTERNS, COPY_FILES and COPY_EXTRA ifndef OPENJDK - CLOSED_SRC_DIRS:=$(JDK_TOPDIR)/src/closed/share/classes \ - $(JDK_TOPDIR)/src/closed/$(OPENJDK_TARGET_OS_API_DIR)/classes + CLOSED_SRC_DIRS:=$(JDK_TOPDIR)/src/closed/share/classes + ifneq ($(OPENJDK_TARGET_OS_API_DIR),windows) + CLOSED_SRC_DIRS += $(JDK_TOPDIR)/src/closed/$(OPENJDK_TARGET_OS_API_DIR)/classes + endif endif MACOSX_SRC_DIRS := @@ -294,7 +298,6 @@ $(eval $(call SetupJavaCompilation,BUILD_JDK,\ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes \ $(MACOSX_SRC_DIRS) \ $(JDK_OUTPUTDIR)/gensrc \ - $(JDK_OUTPUTDIR)/gensrc_swing/javax/swing/beaninfo \ $(CLOSED_SRC_DIRS),\ INCLUDES:=$(JDK_USER_DEFINED_FILTER),\ EXCLUDES:=$(EXCLUDES),\ @@ -326,7 +329,7 @@ endif # Set prereqs to the java files since make doesn't know about the class files. Add BUILD_JDK # as an order only dependency to avoid race with the java compilation. -$(JDK_OUTPUTDIR)/classes/_the.jdk.base.headers: $(JDK_BASE_HEADER_JAVA_FILES) | $(BUILD_JDK) +$(JDK_OUTPUTDIR)/gensrc_headers/_the.jdk.base.headers: $(JDK_BASE_HEADER_JAVA_FILES) | $(BUILD_JDK) $(ECHO) Generating headers for jdk base classes $(JAVAH) -bootclasspath $(JDK_OUTPUTDIR)/classes -d $(JDK_OUTPUTDIR)/gensrc_headers \ $(JDK_BASE_HEADER_CLASSES) @@ -416,6 +419,6 @@ endif # copy with -a to preserve timestamps so dependencies down the line aren't messed up all: $(BUILD_JDK) $(JARS) $(COPY_EXTRA) $(JDK_OUTPUTDIR)/classes/META-INF/services/com.sun.tools.xjc.Plugin \ - $(JDK_OUTPUTDIR)/classes/_the.jdk.base.headers + $(JDK_OUTPUTDIR)/gensrc_headers/_the.jdk.base.headers .PHONY: all diff --git a/jdk/makefiles/CompileLaunchers.gmk b/jdk/makefiles/CompileLaunchers.gmk index ce651675bad..b0cf492a82f 100644 --- a/jdk/makefiles/CompileLaunchers.gmk +++ b/jdk/makefiles/CompileLaunchers.gmk @@ -1,557 +1,591 @@ -# -# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -defalt: all - -include $(SPEC) -include MakeBase.gmk -include NativeCompilation.gmk - -# Setup the java compilers for the JDK build. -include Setup.gmk - -# Build tools -include Tools.gmk - -BUILD_LAUNCHERS= - -# When building a legacy overlay image (on solaris 64 bit), the launchers -# need to be built with a different rpath and a different output dir. -ifeq ($(OVERLAY_IMAGES),true) - ORIGIN_ROOT:=/../.. - OUTPUT_SUBDIR:=$(OPENJDK_TARGET_CPU_ISADIR) -else - ORIGIN_ROOT:=/.. -endif - -ifeq ($(OPENJDK_TARGET_OS), macosx) - ORIGIN_ARG:=$(call SET_EXECUTABLE_ORIGIN) -else - ORIGIN_ARG:=$(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/jli) \ - $(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR)/jli) -endif - -# -# Applications expect to be able to link against libjawt without invoking -# System.loadLibrary("jawt") first. This was the behaviour described in the -# devloper documentation of JAWT and what worked with OpenJDK6. -# -ifneq ($(findstring $(OPENJDK_TARGET_OS), linux solaris),) - ORIGIN_ARG+=$(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/lib$(OPENJDK_TARGET_CPU_LIBDIR)) \ - $(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR)) -endif - -define SetupLauncher - # TODO: Fix mapfile on solaris. Won't work with ld as linker. - # Parameter 1 is the name of the launcher (java,javac,jar...) - # Parameter 2 is extra CFLAGS - # Parameter 3 is extra LDFLAGS - # Parameter 4 is extra LDFLAGS_SUFFIX_posix - # Parameter 5 is extra LDFLAGS_SUFFIX_windows - # Parameter 6 is optional Windows JLI library (full path) - # Parameter 7 is optional Windows resource (RC) flags - # Parameter 8 is optional Windows version resource file (.rc) - # Parameter 9 is different output dir - # Parameter 10 if set, link statically with c runtime on windows. - # Parameter 11 if set, override plist file on macosx. - - $1_WINDOWS_JLI_LIB:=$(JDK_OUTPUTDIR)/objs/libjli/jli.lib - ifneq ($6,) - $1_WINDOWS_JLI_LIB:=$6 - endif - $1_VERSION_INFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc - ifneq ($8,) - $1_VERSION_INFO_RESOURCE:=$8 - endif - - $1_LDFLAGS := $3 - $1_LDFLAGS_SUFFIX := - ifeq ($(OPENJDK_TARGET_OS), macosx) - $1_PLIST_FILE:=Info-cmdline.plist - ifneq ($(11),) - $1_PLIST_FILE:=$(11) - endif - - $1_LDFLAGS += -Wl,-all_load $(JDK_OUTPUTDIR)/objs/libjli_static.a \ - -framework Cocoa -framework Security -framework ApplicationServices \ - -sectcreate __TEXT __info_plist $(JDK_TOPDIR)/src/macosx/lib/$$($1_PLIST_FILE) - $1_LDFLAGS_SUFFIX += -pthread - endif - - ifeq ($(USE_EXTERNAL_LIBZ), true) - $1_LDFLAGS_SUFFIX += -lz - endif - - $1_OUTPUT_DIR_ARG:=$9 - ifeq (,$$($1_OUTPUT_DIR_ARG)) - $1_OUTPUT_DIR_ARG:=$(JDK_OUTPUTDIR)/bin - endif - - # TODO: maybe it's better to move this if-statement out of this function - ifeq ($1,java) - $1_OPTIMIZATION_ARG:=HIGH - $1_LDFLAGS_solaris:=-R$(OPENWIN_HOME)/lib$(OPENJDK_TARGET_CPU_ISADIR) - else - $1_OPTIMIZATION_ARG:=LOW - endif - - $1_CFLAGS:=$(CFLAGS_JDKEXE) - ifeq ($(10),true) - $1_CFLAGS:=$(filter-out -MD,$(CFLAGS_JDKEXE)) - endif - - $(call SetupNativeCompilation,BUILD_LAUNCHER_$1,\ - SRC:=$(JDK_TOPDIR)/src/share/bin,\ - INCLUDE_FILES:=main.c,\ - LANG:=C,\ - OPTIMIZATION:=$$($1_OPTIMIZATION_ARG), \ - CFLAGS:=$$($1_CFLAGS) \ - -I$(JDK_TOPDIR)/src/share/bin \ - -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/bin \ - -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS)/bin \ - -DFULL_VERSION='"$(FULL_VERSION)"' \ - -DJDK_MAJOR_VERSION='"$(JDK_MAJOR_VERSION)"' \ - -DJDK_MINOR_VERSION='"$(JDK_MINOR_VERSION)"' \ - -DLIBARCHNAME='"$(OPENJDK_TARGET_CPU_LEGACY)"' \ - -DLAUNCHER_NAME='"$(LAUNCHER_NAME)"' \ - -DPROGNAME='"$1"' $(DPACKAGEPATH) \ - $2,\ - CFLAGS_linux:=-fPIC,\ - CFLAGS_solaris:=-KPIC -DHAVE_GETHRTIME,\ - LDFLAGS:=$(LDFLAGS_JDKEXE) \ - $(ORIGIN_ARG) \ - $$($1_LDFLAGS),\ - LDFLAGS_macosx:=$(call SET_SHARED_LIBRARY_NAME,$1),\ - LDFLAGS_linux:=-lpthread \ - $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)),\ - LDFLAGS_solaris:=$$($1_LDFLAGS_solaris) \ - $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)),\ - MAPFILE := $(JDK_TOPDIR)/makefiles/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU), \ - LDFLAGS_SUFFIX:=$(LDFLAGS_JDKEXE_SUFFIX) $$($1_LDFLAGS_SUFFIX),\ - LDFLAGS_SUFFIX_posix:=$4,\ - LDFLAGS_SUFFIX_windows:=$$($1_WINDOWS_JLI_LIB) \ - $(JDK_OUTPUTDIR)/objs/libjava/java.lib advapi32.lib $5,\ - LDFLAGS_SUFFIX_linux:=-L$(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/jli -ljli $(LIBDL) -lc, \ - LDFLAGS_SUFFIX_solaris:=-L$(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/jli -ljli -lthread $(LIBDL) -lc, \ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/$1_objs$(OUTPUT_SUBDIR),\ - OUTPUT_DIR:=$$($1_OUTPUT_DIR_ARG)$(OUTPUT_SUBDIR),\ - PROGRAM:=$1,\ - DEBUG_SYMBOLS:=true,\ - VERSIONINFO_RESOURCE:=$$($1_VERSION_INFO_RESOURCE),\ - RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=$1$(EXE_SUFFIX)" \ - /D "JDK_INTERNAL_NAME=$1" \ - /D "JDK_FTYPE=0x1L" \ - $7,\ - MANIFEST:=$(JDK_TOPDIR)/src/windows/resource/java.manifest) - - BUILD_LAUNCHERS += $$(BUILD_LAUNCHER_$1) - - ifeq ($(OPENJDK_TARGET_OS),macosx) - $$(BUILD_LAUNCHER_$1) : $(JDK_OUTPUTDIR)/objs/libjli_static.a - endif - - ifeq ($(OPENJDK_TARGET_OS),windows) - $$(BUILD_LAUNCHER_$1) : $(JDK_OUTPUTDIR)/objs/libjava/java.lib \ - $$($1_WINDOWS_JLI_LIB) - endif -endef - -########################################################################################## - -XLIBS:=$(X_LIBS) -lX11 -ifeq ($(OPENJDK_TARGET_OS),macosx) - DPACKAGEPATH:=-DPACKAGE_PATH='"$(PACKAGE_PATH)"' - XLIBS:= -endif - -ifdef OPENJDK - JAVA_RC_FLAGS += -i "$(JDK_TOPDIR)/src/windows/resource/icons" -else - JAVA_RC_FLAGS += -i "$(JDK_TOPDIR)/src/closed/windows/native/sun/windows" -endif - -# On windows, the debuginfo files get the same name as for java.dll. Build -# into another dir and copy selectively so debuginfo for java.dll isn't -# overwritten. -$(eval $(call SetupLauncher,java,\ - -DEXPAND_CLASSPATH_WILDCARDS,,,user32.lib comctl32.lib,\ - $(JDK_OUTPUTDIR)/objs/jli_static.lib,$(JAVA_RC_FLAGS),\ - $(JDK_TOPDIR)/src/windows/resource/java.rc,$(JDK_OUTPUTDIR)/objs/java_objs,true)) - -$(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/java$(EXE_SUFFIX): $(BUILD_LAUNCHER_java) - $(MKDIR) -p $(@D) - $(RM) $@ - $(CP) $(JDK_OUTPUTDIR)/objs/java_objs$(OUTPUT_SUBDIR)/java$(EXE_SUFFIX) $@ - -BUILD_LAUNCHERS += $(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/java$(EXE_SUFFIX) - -ifeq ($(OPENJDK_TARGET_OS),windows) - $(eval $(call SetupLauncher,javaw,\ - -DJAVAW -DEXPAND_CLASSPATH_WILDCARDS,,,user32.lib comctl32.lib,\ - $(JDK_OUTPUTDIR)/objs/jli_static.lib,$(JAVA_RC_FLAGS),\ - $(JDK_TOPDIR)/src/windows/resource/java.rc,,true)) -endif - - -ifndef BUILD_HEADLESS_ONLY -$(eval $(call SetupLauncher,appletviewer,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.applet.Main"$(COMMA) }',,\ - $(XLIBS))) -endif - -$(eval $(call SetupLauncher,extcheck,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.extcheck.Main"$(COMMA) }')) - -$(eval $(call SetupLauncher,idlj,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.corba.se.idl.toJavaPortable.Compile"$(COMMA) }')) - -$(eval $(call SetupLauncher,jar,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jar.Main"$(COMMA) }')) - -$(eval $(call SetupLauncher,jarsigner,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.tools.JarSigner"$(COMMA) }')) - -$(eval $(call SetupLauncher,javac,\ - -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE \ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javac.Main"$(COMMA) }')) - -$(eval $(call SetupLauncher,javadoc,\ - -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE \ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javadoc.Main"$(COMMA) }')) - -$(eval $(call SetupLauncher,javah,\ - -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE \ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javah.Main"$(COMMA) }')) - -$(eval $(call SetupLauncher,javap,\ - -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE \ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javap.Main"$(COMMA) }')) - -BUILD_LAUNCHER_jconsole_CFLAGS_windows:=-DJAVAW -BUILD_LAUNCHER_jconsole_LDFLAGS_windows:=user32.lib - -$(eval $(call SetupLauncher,jconsole,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "-J-Djconsole.showOutputViewer"$(COMMA) "sun.tools.jconsole.JConsole"$(COMMA) }' \ - -DAPP_CLASSPATH='{ "/lib/jconsole.jar"$(COMMA) "/lib/tools.jar"$(COMMA) "/classes" }')) - -$(eval $(call SetupLauncher,jdb,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.example.debug.tty.TTY"$(COMMA) }' \ - -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }')) - -$(eval $(call SetupLauncher,jhat,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.hat.Main"$(COMMA) }')) - -$(eval $(call SetupLauncher,jinfo,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ - "-J-Dsun.jvm.hotspot.debugger.useProcDebugger"$(COMMA) \ - "-J-Dsun.jvm.hotspot.debugger.useWindbgDebugger"$(COMMA) \ - "sun.tools.jinfo.JInfo"$(COMMA) }' \ - -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \ - ,,,,,,,,,Info-privileged.plist)) - -$(eval $(call SetupLauncher,jmap,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ - "-J-Dsun.jvm.hotspot.debugger.useProcDebugger"$(COMMA) \ - "-J-Dsun.jvm.hotspot.debugger.useWindbgDebugger"$(COMMA) \ - "sun.tools.jmap.JMap"$(COMMA) }' \ - -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \ - ,,,,,,,,,Info-privileged.plist)) - -$(eval $(call SetupLauncher,jps,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jps.Jps"$(COMMA) }')) - -$(eval $(call SetupLauncher,jrunscript,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.script.shell.Main"$(COMMA) }')) - -$(eval $(call SetupLauncher,jsadebugd,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.jvm.hotspot.jdi.SADebugServer"$(COMMA) }' \ - -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \ - ,,,,,,,,,Info-privileged.plist)) - -$(eval $(call SetupLauncher,jstack,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ - "-J-Dsun.jvm.hotspot.debugger.useProcDebugger"$(COMMA) \ - "-J-Dsun.jvm.hotspot.debugger.useWindbgDebugger"$(COMMA) \ - "sun.tools.jstack.JStack"$(COMMA) }' \ - -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \ - ,,,,,,,,,Info-privileged.plist)) - -$(eval $(call SetupLauncher,jstat,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jstat.Jstat"$(COMMA) }')) - -$(eval $(call SetupLauncher,jstatd,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jstatd.Jstatd"$(COMMA) }')) - -$(eval $(call SetupLauncher,keytool,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.tools.KeyTool"$(COMMA) }')) - -$(eval $(call SetupLauncher,native2ascii,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.native2ascii.Main"$(COMMA) }')) - -ifndef BUILD_HEADLESS_ONLY -$(eval $(call SetupLauncher,policytool,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.tools.policytool.PolicyTool"$(COMMA) }',,\ - $(XLIBS))) -endif - -$(eval $(call SetupLauncher,rmic,\ - -DEXPAND_CLASSPATH_WILDCARDS \ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.rmi.rmic.Main"$(COMMA) }')) - -$(eval $(call SetupLauncher,schemagen,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.internal.jxc.SchemaGenerator"$(COMMA) }')) - -$(eval $(call SetupLauncher,serialver,\ - -DEXPAND_CLASSPATH_WILDCARDS \ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.serialver.SerialVer"$(COMMA) }')) - -$(eval $(call SetupLauncher,xjc,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.internal.xjc.Driver"$(COMMA) }')) - -$(eval $(call SetupLauncher,wsgen,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.internal.ws.WsGen"$(COMMA) }')) - -$(eval $(call SetupLauncher,wsimport,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.internal.ws.WsImport"$(COMMA) }')) - -$(eval $(call SetupLauncher,orbd,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ - "-J-Dcom.sun.CORBA.activation.DbDir=./orb.db"$(COMMA) \ - "-J-Dcom.sun.CORBA.activation.Port=1049"$(COMMA) \ - "-J-Dcom.sun.CORBA.POA.ORBServerId=1"$(COMMA) \ - "com.sun.corba.se.impl.activation.ORBD"$(COMMA) }')) - -$(eval $(call SetupLauncher,servertool,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.corba.se.impl.activation.ServerTool"$(COMMA) }')) - -$(eval $(call SetupLauncher,tnameserv,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ - "-J-Dcom.sun.CORBA.activation.DbDir=./orb.db"$(COMMA) \ - "-J-Djava.util.logging.LoggingPermission=contol"$(COMMA) \ - "-J-Dcom.sun.CORBA.POA.ORBServerId=1"$(COMMA) \ - "com.sun.corba.se.impl.naming.cosnaming.TransientNameServer"$(COMMA) }')) - -$(eval $(call SetupLauncher,pack200,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.java.util.jar.pack.Driver"$(COMMA) "--pack" }')) - -$(eval $(call SetupLauncher,rmid,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.rmi.server.Activation"$(COMMA) }')) - -$(eval $(call SetupLauncher,rmiregistry,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.rmi.registry.RegistryImpl"$(COMMA) }')) - -$(eval $(call SetupLauncher,jcmd,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jcmd.JCmd"$(COMMA) }')) - -ifeq ($(OPENJDK_TARGET_OS),windows) - $(eval $(call SetupLauncher,kinit,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.krb5.internal.tools.Kinit"$(COMMA) }')) - - $(eval $(call SetupLauncher,klist,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.krb5.internal.tools.Klist"$(COMMA) }')) - - $(eval $(call SetupLauncher,ktab,\ - -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.krb5.internal.tools.Ktab"$(COMMA) }')) -endif - -########################################################################################## -# The order of the object files on the link command line affects the size of the resulting -# binary (at least on linux) which causes the size to differ between old and new build. -ifeq ($(USE_EXTERNAL_LIBZ), true) -UNPACKEXE_CFLAGS := -DSYSTEM_ZLIB -UNPACKEXE_ZIPOBJS := -lz -else -UNPACKEXE_CFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 -UNPACKEXE_ZIPOBJS := $(JDK_OUTPUTDIR)/objs/libzip/zcrc32$(OBJ_SUFFIX) \ - $(JDK_OUTPUTDIR)/objs/libzip/deflate$(OBJ_SUFFIX) \ - $(JDK_OUTPUTDIR)/objs/libzip/trees$(OBJ_SUFFIX) \ - $(JDK_OUTPUTDIR)/objs/libzip/zadler32$(OBJ_SUFFIX) \ - $(JDK_OUTPUTDIR)/objs/libzip/compress$(OBJ_SUFFIX) \ - $(JDK_OUTPUTDIR)/objs/libzip/zutil$(OBJ_SUFFIX) \ - $(JDK_OUTPUTDIR)/objs/libzip/inflate$(OBJ_SUFFIX) \ - $(JDK_OUTPUTDIR)/objs/libzip/infback$(OBJ_SUFFIX) \ - $(JDK_OUTPUTDIR)/objs/libzip/inftrees$(OBJ_SUFFIX) \ - $(JDK_OUTPUTDIR)/objs/libzip/inffast$(OBJ_SUFFIX) - -endif - -ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc) - UNPACKEXE_CFLAGS += -xregs=no%appl -endif - -UNPACKEXE_LANG:=C -ifeq ($(OPENJDK_TARGET_OS),solaris) - UNPACKEXE_LANG:=C++ -endif - -$(eval $(call SetupNativeCompilation,BUILD_UNPACKEXE,\ - SRC:=$(JDK_TOPDIR)/src/share/native/com/sun/java/util/jar/pack,\ - EXCLUDE_FILES:=jni.cpp,\ - LANG:=$(UNPACKEXE_LANG),\ - OPTIMIZATION := LOW, \ - CFLAGS:=$(UNPACKEXE_CFLAGS) $(CXXFLAGS_JDKEXE)\ - -DFULL, \ - CFLAGS_release:=-DPRODUCT,\ - CFLAGS_linux:=-fPIC,\ - CFLAGS_solaris := -KPIC, \ - CFLAGS_macosx := -fPIC, \ - MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libunpack/mapfile-vers-unpack200, \ - LDFLAGS:=$(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \ - $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)unpack$(SHARED_LIBRARY_SUFFIX)) \ - $(call SET_SHARED_LIBRARY_ORIGIN) \ - $(UNPACKEXE_ZIPOBJS),\ - LDFLAGS_linux:=-lc,\ - LDFLAGS_SUFFIX:=$(LIBCXX),\ - LDFLAGS_SUFFIX_solaris:=-lc,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/unpackexe$(OUTPUT_SUBDIR),\ - OUTPUT_DIR:=$(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR),\ - PROGRAM:=unpack200,\ - VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ - RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=unpack200.exe" \ - /D "JDK_INTERNAL_NAME=unpack200" \ - /D "JDK_FTYPE=0x1L",\ - MANIFEST:=$(JDK_TOPDIR)/src/windows/resource/unpack200_proto.exe.manifest)) - -ifneq ($(USE_EXTERNAL_LIBZ), true) - -$(BUILD_UNPACKEXE) : $(UNPACKEXE_ZIPOBJS) - -endif - -BUILD_LAUNCHERS += $(BUILD_UNPACKEXE) - -########################################################################################## - - -BUILD_JEXEC := -BUILD_JEXEC_SRC := -BUILD_JEXEC_INC := -BUILD_JEXEC_DST_DIR := $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR) - -# -# UNHANDLED: -# - COMPILE_APPROACH = normal -# - -# -# jdk/make/java/Makefile -# -ifeq ($(OPENJDK_TARGET_OS), solaris) - ifeq ($(OPENJDK_TARGET_CPU_BITS), 32) - BUILD_JEXEC := 1 - endif -endif - -ifeq ($(OPENJDK_TARGET_OS), linux) - BUILD_JEXEC := 1 -endif # OPENJDK_TARGET_OS - -# -# jdk/make/java/jexec/Makefile -# -ifeq ($(BUILD_JEXEC), 1) - - ifeq ($(OPENJDK_TARGET_OS),windows) - else ifeq ($(OPENJDK_TARGET_OS),macosx) - BUILD_JEXEC_SRC := $(JDK_TOPDIR)/src/macosx/bin - else - BUILD_JEXEC_SRC := $(JDK_TOPDIR)/src/solaris/bin - endif - - ifeq ($(OPENJDK_TARGET_OS), linux) - BUILD_JEXEC_DST_DIR := $(JDK_OUTPUTDIR)/lib - BUILD_JEXEC_INC += -I$(JDK_TOPDIR)/src/share/bin - endif -endif - -# -# Note that the two Makefile's seems to contradict each other, -# and that src/macosx/bin/jexec.c seems unused -# -ifneq ($(BUILD_JEXEC_SRC),) - $(eval $(call SetupNativeCompilation,BUILD_JEXEC,\ - SRC:=$(BUILD_JEXEC_SRC),\ - INCLUDE_FILES:=jexec.c,\ - LANG:=C,\ - OPTIMIZATION := LOW, \ - CFLAGS:=$(CFLAGS_JDKEXE)\ - $(BUILD_JEXEC_INC), \ - CFLAGS_linux:=-fPIC,\ - CFLAGS_solaris:=-KPIC,\ - LDFLAGS:=$(LDFLAGS_JDKEXE) \ - $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)), \ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/jexec_obj,\ - OUTPUT_DIR:=$(BUILD_JEXEC_DST_DIR),\ - PROGRAM:=jexec)) - - BUILD_LAUNCHERS += $(BUILD_JEXEC) -endif - -########################################################################################## - -# -# The java-rmi.cgi script in bin/ only gets delivered in certain situations -# -JAVA_RMI_CGI:=$(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/java-rmi.cgi -ifeq ($(OPENJDK_TARGET_OS), linux) - BUILD_LAUNCHERS += $(JAVA_RMI_CGI) -endif -ifeq ($(OPENJDK_TARGET_OS), solaris) - ifeq ($(OPENJDK_TARGET_CPU_BITS), 32) - BUILD_LAUNCHERS += $(JAVA_RMI_CGI) - endif -endif - -# TODO: -# On windows java-rmi.cgi shouldn't be bundled since Java 1.2, but has been built all -# this time anyway. Since jdk6, it has been built from the wrong source and resulted -# in a copy of the standard java launcher named "java-rmi.exe" ending up in the final -# images bin dir. This weird behavior is mimicked here in the converted makefiles for -# now. Should probably just be deleted. -# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6512052 -ifeq ($(OPENJDK_TARGET_OS),windows) - $(eval $(call SetupLauncher,java-rmi,\ - -DEXPAND_CLASSPATH_WILDCARDS,\ - $(call SET_SHARED_LIBRARY_MAPFILE,$(JDK_TOPDIR)/makefiles/java/main/java/mapfile-$(OPENJDK_TARGET_CPU)))) -else - $(JAVA_RMI_CGI): $(JDK_TOPDIR)/src/solaris/bin/java-rmi.cgi.sh - $(MKDIR) -p $(@D) - $(CP) $< $@ - $(CHMOD) a+x $@ -endif - -########################################################################################## - -$(BUILD_LAUNCHERS) : $(JDK_TOPDIR)/makefiles/CompileLaunchers.gmk - -all: $(BUILD_LAUNCHERS) - -.PHONY: all +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +defalt: all + +include $(SPEC) +include MakeBase.gmk +include NativeCompilation.gmk + +# Setup the java compilers for the JDK build. +include Setup.gmk + +# Build tools +include Tools.gmk + +BUILD_LAUNCHERS= + +# When building a legacy overlay image (on solaris 64 bit), the launchers +# need to be built with a different rpath and a different output dir. +ifeq ($(OVERLAY_IMAGES),true) + ORIGIN_ROOT:=/../.. + OUTPUT_SUBDIR:=$(OPENJDK_TARGET_CPU_ISADIR) +else + ORIGIN_ROOT:=/.. +endif + +ifeq ($(OPENJDK_TARGET_OS), macosx) + ORIGIN_ARG:=$(call SET_EXECUTABLE_ORIGIN) +else + ORIGIN_ARG:=$(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/jli) \ + $(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR)/jli) +endif + +# +# Applications expect to be able to link against libjawt without invoking +# System.loadLibrary("jawt") first. This was the behaviour described in the +# devloper documentation of JAWT and what worked with OpenJDK6. +# +ifneq ($(findstring $(OPENJDK_TARGET_OS), linux solaris),) + ORIGIN_ARG+=$(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/lib$(OPENJDK_TARGET_CPU_LIBDIR)) \ + $(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR)) +endif + +define SetupLauncher + # TODO: Fix mapfile on solaris. Won't work with ld as linker. + # Parameter 1 is the name of the launcher (java,javac,jar...) + # Parameter 2 is extra CFLAGS + # Parameter 3 is extra LDFLAGS + # Parameter 4 is extra LDFLAGS_SUFFIX_posix + # Parameter 5 is extra LDFLAGS_SUFFIX_windows + # Parameter 6 is optional Windows JLI library (full path) + # Parameter 7 is optional Windows resource (RC) flags + # Parameter 8 is optional Windows version resource file (.rc) + # Parameter 9 is different output dir + # Parameter 10 if set, link statically with c runtime on windows. + # Parameter 11 if set, override plist file on macosx. + + $1_WINDOWS_JLI_LIB:=$(JDK_OUTPUTDIR)/objs/libjli/jli.lib + ifneq ($6,) + $1_WINDOWS_JLI_LIB:=$6 + endif + $1_VERSION_INFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc + ifneq ($8,) + $1_VERSION_INFO_RESOURCE:=$8 + endif + + $1_LDFLAGS := $3 + $1_LDFLAGS_SUFFIX := + ifeq ($(OPENJDK_TARGET_OS), macosx) + $1_PLIST_FILE:=Info-cmdline.plist + ifneq ($(11),) + $1_PLIST_FILE:=$(11) + endif + + $1_LDFLAGS += -Wl,-all_load $(JDK_OUTPUTDIR)/objs/libjli_static.a \ + -framework Cocoa -framework Security -framework ApplicationServices \ + -sectcreate __TEXT __info_plist $(JDK_TOPDIR)/src/macosx/lib/$$($1_PLIST_FILE) + $1_LDFLAGS_SUFFIX += -pthread + endif + + ifeq ($(USE_EXTERNAL_LIBZ), true) + $1_LDFLAGS_SUFFIX += -lz + endif + + $1_OUTPUT_DIR_ARG:=$9 + ifeq (,$$($1_OUTPUT_DIR_ARG)) + $1_OUTPUT_DIR_ARG:=$(JDK_OUTPUTDIR)/bin + endif + + # TODO: maybe it's better to move this if-statement out of this function + ifeq ($1,java) + $1_OPTIMIZATION_ARG:=HIGH + $1_LDFLAGS_solaris:=-R$(OPENWIN_HOME)/lib$(OPENJDK_TARGET_CPU_ISADIR) + else + $1_OPTIMIZATION_ARG:=LOW + endif + + $1_CFLAGS:=$(CFLAGS_JDKEXE) + ifeq ($(10),true) + $1_CFLAGS:=$(filter-out -MD,$(CFLAGS_JDKEXE)) + endif + + ifneq ($(wildcard $(JDK_TOPDIR)/makefiles/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU)),) + $1_MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU) + else + $1_MAPFILE:= + endif + + $(call SetupNativeCompilation,BUILD_LAUNCHER_$1,\ + SRC:=$(JDK_TOPDIR)/src/share/bin,\ + INCLUDE_FILES:=main.c,\ + LANG:=C,\ + OPTIMIZATION:=$$($1_OPTIMIZATION_ARG), \ + CFLAGS:=$$($1_CFLAGS) \ + -I$(JDK_TOPDIR)/src/share/bin \ + -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/bin \ + -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS)/bin \ + -DFULL_VERSION='"$(FULL_VERSION)"' \ + -DJDK_MAJOR_VERSION='"$(JDK_MAJOR_VERSION)"' \ + -DJDK_MINOR_VERSION='"$(JDK_MINOR_VERSION)"' \ + -DLIBARCHNAME='"$(OPENJDK_TARGET_CPU_LEGACY)"' \ + -DLAUNCHER_NAME='"$(LAUNCHER_NAME)"' \ + -DPROGNAME='"$1"' $(DPACKAGEPATH) \ + $2,\ + CFLAGS_linux:=-fPIC,\ + CFLAGS_solaris:=-KPIC -DHAVE_GETHRTIME,\ + LDFLAGS:=$(LDFLAGS_JDKEXE) \ + $(ORIGIN_ARG) \ + $$($1_LDFLAGS),\ + LDFLAGS_macosx:=$(call SET_SHARED_LIBRARY_NAME,$1),\ + LDFLAGS_linux:=-lpthread \ + $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)),\ + LDFLAGS_solaris:=$$($1_LDFLAGS_solaris) \ + $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)),\ + MAPFILE := $$($1_MAPFILE), \ + LDFLAGS_SUFFIX:=$(LDFLAGS_JDKEXE_SUFFIX) $$($1_LDFLAGS_SUFFIX),\ + LDFLAGS_SUFFIX_posix:=$4,\ + LDFLAGS_SUFFIX_windows:=$$($1_WINDOWS_JLI_LIB) \ + $(JDK_OUTPUTDIR)/objs/libjava/java.lib advapi32.lib $5,\ + LDFLAGS_SUFFIX_linux:=-L$(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/jli -ljli $(LIBDL) -lc, \ + LDFLAGS_SUFFIX_solaris:=-L$(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/jli -ljli -lthread $(LIBDL) -lc, \ + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/$1_objs$(OUTPUT_SUBDIR),\ + OUTPUT_DIR:=$$($1_OUTPUT_DIR_ARG)$(OUTPUT_SUBDIR),\ + PROGRAM:=$1,\ + DEBUG_SYMBOLS:=true,\ + VERSIONINFO_RESOURCE:=$$($1_VERSION_INFO_RESOURCE),\ + RC_FLAGS:=$(RC_FLAGS)\ + -D "JDK_FNAME=$1$(EXE_SUFFIX)" \ + -D "JDK_INTERNAL_NAME=$1" \ + -D "JDK_FTYPE=0x1L" \ + $7,\ + MANIFEST:=$(JDK_TOPDIR)/src/windows/resource/java.manifest) + + BUILD_LAUNCHERS += $$(BUILD_LAUNCHER_$1) + + ifeq ($(OPENJDK_TARGET_OS),macosx) + $$(BUILD_LAUNCHER_$1) : $(JDK_OUTPUTDIR)/objs/libjli_static.a + endif + + ifeq ($(OPENJDK_TARGET_OS),windows) + $$(BUILD_LAUNCHER_$1) : $(JDK_OUTPUTDIR)/objs/libjava/java.lib \ + $$($1_WINDOWS_JLI_LIB) + endif +endef + +########################################################################################## + +XLIBS:=$(X_LIBS) -lX11 +ifeq ($(OPENJDK_TARGET_OS),macosx) + DPACKAGEPATH:=-DPACKAGE_PATH='"$(PACKAGE_PATH)"' + XLIBS:= +endif + +ifdef OPENJDK + JAVA_RC_FLAGS += -i "$(JDK_TOPDIR)/src/windows/resource/icons" +else + JAVA_RC_FLAGS += -i "$(JDK_TOPDIR)/src/closed/windows/native/sun/windows" +endif + +# On windows, the debuginfo files get the same name as for java.dll. Build +# into another dir and copy selectively so debuginfo for java.dll isn't +# overwritten. +$(eval $(call SetupLauncher,java,\ + -DEXPAND_CLASSPATH_WILDCARDS,,,user32.lib comctl32.lib,\ + $(JDK_OUTPUTDIR)/objs/jli_static.lib,$(JAVA_RC_FLAGS),\ + $(JDK_TOPDIR)/src/windows/resource/java.rc,$(JDK_OUTPUTDIR)/objs/java_objs,true)) + +$(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/java$(EXE_SUFFIX): $(BUILD_LAUNCHER_java) + $(MKDIR) -p $(@D) + $(RM) $@ + $(CP) $(JDK_OUTPUTDIR)/objs/java_objs$(OUTPUT_SUBDIR)/java$(EXE_SUFFIX) $@ + +BUILD_LAUNCHERS += $(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/java$(EXE_SUFFIX) + +ifeq ($(OPENJDK_TARGET_OS),windows) + $(eval $(call SetupLauncher,javaw,\ + -DJAVAW -DEXPAND_CLASSPATH_WILDCARDS,,,user32.lib comctl32.lib,\ + $(JDK_OUTPUTDIR)/objs/jli_static.lib,$(JAVA_RC_FLAGS),\ + $(JDK_TOPDIR)/src/windows/resource/java.rc,,true)) +endif + + +ifndef BUILD_HEADLESS_ONLY +$(eval $(call SetupLauncher,appletviewer,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.applet.Main"$(COMMA) }',,\ + $(XLIBS))) +endif + +$(eval $(call SetupLauncher,extcheck,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.extcheck.Main"$(COMMA) }')) + +$(eval $(call SetupLauncher,idlj,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.corba.se.idl.toJavaPortable.Compile"$(COMMA) }')) + +$(eval $(call SetupLauncher,jar,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jar.Main"$(COMMA) }')) + +$(eval $(call SetupLauncher,jarsigner,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.tools.JarSigner"$(COMMA) }')) + +$(eval $(call SetupLauncher,javac,\ + -DEXPAND_CLASSPATH_WILDCARDS \ + -DNEVER_ACT_AS_SERVER_CLASS_MACHINE \ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javac.Main"$(COMMA) }')) + +ifeq ($(ENABLE_SJAVAC),yes) +$(eval $(call SetupLauncher,sjavac,\ + -DEXPAND_CLASSPATH_WILDCARDS \ + -DNEVER_ACT_AS_SERVER_CLASS_MACHINE \ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.sjavac.Main"$(COMMA) }')) +endif + +$(eval $(call SetupLauncher,javadoc,\ + -DEXPAND_CLASSPATH_WILDCARDS \ + -DNEVER_ACT_AS_SERVER_CLASS_MACHINE \ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javadoc.Main"$(COMMA) }')) + +$(eval $(call SetupLauncher,javah,\ + -DEXPAND_CLASSPATH_WILDCARDS \ + -DNEVER_ACT_AS_SERVER_CLASS_MACHINE \ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javah.Main"$(COMMA) }')) + +$(eval $(call SetupLauncher,javap,\ + -DEXPAND_CLASSPATH_WILDCARDS \ + -DNEVER_ACT_AS_SERVER_CLASS_MACHINE \ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javap.Main"$(COMMA) }')) + +BUILD_LAUNCHER_jconsole_CFLAGS_windows:=-DJAVAW +BUILD_LAUNCHER_jconsole_LDFLAGS_windows:=user32.lib + +$(eval $(call SetupLauncher,jconsole,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "-J-Djconsole.showOutputViewer"$(COMMA) "sun.tools.jconsole.JConsole"$(COMMA) }' \ + -DAPP_CLASSPATH='{ "/lib/jconsole.jar"$(COMMA) "/lib/tools.jar"$(COMMA) "/classes" }')) + +$(eval $(call SetupLauncher,jdb,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.example.debug.tty.TTY"$(COMMA) }' \ + -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }')) + +$(eval $(call SetupLauncher,jhat,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.hat.Main"$(COMMA) }')) + +$(eval $(call SetupLauncher,jinfo,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ + "-J-Dsun.jvm.hotspot.debugger.useProcDebugger"$(COMMA) \ + "-J-Dsun.jvm.hotspot.debugger.useWindbgDebugger"$(COMMA) \ + "sun.tools.jinfo.JInfo"$(COMMA) }' \ + -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \ + ,,,,,,,,,Info-privileged.plist)) + +$(eval $(call SetupLauncher,jmap,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ + "-J-Dsun.jvm.hotspot.debugger.useProcDebugger"$(COMMA) \ + "-J-Dsun.jvm.hotspot.debugger.useWindbgDebugger"$(COMMA) \ + "sun.tools.jmap.JMap"$(COMMA) }' \ + -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \ + ,,,,,,,,,Info-privileged.plist)) + +$(eval $(call SetupLauncher,jps,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jps.Jps"$(COMMA) }')) + +$(eval $(call SetupLauncher,jrunscript,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.script.shell.Main"$(COMMA) }')) + +$(eval $(call SetupLauncher,jsadebugd,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.jvm.hotspot.jdi.SADebugServer"$(COMMA) }' \ + -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \ + ,,,,,,,,,Info-privileged.plist)) + +$(eval $(call SetupLauncher,jstack,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ + "-J-Dsun.jvm.hotspot.debugger.useProcDebugger"$(COMMA) \ + "-J-Dsun.jvm.hotspot.debugger.useWindbgDebugger"$(COMMA) \ + "sun.tools.jstack.JStack"$(COMMA) }' \ + -DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \ + ,,,,,,,,,Info-privileged.plist)) + +$(eval $(call SetupLauncher,jstat,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jstat.Jstat"$(COMMA) }')) + +$(eval $(call SetupLauncher,jstatd,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jstatd.Jstatd"$(COMMA) }')) + +$(eval $(call SetupLauncher,keytool,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.tools.KeyTool"$(COMMA) }')) + +$(eval $(call SetupLauncher,native2ascii,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.native2ascii.Main"$(COMMA) }')) + +ifndef BUILD_HEADLESS_ONLY +$(eval $(call SetupLauncher,policytool,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.tools.policytool.PolicyTool"$(COMMA) }',,\ + $(XLIBS))) +endif + +$(eval $(call SetupLauncher,rmic,\ + -DEXPAND_CLASSPATH_WILDCARDS \ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.rmi.rmic.Main"$(COMMA) }')) + +$(eval $(call SetupLauncher,schemagen,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.internal.jxc.SchemaGenerator"$(COMMA) }')) + +$(eval $(call SetupLauncher,serialver,\ + -DEXPAND_CLASSPATH_WILDCARDS \ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.serialver.SerialVer"$(COMMA) }')) + +$(eval $(call SetupLauncher,xjc,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.internal.xjc.Driver"$(COMMA) }')) + +$(eval $(call SetupLauncher,wsgen,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.internal.ws.WsGen"$(COMMA) }')) + +$(eval $(call SetupLauncher,wsimport,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.internal.ws.WsImport"$(COMMA) }')) + +$(eval $(call SetupLauncher,orbd,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ + "-J-Dcom.sun.CORBA.activation.DbDir=./orb.db"$(COMMA) \ + "-J-Dcom.sun.CORBA.activation.Port=1049"$(COMMA) \ + "-J-Dcom.sun.CORBA.POA.ORBServerId=1"$(COMMA) \ + "com.sun.corba.se.impl.activation.ORBD"$(COMMA) }')) + +$(eval $(call SetupLauncher,servertool,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.corba.se.impl.activation.ServerTool"$(COMMA) }')) + +$(eval $(call SetupLauncher,tnameserv,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) \ + "-J-Dcom.sun.CORBA.activation.DbDir=./orb.db"$(COMMA) \ + "-J-Djava.util.logging.LoggingPermission=contol"$(COMMA) \ + "-J-Dcom.sun.CORBA.POA.ORBServerId=1"$(COMMA) \ + "com.sun.corba.se.impl.naming.cosnaming.TransientNameServer"$(COMMA) }')) + +$(eval $(call SetupLauncher,pack200,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.java.util.jar.pack.Driver"$(COMMA) "--pack" }')) + +$(eval $(call SetupLauncher,rmid,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.rmi.server.Activation"$(COMMA) }')) + +$(eval $(call SetupLauncher,rmiregistry,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.rmi.registry.RegistryImpl"$(COMMA) }')) + +$(eval $(call SetupLauncher,jcmd,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jcmd.JCmd"$(COMMA) }')) + +ifeq ($(OPENJDK_TARGET_OS),windows) + $(eval $(call SetupLauncher,kinit,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.krb5.internal.tools.Kinit"$(COMMA) }')) + + $(eval $(call SetupLauncher,klist,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.krb5.internal.tools.Klist"$(COMMA) }')) + + $(eval $(call SetupLauncher,ktab,\ + -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.krb5.internal.tools.Ktab"$(COMMA) }')) +endif + +########################################################################################## +# The order of the object files on the link command line affects the size of the resulting +# binary (at least on linux) which causes the size to differ between old and new build. +ifeq ($(USE_EXTERNAL_LIBZ), true) +UNPACKEXE_CFLAGS := -DSYSTEM_ZLIB +UNPACKEXE_ZIPOBJS := -lz +else +UNPACKEXE_CFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 +UNPACKEXE_ZIPOBJS := $(JDK_OUTPUTDIR)/objs/libzip/zcrc32$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/deflate$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/trees$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/zadler32$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/compress$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/zutil$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/inflate$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/infback$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/inftrees$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/inffast$(OBJ_SUFFIX) + +endif + +ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc) + UNPACKEXE_CFLAGS += -xregs=no%appl + UNPACKEXE_LDFLAGS_solaris += -xmemalign=4s +endif + +UNPACKEXE_LANG:=C +ifeq ($(OPENJDK_TARGET_OS),solaris) + UNPACKEXE_LANG:=C++ +endif +# On windows, unpack200 is linked completely differently to all other +# executables, using the compiler with the compiler arguments. +# It's also linked incrementally, producing a .ilk file that needs to +# be kept away. +ifeq ($(OPENJDK_TARGET_OS),windows) + BUILD_UNPACKEXE_LDEXE:=$(CC) + EXE_OUT_OPTION_save:=$(EXE_OUT_OPTION) + EXE_OUT_OPTION:=-Fe +endif +$(eval $(call SetupNativeCompilation,BUILD_UNPACKEXE,\ + SRC:=$(JDK_TOPDIR)/src/share/native/com/sun/java/util/jar/pack,\ + EXCLUDE_FILES:=jni.cpp,\ + LANG:=$(UNPACKEXE_LANG),\ + OPTIMIZATION:=LOW, \ + CFLAGS:=$(UNPACKEXE_CFLAGS) $(CXXFLAGS_JDKEXE)\ + -DFULL, \ + CFLAGS_release:=-DPRODUCT,\ + CFLAGS_linux:=-fPIC,\ + CFLAGS_solaris:=-KPIC, \ + CFLAGS_macosx:=-fPIC, \ + MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libunpack/mapfile-vers-unpack200,\ + LDFLAGS:=$(UNPACKEXE_ZIPOBJS),\ + LDFLAGS_windows:=$(CXXFLAGS_JDKEXE),\ + LDFLAGS_posix:=$(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \ + $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)unpack$(SHARED_LIBRARY_SUFFIX)) \ + $(call SET_SHARED_LIBRARY_ORIGIN),\ + LDFLAGS_linux:=-lc,\ + LDFLAGS_solaris:=$(UNPACKEXE_LDFLAGS_solaris) -lc,\ + LDFLAGS_SUFFIX:=$(LIBCXX),\ + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/unpackexe$(OUTPUT_SUBDIR),\ + OUTPUT_DIR:=$(JDK_OUTPUTDIR)/objs/unpackexe$(OUTPUT_SUBDIR),\ + PROGRAM:=unpack200,\ + VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ + RC_FLAGS:=$(RC_FLAGS)\ + -D "JDK_FNAME=unpack200.exe" \ + -D "JDK_INTERNAL_NAME=unpack200" \ + -D "JDK_FTYPE=0x1L",\ + MANIFEST:=$(JDK_TOPDIR)/src/windows/resource/unpack200_proto.exe.manifest)) + +ifeq ($(OPENJDK_TARGET_OS),windows) + EXE_OUT_OPTION:=$(EXE_OUT_OPTION_save) +endif + +ifneq ($(USE_EXTERNAL_LIBZ), true) + +$(BUILD_UNPACKEXE) : $(UNPACKEXE_ZIPOBJS) + +endif + +# Build into object dir and copy executable afterwards to avoid .ilk file in +# image. The real fix would be clean up linking of unpack200 using +# -link -incremental:no +# like all other launchers. +$(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/unpack200$(EXE_SUFFIX): $(BUILD_UNPACKEXE) + $(MKDIR) -p $(@D) + $(CP) '$<' '$@' + +BUILD_LAUNCHERS += $(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/unpack200$(EXE_SUFFIX) + +########################################################################################## + + +BUILD_JEXEC := +BUILD_JEXEC_SRC := +BUILD_JEXEC_INC := +BUILD_JEXEC_DST_DIR := $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR) + +# +# UNHANDLED: +# - COMPILE_APPROACH = normal +# + +# +# jdk/make/java/Makefile +# +ifeq ($(OPENJDK_TARGET_OS), solaris) + ifeq ($(OPENJDK_TARGET_CPU_BITS), 32) + BUILD_JEXEC := 1 + endif +endif + +ifeq ($(OPENJDK_TARGET_OS), linux) + BUILD_JEXEC := 1 +endif # OPENJDK_TARGET_OS + +# +# jdk/make/java/jexec/Makefile +# +ifeq ($(BUILD_JEXEC), 1) + + ifeq ($(OPENJDK_TARGET_OS),windows) + else ifeq ($(OPENJDK_TARGET_OS),macosx) + BUILD_JEXEC_SRC := $(JDK_TOPDIR)/src/macosx/bin + else + BUILD_JEXEC_SRC := $(JDK_TOPDIR)/src/solaris/bin + endif + + ifeq ($(OPENJDK_TARGET_OS), linux) + BUILD_JEXEC_DST_DIR := $(JDK_OUTPUTDIR)/lib + BUILD_JEXEC_INC += -I$(JDK_TOPDIR)/src/share/bin + endif +endif + +# +# Note that the two Makefile's seems to contradict each other, +# and that src/macosx/bin/jexec.c seems unused +# +ifneq ($(BUILD_JEXEC_SRC),) + $(eval $(call SetupNativeCompilation,BUILD_JEXEC,\ + SRC:=$(BUILD_JEXEC_SRC),\ + INCLUDE_FILES:=jexec.c,\ + LANG:=C,\ + OPTIMIZATION := LOW, \ + CFLAGS:=$(CFLAGS_JDKEXE)\ + $(BUILD_JEXEC_INC), \ + CFLAGS_linux:=-fPIC,\ + CFLAGS_solaris:=-KPIC,\ + LDFLAGS:=$(LDFLAGS_JDKEXE) \ + $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)), \ + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/jexec_obj,\ + OUTPUT_DIR:=$(BUILD_JEXEC_DST_DIR),\ + PROGRAM:=jexec)) + + BUILD_LAUNCHERS += $(BUILD_JEXEC) +endif + +########################################################################################## + +# +# The java-rmi.cgi script in bin/ only gets delivered in certain situations +# +JAVA_RMI_CGI:=$(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/java-rmi.cgi +ifeq ($(OPENJDK_TARGET_OS), linux) + BUILD_LAUNCHERS += $(JAVA_RMI_CGI) +endif +ifeq ($(OPENJDK_TARGET_OS), solaris) + ifeq ($(OPENJDK_TARGET_CPU_BITS), 32) + BUILD_LAUNCHERS += $(JAVA_RMI_CGI) + endif +endif + +# TODO: +# On windows java-rmi.cgi shouldn't be bundled since Java 1.2, but has been built all +# this time anyway. Since jdk6, it has been built from the wrong source and resulted +# in a (almost) copy of the standard java launcher named "java-rmi.exe" ending up in +# the final images bin dir. This weird behavior is mimicked here in the converted +# makefiles for now. Should probably just be deleted. +# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6512052 +ifeq ($(OPENJDK_TARGET_OS),windows) + $(eval $(call SetupLauncher,java-rmi,,\ + $(call SET_SHARED_LIBRARY_MAPFILE,$(JDK_TOPDIR)/makefiles/java/main/java/mapfile-$(OPENJDK_TARGET_CPU)))) +else + $(JAVA_RMI_CGI): $(JDK_TOPDIR)/src/solaris/bin/java-rmi.cgi.sh + $(MKDIR) -p $(@D) + $(CP) $< $@ + $(CHMOD) a+x $@ +endif + +########################################################################################## + +$(BUILD_LAUNCHERS) : $(JDK_TOPDIR)/makefiles/CompileLaunchers.gmk + +all: $(BUILD_LAUNCHERS) + +.PHONY: all diff --git a/jdk/makefiles/CompileNativeLibraries.gmk b/jdk/makefiles/CompileNativeLibraries.gmk index 5a3be46cb22..8f4a2f90a6a 100644 --- a/jdk/makefiles/CompileNativeLibraries.gmk +++ b/jdk/makefiles/CompileNativeLibraries.gmk @@ -146,9 +146,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBVERIFY,\ LDFLAGS_SUFFIX_windows:=jvm.lib,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS) \ - /D "JDK_FNAME=verify.dll" \ - /D "JDK_INTERNAL_NAME=verify" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=verify.dll" \ + -D "JDK_INTERNAL_NAME=verify" \ + -D "JDK_FTYPE=0x2L",\ REORDER:=$(BUILD_LIBVERIFY_REORDER),\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libverify,\ DEBUG_SYMBOLS:=true)) @@ -171,15 +171,19 @@ LIBJAVA_SRC_DIRS:=$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/lan $(JDK_TOPDIR)/src/share/native/java/util \ $(JDK_TOPDIR)/src/share/native/java/util/concurrent/atomic \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/common \ - $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/util \ - $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/security/provider \ - $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/io + $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/util + ifneq ($(OPENJDK_TARGET_OS),macosx) LIBJAVA_SRC_DIRS+=$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/util/locale/provider else LIBJAVA_SRC_DIRS+=$(JDK_TOPDIR)/src/macosx/native/sun/util/locale/provider endif +ifeq ($(OPENJDK_TARGET_OS),windows) + LIBJAVA_SRC_DIRS+=$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/security/provider \ + $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/io +endif + LIBJAVA_CFLAGS:=$(foreach dir,$(LIBJAVA_SRC_DIRS),-I$(dir)) \ -I$(JDK_TOPDIR)/src/share/native/java/lang/fdlibm/include \ -DARCHPROPNAME='"$(OPENJDK_TARGET_CPU_OSARCH)"' @@ -236,21 +240,21 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA,\ MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libjava/mapfile-vers, \ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ - LDFLAGS_windows:=-export:winFileHandleOpen -export:handleLseek \ - $(BUILD_LIBFDLIBM) $(WIN_VERIFY_LIB) jvm.lib \ - shell32.lib delayimp.lib /DELAYLOAD:shell32.dll \ - advapi32.lib,\ LDFLAGS_SUFFIX_posix:=-ljvm -lverify, \ LDFLAGS_SUFFIX_solaris:=-lnsl -lsocket -lscf $(LIBDL) $(BUILD_LIBFDLIBM) -lc,\ LDFLAGS_SUFFIX_linux:=$(LIBDL) $(BUILD_LIBFDLIBM),\ LDFLAGS_SUFFIX_macosx:=-L$(JDK_OUTPUTDIR)/objs/ -lfdlibm \ -framework CoreFoundation \ -framework Security -framework SystemConfiguration, \ + LDFLAGS_SUFFIX_windows:=-export:winFileHandleOpen -export:handleLseek \ + jvm.lib $(BUILD_LIBFDLIBM) $(WIN_VERIFY_LIB) \ + shell32.lib delayimp.lib -DELAYLOAD:shell32.dll \ + advapi32.lib,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=java.dll" \ - /D "JDK_INTERNAL_NAME=java" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=java.dll" \ + -D "JDK_INTERNAL_NAME=java" \ + -D "JDK_FTYPE=0x2L",\ REORDER:=$(LIBJAVA_REORDER), \ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjava,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -299,9 +303,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMLIB_IMAGE,\ $(LDFLAGS_JDKLIB_SUFFIX),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=mlib_image.dll" \ - /D "JDK_INTERNAL_NAME=mlib_image" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=mlib_image.dll" \ + -D "JDK_INTERNAL_NAME=mlib_image" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libmlib_image,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -423,10 +427,12 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMLIB_IMAGE_V,\ $(CFLAGS_JDKLIB), \ MAPFILE:=$(BUILD_LIBMLIB_IMAGE_MAPFILE), \ LDFLAGS:=$(LDFLAGS_JDKLIB) \ - $(BUILD_LIBMLIB_LDLIBS) \ + $(BUILD_LIBMLIB_LDLIBS) -ljava -ljvm \ $(call SET_SHARED_LIBRARY_ORIGIN),\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libmlib_image_v)) +$(BUILD_LIBMLIB_IMAGE_V): $(BUILD_LIBJAVA) + BUILD_LIBRARIES += $(BUILD_LIBMLIB_IMAGE_V) endif @@ -439,7 +445,6 @@ LIBAWT_DIRS:=\ $(JDK_TOPDIR)/src/share/native/sun/awt/image \ $(JDK_TOPDIR)/src/share/native/sun/awt/image/gif \ $(JDK_TOPDIR)/src/share/native/sun/awt/image/cvutils \ - $(JDK_TOPDIR)/src/share/native/sun/awt/shell \ $(JDK_TOPDIR)/src/share/native/sun/awt/medialib \ $(JDK_TOPDIR)/src/share/native/sun/awt/debug \ $(JDK_TOPDIR)/src/share/native/sun/awt/utility \ @@ -450,12 +455,17 @@ LIBAWT_DIRS:=\ $(JDK_TOPDIR)/src/share/native/sun/awt/image \ $(JDK_TOPDIR)/src/share/native/sun/java2d/opengl \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/java2d/opengl \ - $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/java2d/x11 \ - $(JDK_TOPDIR)/src/share/native/sun/font \ + $(JDK_TOPDIR)/src/share/native/sun/font + +ifeq ($(OPENJDK_TARGET_OS),windows) + LIBAWT_DIRS+=\ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/windows \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/java2d/windows \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/java2d/d3d - +else + LIBAWT_DIRS+=\ + $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/java2d/x11 +endif LIBAWT_CFLAGS:=-D__MEDIALIB_OLD_NAMES -D__USE_J2D_NAMES \ $(X_CFLAGS) \ @@ -650,7 +660,21 @@ ifeq ($(OPENJDK_TARGET_OS),windows) DllUtil.cpp \ initIDs.cpp \ MouseInfo.cpp \ - rect.c + rect.c \ + OGLBlitLoops.c \ + OGLBufImgOps.c \ + OGLContext.c \ + OGLFuncs.c \ + OGLMaskBlit.c \ + OGLMaskFill.c \ + OGLPaints.c \ + OGLRenderQueue.c \ + OGLRenderer.c \ + OGLSurfaceData.c \ + OGLTextRenderer.c \ + OGLVertexCache.c \ + WGLGraphicsConfig.c \ + WGLSurfaceData.c LIBAWT_LANG:=C++ LIBAWT_CFLAGS += -EHsc -DUNICODE -D_UNICODE ifeq ($(OPENJDK_TARGET_CPU_BITS), 64) @@ -685,15 +709,6 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT,\ ASFLAGS:=$(LIBAWT_ASFLAGS),\ MAPFILE:=$(LIBAWT_MAPFILE), \ LDFLAGS:=$(LDFLAGS_JDKLIB) $(call SET_SHARED_LIBRARY_ORIGIN),\ - LDFLAGS_windows:=advapi32.lib kernel32.lib user32.lib gdi32.lib winspool.lib \ - imm32.lib ole32.lib uuid.lib shell32.lib \ - comdlg32.lib winmm.lib comctl32.lib \ - shlwapi.lib delayimp.lib $(WIN_JAVA_LIB) jvm.lib \ - /DELAYLOAD:user32.dll /DELAYLOAD:gdi32.dll \ - /DELAYLOAD:shell32.dll /DELAYLOAD:winmm.dll \ - /DELAYLOAD:winspool.drv /DELAYLOAD:imm32.dll \ - /DELAYLOAD:ole32.dll /DELAYLOAD:comdlg32.dll \ - /DELAYLOAD:comctl32.dll /DELAYLOAD:shlwapi.dll,\ LDFLAGS_solaris:=-R/usr/dt/lib$(OPENJDK_TARGET_CPU_ISADIR) -R$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR),\ LDFLAGS_SUFFIX_linux:=-ljvm $(LIBM) $(LIBDL) -ljava,\ LDFLAGS_SUFFIX_solaris:=-ljvm $(LIBM) $(LIBDL) -ljava,\ @@ -706,11 +721,20 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT,\ -framework ApplicationServices \ -framework AudioToolbox \ -ljava,\ + LDFLAGS_SUFFIX_windows:=kernel32.lib user32.lib gdi32.lib winspool.lib \ + imm32.lib ole32.lib uuid.lib shell32.lib \ + comdlg32.lib winmm.lib comctl32.lib shlwapi.lib \ + delayimp.lib jvm.lib $(WIN_JAVA_LIB) advapi32.lib \ + -DELAYLOAD:user32.dll -DELAYLOAD:gdi32.dll \ + -DELAYLOAD:shell32.dll -DELAYLOAD:winmm.dll \ + -DELAYLOAD:winspool.drv -DELAYLOAD:imm32.dll \ + -DELAYLOAD:ole32.dll -DELAYLOAD:comdlg32.dll \ + -DELAYLOAD:comctl32.dll -DELAYLOAD:shlwapi.dll,\ VERSIONINFO_RESOURCE:=$(LIBAWT_VERSIONINFO_RESOURCE),\ RC_FLAGS:=$(RC_FLAGS) $(LIBAWT_RC_FLAGS) \ - /D "JDK_FNAME=awt.dll" \ - /D "JDK_INTERNAL_NAME=awt" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=awt.dll" \ + -D "JDK_INTERNAL_NAME=awt" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -864,9 +888,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_XAWT,\ LDFLAGS_SUFFIX:=$(LIBAWT_XAWT_LDFLAGS_SUFFIX),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=xawt.dll" \ - /D "JDK_INTERNAL_NAME=xawt" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=xawt.dll" \ + -D "JDK_INTERNAL_NAME=xawt" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_xawt)) $(BUILD_LIBAWT_XAWT) : $(BUILD_LIBJAVA) @@ -947,9 +971,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBZIP,\ LDFLAGS_SUFFIX_macosx:=$(LIBZ) -ljava -ljvm,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=zip.dll" \ - /D "JDK_INTERNAL_NAME=zip" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=zip.dll" \ + -D "JDK_INTERNAL_NAME=zip" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libzip,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -972,15 +996,15 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBUNPACK,\ MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libunpack/mapfile-vers, \ LDFLAGS:=$(LDFLAGS_JDKLIB) $(LDFLAGS_CXX_JDK) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ - LDFLAGS_windows:=-map:$(JDK_OUTPUTDIR)/objs/unpack.map /debug \ + LDFLAGS_windows:=-map:$(JDK_OUTPUTDIR)/objs/unpack.map -debug \ jvm.lib $(WIN_JAVA_LIB),\ LDFLAGS_SUFFIX_posix:=-ljvm $(LIBCXX) -ljava -lc,\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libunpack,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=unpack.dll" \ - /D "JDK_INTERNAL_NAME=unpack" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=unpack.dll" \ + -D "JDK_INTERNAL_NAME=unpack" \ + -D "JDK_FTYPE=0x2L",\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) $(BUILD_LIBUNPACK) : $(BUILD_LIBJAVA) @@ -1021,14 +1045,14 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBATTACH,\ MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libattach/mapfile-$(OPENJDK_TARGET_OS), \ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS) \ - /D "JDK_FNAME=attach.dll" \ - /D "JDK_INTERNAL_NAME=attach" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=attach.dll" \ + -D "JDK_INTERNAL_NAME=attach" \ + -D "JDK_FTYPE=0x2L",\ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_solaris:=-ldoor,\ - LDFLAGS_windows:=psapi.lib advapi32.lib $(WIN_JAVA_LIB) jvm.lib,\ LDFLAGS_SUFFIX:=$(LDFLAGS_JDKLIB_SUFFIX),\ + LDFLAGS_SUFFIX_windows:=$(WIN_JAVA_LIB) advapi32.lib psapi.lib,\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libattach,\ DEBUG_SYMBOLS:=true)) @@ -1059,9 +1083,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBDT_SOCKET,\ LDFLAGS_SUFFIX_windows:=$(LDFLAGS_JDKLIB_SUFFIX) -export:jdwpTransport_OnLoad ws2_32.lib,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=dt_socket.dll" \ - /D "JDK_INTERNAL_NAME=dt_socket" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=dt_socket.dll" \ + -D "JDK_INTERNAL_NAME=dt_socket" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libdt_socket,\ DEBUG_SYMBOLS:=true)) @@ -1091,9 +1115,9 @@ ifeq ($(OPENJDK_TARGET_OS),windows) LDFLAGS_SUFFIX:=$(LDFLAGS_JDKLIB_SUFFIX),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=dt_shmem.dll" \ - /D "JDK_INTERNAL_NAME=dt_shmem" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=dt_shmem.dll" \ + -D "JDK_INTERNAL_NAME=dt_shmem" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libdt_shmem,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -1126,9 +1150,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJDWP,\ LDFLAGS_SUFFIX:=,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=jdwp.dll" \ - /D "JDK_INTERNAL_NAME=jdwp" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=jdwp.dll" \ + -D "JDK_INTERNAL_NAME=jdwp" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjdwp,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -1167,9 +1191,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAAS,\ EXCLUDE_FILES:=$(LIBJAAS_EXCLUDE_FILES),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS) \ - /D "JDK_FNAME=$(LIBJAAS_NAME).dll" \ - /D "JDK_INTERNAL_NAME=$(LIBJAAS_NAME)" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=$(LIBJAAS_NAME).dll" \ + -D "JDK_INTERNAL_NAME=$(LIBJAAS_NAME)" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjaas,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -1197,9 +1221,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJSDT,\ LDFLAGS_SUFFIX:=,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=jsdt.dll" \ - /D "JDK_INTERNAL_NAME=jsdt" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=jsdt.dll" \ + -D "JDK_INTERNAL_NAME=jsdt" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjsdt, \ DEBUG_SYMBOLS:=true)) @@ -1241,10 +1265,11 @@ ifdef OPENJDK LDFLAGS_SUFFIX_linux:=-lm -lawt -ljava -ljvm,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=lcms.dll" \ - /D "JDK_INTERNAL_NAME=lcms" \ - /D "JDK_FTYPE=0x2L",\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/liblcms)) + -D "JDK_FNAME=lcms.dll" \ + -D "JDK_INTERNAL_NAME=lcms" \ + -D "JDK_FTYPE=0x2L",\ + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/liblcms,\ + DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) BUILD_LIBRARIES += $(BUILD_LIBLCMS) @@ -1300,9 +1325,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJPEG,\ LDFLAGS_SUFFIX:=$(LDFLAGS_JDKLIB_SUFFIX),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=jpeg.dll" \ - /D "JDK_INTERNAL_NAME=jpeg" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=jpeg.dll" \ + -D "JDK_INTERNAL_NAME=jpeg" \ + -D "JDK_FTYPE=0x2L",\ REORDER:=$(BUILD_LIBJPEG_REORDER),\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjpeg,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -1314,7 +1339,7 @@ BUILD_LIBRARIES += $(BUILD_LIBJPEG) ########################################################################################## ifndef OPENJDK - FONT_HEADERS:=-I$(CLOSED_SRC)/share/native/$(PKGDIR)/t2k + FONT_HEADERS:=-I$(JDK_TOPDIR)/src/closed/share/native/sun/font/t2k BUILD_LIBFONTMANAGER_MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libfontmanager/mapfile-vers LIBFONTMANAGER_EXCLUDE_FILES += freetypeScaler.c else @@ -1369,16 +1394,18 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBFONTMANAGER,\ MAPFILE:=$(BUILD_LIBFONTMANAGER_MAPFILE), \ LDFLAGS:=$(subst -Xlinker -z -Xlinker defs,,$(LDFLAGS_JDKLIB)) $(LDFLAGS_CXX_JDK) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ - LDFLAGS_windows:=advapi32.lib user32.lib gdi32.lib $(WIN_AWT_LIB) $(WIN_JAVA_LIB),\ LDFLAGS_SUFFIX:=$(BUILD_LIBFONTMANAGER_FONTLIB),\ LDFLAGS_SUFFIX_linux:=-lawt $(LIBM) $(LIBCXX) -ljava -ljvm -lc,\ LDFLAGS_SUFFIX_solaris:=-lawt -lawt_xawt -lc $(LIBM) $(LIBCXX) -ljava -ljvm,\ - LDFLAGS_SUFFIX_macosx:=-lawt $(LIBM) $(LIBCXX) -undefined dynamic_lookup -ljava -ljvm,\ + LDFLAGS_SUFFIX_macosx:=-lawt $(LIBM) $(LIBCXX) -undefined dynamic_lookup \ + -ljava -ljvm,\ + LDFLAGS_SUFFIX_windows:=$(WIN_JAVA_LIB) advapi32.lib user32.lib gdi32.lib \ + $(WIN_AWT_LIB),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=fontmanager.dll" \ - /D "JDK_INTERNAL_NAME=fontmanager" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=fontmanager.dll" \ + -D "JDK_INTERNAL_NAME=fontmanager" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libfontmanager,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -1433,9 +1460,9 @@ ifndef OPENJDK LDFLAGS_SUFFIX_solaris:=-lawt -lawt_xawt,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=t2k.dll" \ - /D "JDK_INTERNAL_NAME=t2k" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=t2k.dll" \ + -D "JDK_INTERNAL_NAME=t2k" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libt2k,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -1470,9 +1497,9 @@ ifeq ($(OPENJDK_TARGET_OS), windows) LDFLAGS_SUFFIX:=$(LDFLAGS_JDKLIB_SUFFIX),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=jawt.dll" \ - /D "JDK_INTERNAL_NAME=jawt" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=jawt.dll" \ + -D "JDK_INTERNAL_NAME=jawt" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjawt,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -1583,9 +1610,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJDBCODBC,\ LDFLAGS_SUFFIX:=$(LDFLAGS_JDKLIB_SUFFIX) $(LIBJDBCODBC_SONAME),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=JdbcOdbc.dll" \ - /D "JDK_INTERNAL_NAME=JdbcOdbc" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=JdbcOdbc.dll" \ + -D "JDK_INTERNAL_NAME=JdbcOdbc" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(LIBJDBCODBC_DIR),\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -1694,9 +1721,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBINSTRUMENT,\ LDFLAGS_SUFFIX_linux:=$(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=instrument.dll" \ - /D "JDK_INTERNAL_NAME=instrument" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=instrument.dll" \ + -D "JDK_INTERNAL_NAME=instrument" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(LIBINSTRUMENT_DIR),\ DEBUG_SYMBOLS:=true)) @@ -1755,14 +1782,14 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMANAGEMENT,\ MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libmanagement/mapfile-vers, \ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ - LDFLAGS_windows:=$(WIN_JAVA_LIB) jvm.lib advapi32.lib psapi.lib,\ LDFLAGS_solaris:=-lkstat,\ LDFLAGS_SUFFIX:=$(LDFLAGS_JDKLIB_SUFFIX),\ + LDFLAGS_SUFFIX_windows:=jvm.lib psapi.lib $(WIN_JAVA_LIB) advapi32.lib,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=management.dll" \ - /D "JDK_INTERNAL_NAME=management" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=management.dll" \ + -D "JDK_INTERNAL_NAME=management" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libmanagement,\ DEBUG_SYMBOLS:=true)) @@ -1811,9 +1838,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBHPROF,\ LDFLAGS_SUFFIX:=$(BUILD_LIBHPROF_LDFLAGS),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=hprof.dll" \ - /D "JDK_INTERNAL_NAME=hprof" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=hprof.dll" \ + -D "JDK_INTERNAL_NAME=hprof" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libhprof_jvmti,\ DEBUG_SYMBOLS:=true)) @@ -1834,9 +1861,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA_CRW_DEMO,\ $(call SET_SHARED_LIBRARY_ORIGIN),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=java_crw_demo.dll" \ - /D "JDK_INTERNAL_NAME=java_crw_demo" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=java_crw_demo.dll" \ + -D "JDK_INTERNAL_NAME=java_crw_demo" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjava_crw_demo,\ DEBUG_SYMBOLS:=true)) @@ -1860,9 +1887,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBNPT,\ LDFLAGS_SUFFIX_windows:=-export:nptInitialize -export:nptTerminate,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=npt.dll" \ - /D "JDK_INTERNAL_NAME=npt" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=npt.dll" \ + -D "JDK_INTERNAL_NAME=npt" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libnpt,\ DEBUG_SYMBOLS:=true)) @@ -1873,10 +1900,14 @@ BUILD_LIBRARIES += $(BUILD_LIBNPT) LIBNET_SRC_DIRS:=$(JDK_TOPDIR)/src/share/native/java/net \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/net \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/dns \ - $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/www/protocol/http/ntlm \ - $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/sdp \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/spi +ifeq ($(OPENJDK_TARGET_OS),windows) + LIBNET_SRC_DIRS+=$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/www/protocol/http/ntlm +else + LIBNET_SRC_DIRS+=$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/sdp +endif + LIBNET_CFLAGS:=$(foreach dir,$(LIBNET_SRC_DIRS),-I$(dir)) LIBNET_EXCLUDE_FILES:= @@ -1911,14 +1942,14 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBNET,\ LDFLAGS_SUFFIX_macosx:=-ljvm -ljava,\ LDFLAGS_SUFFIX_solaris:=-ljvm -ljava -lnsl -lsocket $(LIBDL) ,\ LDFLAGS_SUFFIX_linux:=$(LIBDL) -ljvm -lpthread -ljava,\ - LDFLAGS_SUFFIX_windows:=ws2_32.lib $(JVMLIB) secur32.lib iphlpapi.lib \ - delayimp.lib $(WIN_JAVA_LIB) jvm.lib advapi32.lib \ - /DELAYLOAD:secur32.dll /DELAYLOAD:iphlpapi.dll, \ + LDFLAGS_SUFFIX_windows:=ws2_32.lib jvm.lib secur32.lib iphlpapi.lib \ + delayimp.lib $(WIN_JAVA_LIB) advapi32.lib \ + -DELAYLOAD:secur32.dll -DELAYLOAD:iphlpapi.dll, \ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=net.dll" \ - /D "JDK_INTERNAL_NAME=net" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=net.dll" \ + -D "JDK_INTERNAL_NAME=net" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libnet,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -1927,7 +1958,7 @@ $(BUILD_LIBNET) : $(BUILD_LIBJAVA) BUILD_LIBRARIES += $(BUILD_LIBNET) $(JDK_OUTPUTDIR)/lib/net.properties: $(JDK_TOPDIR)/src/share/lib/net.properties - $(ECHO) Copying $(@F) + $(ECHO) $(LOG_INFO) Copying $(@F) $(MKDIR) -p $(@D) $(CP) $< $@ @@ -1935,7 +1966,7 @@ COPY_FILES += $(JDK_OUTPUTDIR)/lib/net.properties ifeq ($(OPENJDK_TARGET_OS), solaris) $(JDK_OUTPUTDIR)/lib/sdp/sdp.conf.template : $(JDK_TOPDIR)/src/${OPENJDK_TARGET_OS_API_DIR}/lib/sdp/sdp.conf.template - $(ECHO) Copying $(@F) + $(ECHO) $(LOG_INFO) Copying $(@F) $(MKDIR) -p $(@D) $(CP) $< $@ @@ -2047,18 +2078,18 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBNIO,\ LDFLAGS_SUFFIX_linux:=-ljava -lnet -lpthread $(LIBDL),\ LDFLAGS_SUFFIX_solaris:=-ljvm -lsocket -lposix4 $(LIBDL) \ -lsendfile -ljava -lnet -lc,\ - LDFLAGS_SUFFIX_windows:=$(LDFLAGS_JDKLIB_SUFFIX) \ - $(WIN_JAVA_LIB) $(JDK_OUTPUTDIR)/objs/libnet/net.lib \ - advapi32.lib jvm.lib ws2_32.lib\ + LDFLAGS_SUFFIX_windows:=jvm.lib ws2_32.lib $(WIN_JAVA_LIB) \ + $(JDK_OUTPUTDIR)/objs/libnet/net.lib \ $(JDK_OUTPUTDIR)/objs/libjava/io_util.obj \ - $(JDK_OUTPUTDIR)/objs/libjava/FileDescriptor_md.obj ,\ + $(JDK_OUTPUTDIR)/objs/libjava/FileDescriptor_md.obj \ + advapi32.lib,\ LDFLAGS_SUFFIX_macosx:=-ljava -lnet -pthread -framework CoreFoundation,\ LDFLAGS_SUFFIX:=,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=nio.dll" \ - /D "JDK_INTERNAL_NAME=nio" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=nio.dll" \ + -D "JDK_INTERNAL_NAME=nio" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libnio,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -2218,9 +2249,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJLI,\ user32.lib,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS) \ - /D "JDK_FNAME=jli.dll" \ - /D "JDK_INTERNAL_NAME=jli" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=jli.dll" \ + -D "JDK_INTERNAL_NAME=jli" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjli,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -2267,6 +2298,7 @@ endif ########################################################################################## +ifndef OPENJDK ifeq ($(ENABLE_JFR), true) $(eval $(call SetupNativeCompilation,BUILD_LIBJFR,\ @@ -2282,14 +2314,15 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJFR,\ $(call SET_SHARED_LIBRARY_ORIGIN),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=jfr.dll" \ - /D "JDK_INTERNAL_NAME=jfr" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=jfr.dll" \ + -D "JDK_INTERNAL_NAME=jfr" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjfr,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) BUILD_LIBRARIES += $(BUILD_LIBJFR) +endif endif ########################################################################################## @@ -2332,9 +2365,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBKCMS,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/closed/share/native/sun/java2d/cmm/kcms/cmm.rc,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/closed/share/native/sun/java2d/cmm/kcms/cmm.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=kcms.dll" \ - /D "JDK_INTERNAL_NAME=kcms" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=kcms.dll" \ + -D "JDK_INTERNAL_NAME=kcms" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libkcms,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -2614,7 +2647,7 @@ ifeq ($(OPENJDK_TARGET_OS), macosx) else ifneq ($(OPENJDK_TARGET_OS), windows) LIBSPLASHSCREEN_LDFLAGS_SUFFIX += -L$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR) -lX11 -lXext $(LIBM) -lpthread else # OPENJDK_TARGET_OS - LIBSPLASHSCREEN_LDFLAGS_SUFFIX += kernel32.lib user32.lib gdi32.lib delayimp.lib /DELAYLOAD:user32.dll + LIBSPLASHSCREEN_LDFLAGS_SUFFIX += kernel32.lib user32.lib gdi32.lib delayimp.lib -DELAYLOAD:user32.dll endif # OPENJDK_TARGET_OS $(eval $(call SetupNativeCompilation,LIBSPLASHSCREEN,\ @@ -2631,9 +2664,9 @@ $(eval $(call SetupNativeCompilation,LIBSPLASHSCREEN,\ LDFLAGS_SUFFIX:=$(LIBSPLASHSCREEN_LDFLAGS_SUFFIX) $(LIBZ),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=splashscreen.dll" \ - /D "JDK_INTERNAL_NAME=splashscreen" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=splashscreen.dll" \ + -D "JDK_INTERNAL_NAME=splashscreen" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsplashscreen,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -2673,9 +2706,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBDCPR,\ LDFLAGS_SUFFIX_posix:=-lm,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=dcpr.dll" \ - /D "JDK_INTERNAL_NAME=dcpr" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=dcpr.dll" \ + -D "JDK_INTERNAL_NAME=dcpr" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libdcpr,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -2706,9 +2739,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2PCSC,\ LDFLAGS_SUFFIX_windows:=winscard.lib,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=j2pcsc.dll" \ - /D "JDK_INTERNAL_NAME=j2pcsc" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=j2pcsc.dll" \ + -D "JDK_INTERNAL_NAME=j2pcsc" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libj2pcsc,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -2743,10 +2776,9 @@ ifeq ($(OPENJDK_TARGET_OS), windows) BUILD_LIBKRB5_NAME:=w2k_lsa_auth BUILD_LIBKRB5_FILES:=NativeCreds.c WindowsDirectory.c BUILD_LIBKRB5_SRC:=$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/security/krb5 - BUILD_LIBKRB5_LIBS:=Secur32.lib netapi32.lib \ - kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib \ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib \ - odbccp32.lib wsock32.lib + BUILD_LIBKRB5_LIBS:=advapi32.lib Secur32.lib netapi32.lib kernel32.lib user32.lib \ + gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib \ + ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib else ifeq ($(OPENJDK_TARGET_OS), macosx) BUILD_LIBKRB5_NAME:=osxkrb5 BUILD_LIBKRB5_FILES:=nativeccache.c @@ -2770,9 +2802,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBKRB5,\ LDFLAGS_SUFFIX:=$(BUILD_LIBKRB5_LIBS) ,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=$(BUILD_LIBKRB5_NAME).dll" \ - /D "JDK_INTERNAL_NAME=$(BUILD_LIBKRB5_NAME)" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=$(BUILD_LIBKRB5_NAME).dll" \ + -D "JDK_INTERNAL_NAME=$(BUILD_LIBKRB5_NAME)" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libkrb5,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -2786,22 +2818,20 @@ ifeq ($(OPENJDK_TARGET_OS), windows) $(eval $(call SetupNativeCompilation,BUILD_LIBSUNMSCAPI,\ LIBRARY:=sunmscapi,\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ - SRC:=$(JDK_TOPDIR)/src/share/native/sun/security/mscapi \ - $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/security/mscapi,\ + SRC:=$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/security/mscapi,\ INCLUDE_FILES:=security.cpp, \ LANG:=C++,\ OPTIMIZATION:=LOW, \ CFLAGS:=$(CFLAGS_JDKLIB) \ - -I$(JDK_TOPDIR)/src/share/native/sun/security/mscapi \ -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/security/mscapi ,\ LDFLAGS:=$(LDFLAGS_JDKLIB) $(LDFLAGS_CXX_JDK) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_SUFFIX:=Crypt32.Lib advapi32.lib,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=sunmscapi.dll" \ - /D "JDK_INTERNAL_NAME=sunmscapi" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=sunmscapi.dll" \ + -D "JDK_INTERNAL_NAME=sunmscapi" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsunmscapi,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -2830,9 +2860,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2PKCS11,\ LDFLAGS_SUFFIX_posix:=$(LIBDL), \ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=j2pkcs11.dll" \ - /D "JDK_INTERNAL_NAME=j2pkcs11" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=j2pkcs11.dll" \ + -D "JDK_INTERNAL_NAME=j2pkcs11" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libj2pkcs11,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -2879,9 +2909,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBSUNEC,\ LDFLAGS_SUFFIX_solaris:=-lc ,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=sunec.dll" \ - /D "JDK_INTERNAL_NAME=sunec" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=sunec.dll" \ + -D "JDK_INTERNAL_NAME=sunec" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsunec,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -3019,13 +3049,13 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJSOUND,\ -framework CoreServices -framework AudioUnit $(LIBCXX) \ -framework CoreMIDI -framework AudioToolbox,\ LDFLAGS_windows:=$(WIN_JAVA_LIB) advapi32.lib winmm.lib,\ - LDFLAGS_SUFFIX:=-ljava -ljvm,\ + LDFLAGS_SUFFIX_posix:=-ljava -ljvm,\ LDFLAGS_SUFFIX_solaris:=-lc ,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=jsound.dll" \ - /D "JDK_INTERNAL_NAME=jsound" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=jsound.dll" \ + -D "JDK_INTERNAL_NAME=jsound" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjsound,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -3090,9 +3120,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJSOUNDDS,\ LDFLAGS_SUFFIX:=$(LDFLAGS_JDKLIB_SUFFIX) dsound.lib winmm.lib user32.lib ole32.lib,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ - /D "JDK_FNAME=jsoundds.dll" \ - /D "JDK_INTERNAL_NAME=jsoundds" \ - /D "JDK_FTYPE=0x2L",\ + -D "JDK_FNAME=jsoundds.dll" \ + -D "JDK_INTERNAL_NAME=jsoundds" \ + -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjsoundds,\ DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) @@ -3182,6 +3212,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBOSXAPP,\ OPTIMIZATION:=LOW, \ CFLAGS:=$(CFLAGS_JDKLIB) \ -I$(JDK_TOPDIR)/src/macosx/native/sun/osxapp \ + -I$(JDK_OUTPUTDIR)/gensrc/sun/osxapp \ -F/System/Library/Frameworks/JavaVM.framework/Frameworks \ -F/System/Library/Frameworks/ApplicationServices.framework/Frameworks,\ LDFLAGS:=$(LDFLAGS_JDKLIB)\ diff --git a/jdk/makefiles/CopyFiles.gmk b/jdk/makefiles/CopyFiles.gmk index b52a411e353..e0c8d620f2d 100644 --- a/jdk/makefiles/CopyFiles.gmk +++ b/jdk/makefiles/CopyFiles.gmk @@ -263,16 +263,16 @@ endif ########################################################################################## -# Copy msvcr100.dll on windows +# Copy msvcrXX.dll on windows ifeq ($(OPENJDK_TARGET_OS),windows) - MSVCRNN_TARGET := $(JDK_OUTPUTDIR)/bin/$(notdir $(MSVCRNN_DLL)) - $(MSVCRNN_TARGET): $(MSVCRNN_DLL) + MSVCR_TARGET := $(JDK_OUTPUTDIR)/bin/$(notdir $(MSVCR_DLL)) + $(MSVCR_TARGET): $(MSVCR_DLL) $(MKDIR) -p $(@D) $(RM) $@ $(CP) $< $@ - COPY_FILES += $(MSVCRNN_TARGET) + COPY_FILES += $(MSVCR_TARGET) endif ########################################################################################## @@ -553,7 +553,7 @@ $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/libjdgaSUNW%.so: $(JDK_TOPDIR)/ $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/libjdgaSUNWafb.so: $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/libjdgaSUNWffb.so $(MKDIR) -p $(@D) $(RM) $@ - $(LN) -s $< $@ + $(LN) -s $( $$@ endef $(foreach i,$(META-INF_RULES_SERVICES),$(eval $(call addto_meta-inf_services,$i))) diff --git a/jdk/makefiles/CreateJars.gmk b/jdk/makefiles/CreateJars.gmk index 27ac93f321d..e6aeb72b29e 100644 --- a/jdk/makefiles/CreateJars.gmk +++ b/jdk/makefiles/CreateJars.gmk @@ -42,35 +42,30 @@ BEANMANIFEST := $(JDK_TOPDIR)/make/javax/swing/beaninfo/manifest JARS:= +$(eval $(call MakeDir,$(IMAGES_OUTPUTDIR)/lib)) + ########################################################################################## -JCONSOLE_JAR_DEPS := \ - $(shell $(FIND) $(JDK_OUTPUTDIR)/classes/sun/tools/jconsole/ -name "_the.package") \ - $(shell $(FIND) $(JDK_OUTPUTDIR)/classes/com/sun/tools/jconsole/ -name "_the.package") - -$(eval $(call SetupArchive,BUILD_JCONSOLE_JAR,$(JCONSOLE_JAR_DEPS),\ +$(eval $(call SetupArchive,BUILD_JCONSOLE_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes,\ SUFFIXES:=.class .gif .png .properties,\ INCLUDES:=sun/tools/jconsole com/sun/tools/jconsole,\ JARMAIN:=sun.tools.jconsole.JConsole,\ - JAR:=$(JDK_OUTPUTDIR)/lib/jconsole.jar,\ + JAR:=$(IMAGES_OUTPUTDIR)/lib/jconsole.jar,\ SKIP_METAINF:=true)) -JARS+=$(JDK_OUTPUTDIR)/lib/jconsole.jar +JARS+=$(IMAGES_OUTPUTDIR)/lib/jconsole.jar ########################################################################################## -DNS_JAR_DEPS := \ - $(shell $(FIND) $(JDK_OUTPUTDIR)/classes/sun/net/spi/nameservice/dns/ -name "_the.package") \ - -$(eval $(call SetupArchive,BUILD_DNS_JAR,$(DNS_JAR_DEPS),\ +$(eval $(call SetupArchive,BUILD_DNS_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes,\ INCLUDES:=sun/net/spi/nameservice/dns,\ EXTRA_FILES:=META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor,\ - JAR:=$(JDK_OUTPUTDIR)/lib/ext/dnsns.jar,\ + JAR:=$(IMAGES_OUTPUTDIR)/lib/ext/dnsns.jar,\ SKIP_METAINF:=true)) -JARS+=$(JDK_OUTPUTDIR)/lib/ext/dnsns.jar +JARS+=$(IMAGES_OUTPUTDIR)/lib/ext/dnsns.jar ########################################################################################## @@ -83,10 +78,10 @@ $(eval $(call SetupArchive,BUILD_LOCALEDATA_JAR,,\ SUFFIXES:=.class _dict _th,\ INCLUDES:=$(LOCALEDATA_INCLUDES),\ EXCLUDES:=sun/text/resources/th/BreakIteratorRules_th.class,\ - JAR:=$(JDK_OUTPUTDIR)/lib/ext/localedata.jar,\ + JAR:=$(IMAGES_OUTPUTDIR)/lib/ext/localedata.jar,\ SKIP_METAINF:=true)) -JARS+=$(JDK_OUTPUTDIR)/lib/ext/localedata.jar +JARS+=$(IMAGES_OUTPUTDIR)/lib/ext/localedata.jar ########################################################################################## # rt.jar and resources.jar are being built in the same way as in the old build. They require @@ -264,8 +259,8 @@ endif ALL_FILES_IN_CLASSES := $(shell $(FIND) $(JDK_OUTPUTDIR)/classes -type f \ | $(GREP) -v -e '/_the\.*' -e '^_the\.*' -e 'javac_state') -RT_JAR_MANIFEST_FILE := $(JDK_OUTPUTDIR)/lib/_the.rt.jar_manifest -RESOURCE_JAR_MANIFEST_FILE := $(JDK_OUTPUTDIR)/lib/_the.resources.jar_manifest +RT_JAR_MANIFEST_FILE := $(IMAGES_OUTPUTDIR)/lib/_the.rt.jar_manifest +RESOURCE_JAR_MANIFEST_FILE := $(IMAGES_OUTPUTDIR)/lib/_the.resources.jar_manifest $(RT_JAR_MANIFEST_FILE): $(MAINMANIFEST) $(BEANMANIFEST) $(MKDIR) -p $(@D) @@ -285,40 +280,40 @@ $(RESOURCE_JAR_MANIFEST_FILE): $(MAINMANIFEST) $(MAINMANIFEST) >> $@.tmp $(MV) $@.tmp $@ -$(JDK_OUTPUTDIR)/lib/_the.jars.exclude: $(MAKEFILE) +$(IMAGES_OUTPUTDIR)/lib/_the.jars.exclude: $(MAKEFILE) $(MKDIR) -p $(@D) $(RM) $@ $@.tmp $(call ListPathsSafely,RT_JAR_EXCLUDES,\n, >> $@.tmp) $(MV) $@.tmp $@ -$(JDK_OUTPUTDIR)/lib/classlist : $(JDK_TOPDIR)/make/tools/sharing/classlist.$(OPENJDK_TARGET_OS) \ +$(IMAGES_OUTPUTDIR)/lib/classlist : $(JDK_TOPDIR)/make/tools/sharing/classlist.$(OPENJDK_TARGET_OS) \ $(MAKEFILE) $(MKDIR) -p $(@D) $(RM) $@ $@.tmp $(TOOL_ADDJSUM) $< $@.tmp $(MV) $@.tmp $@ -$(JDK_OUTPUTDIR)/lib/_the.jars.contents: $(BUILD_TOOLS) $(JDK_OUTPUTDIR)/lib/_the.jars.exclude \ - $(ALL_FILES_IN_CLASSES) $(JDK_OUTPUTDIR)/lib/classlist +$(IMAGES_OUTPUTDIR)/lib/_the.jars.contents: $(BUILD_TOOLS) $(IMAGES_OUTPUTDIR)/lib/_the.jars.exclude \ + $(ALL_FILES_IN_CLASSES) $(IMAGES_OUTPUTDIR)/lib/classlist $(MKDIR) -p $(@D) $(RM) $@ $@.tmp ($(CD) $(JDK_OUTPUTDIR)/classes && \ $(TOOL_JARREORDER) \ - -o $@.tmp $(JDK_OUTPUTDIR)/lib/classlist $(JDK_OUTPUTDIR)/lib/_the.jars.exclude . ) + -o $@.tmp $(IMAGES_OUTPUTDIR)/lib/classlist $(IMAGES_OUTPUTDIR)/lib/_the.jars.exclude . ) $(MV) $@.tmp $@ -$(JDK_OUTPUTDIR)/lib/_the.rt.jar.contents: $(JDK_OUTPUTDIR)/lib/_the.jars.contents +$(IMAGES_OUTPUTDIR)/lib/_the.rt.jar.contents: $(IMAGES_OUTPUTDIR)/lib/_the.jars.contents $(MKDIR) -p $(@D) $(RM) $@ $@.tmp - $(GREP) -e '\.class$$' $(JDK_OUTPUTDIR)/lib/_the.jars.contents > $@.tmp + $(GREP) -e '\.class$$' $(IMAGES_OUTPUTDIR)/lib/_the.jars.contents > $@.tmp $(MV) $@.tmp $@ -$(JDK_OUTPUTDIR)/lib/_the.resources.jar.contents: $(JDK_OUTPUTDIR)/lib/_the.jars.contents +$(IMAGES_OUTPUTDIR)/lib/_the.resources.jar.contents: $(IMAGES_OUTPUTDIR)/lib/_the.jars.contents $(MKDIR) -p $(@D) $(RM) $@ $@.tmp $(GREP) -v -e '\.class$$' \ -e '/_the\.*' -e '^_the\.*' -e '\\_the\.*' -e 'javac_state' \ - $(JDK_OUTPUTDIR)/lib/_the.jars.contents > $@.tmp + $(IMAGES_OUTPUTDIR)/lib/_the.jars.contents > $@.tmp $(MV) $@.tmp $@ RT_JAR_CREATE_OPTIONS := c0fm @@ -326,31 +321,29 @@ ifeq ($(COMPRESS_JARS), true) RT_JAR_CREATE_OPTIONS := cfm endif -$(JDK_OUTPUTDIR)/lib/rt.jar: $(JDK_OUTPUTDIR)/lib/_the.rt.jar.contents $(RT_JAR_MANIFEST_FILE) +$(IMAGES_OUTPUTDIR)/lib/rt.jar: $(IMAGES_OUTPUTDIR)/lib/_the.rt.jar.contents $(RT_JAR_MANIFEST_FILE) $(ECHO) Creating rt.jar $(MKDIR) -p $(@D) $(RM) $@ $@.tmp $(CD) $(JDK_OUTPUTDIR)/classes && \ $(JAR) $(RT_JAR_CREATE_OPTIONS) $@.tmp $(RT_JAR_MANIFEST_FILE) \ - @$(JDK_OUTPUTDIR)/lib/_the.rt.jar.contents + @$(IMAGES_OUTPUTDIR)/lib/_the.rt.jar.contents $(MV) $@.tmp $@ -$(JDK_OUTPUTDIR)/lib/resources.jar: $(JDK_OUTPUTDIR)/lib/_the.resources.jar.contents \ +$(IMAGES_OUTPUTDIR)/lib/resources.jar: $(IMAGES_OUTPUTDIR)/lib/_the.resources.jar.contents \ $(RESOURCE_JAR_MANIFEST_FILE) $(ECHO) Creating resources.jar $(MKDIR) -p $(@D) $(RM) $@ $@.tmp $(CD) $(JDK_OUTPUTDIR)/classes && \ $(JAR) $(RT_JAR_CREATE_OPTIONS) $@.tmp $(RESOURCE_JAR_MANIFEST_FILE) \ - @$(JDK_OUTPUTDIR)/lib/_the.resources.jar.contents + @$(IMAGES_OUTPUTDIR)/lib/_the.resources.jar.contents $(MV) $@.tmp $@ -JARS+=$(JDK_OUTPUTDIR)/lib/rt.jar $(JDK_OUTPUTDIR)/lib/resources.jar +JARS+=$(IMAGES_OUTPUTDIR)/lib/rt.jar $(IMAGES_OUTPUTDIR)/lib/resources.jar ########################################################################################## -CHARSETS_JAR_DEPS := - ifneq ($(OPENJDK_TARGET_OS), windows) CHARSETS_EXTRA_FILES:=sun/awt/motif/X11GBK.class \ sun/awt/motif/X11GB2312\$$$$Decoder.class \ @@ -362,32 +355,34 @@ ifneq ($(OPENJDK_TARGET_OS), windows) sun/awt/motif/X11KSC5601.class endif -$(eval $(call SetupArchive,BUILD_CHARSETS_JAR,$(CHARSETS_JAR_DEPS),\ +$(eval $(call SetupArchive,BUILD_CHARSETS_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes, \ SUFFIXES:=.class .dat,\ INCLUDES:=sun/nio/cs/ext,\ EXTRA_FILES := sun/awt/HKSCS.class \ $(CHARSETS_EXTRA_FILES) \ META-INF/services/java.nio.charset.spi.CharsetProvider, \ - JAR:=$(JDK_OUTPUTDIR)/lib/charsets.jar, \ + JAR:=$(IMAGES_OUTPUTDIR)/lib/charsets.jar, \ SKIP_METAINF := true, \ CHECK_COMPRESS_JAR:=true)) -JARS+=$(JDK_OUTPUTDIR)/lib/charsets.jar +JARS+=$(IMAGES_OUTPUTDIR)/lib/charsets.jar ########################################################################################## +ifndef OPENJDK ifeq ($(ENABLE_JFR), true) $(eval $(call SetupArchive,BUILD_JFR_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes,\ INCLUDES:=com/oracle/jrockit/jfr \ oracle/jrockit/jfr,\ - JAR:=$(JDK_OUTPUTDIR)/lib/jfr.jar,\ + JAR:=$(IMAGES_OUTPUTDIR)/lib/jfr.jar,\ SKIP_METAINF:=true,\ MANIFEST:=$(MAINMANIFEST), \ CHECK_COMPRESS_JAR:=true)) - JARS+=$(JDK_OUTPUTDIR)/lib/jfr.jar + JARS+=$(IMAGES_OUTPUTDIR)/lib/jfr.jar +endif endif ########################################################################################## @@ -398,30 +393,30 @@ $(eval $(call SetupArchive,BUILD_JSSE_JAR,,\ sun/security/rsa/SunRsaSign.class \ sun/security/ssl \ com/sun/net/ssl/internal/ssl,\ - JAR:=$(JDK_OUTPUTDIR)/lib/jsse.jar,\ + JAR:=$(IMAGES_OUTPUTDIR)/lib/jsse.jar,\ SKIP_METAINF:=true,\ MANIFEST:=$(MAINMANIFEST), \ CHECK_COMPRESS_JAR:=true)) -JARS+=$(JDK_OUTPUTDIR)/lib/jsse.jar +JARS+=$(IMAGES_OUTPUTDIR)/lib/jsse.jar ########################################################################################## -SUNPKCS11_JAR_DST := $(JDK_OUTPUTDIR)/lib/ext/sunpkcs11.jar +SUNPKCS11_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/sunpkcs11.jar ifndef OPENJDK SUNPKCS11_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/pkcs11/sunpkcs11.jar $(SUNPKCS11_JAR_DST) : $(SUNPKCS11_JAR_SRC) - @$(ECHO) "\n>>>Installing prebuilt SunPKCS11 provider..." + @$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt SunPKCS11 provider..." $(MKDIR) -p $(@D) $(RM) $@ $(CP) $< $@ else - $(eval $(call SetupArchive,BUILD_SUNPKCS11_JAR,$(SUNPKCS11_JAR_DEPS),\ + $(eval $(call SetupArchive,BUILD_SUNPKCS11_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes, \ SUFFIXES:=.class,\ INCLUDES:=sun/security/pkcs11,\ @@ -434,14 +429,14 @@ JARS += $(SUNPKCS11_JAR_DST) ########################################################################################## -SUNEC_JAR_DST := $(JDK_OUTPUTDIR)/lib/ext/sunec.jar +SUNEC_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/sunec.jar ifndef OPENJDK SUNEC_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/ec/sunec.jar $(SUNEC_JAR_DST) : $(SUNEC_JAR_SRC) - @$(ECHO) "\n>>>Installing prebuilt SunEC provider..." + @$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt SunEC provider..." $(MKDIR) -p $(@D) $(RM) $@ $(CP) $< $@ @@ -467,26 +462,26 @@ $(eval $(call SetupArchive,BUILD_SWINGBEANS_JAR,,\ INCLUDES:=javax/swing sun/swing,\ EXCLUDES:=javax/swing/plaf,\ EXTRA_FILES:=javax/swing/SwingBeanInfoBase.class sun/swing/BeanInfoUtils.class,\ - JAR:=$(JDK_OUTPUTDIR)/lib/dt.jar,\ + JAR:=$(IMAGES_OUTPUTDIR)/lib/dt.jar,\ SKIP_METAINF:=true)) -JARS+=$(JDK_OUTPUTDIR)/lib/dt.jar +JARS+=$(IMAGES_OUTPUTDIR)/lib/dt.jar ########################################################################################## -SUNJCE_PROVIDER_JAR_DST := $(JDK_OUTPUTDIR)/lib/ext/sunjce_provider.jar +SUNJCE_PROVIDER_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/sunjce_provider.jar ifndef OPENJDK SUNJCE_PROVIDER_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/jce/sunjce_provider.jar $(SUNJCE_PROVIDER_JAR_DST) : $(SUNJCE_PROVIDER_JAR_SRC) - @$(ECHO) "\n>>>Installing prebuilt SunJCE provider..." + @$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt SunJCE provider..." $(MKDIR) -p $(@D) $(RM) $@ $(CP) $< $@ else - $(eval $(call SetupArchive,BUILD_SUNJCE_PROVIDER_JAR,$(SUNJCE_PROVIDER_JAR_DEPS),\ + $(eval $(call SetupArchive,BUILD_SUNJCE_PROVIDER_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes, \ SUFFIXES:=.class,\ INCLUDES:= com/sun/crypto/provider,\ @@ -498,21 +493,21 @@ endif JARS += $(SUNJCE_PROVIDER_JAR_DST) -JCE_JAR_DST := $(JDK_OUTPUTDIR)/lib/jce.jar +JCE_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/jce.jar ifndef OPENJDK JCE_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/jce/jce.jar $(JCE_JAR_DST) : $(JCE_JAR_SRC) - @$(ECHO) "\n>>>Installing prebuilt jce.jar..." + @$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt jce.jar..." $(MKDIR) -p $(@D) $(RM) $@ $(CP) $< $@ else -$(eval $(call SetupArchive,BUILD_JCE_JAR,$(JCE_JAR_DEPS),\ +$(eval $(call SetupArchive,BUILD_JCE_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes, \ SUFFIXES:=.class,\ INCLUDES:= javax/crypto sun/security/internal,\ @@ -532,9 +527,9 @@ ifdef OPENJDK # TODO fix so that SetupArchive does not write files into SRCS # then we don't need this extra copying # -US_EXPORT_POLICY_JAR_DST := $(JDK_OUTPUTDIR)/lib/security/US_export_policy.jar +US_EXPORT_POLICY_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/security/US_export_policy.jar US_EXPORT_POLICY_JAR_SRC_DIR := $(JDK_TOPDIR)/make/javax/crypto/policy/unlimited -US_EXPORT_POLICY_JAR_TMP := $(JDK_OUTPUTDIR)/US_export_policy_jar.tmp +US_EXPORT_POLICY_JAR_TMP := $(IMAGES_OUTPUTDIR)/US_export_policy_jar.tmp $(US_EXPORT_POLICY_JAR_TMP)/% : $(US_EXPORT_POLICY_JAR_SRC_DIR)/% $(MKDIR) -p $(@D) @@ -563,11 +558,12 @@ ifdef OPENJDK # TODO fix so that SetupArchive does not write files into SRCS # then we don't need this extra copying # -LOCAL_POLICY_JAR_DST := $(JDK_OUTPUTDIR)/lib/security/local_policy.jar +LOCAL_POLICY_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/security/local_policy.jar LOCAL_POLICY_JAR_SRC_DIR := $(JDK_TOPDIR)/make/javax/crypto/policy/limited -LOCAL_POLICY_JAR_TMP := $(JDK_OUTPUTDIR)/local_policy_jar.tmp +LOCAL_POLICY_JAR_TMP := $(IMAGES_OUTPUTDIR)/local_policy_jar.tmp -LOCAL_POLICY_JAR_DEPS := $(LOCAL_POLICY_JAR_TMP)/exempt_local.policy $(LOCAL_POLICY_JAR_TMP)/default_local.policy +LOCAL_POLICY_JAR_DEPS := $(LOCAL_POLICY_JAR_TMP)/exempt_local.policy \ + $(LOCAL_POLICY_JAR_TMP)/default_local.policy $(LOCAL_POLICY_JAR_TMP)/% : $(LOCAL_POLICY_JAR_SRC_DIR)/% $(MKDIR) -p $(@D) @@ -589,26 +585,24 @@ endif ifeq ($(OPENJDK_TARGET_OS),windows) -SUNMSCAPI_JAR_DST := $(JDK_OUTPUTDIR)/lib/ext/sunmscapi.jar +SUNMSCAPI_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/sunmscapi.jar ifndef OPENJDK SUNMSCAPI_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/mscapi/sunmscapi.jar $(SUNMSCAPI_JAR_DST) : $(SUNMSCAPI_JAR_SRC) - @$(ECHO) "\n>>>Installing prebuilt SunMSCAPI provider..." + @$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt SunMSCAPI provider..." $(MKDIR) -p $(@D) $(RM) $@ $(CP) $< $@ else -$(eval $(call SetupArchive,BUILD_SUNMSCAPI_JAR,$(SUNMSCAPI_JAR_DEPS),\ +$(eval $(call SetupArchive,BUILD_SUNMSCAPI_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes, \ SUFFIXES:=.class,\ INCLUDES:= sun/security/mscapi,\ JAR:=$(SUNMSCAPI_JAR_DST), \ - MANIFEST:=$(JDK_TOPDIR)/make/tools/manifest.mf, \ - EXTRA_MANIFEST_ATTR:=Extension-Name: javax.crypto\nImplementation-Vendor-Id: com.sun, \ SKIP_METAINF:=true)) endif @@ -621,11 +615,11 @@ endif ifeq ($(OPENJDK_TARGET_OS),solaris) ifndef OPENJDK -UCRYPTO_JAR_DST := $(JDK_OUTPUTDIR)/lib/ext/ucrypto.jar +UCRYPTO_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/ucrypto.jar UCRYPTO_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/ucrypto/ucrypto.jar $(UCRYPTO_JAR_DST) : $(UCRYPTO_JAR_SRC) - @$(ECHO) "\n>>>Installing prebuilt OracleUcrypto provider..." + @$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt OracleUcrypto provider..." $(MKDIR) -p $(@D) $(RM) $@ $(CP) $< $@ @@ -640,9 +634,9 @@ endif # Get the CLDRVERSION include GensrcCLDR.gmk -CLDRDATA_JAR_DST := $(JDK_OUTPUTDIR)/lib/ext/cldrdata.jar +CLDRDATA_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/cldrdata.jar -$(eval $(call SetupArchive,BUILD_CLDRDATA_JAR,$(CLDRDATA_DEPS),\ +$(eval $(call SetupArchive,BUILD_CLDRDATA_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes,\ SUFFIXES:=.class,\ INCLUDES:=sun/text/resources/cldr \ @@ -715,21 +709,25 @@ TOOLS_JAR_INCLUDES := \ sun/tools/jinfo \ sun/tools/jmap -$(eval $(call SetupArchive,BUILD_TOOLS_JAR,$(TOOLS_JAR_DEPS),\ +# The sjavac tools is not ready for public consumption. +TOOLS_JAR_EXCLUDES=com/sun/tools/sjavac + +$(eval $(call SetupArchive,BUILD_TOOLS_JAR,,\ SRCS:=$(JDK_OUTPUTDIR)/classes,\ SUFFIXES:=.class .prp .gif .properties .xml .css .xsd .js .html .txt .java \ Tool aliasmap options,\ INCLUDES:=$(TOOLS_JAR_INCLUDES),\ + EXCLUDES:=$(TOOLS_JAR_EXCLUDES),\ EXTRA_FILES:=META-INF/services/com.sun.jdi.connect.Connector \ META-INF/services/com.sun.jdi.connect.spi.TransportService \ META-INF/services/com.sun.tools.attach.spi.AttachProvider \ META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin \ META-INF/services/com.sun.tools.internal.xjc.Plugin,\ - JAR:=$(JDK_OUTPUTDIR)/lib/tools.jar,\ + JAR:=$(IMAGES_OUTPUTDIR)/lib/tools.jar,\ SKIP_METAINF:=true, \ CHECK_COMPRESS_JAR:=true)) -JARS+=$(JDK_OUTPUTDIR)/lib/tools.jar +JARS+=$(IMAGES_OUTPUTDIR)/lib/tools.jar ########################################################################################## @@ -761,7 +759,7 @@ EXPORTED_PRIVATE_PKGS = com.sun.servicetag \ com.oracle.net \ com.oracle.nio -$(IMAGES_OUTPUTDIR)/symbols/_the.symbols: $(JDK_OUTPUTDIR)/lib/rt.jar +$(IMAGES_OUTPUTDIR)/symbols/_the.symbols: $(IMAGES_OUTPUTDIR)/lib/rt.jar $(RM) -r $(IMAGES_OUTPUTDIR)/symbols/META-INF/sym $(MKDIR) -p $(IMAGES_OUTPUTDIR)/symbols/META-INF/sym $(JAVA) \ @@ -769,19 +767,19 @@ $(IMAGES_OUTPUTDIR)/symbols/_the.symbols: $(JDK_OUTPUTDIR)/lib/rt.jar $(JAVAC_JARS) \ -XDprocess.packages -proc:only \ -processor com.sun.tools.javac.sym.CreateSymbols \ - -Acom.sun.tools.javac.sym.Jar=$(JDK_OUTPUTDIR)/lib/rt.jar \ + -Acom.sun.tools.javac.sym.Jar=$(IMAGES_OUTPUTDIR)/lib/rt.jar \ -Acom.sun.tools.javac.sym.Dest=$(IMAGES_OUTPUTDIR)/symbols/META-INF/sym/rt.jar \ $(CORE_PKGS) $(NON_CORE_PKGS) $(EXCLUDE_PROPWARN_PKGS) $(EXPORTED_PRIVATE_PKGS) $(TOUCH) $@ -MAKE_SURE_DIR_EXISTS_DUMMY := $(shell $(MKDIR) -p $(IMAGES_OUTPUTDIR)/symbols) +$(shell $(MKDIR) -p $(IMAGES_OUTPUTDIR)/symbols) $(eval $(call SetupArchive,BUILD_CT_SYM,$(IMAGES_OUTPUTDIR)/symbols/_the.symbols,\ SRCS:=$(IMAGES_OUTPUTDIR)/symbols,\ INCLUDES:=META-INF/sym,\ - JAR:=$(JDK_OUTPUTDIR)/lib/ct.sym, \ + JAR:=$(IMAGES_OUTPUTDIR)/lib/ct.sym, \ CHECK_COMPRESS_JAR:=true)) -JARS+=$(JDK_OUTPUTDIR)/lib/ct.sym +JARS+=$(IMAGES_OUTPUTDIR)/lib/ct.sym ########################################################################################## @@ -861,11 +859,12 @@ $(IMAGES_OUTPUTDIR)/src/launcher/%: $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DI $(IMAGES_OUTPUTDIR)/src.zip: $(LAUNCHER_ZIP_SRC) -# This dir needs to exsist before macro is evaluated to avoid warning from find. -MAKE_SURE_DIR_EXISTS_DUMMY := $(shell $(MKDIR) -p $(IMAGES_OUTPUTDIR)/src) +# This dir needs to exist before macro is evaluated to avoid warning from find. +$(eval $(call MakeDir,$(IMAGES_OUTPUTDIR)/src)) $(eval $(call SetupZipArchive,BUILD_SRC_ZIP,\ SRC:=$(SRC_ZIP_SRCS) $(IMAGES_OUTPUTDIR)/src,\ INCLUDES:=$(SRC_ZIP_INCLUDES) launcher,\ + EXCLUDES:=javax/swing/beaninfo,\ SUFFIXES:=.java .c .h,\ ZIP:=$(IMAGES_OUTPUTDIR)/src.zip,\ EXTRA_DEPS:=$(LAUNCHER_ZIP_SRC))) diff --git a/jdk/makefiles/GendataBreakIterator.gmk b/jdk/makefiles/GendataBreakIterator.gmk index 52c6f6e272d..e07c90bcd62 100644 --- a/jdk/makefiles/GendataBreakIterator.gmk +++ b/jdk/makefiles/GendataBreakIterator.gmk @@ -75,7 +75,7 @@ BIFILES_TH = $(DATA_PKG_DIR)/th/WordBreakIteratorData_th \ $(BIFILES): $(DATA_PKG_DIR)/_the.bifiles $(DATA_PKG_DIR)/_the.bifiles: JAVA_FLAGS += -Xbootclasspath/p:$(BREAK_ITERATOR_CLASSES) $(DATA_PKG_DIR)/_the.bifiles: $(BUILD_TOOLS) $(UNICODEDATA) $(BUILD_BREAKITERATOR) - $(ECHO) "Generating BreakIteratorData" + $(ECHO) $(LOG_INFO) "Generating BreakIteratorData" $(MKDIR) -p $(DATA_PKG_DIR) $(RM) $(BIFILES) $(TOOL_GENERATEBREAKITERATORDATA) \ @@ -86,7 +86,7 @@ $(DATA_PKG_DIR)/_the.bifiles: $(BUILD_TOOLS) $(UNICODEDATA) $(BUILD_BREAKITERATO $(BIFILES_TH): $(DATA_PKG_DIR)/_the.bifiles_th $(DATA_PKG_DIR)/_the.bifiles_th: JAVA_FLAGS += -Xbootclasspath/p:$(BREAK_ITERATOR_CLASSES) $(DATA_PKG_DIR)/_the.bifiles_th: $(BUILD_TOOLS) $(UNICODEDATA) $(BUILD_BREAKITERATOR) - $(ECHO) "Generating BreakIteratorData_th" + $(ECHO) $(LOG_INFO) "Generating BreakIteratorData_th" $(MKDIR) -p $(DATA_PKG_DIR)/th $(RM) $(BIFILES_TH) $(TOOL_GENERATEBREAKITERATORDATA) \ diff --git a/jdk/makefiles/GendataFontConfig.gmk b/jdk/makefiles/GendataFontConfig.gmk index d748998f596..7f539083c9d 100644 --- a/jdk/makefiles/GendataFontConfig.gmk +++ b/jdk/makefiles/GendataFontConfig.gmk @@ -75,7 +75,6 @@ $(GENDATA_FONT_CONFIG_DST)/%.src : \ $(RM) $@ $(MKDIR) -p $(@D) $(CP) $< $@ - $(CHMOD) 644 $@ $(GENDATA_FONT_CONFIG_DST)/%.bfc : \ $(GENDATA_FONT_CONFIG_SRC_DIR)/$(GENDATA_FONT_CONFIG_SRC_PREFIX)%.properties diff --git a/jdk/makefiles/GendataHtml32dtd.gmk b/jdk/makefiles/GendataHtml32dtd.gmk index f1a2c95d55a..45a705dbb1a 100644 --- a/jdk/makefiles/GendataHtml32dtd.gmk +++ b/jdk/makefiles/GendataHtml32dtd.gmk @@ -30,6 +30,6 @@ $(HTML32DTD): $(BUILD_TOOLS) $(ECHO) "Generating HTML DTD file" $(MKDIR) -p $(@D) $(RM) $@ - ($(TOOL_DTDBUILDER) html32 > $@) || exit 1 + ($(TOOL_DTDBUILDER) $(LOG_INFO) html32 > $@) || exit 1 -GENDATA_HTML32DTD += $(HTML32DTD) \ No newline at end of file +GENDATA_HTML32DTD += $(HTML32DTD) diff --git a/jdk/makefiles/GenerateClasses.gmk b/jdk/makefiles/GenerateClasses.gmk index 4ebc56c48ff..3ee2a050d2f 100644 --- a/jdk/makefiles/GenerateClasses.gmk +++ b/jdk/makefiles/GenerateClasses.gmk @@ -32,13 +32,13 @@ include RMICompilation.gmk # To ensure the latest stub generator files are picked up from corba repo # when available, we need to run with latest rmic version available. ifneq ($(COMPILE_TYPE),cross) - RMIC := $(UNCYGDRIVE) $(JDK_OUTPUTDIR)/bin/rmic + RMIC := $(FIXPATH) $(JDK_OUTPUTDIR)/bin/rmic endif CLASSES_DIR := $(JDK_OUTPUTDIR)/classes # NOTE: If the smart javac dependency management is reintroduced, these classes risk # interfering with the dependency checking. In that case they will need to be kept separate. -STUB_CLASSES_DIR := $(JDK_OUTPUTDIR)/rmicclasses +STUB_CLASSES_DIR := $(JDK_OUTPUTDIR)/classes RMIC_GENSRC_DIR := $(JDK_OUTPUTDIR)/gendocsrc_rmic GENCLASSES := @@ -91,8 +91,10 @@ GENCLASSES += $(filter %.java,$(RMI_SRC)) ########################################################################################## -all: $(GENCLASSES) +$(RMIC_GENSRC_DIR)/_the.classes.removed: $(GENCLASSES) $(FIND) $(RMIC_GENSRC_DIR) -name "*.class" $(FIND_DELETE) - $(CP) -rp $(STUB_CLASSES_DIR)/* $(CLASSES_DIR) + $(TOUCH) $@ + +all: $(RMIC_GENSRC_DIR)/_the.classes.removed $(GENCLASSES) .PHONY: all diff --git a/jdk/makefiles/GenerateJavaSources.gmk b/jdk/makefiles/GenerateJavaSources.gmk index 546b7e9a51a..db70c737f7b 100644 --- a/jdk/makefiles/GenerateJavaSources.gmk +++ b/jdk/makefiles/GenerateJavaSources.gmk @@ -67,7 +67,11 @@ GENSRC += $(GENSRC_EXCEPTIONS) ifneq ($(OPENJDK_TARGET_OS),windows) include GensrcIcons.gmk -GENSRC += $(GENSRC_ICONS) +GENSRC += $(GENSRC_X11_ICONS) + +ifeq ($(OPENJDK_TARGET_OS),macosx) +GENSRC += $(GENSRC_OSX_ICONS) +endif include GensrcX11Wrappers.gmk GENSRC += $(GENSRC_X11WRAPPERS) @@ -77,9 +81,7 @@ include GensrcCLDR.gmk GENSRC += $(GENSRC_CLDR) include GensrcSwing.gmk -ifndef DISABLE_NIMBUS - GENSRC += $(GENSRC_SWING_NIMBUS) -endif +GENSRC += $(GENSRC_SWING_BEANINFO) $(GENSRC_SWING_NIMBUS) ifeq ($(OPENJDK_TARGET_OS), macosx) include GensrcJObjC.gmk @@ -88,34 +90,7 @@ endif $(GENSRC) : $(BUILD_TOOLS) -# The exception handling of swing beaninfo -# gensrc_swing/javax/swing/beaninfo/* have not be in src.zip -all: $(GENSRC) $(GENSRC_SWING_BEANINFO) - $(MKDIR) -p $(JDK_OUTPUTDIR)/gensrc - (cd $(JDK_OUTPUTDIR) && \ - $(CHMOD) -R u+rw gensrc && \ - $(CP) -rp gensrc_characterdata/* gensrc && \ - $(CP) -rp gensrc_properties/* gensrc && \ - $(CP) -rp gensrc_localedatametainfo/* gensrc && \ - $(CP) -rp gensrc_jdwp/* gensrc && \ - $(CP) -rp gensrc_misc/* gensrc && \ - $(CP) -rp gensrc_charsetmapping/* gensrc && \ - $(CP) -rp gensrc_charsetcoder/* gensrc && \ - $(CP) -rp gensrc_exceptions/* gensrc && \ - $(CP) -rp gensrc_buffer/* gensrc && \ - $(CP) -rp gensrc_cldr/* gensrc) - if [ -d $(JDK_OUTPUTDIR)/gensrc_swing/javax/swing/plaf ] ; then \ - (cd $(JDK_OUTPUTDIR) && \ - $(MKDIR) -p gensrc/javax/swing/plaf && \ - $(CP) -rp gensrc_swing/javax/swing/plaf/* gensrc/javax/swing/plaf) \ - fi - if [ -d $(JDK_OUTPUTDIR)/gensrc_jobjc ] ; then \ - (cd $(JDK_OUTPUTDIR) && cp -rp gensrc_jobjc/src/* gensrc) \ - fi -ifneq ($(OPENJDK_TARGET_OS),windows) - (cd $(JDK_OUTPUTDIR) && \ - $(CP) -rp gensrc_icons/* gensrc && \ - $(CP) -rp gensrc_x11wrappers/classes/* gensrc) -endif +all: $(GENSRC) + .PHONY: all diff --git a/jdk/makefiles/GensrcBuffer.gmk b/jdk/makefiles/GensrcBuffer.gmk index f2f450b2fe1..3e55b1c14a4 100644 --- a/jdk/makefiles/GensrcBuffer.gmk +++ b/jdk/makefiles/GensrcBuffer.gmk @@ -25,14 +25,14 @@ GENSRC_BUFFER := -GENSRC_BUFFER_TMP := $(JDK_OUTPUTDIR)/gensrc_buffer -GENSRC_BUFFER_DST := $(JDK_OUTPUTDIR)/gensrc_buffer/java/nio +GENSRC_BUFFER_TMP := $(JDK_OUTPUTDIR)/gensrc +GENSRC_BUFFER_DST := $(JDK_OUTPUTDIR)/gensrc/java/nio GENSRC_BUFFER_SRC := $(JDK_TOPDIR)/src/share/classes/java/nio ### -$(GENSRC_BUFFER_DST)/_the.dir : +$(GENSRC_BUFFER_DST)/_the.buffer.dir : $(ECHO) "Generating buffer classes" $(MKDIR) -p $(@D) $(TOUCH) $@ @@ -198,7 +198,9 @@ define SetupGenBuffer $(if $(12),$1_$(strip $(12))) $(if $(13),$1_$(strip $(13))) $(if $(14),$1_$(strip $(14))) - $(if $(15),$(error Internal makefile error: Too many arguments to SetupGenBuffer, please update GensrcBuffer.gmk)) + $(foreach i,3 4 5 6 7 8 9 10 11 12 13 14 15,$(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupGenBuffer($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(16),$(error Internal makefile error: Too many arguments to SetupGenBuffer, please update GensrcBuffer.gmk)) $(call fixRw,$1,$$($1_RW)) $(call typesAndBits,$1,$$($1_type),$$($1_BO)) @@ -225,7 +227,7 @@ define SetupGenBuffer $(call genBinOps,$1_double,double,$$($1_BO),$$($1_RW),eight,seven) endif -$$($1_DST) : $$($1_DEP) $(GENSRC_BUFFER_DST)/_the.dir +$$($1_DST) : $$($1_DEP) $(GENSRC_BUFFER_DST)/_the.buffer.dir $(TOOL_SPP) < $$($1_SRC) > $$($1_OUT).tmp \ -K$$($1_type) \ -K$$($1_category) \ diff --git a/jdk/makefiles/GensrcCLDR.gmk b/jdk/makefiles/GensrcCLDR.gmk index 1cd3749ef6d..a86c12273da 100644 --- a/jdk/makefiles/GensrcCLDR.gmk +++ b/jdk/makefiles/GensrcCLDR.gmk @@ -26,7 +26,7 @@ CLDRVERSION := 21.0.1 CLDRSRCDIR := $(JDK_TOPDIR)/src/share/classes/sun/util/cldr/resources/$(subst .,_,$(CLDRVERSION)) -GENSRC_DIR := $(JDK_OUTPUTDIR)/gensrc_cldr +GENSRC_DIR := $(JDK_OUTPUTDIR)/gensrc CLDR_METAINFO_FILE := $(GENSRC_DIR)/sun/util/cldr/CLDRLocaleDataMetaInfo.java diff --git a/jdk/makefiles/GensrcCharacterData.gmk b/jdk/makefiles/GensrcCharacterData.gmk index 630b547e2b1..e720ab860ed 100644 --- a/jdk/makefiles/GensrcCharacterData.gmk +++ b/jdk/makefiles/GensrcCharacterData.gmk @@ -24,7 +24,7 @@ # # -# Rules to create $(JDK_OUTPUTDIR)/gensrc_characterdata/sun/lang/CharacterData*.java +# Rules to create $(JDK_OUTPUTDIR)/gensrc/sun/lang/CharacterData*.java # GENSRC_CHARACTERDATA:= @@ -33,18 +33,18 @@ CHARACTERDATA = $(JDK_TOPDIR)/make/tools/GenerateCharacter UNICODEDATA = $(JDK_TOPDIR)/make/tools/UnicodeData define SetupCharacterData - $(JDK_OUTPUTDIR)/gensrc_characterdata/java/lang/$1.java : $(CHARACTERDATA)/$1.java.template $(BUILD_TOOLS) + $(JDK_OUTPUTDIR)/gensrc/java/lang/$1.java : $(CHARACTERDATA)/$1.java.template $(BUILD_TOOLS) $(MKDIR) -p $$(@D) - $(ECHO) Generating $1.java + $(ECHO) $(LOG_INFO) Generating $1.java $(TOOL_GENERATECHARACTER) $2 \ -template $(CHARACTERDATA)/$1.java.template \ -spec $(UNICODEDATA)/UnicodeData.txt \ -specialcasing $(UNICODEDATA)/SpecialCasing.txt \ -proplist $(UNICODEDATA)/PropList.txt \ - -o $(JDK_OUTPUTDIR)/gensrc_characterdata/java/lang/$1.java -string \ + -o $(JDK_OUTPUTDIR)/gensrc/java/lang/$1.java -string \ -usecharforbyte $3 - GENSRC_CHARACTERDATA += $(JDK_OUTPUTDIR)/gensrc_characterdata/java/lang/$1.java + GENSRC_CHARACTERDATA += $(JDK_OUTPUTDIR)/gensrc/java/lang/$1.java endef $(eval $(call SetupCharacterData,CharacterDataLatin1,,-latin1 8)) @@ -54,12 +54,12 @@ $(eval $(call SetupCharacterData,CharacterData02,-plane 2,11 4 1)) $(eval $(call SetupCharacterData,CharacterData0E,-plane 14,11 4 1)) # Copy two Java files that need no preprocessing. -$(JDK_OUTPUTDIR)/gensrc_characterdata/java/lang/%.java : $(CHARACTERDATA)/%.java.template +$(JDK_OUTPUTDIR)/gensrc/java/lang/%.java : $(CHARACTERDATA)/%.java.template $(MKDIR) -p $(@D) - $(ECHO) Generating $(@F) + $(ECHO) $(LOG_INFO) Generating $(@F) $(CP) -f $< $@ -GENSRC_CHARACTERDATA += $(JDK_OUTPUTDIR)/gensrc_characterdata/java/lang/CharacterDataUndefined.java \ - $(JDK_OUTPUTDIR)/gensrc_characterdata/java/lang/CharacterDataPrivateUse.java +GENSRC_CHARACTERDATA += $(JDK_OUTPUTDIR)/gensrc/java/lang/CharacterDataUndefined.java \ + $(JDK_OUTPUTDIR)/gensrc/java/lang/CharacterDataPrivateUse.java $(GENSRC_CHARACTERDATA) : $(BUILD_TOOLS) diff --git a/jdk/makefiles/GensrcCharsetCoder.gmk b/jdk/makefiles/GensrcCharsetCoder.gmk index 74c1a1e4dd5..1ae71492ea6 100644 --- a/jdk/makefiles/GensrcCharsetCoder.gmk +++ b/jdk/makefiles/GensrcCharsetCoder.gmk @@ -25,8 +25,8 @@ GENSRC_CHARSETCODER := -GENSRC_CHARSETCODER_TMP := $(JDK_OUTPUTDIR)/gensrc_charsetcoder -GENSRC_CHARSETCODER_DST := $(JDK_OUTPUTDIR)/gensrc_charsetcoder/java/nio/charset +GENSRC_CHARSETCODER_TMP := $(JDK_OUTPUTDIR)/gensrc +GENSRC_CHARSETCODER_DST := $(JDK_OUTPUTDIR)/gensrc/java/nio/charset GENSRC_CHARSETCODER_SRC := $(JDK_TOPDIR)/src/share/classes/java/nio diff --git a/jdk/makefiles/GensrcCharsetMapping.gmk b/jdk/makefiles/GensrcCharsetMapping.gmk index 6ff21ad624e..5d320927ed8 100644 --- a/jdk/makefiles/GensrcCharsetMapping.gmk +++ b/jdk/makefiles/GensrcCharsetMapping.gmk @@ -25,8 +25,8 @@ GENSRC_CHARSETMAPPING:= -GENSRC_TMP := $(JDK_OUTPUTDIR)/gensrc_charsetmapping -GENSRC_DST := $(JDK_OUTPUTDIR)/gensrc_charsetmapping/sun/nio/cs +GENSRC_TMP := $(JDK_OUTPUTDIR)/gensrc +GENSRC_DST := $(JDK_OUTPUTDIR)/gensrc/sun/nio/cs GENSRC_SRC := $(JDK_TOPDIR)/make/tools/CharsetMapping GENSRC_JAVA_SRC := $(JDK_TOPDIR)/make/tools/src/build/tools/charsetmapping @@ -35,17 +35,17 @@ GENSRC_TEMPLATES := $(GENSRC_SRC)/SingleByte-X.java.template $(GENSRC_SRC)/Doubl ### -$(GENSRC_TMP)/_the.dir : +$(GENSRC_TMP)/_the.charsetmapping.dir : $(ECHO) Generating charsetmapping classes $(MKDIR) -p $(GENSRC_DST)/ext $(TOUCH) $@ ### -GENSRC_SB := $(GENSRC_TMP)/gensrc_the.charsetmapping.sbcs +GENSRC_SB := $(GENSRC_TMP)/_the.charsetmapping.sbcs -$(GENSRC_SB) : $(GENSRC_SRC)/sbcs $(GENSRC_TEMPLATES) $(GENSRC_TMP)/_the.dir - $(TOOL_CHARSETMAPPING) $(GENSRC_SRC) $(GENSRC_DST) sbcs +$(GENSRC_SB) : $(GENSRC_SRC)/sbcs $(GENSRC_TEMPLATES) $(GENSRC_TMP)/_the.charsetmapping.dir + $(TOOL_CHARSETMAPPING) $(LOG_INFO) $(GENSRC_SRC) $(GENSRC_DST) sbcs $(TOUCH) $@ GENSRC_CHARSETMAPPING += $(GENSRC_SB) @@ -53,28 +53,28 @@ GENSRC_CHARSETMAPPING += $(GENSRC_SB) ### $(GENSRC_DST)/ext/sjis0213.dat : $(GENSRC_SRC)/sjis0213.map $(GENSRC_SB) - $(TOOL_CHARSETMAPPING) $< $@ sjis0213 + $(TOOL_CHARSETMAPPING) $(LOG_INFO) $< $@ sjis0213 GENSRC_CHARSETMAPPING += $(GENSRC_DST)/ext/sjis0213.dat ### $(GENSRC_DST)/ext/EUC_TWMapping.java : $(GENSRC_JAVA_SRC)/EUC_TW.java $(GENSRC_SB) - $(TOOL_CHARSETMAPPING) $(GENSRC_SRC) $(GENSRC_DST)/ext euctw $(GENSRC_JAVA_SRC)/EUC_TW.java + $(TOOL_CHARSETMAPPING) $(LOG_INFO) $(GENSRC_SRC) $(GENSRC_DST)/ext euctw $(GENSRC_JAVA_SRC)/EUC_TW.java GENSRC_CHARSETMAPPING += $(GENSRC_DST)/ext/EUC_TWMapping.java ### $(GENSRC_DST)/ext/HKSCSMapping.java : $(GENSRC_JAVA_SRC)/HKSCS.java $(GENSRC_SB) - $(TOOL_CHARSETMAPPING) $(GENSRC_SRC) $(GENSRC_DST)/ext hkscs $(GENSRC_JAVA_SRC)/HKSCS.java + $(TOOL_CHARSETMAPPING) $(LOG_INFO) $(GENSRC_SRC) $(GENSRC_DST)/ext hkscs $(GENSRC_JAVA_SRC)/HKSCS.java GENSRC_CHARSETMAPPING += $(GENSRC_DST)/ext/HKSCSMapping.java ### $(GENSRC_TMP)/gensrc_the.charsetmapping.extsbcs : $(GENSRC_SRC)/extsbcs $(GENSRC_TEMPLATES) $(GENSRC_SB) - $(TOOL_CHARSETMAPPING) $(GENSRC_SRC) $(GENSRC_DST)/ext extsbcs + $(TOOL_CHARSETMAPPING) $(GENSRC_SRC) $(LOG_INFO) $(GENSRC_DST)/ext extsbcs $(TOUCH) $@ GENSRC_CHARSETMAPPING += $(GENSRC_TMP)/gensrc_the.charsetmapping.extsbcs @@ -82,7 +82,7 @@ GENSRC_CHARSETMAPPING += $(GENSRC_TMP)/gensrc_the.charsetmapping.extsbcs ### $(GENSRC_TMP)/gensrc_the.charsetmapping.dbcs : $(GENSRC_SRC)/dbcs $(GENSRC_TEMPLATES) $(GENSRC_SB) - $(TOOL_CHARSETMAPPING) $(GENSRC_SRC) $(GENSRC_DST)/ext dbcs + $(TOOL_CHARSETMAPPING) $(GENSRC_SRC) $(LOG_INFO) $(GENSRC_DST)/ext dbcs $(TOUCH) $@ GENSRC_CHARSETMAPPING += $(GENSRC_TMP)/gensrc_the.charsetmapping.dbcs @@ -93,12 +93,12 @@ GENSRC_CHARSET_PROVIDER_CMD := $(JDK_TOPDIR)/makefiles/scripts/genCharsetProvide $(GENSRC_DST)/StandardCharsets.java : $(JDK_TOPDIR)/src/share/classes/sun/nio/cs/standard-charsets \ $(GENSRC_CHARSET_PROVIDER_CMD) \ - $(GENSRC_TMP)/_the.dir + $(GENSRC_TMP)/_the.charsetmapping.dir NAWK="$(NAWK)" TEMPDIR="$(GENSRC_TMP)" SH="$(SH)" \ HASHER="$(TOOL_HASHER)" \ SCRIPTS="$(JDK_TOPDIR)/makefiles/scripts" \ - $(SH) -e $(GENSRC_CHARSET_PROVIDER_CMD) $< $(@D) + $(SH) -e $(GENSRC_CHARSET_PROVIDER_CMD) $(LOG_INFO) $< $(@D) GENSRC_CHARSETMAPPING += $(GENSRC_DST)/StandardCharsets.java diff --git a/jdk/makefiles/GensrcExceptions.gmk b/jdk/makefiles/GensrcExceptions.gmk index 1a1f71769da..a1cd39396c7 100644 --- a/jdk/makefiles/GensrcExceptions.gmk +++ b/jdk/makefiles/GensrcExceptions.gmk @@ -25,8 +25,8 @@ GENSRC_EXCEPTIONS := -GENSRC_EXCEPTIONS_TMP := $(JDK_OUTPUTDIR)/gensrc_exceptions -GENSRC_EXCEPTIONS_DST := $(JDK_OUTPUTDIR)/gensrc_exceptions/java/nio +GENSRC_EXCEPTIONS_TMP := $(JDK_OUTPUTDIR)/gensrc +GENSRC_EXCEPTIONS_DST := $(JDK_OUTPUTDIR)/gensrc/java/nio GENSRC_EXCEPTIONS_SRC := $(JDK_TOPDIR)/src/share/classes/java/nio GENSRC_EXCEPTIONS_CMD := $(JDK_TOPDIR)/makefiles/scripts/genExceptions.sh @@ -35,7 +35,7 @@ GENSRC_EXCEPTIONS_SRC_DIRS := . charset channels ### -$(GENSRC_EXCEPTIONS_DST)/_the.dir : +$(GENSRC_EXCEPTIONS_DST)/_the.exceptions.dir : $(ECHO) "Generating exceptions classes" $(MKDIR) -p $(@D) $(TOUCH) $@ @@ -45,9 +45,9 @@ $(GENSRC_EXCEPTIONS_DST)/_the.dir : $(GENSRC_EXCEPTIONS_DST)/_the.% : $(GENSRC_EXCEPTIONS_SRC)/%/exceptions \ $(GENSRC_EXCEPTIONS_CMD) \ - $(GENSRC_EXCEPTIONS_DST)/_the.dir + $(GENSRC_EXCEPTIONS_DST)/_the.exceptions.dir $(MKDIR) -p $(@D)/$* - SCRIPTS="$(JDK_TOPDIR)/makefiles/scripts" NAWK="$(NAWK)" SH="$(SH)" $(SH) $(GENSRC_EXCEPTIONS_CMD) $< $(@D)/$* + SCRIPTS="$(JDK_TOPDIR)/makefiles/scripts" NAWK="$(NAWK)" SH="$(SH)" $(SH) $(GENSRC_EXCEPTIONS_CMD) $< $(@D)/$* $(LOG_INFO) $(TOUCH) $@ GENSRC_EXCEPTIONS += $(foreach D,$(GENSRC_EXCEPTIONS_SRC_DIRS),$(GENSRC_EXCEPTIONS_DST)/_the.$(D)) diff --git a/jdk/makefiles/GensrcIcons.gmk b/jdk/makefiles/GensrcIcons.gmk index 52cb418d275..a6a8a016758 100644 --- a/jdk/makefiles/GensrcIcons.gmk +++ b/jdk/makefiles/GensrcIcons.gmk @@ -23,84 +23,105 @@ # questions. # -GENSRC_ICONS := -GENSRC_ICONS_SRC := -GENSRC_ICONS_TMP := $(JDK_OUTPUTDIR)/gensrc_icons -GENSRC_ICONS_DST := $(GENSRC_ICONS_TMP)/sun/awt/X11 +GENSRC_X11_ICONS := +GENSRC_X11_ICONS_SRC := +GENSRC_X11_ICONS_TMP := $(JDK_OUTPUTDIR)/gensrc +GENSRC_X11_ICONS_DST := $(GENSRC_X11_ICONS_TMP)/sun/awt/X11 ifdef OPENJDK - ICONS_PATH_PREFIX := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR) + X11_ICONS_PATH_PREFIX := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR) else - ICONS_PATH_PREFIX := $(JDK_TOPDIR)/src/closed/solaris + X11_ICONS_PATH_PREFIX := $(JDK_TOPDIR)/src/closed/solaris endif -GENSRC_ICONS_SRC += \ - $(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon16.png \ - $(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon24.png \ - $(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon32.png \ - $(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon48.png +GENSRC_X11_ICONS_SRC += \ + $(X11_ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon16.png \ + $(X11_ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon24.png \ + $(X11_ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon32.png \ + $(X11_ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon48.png -ICONPATH := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes/sun/awt/X11 +X11_ICONPATH := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes/sun/awt/X11 -GENSRC_ICONS_SRC += \ - $(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 +GENSRC_X11_ICONS_SRC += \ + $(X11_ICONPATH)/security-icon-bw16.png \ + $(X11_ICONPATH)/security-icon-interim16.png \ + $(X11_ICONPATH)/security-icon-yellow16.png \ + $(X11_ICONPATH)/security-icon-bw24.png \ + $(X11_ICONPATH)/security-icon-interim24.png \ + $(X11_ICONPATH)/security-icon-yellow24.png \ + $(X11_ICONPATH)/security-icon-bw32.png \ + $(X11_ICONPATH)/security-icon-interim32.png \ + $(X11_ICONPATH)/security-icon-yellow32.png \ + $(X11_ICONPATH)/security-icon-bw48.png \ + $(X11_ICONPATH)/security-icon-interim48.png \ + $(X11_ICONPATH)/security-icon-yellow48.png -GENSRC_ICONS_FILES := $(notdir $(GENSRC_ICONS_SRC)) +GENSRC_X11_ICONS_FILES := $(notdir $(GENSRC_X11_ICONS_SRC)) -GENSRC_ICONS_SHORT_NAME = $(subst .,_,$(subst -,_,$(1))) -GENSRC_ICONS_DST_NAME = XAWTIcon$(2)_$(subst .,_,$(subst -,_,$(1))) +GENSRC_X11_ICONS_SHORT_NAME = $(subst .,_,$(subst -,_,$(1))) +GENSRC_X11_ICONS_DST_NAME = XAWTIcon$(2)_$(subst .,_,$(subst -,_,$(1))) ### -$(GENSRC_ICONS_TMP)/_the.dir : +$(GENSRC_X11_ICONS_TMP)/_the.icons.dir : $(ECHO) Generating icon classes - $(MKDIR) -p $(GENSRC_ICONS_DST) + $(MKDIR) -p $(GENSRC_X11_ICONS_DST) $(TOUCH) $@ ### -define SetupGensrcIcon +define SetupGensrcX11Icon # param 1 is for src-file # param 2 is for src-dir - $1_SHORTNAME := $(call GENSRC_ICONS_SHORT_NAME,$1) - $1_NAME32 := $(call GENSRC_ICONS_DST_NAME,$1,32) - $1_TARGET32 := $(GENSRC_ICONS_DST)/$$($1_NAME32).java - $1_NAME64 := $(call GENSRC_ICONS_DST_NAME,$1,64) - $1_TARGET64 := $(GENSRC_ICONS_DST)/$$($1_NAME64).java + $1_SHORTNAME := $(call GENSRC_X11_ICONS_SHORT_NAME,$1) + $1_NAME32 := $(call GENSRC_X11_ICONS_DST_NAME,$1,32) + $1_TARGET32 := $(GENSRC_X11_ICONS_DST)/$$($1_NAME32).java + $1_NAME64 := $(call GENSRC_X11_ICONS_DST_NAME,$1,64) + $1_TARGET64 := $(GENSRC_X11_ICONS_DST)/$$($1_NAME64).java -$$($1_TARGET32) : $2/$1 $(GENSRC_ICONS_TMP)/_the.dir +$$($1_TARGET32) : $2/$1 $(GENSRC_X11_ICONS_TMP)/_the.icons.dir $(RM) $$@ $$@.tmp $(ECHO) "package sun.awt.X11;" > $$@.tmp $(ECHO) "public class $$($1_NAME32) {" >> $$@.tmp $(ECHO) "public static int[] $$($1_SHORTNAME) = { " >> $$@.tmp - $(CAT) $$< | $(TOOL_TOBIN) >> $$@.tmp + $(CAT) $$< | $(TOOL_X11_TOBIN) >> $$@.tmp $(ECHO) "}; }" >> $$@.tmp $(MV) $$@.tmp $$@ -GENSRC_ICONS += $$($1_TARGET32) +GENSRC_X11_ICONS += $$($1_TARGET32) -$$($1_TARGET64) : $2/$1 $(GENSRC_ICONS_TMP)/_the.dir +$$($1_TARGET64) : $2/$1 $(GENSRC_X11_ICONS_TMP)/_the.icons.dir $(RM) $$@ $$@.tmp $(ECHO) "package sun.awt.X11;" > $$@.tmp $(ECHO) "public class $$($1_NAME64) {" >> $$@.tmp $(ECHO) "public static long[] $$($1_SHORTNAME) = { " >> $$@.tmp - $(CAT) $$< | $(TOOL_TOBIN) >> $$@.tmp + $(CAT) $$< | $(TOOL_X11_TOBIN) >> $$@.tmp $(ECHO) "}; }" >> $$@.tmp $(MV) $$@.tmp $$@ -GENSRC_ICONS += $$($1_TARGET64) +GENSRC_X11_ICONS += $$($1_TARGET64) endef -$(foreach I,$(GENSRC_ICONS_SRC), $(eval $(call SetupGensrcIcon,$(notdir $(I)),$(dir $(I))))) +$(foreach I,$(GENSRC_X11_ICONS_SRC), $(eval $(call SetupGensrcX11Icon,$(notdir $(I)),$(dir $(I))))) + +### + +ifeq ($(OPENJDK_TARGET_OS),macosx) + + GENSRC_OSX_ICONS = $(GENSRC_OSX_ICONS_DST)/AWTIconData.h + GENSRC_OSX_ICONS_SRC = + GENSRC_OSX_ICONS_TMP = $(JDK_OUTPUTDIR)/gensrc + GENSRC_OSX_ICONS_DST = $(GENSRC_OSX_ICONS_TMP)/sun/osxapp + +$(GENSRC_OSX_ICONS_DST)/AWTIconData.h: \ + $(JDK_TOPDIR)/src/macosx/native/sun/osxapp/resource/icons/JavaApp.icns + $(RM) $@ $@.tmp + $(MKDIR) -p $(dir $@) + $(ECHO) "static unsigned char sAWTIconData[] = { " >> $@.tmp + $(CAT) $< | $(TOOL_OSX_TOBIN) >> $@.tmp + $(ECHO) "};" >> $@.tmp + $(MV) $@.tmp $@ + +endif + diff --git a/jdk/makefiles/GensrcJDWP.gmk b/jdk/makefiles/GensrcJDWP.gmk index 42e9181e3ee..e2103532285 100644 --- a/jdk/makefiles/GensrcJDWP.gmk +++ b/jdk/makefiles/GensrcJDWP.gmk @@ -28,20 +28,19 @@ $(JDK_OUTPUTDIR)/gensrc_jdwp_headers/JDWPCommands.h : $(JDK_TOPDIR)/makefiles/jpda/jdwp/jdwp.spec -$(JDK_OUTPUTDIR)/gensrc_jdwp/com/sun/tools/jdi/JDWP.java : $(JDK_TOPDIR)/makefiles/jpda/jdwp/jdwp.spec +$(JDK_OUTPUTDIR)/gensrc/com/sun/tools/jdi/JDWP.java : $(JDK_TOPDIR)/makefiles/jpda/jdwp/jdwp.spec $(MKDIR) -p $(@D) $(MKDIR) -p $(JDK_OUTPUTDIR)/gensrc_jdwp_headers $(RM) $@ $(JDK_OUTPUTDIR)/gensrc_jdwp_headers/JDWPCommands.h - $(ECHO) Creating JDWP.java and JDWPCommands.h from jdwp.spec + $(ECHO) $(LOG_INFO) Creating JDWP.java and JDWPCommands.h from jdwp.spec $(TOOL_JDWPGEN) $< -jdi $@ -include $(JDK_OUTPUTDIR)/gensrc_jdwp_headers/JDWPCommands.h $(JDK_OUTPUTDIR)/gensrc_jdwp_doc/jdwp-protocol.html : $(JDK_TOPDIR)/makefiles/jpda/jdwp/jdwp.spec $(MKDIR) -p $(@D) $(RM) $@ - $(ECHO) Creating $(@F) from jdwp.spec + $(ECHO) $(LOG_INFO) Creating $(@F) from jdwp.spec $(TOOL_JDWPGEN) $< -doc $@ -GENSRC_JDWP:= $(JDK_OUTPUTDIR)/gensrc_jdwp/com/sun/tools/jdi/JDWP.java \ +GENSRC_JDWP:= $(JDK_OUTPUTDIR)/gensrc/com/sun/tools/jdi/JDWP.java \ $(JDK_OUTPUTDIR)/gensrc_jdwp_headers/JDWPCommands.h \ $(JDK_OUTPUTDIR)/gensrc_jdwp_doc/jdwp-protocol.html - diff --git a/jdk/makefiles/GensrcJObjC.gmk b/jdk/makefiles/GensrcJObjC.gmk index 84aebe15a67..e3c3d7a1fee 100644 --- a/jdk/makefiles/GensrcJObjC.gmk +++ b/jdk/makefiles/GensrcJObjC.gmk @@ -64,7 +64,7 @@ $(MKDIR) -p $(@D) if [ -f $(FRAMEWORKS_DIR)/$1.framework/Resources/BridgeSupport/$(@F) ]; then \ $(CP) $(FRAMEWORKS_DIR)/$1.framework/Resources/BridgeSupport/$(@F) $@.tmp ;\ else \ - $(GBM) -F complete --framework $1 -o $@.tmp ; \ + $(GBM) $(LOG_INFO) -F complete --framework $1 -o $@.tmp ; \ fi $(MV) $@.tmp $@ endef @@ -88,8 +88,9 @@ $(JOBJC_TMP)/bridge/AppKitFull.bridgesupport : \ # classpath that ends with "JObjC.jar", and emit the new bootclasspath. # $(JOBJC_TMP)/_the.generator_bootclasspath : $(BUILD_JOBJC_PRIMITIVE_CODER) + $(ECHO) Generating jobjc framework bridge $(RM) $@ - $(JAVA) -cp $(JOBJC_TMP)/bin com.apple.internal.jobjc.generator.BootClassPathMinus JObjC.jar > $@.tmp + $(JAVA) $(LOG_INFO) -cp $(JOBJC_TMP)/bin com.apple.internal.jobjc.generator.BootClassPathMinus JObjC.jar > $@.tmp $(MV) $@.tmp $@ # @@ -101,8 +102,14 @@ $(JOBJC_TMP)/_the.generator_bootclasspath : $(BUILD_JOBJC_PRIMITIVE_CODER) # $(JOBJC_TMP)/_the.generator : $(JOBJC_TMP)/_the.generator_bootclasspath | $(BRIDGESUPPORT) $(RM) $@ - $(JAVA) -d64 -Xbootclasspath:`$(CAT) $(JOBJC_TMP)/_the.generator_bootclasspath` -cp $(JOBJC_TMP)/bin -ea com.apple.internal.jobjc.generator.Generator dst=$(JOBJC_DST) frameworks=$(JOBJC_TMP)/bridge + $(JAVA) $(LOG_INFO) -d64 -Xbootclasspath:`$(CAT) $(JOBJC_TMP)/_the.generator_bootclasspath` -cp $(JOBJC_TMP)/bin -ea com.apple.internal.jobjc.generator.Generator dst=$(JOBJC_DST) frameworks=$(JOBJC_TMP)/bridge $(TOUCH) $@ -GENSRC_JOBJC += $(JOBJC_TMP)/_the.generator +# The generator delets all files in the target dir so it has to work in its +# own dir and have the files copied over to gensrc aftewards. +$(JDK_OUTPUTDIR)/gensrc/_the.jobjc.files : $(JOBJC_TMP)/_the.generator + $(MKDIR) -p $(@D) + $(CP) -rp $(JOBJC_DST)/* $(@D) + $(TOUCH) $@ +GENSRC_JOBJC += $(JDK_OUTPUTDIR)/gensrc/_the.jobjc.files diff --git a/jdk/makefiles/GensrcLocaleDataMetaInfo.gmk b/jdk/makefiles/GensrcLocaleDataMetaInfo.gmk index 811d9d4cb79..5f88ec04d24 100644 --- a/jdk/makefiles/GensrcLocaleDataMetaInfo.gmk +++ b/jdk/makefiles/GensrcLocaleDataMetaInfo.gmk @@ -40,14 +40,14 @@ LOCALE_FILES:=$(shell $(FIND) $(JDK_TOPDIR)/src/share/classes \ LOCALE_RESOURCES:=$(sort $(subst .properties,,$(subst .java,,$(notdir $(LOCALE_FILES))))) # Include the list of resources found during the previous compile. --include $(JDK_OUTPUTDIR)/gensrc_localedatametainfo/_the.locale_resources +-include $(JDK_OUTPUTDIR)/gensrc/_the.locale_resources MISSING_RESOURCES:=$(filter-out $(LOCALE_RESOURCES),$(PREV_LOCALE_RESOURCES)) NEW_RESOURCES:=$(filter-out $(PREV_LOCALE_RESOURCES),$(LOCALE_RESOURCES)) ifneq (,$(MISSING_RESOURCES)$(NEW_RESOURCES)) # There is a difference in the number of supported resources. Trigger a regeneration. - $(shell $(RM) $(JDK_OUTPUTDIR)/gensrc_localedatametainfo/sun/util/locale/provider/LocaleDataMetaInfo.java) + $(shell $(RM) $(JDK_OUTPUTDIR)/gensrc/sun/util/locale/provider/LocaleDataMetaInfo.java) endif # The non-euro zone locales have to be separated from the euro-zone locales. @@ -93,18 +93,18 @@ $(eval $(call CaptureLocale,CalendarData)) SED_ARGS+= -e 's/$(HASH)AvailableLocales_EuroLocales$(HASH)/$(sort $(ALL_EURO_LOCALES))/g' SED_ARGS+= -e 's/$(HASH)AvailableLocales_NonEuroLocales$(HASH)/$(sort $(ALL_NON_EURO_LOCALES))/g' -$(JDK_OUTPUTDIR)/gensrc_localedatametainfo/sun/util/locale/provider/LocaleDataMetaInfo.java: \ +$(JDK_OUTPUTDIR)/gensrc/sun/util/locale/provider/LocaleDataMetaInfo.java: \ $(JDK_TOPDIR)/src/share/classes/sun/util/locale/provider/LocaleDataMetaInfo-XLocales.java.template $(MKDIR) -p $(@D) $(ECHO) Creating sun/util/LocaleDataMetaInfo.java from $(words $(LOCALE_RESOURCES)) found resources. - $(PRINTF) "PREV_LOCALE_RESOURCES:=$(LOCALE_RESOURCES)" > $(JDK_OUTPUTDIR)/gensrc_localedatametainfo/_the.locale_resources + $(PRINTF) "PREV_LOCALE_RESOURCES:=$(LOCALE_RESOURCES)" > $(JDK_OUTPUTDIR)/gensrc/_the.locale_resources $(SED) $(SED_ARGS) $< > $@ -GENSRC_LOCALEDATAMETAINFO:=$(JDK_OUTPUTDIR)/gensrc_localedatametainfo/sun/util/locale/provider/LocaleDataMetaInfo.java +GENSRC_LOCALEDATAMETAINFO:=$(JDK_OUTPUTDIR)/gensrc/sun/util/locale/provider/LocaleDataMetaInfo.java ### -GENSRC_CRBC_DST := $(JDK_OUTPUTDIR)/gensrc_localedatametainfo/sun/util/CoreResourceBundleControl.java +GENSRC_CRBC_DST := $(JDK_OUTPUTDIR)/gensrc/sun/util/CoreResourceBundleControl.java GENSRC_CRBC_CMD := $(JDK_TOPDIR)/makefiles/scripts/localelist.sh JRE_NONEXIST_LOCALES := en en_US de_DE es_ES fr_FR it_IT ja_JP ko_KR sv_SE zh diff --git a/jdk/makefiles/GensrcMisc.gmk b/jdk/makefiles/GensrcMisc.gmk index f3734621716..55f86369f32 100644 --- a/jdk/makefiles/GensrcMisc.gmk +++ b/jdk/makefiles/GensrcMisc.gmk @@ -28,11 +28,11 @@ # string and the runtime name into the Version.java file. # To be printed by java -version -$(JDK_OUTPUTDIR)/gensrc_misc/sun/misc/Version.java: \ +$(JDK_OUTPUTDIR)/gensrc/sun/misc/Version.java: \ $(JDK_TOPDIR)/src/share/classes/sun/misc/Version.java.template $(MKDIR) -p $(@D) $(RM) $@ $@.tmp - $(ECHO) Generating sun/misc/Version.java + $(ECHO) $(LOG_INFO) Generating sun/misc/Version.java $(SED) -e 's/@@launcher_name@@/$(LAUNCHER_NAME)/g' \ -e 's/@@java_version@@/$(RELEASE)/g' \ -e 's/@@java_runtime_version@@/$(FULL_VERSION)/g' \ @@ -40,20 +40,20 @@ $(JDK_OUTPUTDIR)/gensrc_misc/sun/misc/Version.java: \ $< > $@.tmp $(MV) $@.tmp $@ -GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc_misc/sun/misc/Version.java +GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/misc/Version.java ########################################################################################## # Version file for jconsole -$(JDK_OUTPUTDIR)/gensrc_misc/sun/tools/jconsole/Version.java: \ +$(JDK_OUTPUTDIR)/gensrc/sun/tools/jconsole/Version.java: \ $(JDK_TOPDIR)/src/share/classes/sun/tools/jconsole/Version.java.template $(MKDIR) -p $(@D) $(RM) $@ $@.tmp - $(ECHO) Generating sun/tools/jconsole/Version.java + $(ECHO) $(LOG_INFO) Generating sun/tools/jconsole/Version.java $(SED) -e 's/@@jconsole_version@@/$(FULL_VERSION)/g' $< > $@.tmp $(MV) $@.tmp $@ -GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc_misc/sun/tools/jconsole/Version.java +GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/tools/jconsole/Version.java ########################################################################################## @@ -65,14 +65,14 @@ ifeq ($(OPENJDK_TARGET_OS_API),posix) # UNIXProcess.java is different for solaris and linux. We need to copy # the correct UNIXProcess.java over to $(JDK_OUTPUTDIR)/gensrc/java/lang/. - $(JDK_OUTPUTDIR)/gensrc_misc/java/lang/UNIXProcess.java : \ + $(JDK_OUTPUTDIR)/gensrc/java/lang/UNIXProcess.java : \ $(JDK_TOPDIR)/src/solaris/classes/java/lang/UNIXProcess.java.$(UPSUFFIX) $(MKDIR) -p $(@D) - $(ECHO) Copying UNIXProcess.java.$(OPENJDK_TARGET_OS) to java/lang/UNIXProcess.java + $(ECHO) $(LOG_INFO) Copying UNIXProcess.java.$(OPENJDK_TARGET_OS) to java/lang/UNIXProcess.java $(CP) $< $@ $(CHMOD) u+rw $@ - GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc_misc/java/lang/UNIXProcess.java + GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/java/lang/UNIXProcess.java endif ########################################################################################## @@ -85,16 +85,14 @@ ifneq ($(OPENJDK_TARGET_OS), macosx) $(JDK_OUTPUTDIR)/gensrc_c/libjdbcodbc/dummyodbc1.c : $(MKDIR) -p $(@D) $(RM) $@ - $(ECHO) Creating $@ + $(ECHO) $(LOG_INFO) Creating $@ $(PRINTF) "void dummyOdbc(void){}\n" > $@ - $(ECHO) Created $@ $(JDK_OUTPUTDIR)/gensrc_c/libjdbcodbc/dummyodbc2.c : $(MKDIR) -p $(@D) $(RM) $@ - $(ECHO) Creating $@ + $(ECHO) $(LOG_INFO) Creating $@ $(PRINTF) "void dummyOdbc(void){}\n" > $@ - $(ECHO) Created $@ GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc_c/libjdbcodbc/dummyodbc1.c $(JDK_OUTPUTDIR)/gensrc_c/libjdbcodbc/dummyodbc2.c endif @@ -103,11 +101,11 @@ endif ########################################################################################## -GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc_misc/sun/nio/ch/SocketOptionRegistry.java +GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/nio/ch/SocketOptionRegistry.java GENSRC_SOR_SRC := $(JDK_TOPDIR)/src/share/native/sun/nio/ch GENSRC_SOR_SRC_FILE := genSocketOptionRegistry.c -GENSRC_SOR_BIN := $(JDK_OUTPUTDIR)/gensrc_misc/genSocketOptionRegistry +GENSRC_SOR_BIN := $(JDK_OUTPUTDIR)/gensrc/genSocketOptionRegistry SOR_COPYRIGHT_YEARS = $(shell $(CAT) $(GENSRC_SOR_SRC)/$(GENSRC_SOR_SRC_FILE) | \ $(NAWK) '/^.*Copyright.*Oracle/ { printf "%s %s",$$4,$$5 }') @@ -126,15 +124,15 @@ ifneq ($(wildcard $(JDK_TOPDIR)/src/closed/solaris/classes/sun/nio/ch/SocketOpti HAS_SOCKET_OPTION_REGISTRY:=true endif -ifneq ($(HAS_SOCKET_OTION_REGISTRY),true) -$(JDK_OUTPUTDIR)/gensrc_misc/sun/nio/ch/SocketOptionRegistry.java : $(BUILD_GENSRC_SOR_EXE) +ifneq ($(HAS_SOCKET_OPTION_REGISTRY),true) +$(JDK_OUTPUTDIR)/gensrc/sun/nio/ch/SocketOptionRegistry.java : $(BUILD_GENSRC_SOR_EXE) $(MKDIR) -p $(@D) $(RM) $@ $@.tmp NAWK="$(NAWK)" SH="$(SH)" $(SH) -e $(JDK_TOPDIR)/makefiles/scripts/addNotices.sh "$(SOR_COPYRIGHT_YEARS)" > $@.tmp $(BUILD_GENSRC_SOR_EXE) >> $@.tmp $(MV) $@.tmp $@ else -$(JDK_OUTPUTDIR)/gensrc_misc/sun/nio/ch/SocketOptionRegistry.java : $(JDK_TOPDIR)/src/closed/solaris/classes/sun/nio/ch/SocketOptionRegistry-$(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_ARCH).java +$(JDK_OUTPUTDIR)/gensrc/sun/nio/ch/SocketOptionRegistry.java : $(JDK_TOPDIR)/src/closed/solaris/classes/sun/nio/ch/SocketOptionRegistry-$(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_ARCH).java $(MKDIR) -p $(@D) $(RM) $@ $(CP) $< $@ @@ -144,11 +142,11 @@ endif ifneq ($(OPENJDK_TARGET_OS),windows) -GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc_misc/sun/nio/fs/UnixConstants.java +GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/nio/fs/UnixConstants.java GENSRC_UC_SRC := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/nio/fs GENSRC_UC_SRC_FILE := genUnixConstants.c -GENSRC_UC_BIN := $(JDK_OUTPUTDIR)/gensrc_misc/genUnixConstants +GENSRC_UC_BIN := $(JDK_OUTPUTDIR)/gensrc/genUnixConstants UC_COPYRIGHT_YEARS = $(shell $(CAT) $(GENSRC_UC_SRC)/$(GENSRC_UC_SRC_FILE) | \ $(NAWK) '/^.*Copyright.*Oracle/ { printf "%s %s",$$4,$$5 }') @@ -159,6 +157,7 @@ $(eval $(call SetupNativeCompilation,BUILD_GENSRC_UC_EXE,\ LANG:=C,\ CC:=$(BUILD_CC),\ LDEXE:=$(BUILD_CC),\ + CFLAGS:=$(filter -D%,$(CFLAGS_JDKEXE)),\ OBJECT_DIR:=$(GENSRC_UC_BIN),\ OUTPUT_DIR:=$(GENSRC_UC_BIN),\ PROGRAM:=genUnixConstants)) @@ -168,14 +167,14 @@ ifneq ($(wildcard $(JDK_TOPDIR)/src/closed/solaris/classes/sun/nio/fs/UnixConsta endif ifneq ($(HAS_UNIX_CONSTANTS),true) -$(JDK_OUTPUTDIR)/gensrc_misc/sun/nio/fs/UnixConstants.java : $(BUILD_GENSRC_UC_EXE) +$(JDK_OUTPUTDIR)/gensrc/sun/nio/fs/UnixConstants.java : $(BUILD_GENSRC_UC_EXE) $(MKDIR) -p $(@D) $(RM) $@ $@.tmp NAWK="$(NAWK)" SH="$(SH)" $(SH) -e $(JDK_TOPDIR)/makefiles/scripts/addNotices.sh "$(UC_COPYRIGHT_YEARS)" > $@.tmp $(BUILD_GENSRC_UC_EXE) >> $@.tmp $(MV) $@.tmp $@ else -$(JDK_OUTPUTDIR)/gensrc_misc/sun/nio/fs/UnixConstants.java : $(JDK_TOPDIR)/src/closed/solaris/classes/sun/nio/fs/UnixConstants-$(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_ARCH).java +$(JDK_OUTPUTDIR)/gensrc/sun/nio/fs/UnixConstants.java : $(JDK_TOPDIR)/src/closed/solaris/classes/sun/nio/fs/UnixConstants-$(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_ARCH).java $(MKDIR) -p $(@D) $(RM) $@ $(CP) $< $@ @@ -187,11 +186,11 @@ endif ifeq ($(OPENJDK_TARGET_OS),solaris) -GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc_misc/sun/nio/fs/SolarisConstants.java +GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/nio/fs/SolarisConstants.java GENSRC_SOL_SRC := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/nio/fs GENSRC_SOL_SRC_FILE := genSolarisConstants.c -GENSRC_SOL_BIN := $(JDK_OUTPUTDIR)/gensrc_misc/genSolarisConstants +GENSRC_SOL_BIN := $(JDK_OUTPUTDIR)/gensrc/genSolarisConstants SOL_COPYRIGHT_YEARS = $(shell $(CAT) $(GENSRC_SOL_SRC)/$(GENSRC_SOL_SRC_FILE) | \ $(NAWK) '/^.*Copyright.*Oracle/ { printf "%s %s",$$4,$$5 }') @@ -206,7 +205,7 @@ $(eval $(call SetupNativeCompilation,BUILD_GENSRC_SOL_EXE,\ OUTPUT_DIR:=$(GENSRC_SOL_BIN),\ PROGRAM:=genSolarisConstants)) -$(JDK_OUTPUTDIR)/gensrc_misc/sun/nio/fs/SolarisConstants.java : $(BUILD_GENSRC_SOL_EXE) +$(JDK_OUTPUTDIR)/gensrc/sun/nio/fs/SolarisConstants.java : $(BUILD_GENSRC_SOL_EXE) $(MKDIR) -p $(@D) $(RM) $@ $@.tmp NAWK="$(NAWK)" SH="$(SH)" $(SH) -e $(JDK_TOPDIR)/makefiles/scripts/addNotices.sh "$(SOL_COPYRIGHT_YEARS)" > $@.tmp diff --git a/jdk/makefiles/GensrcProperties.gmk b/jdk/makefiles/GensrcProperties.gmk index 8906b60df72..a00f546fdce 100644 --- a/jdk/makefiles/GensrcProperties.gmk +++ b/jdk/makefiles/GensrcProperties.gmk @@ -57,13 +57,13 @@ define add_properties_to_compile ALL_COMPILED_PROPSOURCES+=$2 # Generate the list of to be created java files. - ALL_COMPILED_PROPJAVAS+=$$(patsubst %,$(JDK_OUTPUTDIR)/gensrc_properties/%.java,$$($1_PROPPATHS)) + ALL_COMPILED_PROPJAVAS+=$$(patsubst %,$(JDK_OUTPUTDIR)/gensrc/%.java,$$($1_PROPPATHS)) # Now generate a sequence of "-compile ...CurrencyNames_sv.properties ...CurrencyNames_sv.java ListResourceBundle" # suitable to be fed into the CompileProperties command. COMPILE_PROPCMDLINE+=$$(subst _SPACE_,$(SPACE),$$(join $$(addprefix -compile_SPACE_,$2), \ $$(addsuffix _SPACE_$(strip $3),\ - $$(addprefix _SPACE_$(JDK_OUTPUTDIR)/gensrc_properties/,\ + $$(addprefix _SPACE_$(JDK_OUTPUTDIR)/gensrc/,\ $$(addsuffix .java,$$($1_PROPPATHS)))))) endef @@ -303,13 +303,12 @@ $(eval $(call add_properties_to_compile,SUN_UTIL,\ sun.util.resources.LocaleNamesBundle)) # Now setup the rule for the generation of the resource bundles. -$(JDK_OUTPUTDIR)/gensrc_properties/_the.compiled_properties : $(ALL_COMPILED_PROPSOURCES) $(BUILD_TOOLS) - $(RM) -r $(JDK_OUTPUTDIR)/gensrc_properties/* +$(JDK_OUTPUTDIR)/gensrc/_the.compiled_properties : $(ALL_COMPILED_PROPSOURCES) $(BUILD_TOOLS) # Generate all output directories in advance since the build tool does not do that... $(MKDIR) -p $(sort $(dir $(ALL_COMPILED_PROPJAVAS))) $(ECHO) Compiling $(words $(ALL_COMPILED_PROPSOURCES)) properties into resource bundles - $(call ListPathsSafely,COMPILE_PROPCMDLINE,\n, >> $(JDK_OUTPUTDIR)/gensrc_properties/_the.cmdline) - $(TOOL_COMPILEPROPERTIES) -quiet @$(JDK_OUTPUTDIR)/gensrc_properties/_the.cmdline + $(call ListPathsSafely,COMPILE_PROPCMDLINE,\n, >> $(JDK_OUTPUTDIR)/gensrc/_the.cmdline) + $(TOOL_COMPILEPROPERTIES) -quiet @$(JDK_OUTPUTDIR)/gensrc/_the.cmdline $(TOUCH) $@ # Now setup the rule for the generation of the cleaned properties. @@ -323,13 +322,13 @@ $(JDK_OUTPUTDIR)/classes/_the.cleaned_properties : $(ALL_CLEANED_PROPSOURCES) $( $(TOOL_STRIPPROPERTIES) @$(JDK_OUTPUTDIR)/classes/_the.cleaned_properties.cmdline $(TOUCH) $@ -$(ALL_COMPILED_PROPJAVAS) : $(JDK_OUTPUTDIR)/gensrc_properties/_the.compiled_properties +$(ALL_COMPILED_PROPJAVAS) : $(JDK_OUTPUTDIR)/gensrc/_the.compiled_properties $(ALL_CLEANED_PROPOUTPUT) : $(JDK_OUTPUTDIR)/classes/_the.cleaned_properties # Some zh_HK resources are just copied of zh_TW -$(JDK_OUTPUTDIR)/gensrc_properties/%_zh_HK.java: $(JDK_TOPDIR)/src/share/classes/%_zh_TW.java +$(JDK_OUTPUTDIR)/gensrc/%_zh_HK.java: $(JDK_TOPDIR)/src/share/classes/%_zh_TW.java $(MKDIR) -p $(@D) $(CAT) $< | $(SED) -e '/class/s/_zh_TW/_zh_HK/' > $@ @@ -338,7 +337,7 @@ ZH_HK_JAVA:= sun/applet/resources/MsgAppletViewer_zh_HK.java \ sun/security/util/AuthResources_zh_HK.java \ sun/security/util/Resources_zh_HK.java -ZH_HK_JAVA_FILES:=$(addprefix $(JDK_OUTPUTDIR)/gensrc_properties/,$(ZH_HK_JAVA)) +ZH_HK_JAVA_FILES:=$(addprefix $(JDK_OUTPUTDIR)/gensrc/,$(ZH_HK_JAVA)) GENSRC_PROPERTIES:=$(ALL_COMPILED_PROPJAVAS) $(ALL_CLEANED_PROPOUTPUT) $(ZH_HK_JAVA_FILES) diff --git a/jdk/makefiles/GensrcSwing.gmk b/jdk/makefiles/GensrcSwing.gmk index 3c0043e695d..9218fda43df 100644 --- a/jdk/makefiles/GensrcSwing.gmk +++ b/jdk/makefiles/GensrcSwing.gmk @@ -27,25 +27,25 @@ # Generate java files for javax.swing.plaf package # NIMBUS_PACKAGE = javax.swing.plaf -NIMBUS_GENSRC_DIR = $(JDK_OUTPUTDIR)/gensrc_swing/javax/swing/plaf/nimbus +NIMBUS_GENSRC_DIR = $(JDK_OUTPUTDIR)/gensrc/javax/swing/plaf/nimbus NIMBUS_SKIN_FILE = $(JDK_TOPDIR)/src/share/classes/javax/swing/plaf/nimbus/skin.laf -$(JDK_OUTPUTDIR)/gensrc_swing/_the.generated_nimbus: $(NIMBUS_SKIN_FILE) $(BUILD_TOOLS) +$(JDK_OUTPUTDIR)/gensrc/_the.generated_nimbus: $(NIMBUS_SKIN_FILE) $(BUILD_TOOLS) $(MKDIR) -p $(@D) - $(ECHO) "Generating Nimbus source files:" - $(TOOL_GENERATENIMBUS) \ - -skinFile $(NIMBUS_SKIN_FILE) -buildDir $(JDK_OUTPUTDIR)/gensrc_swing \ + $(ECHO) "Generating Nimbus source files" + $(TOOL_GENERATENIMBUS) $(LOG_INFO) \ + -skinFile $(NIMBUS_SKIN_FILE) -buildDir $(JDK_OUTPUTDIR)/gensrc \ -packagePrefix $(NIMBUS_PACKAGE).nimbus -lafName Nimbus - $(ECHO) "Finished generating Nimbus source files" + $(ECHO) $(LOG_INFO) "Finished generating Nimbus source files" $(TOUCH) $@ -GENSRC_SWING_NIMBUS := $(JDK_OUTPUTDIR)/gensrc_swing/_the.generated_nimbus +GENSRC_SWING_NIMBUS := $(JDK_OUTPUTDIR)/gensrc/_the.generated_nimbus # # Generate beaninfo java files # -BEAN_GENSRC_DIR = $(JDK_OUTPUTDIR)/gensrc_swing/javax/swing/beaninfo +BEAN_GENSRC_DIR = $(JDK_OUTPUTDIR)/gensrc/javax/swing/beaninfo DOCLETSRC_DIR = $(JDK_TOPDIR)/make/tools/swing-beans # javax.swing package @@ -69,9 +69,11 @@ BEANS_SRC = $(BEANS:%=$(JDK_TOPDIR)/src/share/classes/javax/swing/%.java) \ # Dummy variable so far, in the old build system it was false by default SWINGBEAN_DEBUG_FLAG = false # GenDocletBeanInfo is compiled in Tools.gmk and picks up from $(JDK_OUTPUTDIR)/btclasses -$(JDK_OUTPUTDIR)/gensrc_swing/_the.generated_beaninfo: $(BEANS_SRC) $(BEAN_GENSRC_DIR)/SwingBeanInfoBase.java $(BEAN_GENSRC_DIR)/BeanInfoUtils.java $(BUILD_TOOLS) +$(JDK_OUTPUTDIR)/gensrc/_the.generated_beaninfo: $(BEANS_SRC) $(BEAN_GENSRC_DIR)/SwingBeanInfoBase.java $(BEAN_GENSRC_DIR)/BeanInfoUtils.java $(BUILD_TOOLS) + $(ECHO) Generating beaninfo $(JAVA) -Djava.awt.headless=true -jar $(JAVADOC_JARS) -doclet GenDocletBeanInfo -x $(SWINGBEAN_DEBUG_FLAG) -d $(BEAN_GENSRC_DIR) -t $(DOCLETSRC_DIR)/SwingBeanInfo.template -docletpath $(JDK_OUTPUTDIR)/btclasses \ - -classpath $(JDK_OUTPUTDIR)/btclasses $(BEANS_SRC) + -XDignore.symbol.file=true \ + -classpath $(JDK_OUTPUTDIR)/btclasses $(BEANS_SRC) $(LOG_INFO) $(TOUCH) $@ # This file is the part of dt.jar @@ -88,4 +90,4 @@ $(BEAN_GENSRC_DIR)/BeanInfoUtils.java: $(DOCLETSRC_DIR)/beaninfo/BeanInfoUtils.j $(MKDIR) -p $(@D) $(CP) $< $@ -GENSRC_SWING_BEANINFO = $(JDK_OUTPUTDIR)/gensrc_swing/_the.generated_beaninfo +GENSRC_SWING_BEANINFO = $(JDK_OUTPUTDIR)/gensrc/_the.generated_beaninfo diff --git a/jdk/makefiles/GensrcX11Wrappers.gmk b/jdk/makefiles/GensrcX11Wrappers.gmk index 695f6bbdaff..7017a3f72fd 100644 --- a/jdk/makefiles/GensrcX11Wrappers.gmk +++ b/jdk/makefiles/GensrcX11Wrappers.gmk @@ -33,6 +33,7 @@ GENSRC_X11WRAPPERS := GENSRC_X11WRAPPERS_TMP := $(JDK_OUTPUTDIR)/gensrc_x11wrappers +GENSRC_X11WRAPPERS_DST := $(JDK_OUTPUTDIR)/gensrc GENSRC_SIZER_SRC := $(JDK_TOPDIR)/src/solaris/classes/sun/awt/X11/generator @@ -45,8 +46,8 @@ ifneq ($(OPENJDK_TARGET_OS), linux) GENSRC_SIZES := sizes.32 sizes.64 endif else -ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), solaris-x86) -# As a special case, solaris on x86 (32-bit) also generates the 64-bit version +ifeq ($(OPENJDK_TARGET_OS), solaris) +# As a special case, solaris 32-bit also generates the 64-bit version GENSRC_SIZES := sizes.32 sizes.64 endif endif @@ -54,6 +55,7 @@ endif ########################################################################################## $(GENSRC_X11WRAPPERS_TMP)/sizer/sizer.%.c : $(GENSRC_SIZER_SRC)/xlibtypes.txt + $(ECHO) "Generating X11 wrapper ($*-bit version)" $(MKDIR) -p $(@D) $(RM) $@ $(TOOL_WRAPPERGENERATOR) $(@D) $< "sizer" $* @@ -88,10 +90,9 @@ $(GENSRC_X11WRAPPERS_TMP)/sizer/sizes.64 : $(JDK_TOPDIR)/src/solaris/classes/sun $(CP) $< $@ endif -$(GENSRC_X11WRAPPERS_TMP)/classes/_the.classes : $(foreach S,$(GENSRC_SIZES),$(GENSRC_X11WRAPPERS_TMP)/sizer/$(S)) +$(GENSRC_X11WRAPPERS_DST)/_the.generated.x11 : $(foreach S,$(GENSRC_SIZES),$(GENSRC_X11WRAPPERS_TMP)/sizer/$(S)) $(RM) $@ $(MKDIR) -p $(@D)/sun/awt/X11 - $(RM) $(@D)/sun/awt/X11/* $(TOOL_WRAPPERGENERATOR) $(@D)/sun/awt/X11 $(GENSRC_SIZER_SRC)/xlibtypes.txt "gen" $(GENSRC_X11WRAPPERS_TMP)/sizer/sizes ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), solaris-x86_64) # On solaris-x86_64, as a safety measure, compare the generated file with the checked-in version @@ -100,4 +101,4 @@ ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), solaris-x86_64) endif $(TOUCH) $@ -GENSRC_X11WRAPPERS += $(GENSRC_X11WRAPPERS_TMP)/classes/_the.classes +GENSRC_X11WRAPPERS += $(GENSRC_X11WRAPPERS_DST)/_the.generated.x11 diff --git a/jdk/makefiles/Images.gmk b/jdk/makefiles/Images.gmk index 0526f97b0a3..64d8bb19a22 100644 --- a/jdk/makefiles/Images.gmk +++ b/jdk/makefiles/Images.gmk @@ -42,35 +42,31 @@ overlay-images: jre-overlay-image jdk-overlay-image -include $(CUSTOM_MAKE_DIR)/Images.gmk -ifeq ($(OPENJDK_TARGET_OS),solaris) -# On Solaris, if the target is a symlink and exists, cp won't overwrite. -define install-file - $(MKDIR) -p $(@D) - $(RM) '$@' - $(CP) -f -r -P '$<' '$(@D)' -endef -else ifeq ($(OPENJDK_TARGET_OS),macosx) -define install-file - $(MKDIR) -p $(@D) - $(CP) -fpRP '$<' '$@' -endef -else -define install-file - $(MKDIR) -p $(@D) - $(CP) -fP '$<' '$@' -endef -endif - # Processing license files from source area to image area # These will be modified to have the platform specific EOL chars. define process-doc-file - $(ECHO) Processing $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Processing $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(MKDIR) -p $(@D) $(RM) $@ $(SED) 's/$$//g' $< > $@ $(CHMOD) 444 $@ endef +define AddFileToCopy + # Param 1 - src root dir + # Param 2 - dest root dir + # Param 3 - src file + # Param 4 - variable to add targets to + + # Remove src dir root from src file + $2_$3_FILE := $$(patsubst $1/%,%,$3) + + $2/$$($2_$3_FILE): $3 + $(ECHO) $(LOG_INFO) Copying $$(patsubst $(OUTPUT_ROOT)/%,%,$$@) + $$(install-file) + + $4 += $2/$$($2_$3_FILE) +endef JDK_IMAGE_DIR:=$(IMAGES_OUTPUTDIR)/j2sdk-image JRE_IMAGE_DIR:=$(IMAGES_OUTPUTDIR)/j2re-image @@ -93,31 +89,6 @@ JRE_OVERLAY_IMAGE_DIR:=$(IMAGES_OUTPUTDIR)/j2re-overlay-image ################################################################################ # /bin dir -$(JRE_IMAGE_DIR)/bin/%: $(JDK_OUTPUTDIR)/bin/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -$(JDK_IMAGE_DIR)/bin/%: $(JDK_OUTPUTDIR)/bin/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -$(JDK_IMAGE_DIR)/jre/bin/%: $(JDK_OUTPUTDIR)/bin/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -# Overaly image targets -$(JRE_OVERLAY_IMAGE_DIR)/bin/%: $(JDK_OUTPUTDIR)/bin/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -$(JDK_OVERLAY_IMAGE_DIR)/bin/%: $(JDK_OUTPUTDIR)/bin/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -$(JDK_OVERLAY_IMAGE_DIR)/jre/bin/%: $(JDK_OUTPUTDIR)/bin/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - NOT_JRE_BIN_FILES := \ appletviewer$(EXE_SUFFIX) \ extcheck$(EXE_SUFFIX) \ @@ -154,7 +125,7 @@ NOT_JRE_BIN_FILES := \ WINDOWS_JDK_BIN_FILES = \ $(EXE_SUFFIX) \ $(LIBRARY_PREFIX)jli$(SHARED_LIBRARY_SUFFIX) \ - $(notdir $(MSVCRNN_DLL)) + $(notdir $(MSVCR_DLL)) WINDOWS_JDKJRE_BIN_FILES := \ $(LIBRARY_PREFIX)attach$(SHARED_LIBRARY_SUFFIX) \ @@ -163,6 +134,9 @@ WINDOWS_JDKJRE_BIN_FILES := \ # Find all files in bin dir ALL_BIN_LIST := $(shell $(FIND) $(JDK_OUTPUTDIR)/bin -type f) +# Prevent sjavac from entering the images. +ALL_BIN_LIST := $(filter-out %/sjavac,$(ALL_BIN_LIST)) + # For unknown reason the debuginfo files for executables are not put into images # e.g filter them out ifneq ($(OPENJDK_TARGET_OS),windows) @@ -176,60 +150,42 @@ else ALL_BIN_LIST := $(filter-out $(ALL_BIN_DEBUG_FILTER),$(ALL_BIN_LIST)) endif +JDKJRE_BIN_LIST := $(filter-out $(addprefix %,$(NOT_JRE_BIN_FILES)), $(ALL_BIN_LIST)) +JRE_BIN_LIST := $(filter-out $(addprefix %,$(WINDOWS_JDKJRE_BIN_FILES)), $(JDKJRE_BIN_LIST)) + ifeq ($(OPENJDK_TARGET_OS),windows) JDK_BIN_LIST := $(filter $(addprefix %,$(WINDOWS_JDK_BIN_FILES)), $(ALL_BIN_LIST)) + # On windows x86, the server jvm is filtered out from the j2re image. This could possibly + # be handled by profiles in the future. If no client jvm is built, leave server in. + ifeq ($(OPENJDK_TARGET_CPU),x86) + ifeq ($(JVM_VARIANT_CLIENT),true) + JRE_BIN_LIST := $(filter-out $(JDK_OUTPUTDIR)/bin/server/%,$(JRE_BIN_LIST)) + endif + endif else JDK_BIN_LIST := $(ALL_BIN_LIST) endif -JDKJRE_BIN_LIST := $(filter-out $(addprefix %,$(NOT_JRE_BIN_FILES)), $(ALL_BIN_LIST)) -JRE_BIN_LIST := $(filter-out $(addprefix %,$(WINDOWS_JDKJRE_BIN_FILES)), $(JDKJRE_BIN_LIST)) ifneq ($(OPENJDK_TARGET_CPU_ISADIR),) OVERLAY_FILTER := $(JDK_OUTPUTDIR)/bin$(OPENJDK_TARGET_CPU_ISADIR)% endif -JRE_BIN_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/%,$(JRE_IMAGE_DIR)/%, \ - $(filter-out $(OVERLAY_FILTER),$(JRE_BIN_LIST))) -JDK_BIN_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/%,$(JDK_IMAGE_DIR)/%, \ - $(filter-out $(OVERLAY_FILTER),$(JDK_BIN_LIST))) -JDKJRE_BIN_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/%,$(JDK_IMAGE_DIR)/jre/%, \ - $(filter-out $(OVERLAY_FILTER),$(JDKJRE_BIN_LIST))) +$(foreach f,$(filter-out $(OVERLAY_FILTER),$(JRE_BIN_LIST)),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JRE_IMAGE_DIR),$f,JRE_BIN_TARGETS))) +$(foreach f,$(filter-out $(OVERLAY_FILTER),$(JDK_BIN_LIST)),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_IMAGE_DIR),$f,JDK_BIN_TARGETS))) +$(foreach f,$(filter-out $(OVERLAY_FILTER),$(JDKJRE_BIN_LIST)),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_IMAGE_DIR)/jre,$f,JDKJRE_BIN_TARGETS))) -JRE_OVERLAY_BIN_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/%,$(JRE_OVERLAY_IMAGE_DIR)/%, \ - $(filter $(OVERLAY_FILTER),$(JRE_BIN_LIST))) -JDK_OVERLAY_BIN_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/%,$(JDK_OVERLAY_IMAGE_DIR)/%, \ - $(filter $(OVERLAY_FILTER),$(JDK_BIN_LIST))) -JDKJRE_OVERLAY_BIN_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/%,$(JDK_OVERLAY_IMAGE_DIR)/jre/%, \ - $(filter $(OVERLAY_FILTER),$(JDKJRE_BIN_LIST))) +$(foreach f,$(filter $(OVERLAY_FILTER),$(JRE_BIN_LIST)),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JRE_OVERLAY_IMAGE_DIR),$f,JRE_BIN_TARGETS))) +$(foreach f,$(filter $(OVERLAY_FILTER),$(JDK_BIN_LIST)),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_OVERLAY_IMAGE_DIR),$f,JDK_BIN_TARGETS))) +$(foreach f,$(filter $(OVERLAY_FILTER),$(JDKJRE_BIN_LIST)),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_OVERLAY_IMAGE_DIR)/jre,$f,JDKJRE_BIN_TARGETS))) ################################################################################ # /lib dir - -$(JRE_IMAGE_DIR)/lib/%: $(JDK_OUTPUTDIR)/lib/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -$(JDK_IMAGE_DIR)/lib/%: $(JDK_OUTPUTDIR)/lib/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -$(JDK_IMAGE_DIR)/jre/lib/%: $(JDK_OUTPUTDIR)/lib/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -# Overlay image targets -$(JRE_OVERLAY_IMAGE_DIR)/lib/%: $(JDK_OUTPUTDIR)/lib/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -$(JDK_OVERLAY_IMAGE_DIR)/lib/%: $(JDK_OUTPUTDIR)/lib/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - -$(JDK_OVERLAY_IMAGE_DIR)/jre/lib/%: $(JDK_OUTPUTDIR)/lib/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) - ifneq ($(OPENJDK_TARGET_OS), macosx) JDKJRE_LIB_FILES := \ $(LIBRARY_PREFIX)attach$(SHARED_LIBRARY_SUFFIX) \ @@ -254,52 +210,80 @@ ifeq ($(OPENJDK_TARGET_OS), linux) JDK_LIB_FILES += jexec endif -ALL_LIB_LIST := $(shell $(FIND) $(JDK_OUTPUTDIR)/lib \( -type f -o -type l \) -a ! \( -name "_the*" -o -name "javac_state " \) ) -JRE_LIB_LIST := $(filter-out $(addprefix %,$(NOT_JRE_LIB_FILES) $(JDKJRE_LIB_FILES)),$(ALL_LIB_LIST)) -JDKJRE_LIB_LIST := $(filter-out $(addprefix %,$(NOT_JRE_LIB_FILES)),$(ALL_LIB_LIST)) -JDK_LIB_LIST := $(filter $(addprefix %,$(JDK_LIB_FILES)),$(ALL_LIB_LIST)) +# Find all files to copy from $(JDK_OUTPUTDIR)/lib +ALL_JDKOUT_LIB_LIST := $(shell $(FIND) $(JDK_OUTPUTDIR)/lib \( -type f -o -type l \) -a ! \ + \( -name "_the*" -o -name "javac_state " \) ) +# Find all files to copy from $(IMAGES_OUTPUTDIR)/lib +# This might not exist if building overlay-images +ifneq ($(wildcard $(IMAGES_OUTPUTDIR)/lib),) + ALL_IMAGES_LIB_LIST := $(shell $(FIND) $(IMAGES_OUTPUTDIR)/lib \( -type f -o -type l \) -a ! \ + \( -name "_the*" -o -name "javac_state " \) ) +endif -JRE_LIB_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/%,$(JRE_IMAGE_DIR)/%,$(JRE_LIB_LIST)) -JDK_LIB_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/%,$(JDK_IMAGE_DIR)/%,$(JDK_LIB_LIST)) -JDKJRE_LIB_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/%,$(JDK_IMAGE_DIR)/jre/%,$(JDKJRE_LIB_LIST)) +# Filter files to copy for each destination +JRE_JDKOUT_LIB_LIST := $(filter-out $(addprefix %,$(NOT_JRE_LIB_FILES) $(JDKJRE_LIB_FILES)),\ + $(ALL_JDKOUT_LIB_LIST)) +JDKJRE_JDKOUT_LIB_LIST := $(filter-out $(addprefix %,$(NOT_JRE_LIB_FILES)),$(ALL_JDKOUT_LIB_LIST)) +JDK_JDKOUT_LIB_LIST := $(filter $(addprefix %,$(JDK_LIB_FILES)),$(ALL_JDKOUT_LIB_LIST)) -JRE_OVERLAY_LIB_TARGETS := $(subst $(JRE_IMAGE_DIR),$(JRE_OVERLAY_IMAGE_DIR),\ - $(filter $(JRE_IMAGE_DIR)/lib$(OPENJDK_TARGET_CPU_ISADIR)/%,$(JRE_LIB_TARGETS))) -JDK_OVERLAY_LIB_TARGETS := $(subst $(JDK_IMAGE_DIR),$(JDK_OVERLAY_IMAGE_DIR),\ - $(filter $(JDK_IMAGE_DIR)/lib$(OPENJDK_TARGET_CPU_ISADIR)/%,$(JDK_LIB_TARGETS))) -JDKJRE_OVERLAY_LIB_TARGETS := $(subst $(JDK_IMAGE_DIR),$(JDK_OVERLAY_IMAGE_DIR),\ - $(filter $(JDK_IMAGE_DIR)/jre/lib$(OPENJDK_TARGET_CPU_ISADIR)/%,$(JDKJRE_LIB_TARGETS))) +JRE_IMAGES_LIB_LIST := $(filter-out $(addprefix %,$(NOT_JRE_LIB_FILES) $(JDKJRE_LIB_FILES)),\ + $(ALL_IMAGES_LIB_LIST)) +JDKJRE_IMAGES_LIB_LIST := $(filter-out $(addprefix %,$(NOT_JRE_LIB_FILES)),$(ALL_IMAGES_LIB_LIST)) +JDK_IMAGES_LIB_LIST := $(filter $(addprefix %,$(JDK_LIB_FILES)),$(ALL_IMAGES_LIB_LIST)) + +# Iterate over files to copy to create rules for each one +$(foreach f,$(JRE_JDKOUT_LIB_LIST),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JRE_IMAGE_DIR),$f,JRE_LIB_TARGETS))) +$(foreach f,$(JDK_JDKOUT_LIB_LIST),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_IMAGE_DIR),$f,JDK_LIB_TARGETS))) +$(foreach f,$(JDKJRE_JDKOUT_LIB_LIST),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_IMAGE_DIR)/jre,$f,JDKJRE_LIB_TARGETS))) + +$(foreach f,$(JRE_IMAGES_LIB_LIST),\ + $(eval $(call AddFileToCopy,$(IMAGES_OUTPUTDIR),$(JRE_IMAGE_DIR),$f,JRE_LIB_TARGETS))) +$(foreach f,$(JDK_IMAGES_LIB_LIST),\ + $(eval $(call AddFileToCopy,$(IMAGES_OUTPUTDIR),$(JDK_IMAGE_DIR),$f,JDK_LIB_TARGETS))) +$(foreach f,$(JDKJRE_IMAGES_LIB_LIST),\ + $(eval $(call AddFileToCopy,$(IMAGES_OUTPUTDIR),$(JDK_IMAGE_DIR)/jre,$f,JDKJRE_LIB_TARGETS))) + +$(foreach f,$(filter $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_ISADIR)/%,$(JRE_JDKOUT_LIB_LIST)),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JRE_OVERLAY_IMAGE_DIR),$f,JRE_OVERLAY_LIB_TARGETS))) +$(foreach f,$(filter $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_ISADIR)/%,$(JDK_JDKOUT_LIB_LIST)),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_OVERLAY_IMAGE_DIR),$f,JDK_OVERLAY_LIB_TARGETS))) +$(foreach f,$(filter $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_ISADIR)/%,$(JDKJRE_JDKOUT_LIB_LIST)),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_OVERLAY_IMAGE_DIR)/jre,$f,JDKJRE_OVERLAY_LIB_TARGETS))) # CTE plugin security change require new empty directory lib/applet $(JRE_IMAGE_DIR)/lib/applet: - $(ECHO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(MKDIR) -p $@ $(JDK_IMAGE_DIR)/jre/lib/applet: - $(ECHO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(MKDIR) -p $@ # In the old build, JObjC.jar is not part of the meta-index $(JRE_IMAGE_DIR)/lib/meta-index: $(JRE_LIB_TARGETS) - $(ECHO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(CD) $(@D) && $(TOOL_BUILDMETAINDEX) -o meta-index `$(LS) *.jar | $(SED) 's/JObjC\.jar//g'` $(JDK_IMAGE_DIR)/jre/lib/meta-index: $(JDKJRE_LIB_TARGETS) - $(ECHO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(CD) $(@D) && $(TOOL_BUILDMETAINDEX) -o meta-index `$(LS) *.jar | $(SED) 's/JObjC\.jar//g'` $(JRE_IMAGE_DIR)/lib/ext/meta-index: $(JRE_LIB_TARGETS) - $(ECHO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(CD) $(@D) && $(TOOL_BUILDMETAINDEX) -o meta-index *.jar $(JDK_IMAGE_DIR)/jre/lib/ext/meta-index: $(JDKJRE_LIB_TARGETS) - $(ECHO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(CD) $(@D) && $(TOOL_BUILDMETAINDEX) -o meta-index *.jar ################################################################################ # /man dir - -JRE_MAN_PAGES := \ +# Avoid evaluating this whole section on windows for speed and stability +ifneq ($(OPENJDK_TARGET_OS),windows) + JRE_MAN_PAGES := \ java.1 \ keytool.1 \ orbd.1 \ @@ -311,11 +295,11 @@ JRE_MAN_PAGES := \ tnameserv.1 \ unpack200.1 -ifndef OPENJDK - JRE_MAN_PAGES += javaws.1 -endif + ifndef OPENJDK + JRE_MAN_PAGES += javaws.1 + endif -JDK_MAN_PAGES = \ + JDK_MAN_PAGES = \ $(JRE_MAN_PAGES) \ appletviewer.1 \ extcheck.1 \ @@ -346,186 +330,176 @@ JDK_MAN_PAGES = \ wsimport.1 \ xjc.1 -ifndef OPENJDK - JDK_MAN_PAGES += jvisualvm.1 -endif + ifndef OPENJDK + JDK_MAN_PAGES += jvisualvm.1 + endif -ifeq ($(OPENJDK_TARGET_OS), linux) - MAN_SRC_DIR:=$(JDK_TOPDIR)/src/linux/doc - MAN1_SUBDIR:=man -endif -ifeq ($(OPENJDK_TARGET_OS), solaris) - MAN_SRC_DIR:=$(JDK_TOPDIR)/src/solaris/doc - MAN1_SUBDIR:=sun/man/man1 -endif -ifeq ($(OPENJDK_TARGET_OS), macosx) - MAN_SRC_DIR:=$(JDK_TOPDIR)/src/bsd/doc - MAN1_SUBDIR:=man - JDK_MAN_PAGES := $(filter-out jcmd.1, $(JDK_MAN_PAGES)) - JDK_MAN_PAGES := $(filter-out jvisualvm.1, $(JDK_MAN_PAGES)) -endif + ifeq ($(OPENJDK_TARGET_OS), linux) + MAN_SRC_DIR:=$(JDK_TOPDIR)/src/linux/doc + MAN1_SUBDIR:=man + endif + ifeq ($(OPENJDK_TARGET_OS), solaris) + MAN_SRC_DIR:=$(JDK_TOPDIR)/src/solaris/doc + MAN1_SUBDIR:=sun/man/man1 + endif + ifeq ($(OPENJDK_TARGET_OS), macosx) + MAN_SRC_DIR:=$(JDK_TOPDIR)/src/bsd/doc + MAN1_SUBDIR:=man + JDK_MAN_PAGES := $(filter-out jcmd.1, $(JDK_MAN_PAGES)) + JDK_MAN_PAGES := $(filter-out jvisualvm.1, $(JDK_MAN_PAGES)) + endif -$(JRE_IMAGE_DIR)/man/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(JRE_IMAGE_DIR)/man/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/% + $(ECHO) $(LOG_INFO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(install-file) -$(JDK_IMAGE_DIR)/man/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(JDK_IMAGE_DIR)/man/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/% + $(ECHO) $(LOG_INFO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(install-file) -$(JRE_IMAGE_DIR)/man/man1/%: $(JDK_OUTPUTDIR)/impdoc/$(MAN1_SUBDIR)/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(JRE_IMAGE_DIR)/man/man1/%: $(JDK_OUTPUTDIR)/impdoc/$(MAN1_SUBDIR)/% + $(ECHO) $(LOG_INFO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(install-file) -$(JDK_IMAGE_DIR)/man/man1/%: $(JDK_OUTPUTDIR)/impdoc/$(MAN1_SUBDIR)/% - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(JDK_IMAGE_DIR)/man/man1/%: $(JDK_OUTPUTDIR)/impdoc/$(MAN1_SUBDIR)/% + $(ECHO) $(LOG_INFO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(install-file) -define install-ja-manpage + define install-ja-manpage $(MKDIR) -p $(@D) $(CAT) $< \ | $(NATIVE2ASCII) -encoding eucJP \ | $(SED) 's/@@VERSION@@/$(THIS_JDK_VERSION)/g' \ | $(NATIVE2ASCII) -reverse -encoding $1 \ > $@ -endef + endef -$(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% - $(ECHO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% + $(ECHO) $(LOG_INFO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(call install-ja-manpage,UTF-8) -$(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% - $(ECHO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% + $(ECHO) $(LOG_INFO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(call install-ja-manpage,UTF-8) -$(JRE_IMAGE_DIR)/man/ja_JP.PCK/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% - $(ECHO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(JRE_IMAGE_DIR)/man/ja_JP.PCK/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% + $(ECHO) $(LOG_INFO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(call install-ja-manpage,PCK) -$(JDK_IMAGE_DIR)/man/ja_JP.PCK/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% - $(ECHO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(JDK_IMAGE_DIR)/man/ja_JP.PCK/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% + $(ECHO) $(LOG_INFO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(call install-ja-manpage,PCK) -ifeq ($(OPENJDK_TARGET_OS), solaris) - $(JRE_IMAGE_DIR)/man/ja/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% - $(ECHO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) + ifeq ($(OPENJDK_TARGET_OS), solaris) + $(JRE_IMAGE_DIR)/man/ja/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% + $(ECHO) $(LOG_INFO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(install-file) - $(JDK_IMAGE_DIR)/man/ja/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% - $(ECHO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(install-file) -endif + $(JDK_IMAGE_DIR)/man/ja/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/% + $(ECHO) $(LOG_INFO) Converting $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(install-file) + endif -# Old build creates empty man page for this, mimicing behaviour. -$(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/jcmd.1 $(JDK_IMAGE_DIR)/man/ja_JP.PCK/man1/jcmd.1 $(JDK_IMAGE_DIR)/man/ja/man1/jcmd.1: - $(ECHO) Creating dummy $(patsubst $(OUTPUT_ROOT)/%,%,$@) + # Old build creates empty man page for this, mimicing behaviour. + $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/jcmd.1 $(JDK_IMAGE_DIR)/man/ja_JP.PCK/man1/jcmd.1 $(JDK_IMAGE_DIR)/man/ja/man1/jcmd.1: + $(ECHO) $(LOG_INFO) Creating dummy $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(MKDIR) -p $(@D) $(TOUCH) $@ -ifeq ($(OPENJDK_TARGET_OS), linux) - $(JRE_IMAGE_DIR)/man/ja: - $(ECHO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja + ifeq ($(OPENJDK_TARGET_OS), linux) + $(JRE_IMAGE_DIR)/man/ja: + $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja - $(JDK_IMAGE_DIR)/man/ja: - $(ECHO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja -endif + $(JDK_IMAGE_DIR)/man/ja: + $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja + endif -ifeq ($(OPENJDK_TARGET_OS), macosx) - $(JRE_IMAGE_DIR)/man/ja: - $(ECHO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja + ifeq ($(OPENJDK_TARGET_OS), macosx) + $(JRE_IMAGE_DIR)/man/ja: + $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja - $(JDK_IMAGE_DIR)/man/ja: - $(ECHO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja -endif + $(JDK_IMAGE_DIR)/man/ja: + $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja + endif -ifeq ($(OPENJDK_TARGET_OS), linux) - JRE_MAN_PAGE_LIST := $(addprefix $(JRE_IMAGE_DIR)/man/man1/,$(JRE_MAN_PAGES)) \ - $(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JRE_MAN_PAGES)) \ - $(JRE_IMAGE_DIR)/man/ja + ifeq ($(OPENJDK_TARGET_OS), linux) + JRE_MAN_PAGE_LIST := $(addprefix $(JRE_IMAGE_DIR)/man/man1/,$(JRE_MAN_PAGES)) \ + $(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JRE_MAN_PAGES)) \ + $(JRE_IMAGE_DIR)/man/ja - JDK_MAN_PAGE_LIST := $(addprefix $(JDK_IMAGE_DIR)/man/man1/,$(JDK_MAN_PAGES)) \ - $(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JDK_MAN_PAGES)) \ - $(JDK_IMAGE_DIR)/man/ja -endif + JDK_MAN_PAGE_LIST := $(addprefix $(JDK_IMAGE_DIR)/man/man1/,$(JDK_MAN_PAGES)) \ + $(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JDK_MAN_PAGES)) \ + $(JDK_IMAGE_DIR)/man/ja + endif -ifeq ($(OPENJDK_TARGET_OS), solaris) - JRE_MAN_PAGE_LIST := $(addprefix $(JRE_IMAGE_DIR)/man/man1/,$(JRE_MAN_PAGES)) \ - $(addprefix $(JRE_IMAGE_DIR)/man/ja/man1/,$(JRE_MAN_PAGES)) \ - $(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JRE_MAN_PAGES)) \ - $(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.PCK/man1/,$(JRE_MAN_PAGES)) + ifeq ($(OPENJDK_TARGET_OS), solaris) + JRE_MAN_PAGE_LIST := $(addprefix $(JRE_IMAGE_DIR)/man/man1/,$(JRE_MAN_PAGES)) \ + $(addprefix $(JRE_IMAGE_DIR)/man/ja/man1/,$(JRE_MAN_PAGES)) \ + $(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JRE_MAN_PAGES)) \ + $(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.PCK/man1/,$(JRE_MAN_PAGES)) - JDK_MAN_PAGE_LIST := $(addprefix $(JDK_IMAGE_DIR)/man/man1/,$(JDK_MAN_PAGES)) \ - $(addprefix $(JDK_IMAGE_DIR)/man/ja/man1/,$(JDK_MAN_PAGES)) \ - $(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JDK_MAN_PAGES)) \ - $(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.PCK/man1/,$(JDK_MAN_PAGES)) -endif + JDK_MAN_PAGE_LIST := $(addprefix $(JDK_IMAGE_DIR)/man/man1/,$(JDK_MAN_PAGES)) \ + $(addprefix $(JDK_IMAGE_DIR)/man/ja/man1/,$(JDK_MAN_PAGES)) \ + $(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JDK_MAN_PAGES)) \ + $(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.PCK/man1/,$(JDK_MAN_PAGES)) + endif -ifeq ($(OPENJDK_TARGET_OS), macosx) - JRE_MAN_PAGE_LIST := $(addprefix $(JRE_IMAGE_DIR)/man/man1/,$(JRE_MAN_PAGES)) \ - $(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JRE_MAN_PAGES)) \ - $(JRE_IMAGE_DIR)/man/ja + ifeq ($(OPENJDK_TARGET_OS), macosx) + JRE_MAN_PAGE_LIST := $(addprefix $(JRE_IMAGE_DIR)/man/man1/,$(JRE_MAN_PAGES)) \ + $(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JRE_MAN_PAGES)) \ + $(JRE_IMAGE_DIR)/man/ja - JDK_MAN_PAGE_LIST := $(addprefix $(JDK_IMAGE_DIR)/man/man1/,$(JDK_MAN_PAGES)) \ - $(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JDK_MAN_PAGES)) \ - $(JDK_IMAGE_DIR)/man/ja -endif + JDK_MAN_PAGE_LIST := $(addprefix $(JDK_IMAGE_DIR)/man/man1/,$(JDK_MAN_PAGES)) \ + $(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/,$(JDK_MAN_PAGES)) \ + $(JDK_IMAGE_DIR)/man/ja + endif + +endif # Windows ################################################################################ # /demo dir -ifndef NO_DEMOS # FIXME: demo/applets/GraphLayout/GraphPanel$2.class is sometimes not copied. # The db demo contains an empty dir that needs to be copied. The other # directories will always trigger the rule for recompile since # _the.list_of_packages files are touched. - $(JDK_IMAGE_DIR)/demo/%: $(JDK_OUTPUTDIR)/demo/% +$(JDK_IMAGE_DIR)/demo/%: $(JDK_OUTPUTDIR)/demo/% if [ ! -d "$@" ]; then \ - $(ECHO) Copying '$(patsubst $(OUTPUT_ROOT)/%,%,$@)'; \ + $(ECHO) $(LOG_INFO) Copying '$(patsubst $(OUTPUT_ROOT)/%,%,$@)'; \ $(MKDIR) -p $(@D); \ if [ -d "$<" ]; then $(MKDIR) -p $@; else $(CP) '$<' '$@'; fi \ fi # Find all files including directories - JDK_DEMO_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/demo/%,$(JDK_IMAGE_DIR)/demo/%,\ +JDK_DEMO_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/demo/%,$(JDK_IMAGE_DIR)/demo/%,\ $(shell $(FIND) $(JDK_OUTPUTDIR)/demo ! \( -name "_the*" -o -name "javac_state" \) )) - # Param 1 is source file - define CreateOverlayDemoRule - $1_TARGET:=$$(subst $(JDK_OUTPUTDIR),$(JDK_OVERLAY_IMAGE_DIR),\ +# Param 1 is source file +define CreateOverlayDemoRule + $1_TARGET:=$$(subst $(JDK_OUTPUTDIR),$(JDK_OVERLAY_IMAGE_DIR),\ $$(dir $1)$(OPENJDK_TARGET_CPU_ISADIR)/$$(notdir $1)) - $$($1_TARGET): $1 - $(ECHO) Copying '$$(patsubst $(OUTPUT_ROOT)/%,%,$$@)' - $(MKDIR) -p $$(@D) - $(RM) $$@ - $(CP) -f '$$<' '$$@' + $$($1_TARGET): $1 + $(ECHO) $(LOG_INFO) Copying '$$(patsubst $(OUTPUT_ROOT)/%,%,$$@)' + $$(call install-file) - JDK_OVERLAY_DEMO_TARGETS += $$($1_TARGET) - endef - JDK_OVERLAY_DEMO_SOURCES := $(shell $(FIND) $(JDK_OUTPUTDIR)/demo -name "*$(SHARED_LIBRARY_SUFFIX)") - $(foreach lib,$(JDK_OVERLAY_DEMO_SOURCES),$(eval $(call CreateOverlayDemoRule,$(lib)))) - -endif + JDK_OVERLAY_DEMO_TARGETS += $$($1_TARGET) +endef +JDK_OVERLAY_DEMO_SOURCES := $(shell $(FIND) $(JDK_OUTPUTDIR)/demo -name "*$(SHARED_LIBRARY_SUFFIX)") +$(foreach lib,$(JDK_OVERLAY_DEMO_SOURCES),$(eval $(call CreateOverlayDemoRule,$(lib)))) ################################################################################ # /sample dir -ifndef NO_SAMPLES - $(JDK_IMAGE_DIR)/sample/%: $(JDK_OUTPUTDIR)/sample/% - $(ECHO) Copying '$(patsubst $(OUTPUT_ROOT)/%,%,$@)' - $(install-file) - - JDK_SAMPLE_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/sample/%,$(JDK_IMAGE_DIR)/sample/%,\ - $(shell $(FIND) $(JDK_OUTPUTDIR)/sample -type f)) - -endif +$(foreach f,$(shell $(FIND) $(JDK_OUTPUTDIR)/sample -type f),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_IMAGE_DIR),$f,JDK_SAMPLE_TARGETS))) ################################################################################ # /db dir @@ -534,14 +508,13 @@ ifndef OPENJDK $(IMAGES_OUTPUTDIR)/_unzip/%.unzipped: $(JDK_TOPDIR)/src/closed/share/db/% $(ECHO) Unzipping $(patsubst $(SRC_ROOT)/%,%,$<) $(MKDIR) -p $(JDK_IMAGE_DIR)/db - cd $(JDK_IMAGE_DIR)/db && $(UNZIP) -o $< -x index.html 2> /dev/null + cd $(JDK_IMAGE_DIR)/db && $(UNZIP) -q -o $< -x index.html 2> /dev/null $(MKDIR) -p $(@D) $(TOUCH) $@ $(JDK_IMAGE_DIR)/db/README-JDK.html: $(JDK_TOPDIR)/src/closed/share/db/README-JDK.html - $(ECHO) Copying '$(patsubst $(OUTPUT_ROOT)/%,%,$@)' + $(ECHO) $(LOG_INFO) Copying '$(patsubst $(OUTPUT_ROOT)/%,%,$@)' $(install-file) - $(CHMOD) 644 $(@) JDK_DB_TARGETS := $(patsubst $(JDK_TOPDIR)/src/closed/share/db/%,$(IMAGES_OUTPUTDIR)/_unzip/%.unzipped,\ $(shell $(FIND) $(JDK_TOPDIR)/src/closed/share/db -name "*.zip" ! -name "*demo*")) \ @@ -552,12 +525,8 @@ endif ################################################################################ # /include dir -$(JDK_IMAGE_DIR)/include/%: $(JDK_OUTPUTDIR)/include/% - $(ECHO) Copying '$(patsubst $(OUTPUT_ROOT)/%,%,$@)' - $(install-file) - - JDK_INCLUDE_TARGETS := $(patsubst $(JDK_OUTPUTDIR)/include/%,$(JDK_IMAGE_DIR)/include/%,\ - $(shell $(FIND) $(JDK_OUTPUTDIR)/include -type f)) +$(foreach f,$(shell $(FIND) $(JDK_OUTPUTDIR)/include -type f),\ + $(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_IMAGE_DIR),$f,JDK_INCLUDE_TARGETS))) ################################################################################ # doc files @@ -575,12 +544,7 @@ else else JRE_DOC_FILES += README endif - ifndef NO_DEMOS - JDK_DOC_FILES += demo/DEMOS_LICENSE - endif - ifndef NO_SAMPLES - JDK_DOC_FILES += sample/SAMPLES_LICENSE - endif + JDK_DOC_FILES += demo/DEMOS_LICENSE sample/SAMPLES_LICENSE JRE_DOC_LOCATION := $(JDK_TOPDIR)/src/closed/share/doc/jre JDK_DOC_LOCATION := $(JDK_TOPDIR)/src/closed/share/doc/jdk endif @@ -636,23 +600,23 @@ ALL_SOURCE_TIPS = $(shell \ fi) $(JRE_INFO_FILE): $(OUTPUT_ROOT)/spec.gmk $(OUTPUT_ROOT)/source_tips - $(ECHO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(call create-info-file) $(JDK_INFO_FILE): $(OUTPUT_ROOT)/spec.gmk $(OUTPUT_ROOT)/source_tips - $(ECHO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(call create-info-file) $(JRE_OVERLAY_INFO_FILE): $(OUTPUT_ROOT)/spec.gmk $(OUTPUT_ROOT)/source_tips - $(ECHO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(call create-info-file) $(JDK_OVERLAY_INFO_FILE): $(OUTPUT_ROOT)/spec.gmk $(OUTPUT_ROOT)/source_tips - $(ECHO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(call create-info-file) $(JDK_IMAGE_DIR)/src.zip: $(IMAGES_OUTPUTDIR)/src.zip - $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) + $(ECHO) $(LOG_INFO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(install-file) ################################################################################ @@ -661,7 +625,7 @@ $(JDK_IMAGE_DIR)/src.zip: $(IMAGES_OUTPUTDIR)/src.zip ifneq ($(POST_STRIP_CMD),) ifeq ($(OPENJDK_TARGET_OS), windows) EXEC_LIST_BIN:=$(shell $(FIND) $(JDK_OUTPUTDIR)/bin -type f -name \*.exe \ - -o -name \*.dll | $(EGREP) -v -i "$(MSVCRNN_DLL)") + -o -name \*.dll | $(EGREP) -v -i "$(MSVCR_DLL)") else # Find all executables in JDK_OUTPUTDIR since they exist when this makefile is parsed EXEC_LIST_BIN:=$(shell $(FILE) `$(FIND) $(JDK_OUTPUTDIR)/bin -type f -name \*$(EXE_SUFFIX)` \ @@ -672,6 +636,8 @@ ifneq ($(POST_STRIP_CMD),) EXEC_LIST_LIB:=$(shell $(FIND) $(JDK_OUTPUTDIR)/lib -type f -name \*$(SHARED_LIBRARY_SUFFIX)) endif endif + # Filter out sjavac + EXEC_LIST_BIN:=$(filter-out %sjavac$(EXE_SUFFIX),$(EXEC_LIST_BIN)) # Filter out the overlay specific bin files EXEC_LIST:=$(filter-out $(OVERLAY_FILTER),$(EXEC_LIST_BIN)) $(EXEC_LIST_LIB) @@ -708,7 +674,7 @@ ifneq ($(POST_STRIP_CMD),) endef define strip-file - $(ECHO) Stripping $(patsubst $(OUTPUT_ROOT)/%,%,$<) + $(ECHO) Stripping $(LOG_INFO) $(patsubst $(OUTPUT_ROOT)/%,%,$<) $(CHMOD) u+w $< $(POST_STRIP_CMD) $< $(call mcs-file) diff --git a/jdk/makefiles/Import.gmk b/jdk/makefiles/Import.gmk index 4c07307c015..76272da7368 100644 --- a/jdk/makefiles/Import.gmk +++ b/jdk/makefiles/Import.gmk @@ -125,7 +125,7 @@ define CopyDir $1_DST_FILES := $$(patsubst $2/%,$3/%,$$($1_SRC_FILES)) IMPORT_TARGET_FILES += $$($1_DST_FILES) $3/% : $2/% - $(ECHO) Copying $$(@F) + $(ECHO) $(LOG_INFO) Copying $$(@F) $(do-install-file) endef @@ -234,19 +234,14 @@ ifndef OPENJDK IMPORT_TARGET_FILES += \ $(JDK_OUTPUTDIR)/lib/security/US_export_policy.jar \ - $(JDK_OUTPUTDIR)/lib/security/local_policy.jar \ - $(JDK_OUTPUTDIR)/lib/jce.jar - -$(JDK_OUTPUTDIR)/lib/jce.jar : $(JDK_TOPDIR)/make/closed/tools/crypto/jce/jce.jar - $(ECHO) Copying $(@F) - $(install-file) + $(JDK_OUTPUTDIR)/lib/security/local_policy.jar $(JDK_OUTPUTDIR)/lib/security/local_policy.jar: $(JDK_TOPDIR)/make/closed/tools/crypto/jce/local_policy.jar - $(ECHO) Copying $(@F) + $(ECHO) $(LOG_INFO) Copying $(@F) $(install-file) $(JDK_OUTPUTDIR)/lib/security/US_export_policy.jar: $(JDK_TOPDIR)/make/closed/tools/crypto/jce/US_export_policy.jar - $(ECHO) Copying $(@F) + $(ECHO) $(LOG_INFO) Copying $(@F) $(install-file) endif # OPENJDK diff --git a/jdk/makefiles/Makefile b/jdk/makefiles/Makefile index 060a4838038..9539fe0e255 100644 --- a/jdk/makefiles/Makefile +++ b/jdk/makefiles/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,102 +23,27 @@ # questions. # -# This must be the first rule -default: all +# Locate this Makefile +ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) + makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path:=$(lastword $(MAKEFILE_LIST)) +endif +repo_dir:=$(patsubst %/makefiles/Makefile,%,$(makefile_path)) -# Inclusion of this pseudo-target will cause make to execute this file -# serially, regardless of -j. Recursively called makefiles will not be -# affected, however. This is required for correct dependency management. -.NOTPARALLEL: +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name:=$(notdir $(repo_dir)) -include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk -include NativeCompilation.gmk - -# Setup the java compilers for the JDK build. -include Setup.gmk - -# Setup the build tools. -include Tools.gmk - -import: $(BUILD_TOOLS) import-only -import-only: -# Import (corba jaxp jaxws langtools hotspot) - +$(MAKE) -f Import.gmk - -gensrc: import gensrc-only -gensrc-only: - +$(MAKE) -f GenerateJavaSources.gmk -# Ok, now gensrc is fully populated. - -gendata: gensrc gendata-only -gendata-only: - +$(MAKE) -f GenerateData.gmk - -classes: gendata classes-only -classes-only: - +$(MAKE) -f CompileJavaClasses.gmk -# The classes are now built and -# any javah files have now been generated. - -libs: classes libs-only -libs-only: - +$(MAKE) -f CompileNativeLibraries.gmk - -launchers: libs launchers-only -launchers-only: -# Finally compile the launchers. - +$(MAKE) -f CompileLaunchers.gmk - -genclasses: launchers genclasses-only -genclasses-only: -# Generate classes that have other sources. Needs -# to execute launchers. - +$(MAKE) -f GenerateClasses.gmk - -demos: genclasses demos-only -demos-only: -# Now we have a complete jdk, which you can run. -# It is not yet wrapped up as an installed image. -# The demos are compiled against this jdk. -ifndef NO_DEMOS - +$(MAKE) -f CompileDemos.gmk +# Try to locate top-level makefile +top_level_makefile:=$(repo_dir)/../common/makefiles/Makefile +ifneq ($(wildcard $(top_level_makefile)),) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) endif -samples: demos samples-only -samples-only: -# Now copy the sample sources into the jdk. -ifndef NO_SAMPLES - +$(MAKE) -f CopySamples.gmk -endif - -# The all target builds the JDK, but not the images -all: import gensrc gendata classes libs launchers genclasses demos samples - -.PHONY: all images install overlay-images import-only gensrc-only gendata-only classes-only -.PHONY: libs-only launchers-only genclasses-only demos-only samples-only - -# Create the final jdk and jre images, to be wrapped up -# into packages, or installed. -images: - +$(MAKE) -f CreateJars.gmk - +$(MAKE) -f Images.gmk - -overlay-images: - +$(MAKE) -f CompileLaunchers.gmk OVERLAY_IMAGES=true - +$(MAKE) -f Images.gmk overlay-images - -BINARIES:=$(shell if test -d $(IMAGES_OUTPUTDIR)/j2sdk-image/bin; then cd $(IMAGES_OUTPUTDIR)/j2sdk-image/bin && $(LS) ; fi) -INSTALLDIR:=openjdk-$(RELEASE) - -# Install the jdk image, in a very crude way. Not taking into -# account, how to install properly on macosx or windows etc. -install: images - echo Installing jdk image into $(INSTALL_PREFIX)/jvm/$(INSTALLDIR) - echo and creating $(words $(BINARIES)) links from $(INSTALL_PREFIX)/bin into the jdk. - $(MKDIR) -p $(INSTALL_PREFIX)/jvm/$(INSTALLDIR) - $(RM) -r $(INSTALL_PREFIX)/jvm/$(INSTALLDIR)/* - $(CP) -rp $(IMAGES_OUTPUTDIR)/j2sdk-image/* $(INSTALL_PREFIX)/jvm/$(INSTALLDIR) - $(RM) $(addprefix $(INSTALL_PREFIX)/bin/,$(BINARIES)) - $(foreach b,$(BINARIES),$(LN) -s $(INSTALL_PREFIX)/jvm/$(INSTALLDIR)/bin/$b $(INSTALL_PREFIX)/bin/$b &&) true +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) diff --git a/jdk/makefiles/Tools.gmk b/jdk/makefiles/Tools.gmk index 330875664ae..545fe3dcb8a 100644 --- a/jdk/makefiles/Tools.gmk +++ b/jdk/makefiles/Tools.gmk @@ -29,14 +29,13 @@ $(eval $(call SetupJavaCompilation,BUILD_TOOLS,\ SETUP:=GENERATE_OLDBYTECODE,\ SRC:=$(JDK_TOPDIR)/make/tools/src \ $(JDK_TOPDIR)/src/solaris/classes/sun/awt/X11/generator \ - $(JDK_TOPDIR)/makefiles/sun/xawt \ + $(JDK_TOPDIR)/makefiles/sun/awt/X11 \ + $(JDK_TOPDIR)/makefiles/sun/osxapp \ $(JDK_TOPDIR)/make/tools/swing-beans,\ BIN:=$(JDK_OUTPUTDIR)/btclasses)) endif -ifndef DISABLE_NIMBUS - $(JDK_OUTPUTDIR)/btclasses/build/tools/generatenimbus/resources/%.template : \ $(JDK_TOPDIR)/src/share/classes/javax/swing/plaf/nimbus/%.template $(MKDIR) -p $(@D) @@ -44,9 +43,6 @@ $(JDK_OUTPUTDIR)/btclasses/build/tools/generatenimbus/resources/%.template : \ BUILD_TOOLS += $(foreach i,$(wildcard $(JDK_TOPDIR)/src/share/classes/javax/swing/plaf/nimbus/*.template),$(JDK_OUTPUTDIR)/btclasses/build/tools/generatenimbus/resources/$(notdir $i)) -endif - - # Add a checksum ("jsum") to the end of a text file. Prevents trivial tampering with class lists. TOOL_ADDJSUM=$(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \ build.tools.addjsum.AddJsum @@ -121,9 +117,12 @@ TOOL_GENERATENIMBUS=$(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \ TOOL_WRAPPERGENERATOR=$(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \ WrapperGenerator -TOOL_TOBIN=$(JAVA) -Djava.awt.headless=true -cp $(JDK_OUTPUTDIR)/btclasses \ +TOOL_X11_TOBIN=$(JAVA) -Djava.awt.headless=true -cp $(JDK_OUTPUTDIR)/btclasses \ sun.awt.X11.ToBin +TOOL_OSX_TOBIN=$(JAVA) -Djava.awt.headless=true -cp $(JDK_OUTPUTDIR)/btclasses \ + sun.osxapp.ToBin + TOOL_CLDRCONVERTER=$(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \ build.tools.cldrconverter.CLDRConverter diff --git a/jdk/makefiles/docs/CORE_PKGS.gmk b/jdk/makefiles/docs/CORE_PKGS.gmk deleted file mode 100644 index e292869f951..00000000000 --- a/jdk/makefiles/docs/CORE_PKGS.gmk +++ /dev/null @@ -1,293 +0,0 @@ -# -# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# EXCLUDE_PKGS is the list of packages to exclude from the -# Java API Specification. Do not add these to CORE_PKGS. -# The concatenation of EXCLUDE_PKGS and CORE_PKGS -# should make up the list of all packages under the -# src/shared/classes directory of the JDK source tree. -# -EXCLUDE_PKGS = \ - java.awt.peer \ - java.awt.dnd.peer \ - sun.* \ - com.sun.* \ - org.apache.* \ - org.jcp.* \ - org.w3c.dom.css \ - org.w3c.dom.html \ - org.w3c.dom.stylesheets \ - org.w3c.dom.traversal \ - org.w3c.dom.ranges \ - org.w3c.dom.views \ - org.omg.stub.javax.management.remote.rmi - -# -# ACTIVE_JSR_PKGS are packages that are part of an active JSR process-- -# one that is doing its own review. These packages are not included when -# creating diff pages for the platform's JCP process. -# -# (see /java/pubs/apisrc/jdk/6.0/beta/make/docs/active_jsr_pkgs) -# Note: -# This is a list of regular expressions. So foo.* matches "foo" and "foo.bar". -# -ACTIVE_JSR_PKGS= \ - java.lang.invoke \ - java.sql \ - javax.activation \ - javax.annotation.* \ - javax.jws.* \ - javax.lang.* \ - javax.management.* \ - javax.script \ - javax.sql.* \ - javax.tools.* \ - javax.xml.* \ - org.w3c.* \ - org.xml.sax - -# -# CORE_PKGS is the list of packages that form the -# Java API Specification. -# -### ***IMPORTANT NOTE*** -### There is also a "REGEXP" variable in the docs/makefile that -### determines which table the packages go in on the main page. -### Currently, there is only table ("Platform Packages") and -### everything goes in it, so REGEXP is "*". But if that policy -### changes, packages added will need to be reflected in that -### list of wildcard expressions, as well. -### -CORE_PKGS = \ - java.applet \ - java.awt \ - java.awt.color \ - java.awt.datatransfer \ - java.awt.dnd \ - java.awt.event \ - java.awt.font \ - java.awt.geom \ - java.awt.im \ - java.awt.im.spi \ - java.awt.image \ - java.awt.image.renderable \ - java.awt.print \ - java.beans \ - java.beans.beancontext \ - java.io \ - java.lang \ - java.lang.annotation \ - java.lang.instrument \ - java.lang.invoke \ - java.lang.management \ - java.lang.ref \ - java.lang.reflect \ - java.math \ - java.net \ - java.nio \ - java.nio.channels \ - java.nio.channels.spi \ - java.nio.charset \ - java.nio.charset.spi \ - java.nio.file \ - java.nio.file.attribute \ - java.nio.file.spi \ - java.rmi \ - java.rmi.activation \ - java.rmi.dgc \ - java.rmi.registry \ - java.rmi.server \ - java.security \ - java.security.acl \ - java.security.cert \ - java.security.interfaces \ - java.security.spec \ - java.sql \ - java.text \ - java.text.spi \ - java.util \ - java.util.concurrent \ - java.util.concurrent.atomic \ - java.util.concurrent.locks \ - java.util.jar \ - java.util.logging \ - java.util.prefs \ - java.util.regex \ - java.util.spi \ - java.util.zip \ - javax.accessibility \ - javax.activation \ - javax.activity \ - javax.annotation \ - javax.annotation.processing \ - javax.crypto \ - javax.crypto.interfaces \ - javax.crypto.spec \ - javax.imageio \ - javax.imageio.event \ - javax.imageio.metadata \ - javax.imageio.plugins.jpeg \ - javax.imageio.plugins.bmp \ - javax.imageio.spi \ - javax.imageio.stream \ - javax.jws \ - javax.jws.soap \ - javax.lang.model \ - javax.lang.model.element \ - javax.lang.model.type \ - javax.lang.model.util \ - javax.management \ - javax.management.loading \ - javax.management.monitor \ - javax.management.relation \ - javax.management.openmbean \ - javax.management.timer \ - javax.management.modelmbean \ - javax.management.remote \ - javax.management.remote.rmi \ - javax.naming \ - javax.naming.directory \ - javax.naming.event \ - javax.naming.ldap \ - javax.naming.spi \ - javax.net \ - javax.net.ssl \ - javax.print \ - javax.print.attribute \ - javax.print.attribute.standard \ - javax.print.event \ - javax.rmi \ - javax.rmi.CORBA \ - javax.rmi.ssl \ - javax.script \ - javax.security.auth \ - javax.security.auth.callback \ - javax.security.auth.kerberos \ - javax.security.auth.login \ - javax.security.auth.spi \ - javax.security.auth.x500 \ - javax.security.cert \ - javax.security.sasl \ - javax.sound.sampled \ - javax.sound.sampled.spi \ - javax.sound.midi \ - javax.sound.midi.spi \ - javax.sql \ - javax.sql.rowset \ - javax.sql.rowset.serial \ - javax.sql.rowset.spi \ - javax.swing \ - javax.swing.border \ - javax.swing.colorchooser \ - javax.swing.filechooser \ - javax.swing.event \ - javax.swing.table \ - javax.swing.text \ - javax.swing.text.html \ - javax.swing.text.html.parser \ - javax.swing.text.rtf \ - javax.swing.tree \ - javax.swing.undo \ - javax.swing.plaf \ - javax.swing.plaf.basic \ - javax.swing.plaf.metal \ - javax.swing.plaf.multi \ - javax.swing.plaf.nimbus \ - javax.swing.plaf.synth \ - javax.tools \ - javax.tools.annotation \ - javax.transaction \ - javax.transaction.xa \ - javax.xml.parsers \ - javax.xml.bind \ - javax.xml.bind.annotation \ - javax.xml.bind.annotation.adapters \ - javax.xml.bind.attachment \ - javax.xml.bind.helpers \ - javax.xml.bind.util \ - javax.xml.soap \ - javax.xml.ws \ - javax.xml.ws.handler \ - javax.xml.ws.handler.soap \ - javax.xml.ws.http \ - javax.xml.ws.soap \ - javax.xml.ws.spi \ - javax.xml.ws.spi.http \ - javax.xml.ws.wsaddressing \ - javax.xml.transform \ - javax.xml.transform.sax \ - javax.xml.transform.dom \ - javax.xml.transform.stax \ - javax.xml.transform.stream \ - javax.xml \ - javax.xml.crypto \ - javax.xml.crypto.dom \ - javax.xml.crypto.dsig \ - javax.xml.crypto.dsig.dom \ - javax.xml.crypto.dsig.keyinfo \ - javax.xml.crypto.dsig.spec \ - javax.xml.datatype \ - javax.xml.validation \ - javax.xml.namespace \ - javax.xml.xpath \ - javax.xml.stream \ - javax.xml.stream.events \ - javax.xml.stream.util \ - org.ietf.jgss \ - org.omg.CORBA \ - org.omg.CORBA.DynAnyPackage \ - org.omg.CORBA.ORBPackage \ - org.omg.CORBA.TypeCodePackage \ - org.omg.stub.java.rmi \ - org.omg.CORBA.portable \ - org.omg.CORBA_2_3 \ - org.omg.CORBA_2_3.portable \ - org.omg.CosNaming \ - org.omg.CosNaming.NamingContextExtPackage \ - org.omg.CosNaming.NamingContextPackage \ - org.omg.SendingContext \ - org.omg.PortableServer \ - org.omg.PortableServer.CurrentPackage \ - org.omg.PortableServer.POAPackage \ - org.omg.PortableServer.POAManagerPackage \ - org.omg.PortableServer.ServantLocatorPackage \ - org.omg.PortableServer.portable \ - org.omg.PortableInterceptor \ - org.omg.PortableInterceptor.ORBInitInfoPackage \ - org.omg.Messaging \ - org.omg.IOP \ - org.omg.IOP.CodecFactoryPackage \ - org.omg.IOP.CodecPackage \ - org.omg.Dynamic \ - org.omg.DynamicAny \ - org.omg.DynamicAny.DynAnyPackage \ - org.omg.DynamicAny.DynAnyFactoryPackage \ - org.w3c.dom \ - org.w3c.dom.events \ - org.w3c.dom.bootstrap \ - org.w3c.dom.ls \ - org.xml.sax \ - org.xml.sax.ext \ - org.xml.sax.helpers diff --git a/jdk/makefiles/docs/Makefile b/jdk/makefiles/docs/Makefile deleted file mode 100644 index 5a395daabc5..00000000000 --- a/jdk/makefiles/docs/Makefile +++ /dev/null @@ -1,1174 +0,0 @@ -# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# Definitions for $(DOCSDIR), $(MKDIR), $(BINDIR), etc. -# -BUILDDIR=.. -PRODUCT=docs -include $(BUILDDIR)/common/Defs.gmk - -# Get CopyrightLine macro and other shared variables -include $(BUILDDIR)/common/shared/Defs-javadoc.gmk - -# Url to root of documents -DOCSDIR_URL = {@docroot}/$(GET2DOCSDIR) - -# Url to copyright html file -COPYRIGHT_URL-7 = $(DOCSDIR_URL)/legal/cpyr.html -COPYRIGHT_URL = $(COPYRIGHT_URL-$(JDK_MINOR_VERSION)) - -# Url to bug filing site -BUG_SUBMIT_URL = http://bugreport.sun.com/bugreport/ - -# Common line for how to submit a bug or rfe -BUG_SUBMIT_LINE = Submit a bug or feature - -# Url to devdocs page -# Was: http://java.sun.com/javase/6/webnotes/devdocs-vs-specs.html -DEV_DOCS_URL-5 = http://java.sun.com/j2se/1.5.0/docs/index.html -DEV_DOCS_URL-6 = http://download.oracle.com/javase/6/docs/index.html -DEV_DOCS_URL-7 = http://download.oracle.com/javase/7/docs/index.html -DEV_DOCS_URL = $(DEV_DOCS_URL-$(JDK_MINOR_VERSION)) -DOCS_BASE_URL = http://download.oracle.com/javase/7/docs - -# Url to Java Language Spec -#JLS3_URL = http://java.sun.com/docs/books/jls/ - -# Common Java trademark line -JAVA_TRADEMARK_LINE = Java is a trademark or registered trademark of \ -$(FULL_COMPANY_NAME) in the US and other countries. - -# -# Definitions for imported components -# -include $(BUILDDIR)/common/internal/ImportComponents.gmk - -# We override whatever the max VM memory setting is here. -# NOTE: javadoc will not complete without these larger settings. -# WARNING: This could cause thrashing on low memory machines. -ifeq ($(ARCH_DATA_MODEL),64) - MAX_VM_MEMORY = 1024 -else ifeq ($(ARCH),universal) - MAX_VM_MEMORY = 1024 -else - MAX_VM_MEMORY = 612 -endif - -# List of all possible directories for javadoc to look for sources -# NOTE: Quotes are required around sourcepath argument only on Windows. -# Otherwise, you get "No packages or classes specified." due -# to $(CLASSPATH_SEPARATOR) being interpreted as an end of -# command (newline or shell ; character) -ALL_SOURCE_DIRS = $(SHARE_SRC)/classes \ - $(IMPORTSRCDIR) \ - $(GENSRCDIR) \ - $(SHARE_SRC)/../solaris/classes \ - $(SHARE_SRC)/../windows/classes \ - $(SHARE_SRC)/doc/stub - -# List of directories that actually exist -ALL_EXISTING_SOURCE_DIRS := $(wildcard $(ALL_SOURCE_DIRS)) - -# List with classpath separator between them -EMPTY:= -SPACE:= $(EMPTY) $(EMPTY) -RELEASEDOCS_SOURCEPATH = \ - $(subst $(SPACE),$(CLASSPATH_SEPARATOR),$(strip $(ALL_SOURCE_DIRS))) - -# Prep for javadoc creation, assumes $@ is an index.html file -define prep-javadoc -@if [ -f "$@" -a "$?" != "" ] ; then \ - $(ECHO) "# Dependencies have changed: $?"; \ -fi -$(RM) -r $(@D) -$(MKDIR) -p $(@D) -endef - -# A cache of the directories in ALL_SOURCE_DIRS -DIRECTORY_CACHE = $(DOCSTMPDIR)/directory.cache - -# Given a list of packages, return a list of files or dirs to be dependent on -# (Currently only returning a list of directories) -define PackageDependencies # packages -$(shell \ - if [ "$1" != "" -a -f $(DIRECTORY_CACHE) ] ; then \ - for p in $1 ; do \ - pd=`$(ECHO) $${p} | $(SED) -e 's@[.]@/@g'`; \ - $(CAT) $(DIRECTORY_CACHE) | $(GREP) "/$${pd}/" ; \ - done; \ - fi \ -) -endef - -# Given a list of packages, add packages that exist to $@, print summary -define PackageFilter # packages -@if [ "$1" != "" ] ; then \ - for p in $1 ; do \ - pd=`$(ECHO) $${p} | $(SED) -e 's@[.]@/@g'`; \ - found="false"; \ - for cp in $(ALL_SOURCE_DIRS) ; do \ - if [ -d $${cp}/$${pd} ] ; then \ - $(ECHO) "$${p}" >> $@; \ - found="true"; \ - break; \ - fi; \ - done; \ - if [ "$${found}" = "false" ] ; then \ - $(ECHO) "WARNING: Package not found: $${p}"; \ - fi; \ - done; \ -fi -endef - -# Print out a summary of the javadoc command about to be run -define JavadocSummary # optionsfile packagesfile -@$(ECHO) "# Summary for $@";\ - $(ECHO) "# Options (`$(BASENAME) $1`):"; $(SED) -e 's@^@# @' $1; \ - $(ECHO) "# Packages (`$(BASENAME) $2`):";$(SED) -e 's@^@# @' $2 -endef - -# -# Temporary directory for javadoc creation -# -DOCSTMPDIR = $(TEMPDIR)/doctmp - -# -# Different api directories created from root directory -# -COREAPI_DOCSDIR = $(DOCSDIR)/api -JDK_API_DOCSDIR = $(DOCSDIR)/jdk/api -JRE_API_DOCSDIR = $(DOCSDIR)/jre/api -PLATFORM_DOCSDIR = $(DOCSDIR)/platform - -# The non-core api javadocs need to be able to access the root of the core -# api directory, so for jdk/api or jre/api to get to the core api/ -# directory we would use this: -JDKJRE2COREAPI = ../../api - -# Common bottom argument -define CommonBottom # year -
    $(call CopyrightLine,,$1,)
    -endef - -# Common trademark bottom argument (Not sure why this is used sometimes) -define CommonTrademarkBottom # year -\ -$(BUG_SUBMIT_LINE)
    $(JAVA_TRADEMARK_LINE)
    \ -$(call CopyrightLine,,$1,$(COMPANY_ADDRESS))\ -
    -endef - -# Common echo of option -define OptionOnly # opt -$(PRINTF) "%s\n" "$1" -endef -define OptionPair # opt arg -$(PRINTF) "%s '%s'\n" "$1" '$2' -endef -define OptionTrip # opt arg arg -$(PRINTF) "%s '%s' '%s'\n" "$1" '$2' '$3' -endef - -# Core api bottom argument (with special sauce) -COREAPI_BOTTOM = $(BUG_SUBMIT_LINE)\ -
    For further API reference and developer documentation, \ -see Java SE Documentation. \ -That documentation contains more detailed, developer-targeted descriptions, \ -with conceptual overviews, definitions of terms, workarounds, \ -and working code examples.
    \ -$(call CopyrightLine,$(COPYRIGHT_URL),$(FIRST_COPYRIGHT_YEAR),)\ -
    - -# Common javadoc options used by all -COMMON_JAVADOCFLAGS = \ - $(NO_PROPRIETARY_API_WARNINGS) \ - -quiet \ - -use \ - -keywords \ - $(ADDITIONAL_JAVADOCFLAGS) - -ifdef OPENJDK - ADDITIONAL_JAVADOCFLAGS = \ - -Xdocrootparent $(DOCS_BASE_URL) -else - ADDITIONAL_JAVADOCFLAGS = -endif - -# Draft used for non-fcs documents -JDK_IS_FCS = false -DRAFT_HEADER = -ifeq ($(JDK_MINOR_VERSION),5) - JDK_IS_FCS = true -endif -ifeq ($(JDK_MINOR_VERSION),6) - JDK_IS_FCS = true -endif -ifeq ($(JDK_MINOR_VERSION),7) - JDK_IS_FCS = true -endif -ifeq ($(JDK_IS_FCS),false) - ifneq ($(MILESTONE), fcs) - DRAFT_HEADER =
    DRAFT $(MILESTONE)-$(BUILD_NUMBER) - DRAFT_BOTTOM =
    DRAFT $(MILESTONE)-$(BUILD_NUMBER) - DRAFT_WINTITLE = $(BUILD_NUMBER) - # Early access top text (not used in FCS releases) - COREAPI_TOP_EARLYACCESS = \ -

    \ -
    \ -Please note that the specifications and other information \ -contained herein are not final and are subject to change. \ -The information is being made available to you solely for purpose of \ -evaluation. \ -
    - endif -endif - -################################################################# - -# -# CORE_PKGS environment variable has been moved to the following file -# -include CORE_PKGS.gmk - -# -# Load environment variables for API package names that are not part of -# the Java SE platform -# -include NON_CORE_PKGS.gmk - -################################################################# - -# -# Default target is same as docs target, create core api and all others it can -# - -all: docs -docs: coredocs otherdocs - -################################################################# -# Production Targets -- USE THESE TARGETS WHEN: -# a) You're generating docs outside of release engineering's -# standard control build. -# b) The docs will be pushed to the web and/or included in -# the downloaded doc bundle. -# -# See: Notes.html#releaseTargets -# Note: Spaces precede ifdef/ifndef indents. Tabs precede target commands (!) -# - -sanitycheckcoredocs: - @$(ECHO) "" - @$(ECHO) "Building core api docs with these values:" - @$(ECHO) " BUILD_NUMBER = $(BUILD_NUMBER)" - @$(ECHO) " MILESTONE = $(MILESTONE)" - @$(ECHO) "" - ifeq ($(BUILD_NUMBER), b00) - @$(ECHO) "ERROR: Build number must be defined" - @$(ECHO) "MILESTONE is set to $(MILESTONE)" - @$(ECHO) "" - exit 1 - endif - -############################################################# -# -# coredocs -# -COREAPI_DOCTITLE = Java$(TRADEMARK) Platform, Standard Edition \ -$(JDK_MINOR_VERSION)
    API Specification -COREAPI_WINDOWTITLE = Java Platform SE $(JDK_MINOR_VERSION) -COREAPI_HEADER = \ -Java$(TRADEMARK) Platform
    Standard Ed. $(JDK_MINOR_VERSION)
    - -# Java language specification cite -TAG_JLS = jls:a:See \ -The Java™ Language Specification: - -# Overview file for core apis -COREAPI_OVERVIEW = $(SHARE_SRC)/classes/overview-core.html - -# The index.html, options, and packages files -COREAPI_INDEX_FILE = $(COREAPI_DOCSDIR)/index.html -COREAPI_OPTIONS_FILE = $(DOCSTMPDIR)/coredocs.options -COREAPI_PACKAGES_FILE = $(DOCSTMPDIR)/coredocs.packages - -coredocs: $(COREAPI_INDEX_FILE) - -# Set relative location to core api document root -$(COREAPI_INDEX_FILE): GET2DOCSDIR=.. - -# Run javadoc if the index file is out of date or missing -$(COREAPI_INDEX_FILE): $(COREAPI_OPTIONS_FILE) $(COREAPI_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(COREAPI_OPTIONS_FILE),$(COREAPI_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(COREAPI_OPTIONS_FILE) @$(COREAPI_PACKAGES_FILE) - -# Create file with javadoc options in it -$(COREAPI_OPTIONS_FILE): $(COREAPI_OVERVIEW) - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ISO-8859-1) ; \ - $(call OptionPair,-tag,beaninfo:X) ; \ - $(call OptionPair,-tag,revised:X) ; \ - $(call OptionPair,-tag,since.unbundled:X) ; \ - $(call OptionPair,-tag,spec:X) ; \ - $(call OptionPair,-tag,specdefault:X) ; \ - $(call OptionPair,-tag,Note:X) ; \ - $(call OptionPair,-tag,ToDo:X) ; \ - $(call OptionPair,-tag,$(TAG_JLS)) ; \ - $(call OptionOnly,-splitIndex) ; \ - $(call OptionPair,-overview,$(COREAPI_OVERVIEW)) ; \ - $(call OptionPair,-doctitle,$(COREAPI_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(COREAPI_WINDOWTITLE) $(DRAFT_WINTITLE)) ;\ - $(call OptionPair,-header,$(COREAPI_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(COREAPI_BOTTOM)$(DRAFT_BOTTOM)) ; \ - ) >> $@ -ifdef COREAPI_TOP_EARLYACCESS - @$(call OptionPair,-top,$(COREAPI_TOP_EARLYACCESS)) >> $@ -endif - -# Create a file with the package names in it -$(COREAPI_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(CORE_PKGS)) - $(prep-target) - $(call PackageFilter,$(CORE_PKGS)) - -############################################################# -# -# docletapidocs -# - -# Part of langtools -ifdef LANGTOOLS_DIST - ALL_OTHER_TARGETS += docletapidocs -endif - -DOCLETAPI_DOCDIR := $(JDK_API_DOCSDIR)/javadoc/doclet -DOCLETAPI2COREAPI := ../../$(JDKJRE2COREAPI) -DOCLETAPI_DOCTITLE := Doclet API -DOCLETAPI_WINDOWTITLE := Doclet API -DOCLETAPI_HEADER := Doclet API -DOCLETAPI_BOTTOM := $(call CommonTrademarkBottom,$(DOCLETAPI_FIRST_COPYRIGHT_YEAR)) -DOCLETAPI_GROUPNAME := Packages -DOCLETAPI_REGEXP := com.sun.javadoc -# DOCLETAPI_PKGS is located in NON_CORE_PKGS.gmk - -# The index.html, options, and packages files -DOCLETAPI_INDEX_FILE = $(DOCLETAPI_DOCDIR)/index.html -DOCLETAPI_OPTIONS_FILE = $(DOCSTMPDIR)/docletapi.options -DOCLETAPI_PACKAGES_FILE = $(DOCSTMPDIR)/docletapi.packages - -docletapidocs: $(DOCLETAPI_INDEX_FILE) - -# Set relative location to core api document root -$(DOCLETAPI_INDEX_FILE): GET2DOCSDIR=$(DOCLETAPI2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(DOCLETAPI_INDEX_FILE): $(DOCLETAPI_OPTIONS_FILE) $(DOCLETAPI_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(DOCLETAPI_OPTIONS_FILE),$(DOCLETAPI_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(DOCLETAPI_OPTIONS_FILE) @$(DOCLETAPI_PACKAGES_FILE) - -# Create file with javadoc options in it -$(DOCLETAPI_OPTIONS_FILE): - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-breakiterator) ; \ - $(call OptionPair,-doctitle,$(DOCLETAPI_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(DOCLETAPI_WINDOWTITLE) $(DRAFT_WINTITLE));\ - $(call OptionPair,-header,$(DOCLETAPI_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(DOCLETAPI_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-group,$(DOCLETAPI_GROUPNAME),$(DOCLETAPI_REGEXP)); \ - $(call OptionTrip,-linkoffline,$(DOCLETAPI2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(DOCLETAPI_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(DOCLETAPI_PKGS)) - $(prep-target) - $(call PackageFilter,$(DOCLETAPI_PKGS)) - -############################################################# -# -# tagletapidocs -# - -# Part of langtools -ifdef LANGTOOLS_DIST - ALL_OTHER_TARGETS += tagletapidocs -endif - -TAGLETAPI_DOCDIR := $(JDK_API_DOCSDIR)/javadoc/taglet -TAGLETAPI2COREAPI := ../../$(JDKJRE2COREAPI) -TAGLETAPI_BOTTOM := $(call CommonTrademarkBottom,$(TAGLETAPI_FIRST_COPYRIGHT_YEAR)) -# TAGLETAPI_FILE is located in NON_CORE_PKGS.gmk - -# Temporary directory (special generation rules) -TAGLETAPI_TEMPDIR = $(DOCSTMPDIR)/taglets_temp - -# The index.html, options, and packages files -TAGLETAPI_INDEX_FILE = $(TAGLETAPI_DOCDIR)/index.html -TAGLETAPI_OPTIONS_FILE = $(DOCSTMPDIR)/tagletapi.options -TAGLETAPI_PACKAGES_FILE = $(DOCSTMPDIR)/tagletapi.packages - -tagletapidocs: $(TAGLETAPI_INDEX_FILE) - -# Set relative location to core api document root -$(TAGLETAPI_INDEX_FILE): GET2DOCSDIR=$(TAGLETAPI2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(TAGLETAPI_INDEX_FILE): $(TAGLETAPI_OPTIONS_FILE) $(TAGLETAPI_PACKAGES_FILE) - $(prep-javadoc) - $(RM) -r $(TAGLETAPI_TEMPDIR) - $(MKDIR) -p $(TAGLETAPI_TEMPDIR) - $(call JavadocSummary,$(TAGLETAPI_OPTIONS_FILE),$(TAGLETAPI_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(TAGLETAPI_TEMPDIR) \ - @$(TAGLETAPI_OPTIONS_FILE) @$(TAGLETAPI_PACKAGES_FILE) - cp -r $(TAGLETAPI_TEMPDIR)/com $(@D) - cp $(TAGLETAPI_TEMPDIR)/stylesheet.css $(@D) - $(RM) -r $(TAGLETAPI_TEMPDIR) - -# Create file with javadoc options in it -$(TAGLETAPI_OPTIONS_FILE): - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-nonavbar) ; \ - $(call OptionOnly,-noindex) ; \ - $(call OptionPair,-bottom,$(TAGLETAPI_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-linkoffline,$(TAGLETAPI2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(TAGLETAPI_PACKAGES_FILE): $(IMPORTSRCDIR)/$(TAGLETAPI_FILE) - $(prep-target) - @($(ECHO) "$(IMPORTSRCDIR)/$(TAGLETAPI_FILE)" ) > $@ - -############################################################# -# -# domapidocs -# - -ALL_OTHER_TARGETS += domapidocs - -DOMAPI_DOCDIR := $(JRE_API_DOCSDIR)/plugin/dom -DOMAPI2COREAPI := ../../$(JDKJRE2COREAPI) -DOMAPI_DOCTITLE := Common DOM API -DOMAPI_WINDOWTITLE := Common DOM API -DOMAPI_HEADER := Common DOM API -DOMAPI_BOTTOM := $(call CommonTrademarkBottom,$(DOMAPI_FIRST_COPYRIGHT_YEAR)) -DOMAPI_GROUPNAME := Packages -DOMAPI_REGEXP := com.sun.java.browser.dom:org.w3c.dom* -# DOMAPI_PKGS is located in NON_CORE_PKGS.gmk - -# The index.html, options, and packages files -DOMAPI_INDEX_FILE = $(DOMAPI_DOCDIR)/index.html -DOMAPI_OPTIONS_FILE = $(DOCSTMPDIR)/domapi.options -DOMAPI_PACKAGES_FILE = $(DOCSTMPDIR)/domapi.packages - -domapidocs: $(DOMAPI_INDEX_FILE) - -# Set relative location to core api document root -$(DOMAPI_INDEX_FILE): GET2DOCSDIR=$(DOMAPI2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(DOMAPI_INDEX_FILE): $(DOMAPI_OPTIONS_FILE) $(DOMAPI_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(DOMAPI_OPTIONS_FILE),$(DOMAPI_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(DOMAPI_OPTIONS_FILE) @$(DOMAPI_PACKAGES_FILE) - -# Create file with javadoc options in it -$(DOMAPI_OPTIONS_FILE): - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-splitIndex) ; \ - $(call OptionPair,-doctitle,$(DOMAPI_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(DOMAPI_WINDOWTITLE) $(DRAFT_WINTITLE));\ - $(call OptionPair,-header,$(DOMAPI_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(DOMAPI_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-group,$(DOMAPI_GROUPNAME),$(DOMAPI_REGEXP)); \ - $(call OptionTrip,-linkoffline,$(DOMAPI2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(DOMAPI_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(DOMAPI_PKGS)) - $(prep-target) - $(call PackageFilter,$(DOMAPI_PKGS)) - -############################################################# -# -# jpdadocs -# - -ALL_OTHER_TARGETS += jpdadocs - -jpdadocs: jdidocs jdwpdocs jvmtidocs - -############################################################# -# -# jdidocs -# - -ALL_OTHER_TARGETS += jdidocs - -JDI_DOCDIR := $(JDK_API_DOCSDIR)/jpda/jdi -JDI2COREAPI := ../../$(JDKJRE2COREAPI) -JDI_DOCTITLE := Java$(TRADEMARK) Debug Interface -JDI_WINDOWTITLE := Java Debug Interface -JDI_HEADER := Java Debug Interface -JDI_BOTTOM := $(call CommonBottom,$(JDI_FIRST_COPYRIGHT_YEAR)) -JDI_OVERVIEW := $(SHARE_SRC)/classes/jdi-overview.html -# JDI_PKGS is located in NON_CORE_PKGS.gmk - -# The index.html, options, and packages files -JDI_INDEX_FILE = $(JDI_DOCDIR)/index.html -JDI_OPTIONS_FILE = $(DOCSTMPDIR)/jdi.options -JDI_PACKAGES_FILE = $(DOCSTMPDIR)/jdi.packages - -jdidocs: $(JDI_INDEX_FILE) - -# Set relative location to core api document root -$(JDI_INDEX_FILE): GET2DOCSDIR=$(JDI2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(JDI_INDEX_FILE): $(JDI_OPTIONS_FILE) $(JDI_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(JDI_OPTIONS_FILE),$(JDI_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(JDI_OPTIONS_FILE) @$(JDI_PACKAGES_FILE) - -# Create file with javadoc options in it -$(JDI_OPTIONS_FILE): $(JDI_OVERVIEW) - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionPair,-overview,$(JDI_OVERVIEW)) ; \ - $(call OptionPair,-doctitle,$(JDI_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(JDI_WINDOWTITLE) $(DRAFT_WINTITLE)); \ - $(call OptionPair,-header,$(JDI_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(JDI_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-linkoffline,$(JDI2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(JDI_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(JDI_PKGS)) - $(prep-target) - $(call PackageFilter,$(JDI_PKGS)) - -############################################################# -# -# jdwpdocs -# - -ALL_OTHER_TARGETS += jdwpdocs - -JDWP_DOCDIR = $(PLATFORM_DOCSDIR)/jpda/jdwp -JDWP_SPEC = $(BUILDDIR)/jpda/jdwp/jdwp.spec - -jdwpdocs: $(JDWP_DOCDIR)/jdwp-protocol.html -$(JDWP_DOCDIR)/jdwp-protocol.html: $(BUILD_TOOLS) $(JDWP_SPEC) - $(prep-javadoc) - $(TOOL_JDWPGEN) $(JDWP_SPEC) -doc $@ - -############################################################# -# -# jvmtidocs -# - -ALL_OTHER_TARGETS += jvmtidocs - -JVMTI_DOCDIR = $(PLATFORM_DOCSDIR)/jvmti -JVMTI_HTML = $(HOTSPOT_DOCS_IMPORT_PATH)/platform/jvmti/jvmti.html - -jvmtidocs: $(JVMTI_DOCDIR)/jvmti.html -$(JVMTI_DOCDIR)/jvmti.html: - @$(prep-javadoc) - @if [ -f $(JVMTI_HTML) ] ; then \ - $(ECHO) "$(CP) $(JVMTI_HTML) $@"; \ - $(CP) $(JVMTI_HTML) $@; \ - else \ - $(ECHO) "WARNING: Generated file does not exist: $(JVMTI_HTML)"; \ - fi - -############################################################# -# -# jaasdocs -# - -ALL_OTHER_TARGETS += jaasdocs - -JAAS_DOCDIR := $(JRE_API_DOCSDIR)/security/jaas/spec -JAAS2COREAPI := ../../../$(JDKJRE2COREAPI) -JAAS_DOCTITLE := Java$(TRADEMARK) Authentication and Authorization Service -JAAS_WINDOWTITLE := Java Authentication and Authorization Service -JAAS_HEADER := Java Authentication and Authorization Service -JAAS_BOTTOM := $(call CommonBottom,$(JAAS_FIRST_COPYRIGHT_YEAR)) -# JAAS_PKGS is located in NON_CORE_PKGS.gmk -JAAS_OVERVIEW := $(SHARE_SRC)/classes/com/sun/security/auth/jaas-overview.html - -# The index.html, options, and packages files -JAAS_INDEX_FILE = $(JAAS_DOCDIR)/index.html -JAAS_OPTIONS_FILE = $(DOCSTMPDIR)/jaas.options -JAAS_PACKAGES_FILE = $(DOCSTMPDIR)/jaas.packages - -jaasdocs: $(JAAS_INDEX_FILE) - -# Set relative location to core api document root -$(JAAS_INDEX_FILE): GET2DOCSDIR=$(JAAS2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(JAAS_INDEX_FILE): $(JAAS_OPTIONS_FILE) $(JAAS_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(JAAS_OPTIONS_FILE),$(JAAS_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(JAAS_OPTIONS_FILE) @$(JAAS_PACKAGES_FILE) - -# Create file with javadoc options in it -$(JAAS_OPTIONS_FILE): $(JAAS_OVERVIEW) - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionPair,-overview,$(JAAS_OVERVIEW)) ; \ - $(call OptionPair,-doctitle,$(JAAS_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(JAAS_WINDOWTITLE) $(DRAFT_WINTITLE)); \ - $(call OptionPair,-header,$(JAAS_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(JAAS_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-linkoffline,$(JAAS2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(JAAS_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(JAAS_PKGS)) - $(prep-target) - $(call PackageFilter,$(JAAS_PKGS)) - -############################################################# -# -# jgssdocs -# - -ALL_OTHER_TARGETS += jgssdocs - -JGSS_DOCDIR := $(JRE_API_DOCSDIR)/security/jgss/spec -JGSS2COREAPI := ../../../$(JDKJRE2COREAPI) -JGSS_DOCTITLE := Java$(TRADEMARK) GSS-API Utilities -JGSS_WINDOWTITLE := Java GSS-API Utilities -JGSS_HEADER := Java GSS-API Utilities -JGSS_BOTTOM := $(call CommonBottom,$(JGSS_FIRST_COPYRIGHT_YEAR)) -JGSS_OVERVIEW := $(SHARE_SRC)/classes/com/sun/security/jgss/jgss-overview.html -# JGSS_PKGS is located in NON_CORE_PKGS.gmk - -# The index.html, options, and packages files -JGSS_INDEX_FILE = $(JGSS_DOCDIR)/index.html -JGSS_OPTIONS_FILE = $(DOCSTMPDIR)/jgss.options -JGSS_PACKAGES_FILE = $(DOCSTMPDIR)/jgss.packages - -jgssdocs: $(JGSS_INDEX_FILE) - -# Set relative location to core api document root -$(JGSS_INDEX_FILE): GET2DOCSDIR=$(JGSS2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(JGSS_INDEX_FILE): $(JGSS_OPTIONS_FILE) $(JGSS_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(JGSS_OPTIONS_FILE),$(JGSS_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(JGSS_OPTIONS_FILE) @$(JGSS_PACKAGES_FILE) - -# Create file with javadoc options in it -$(JGSS_OPTIONS_FILE): $(JGSS_OVERVIEW) - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-nodeprecatedlist) ; \ - $(call OptionPair,-overview,$(JGSS_OVERVIEW)) ; \ - $(call OptionPair,-doctitle,$(JGSS_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(JGSS_WINDOWTITLE) $(DRAFT_WINTITLE)); \ - $(call OptionPair,-header,$(JGSS_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(JGSS_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-linkoffline,$(JGSS2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(JGSS_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(JGSS_PKGS)) - $(prep-target) - $(call PackageFilter,$(JGSS_PKGS)) - -############################################################# -# -# smartcardiodocs -# - -ALL_OTHER_TARGETS += smartcardiodocs - -SMARTCARDIO_DOCDIR := $(JRE_API_DOCSDIR)/security/smartcardio/spec -SMARTCARDIO2COREAPI := ../../../$(JDKJRE2COREAPI) -SMARTCARDIO_DOCTITLE := Java$(TRADEMARK) Smart Card I/O -SMARTCARDIO_WINDOWTITLE := Java Smart Card I/O -SMARTCARDIO_HEADER := Java Smart Card I/O -SMARTCARDIO_BOTTOM := $(call CommonBottom,$(SMARTCARDIO_FIRST_COPYRIGHT_YEAR)) -# SMARTCARDIO_PKGS is located in NON_CORE_PKGS.gmk - -# The index.html, options, and packages files -SMARTCARDIO_INDEX_FILE = $(SMARTCARDIO_DOCDIR)/index.html -SMARTCARDIO_OPTIONS_FILE = $(DOCSTMPDIR)/smartcardio.options -SMARTCARDIO_PACKAGES_FILE = $(DOCSTMPDIR)/smartcardio.packages - -smartcardiodocs: $(SMARTCARDIO_INDEX_FILE) - -# Set relative location to core api document root -$(SMARTCARDIO_INDEX_FILE): GET2DOCSDIR=$(SMARTCARDIO2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(SMARTCARDIO_INDEX_FILE): $(SMARTCARDIO_OPTIONS_FILE) $(SMARTCARDIO_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(SMARTCARDIO_OPTIONS_FILE),$(SMARTCARDIO_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(SMARTCARDIO_OPTIONS_FILE) @$(SMARTCARDIO_PACKAGES_FILE) - -# Create file with javadoc options in it -$(SMARTCARDIO_OPTIONS_FILE): - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-nodeprecatedlist) ; \ - $(call OptionPair,-doctitle,$(SMARTCARDIO_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(SMARTCARDIO_WINDOWTITLE) $(DRAFT_WINTITLE));\ - $(call OptionPair,-header,$(SMARTCARDIO_HEADER)$(DRAFT_HEADER)); \ - $(call OptionPair,-bottom,$(SMARTCARDIO_BOTTOM)$(DRAFT_BOTTOM)); \ - $(call OptionTrip,-linkoffline,$(SMARTCARDIO2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(SMARTCARDIO_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(SMARTCARDIO_PKGS)) - $(prep-target) - $(call PackageFilter,$(SMARTCARDIO_PKGS)) - -############################################################# -# -# httpserverdocs -# - -ALL_OTHER_TARGETS += httpserverdocs - -HTTPSERVER_DOCDIR := $(JRE_API_DOCSDIR)/net/httpserver/spec -HTTPSERVER2COREAPI := ../../../$(JDKJRE2COREAPI) -HTTPSERVER_DOCTITLE := Java$(TRADEMARK) HTTP Server -HTTPSERVER_WINDOWTITLE := Java HTTP Server -HTTPSERVER_HEADER := Java HTTP Server -HTTPSERVER_BOTTOM := $(call CommonBottom,$(HTTPSERVER_FIRST_COPYRIGHT_YEAR)) -# HTTPSERVER_PKGS is located in NON_CORE_PKGS.gmk - -HTTPSERVER_INDEX_HTML = $(HTTPSERVER_DOCDIR)/index.html -HTTPSERVER_OPTIONS_FILE = $(DOCSTMPDIR)/httpserver.options -HTTPSERVER_PACKAGES_FILE = $(DOCSTMPDIR)/httpserver.packages - -httpserverdocs: $(HTTPSERVER_INDEX_HTML) - -# Set relative location to core api document root -$(HTTPSERVER_INDEX_HTML): GET2DOCSDIR=$(HTTPSERVER2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(HTTPSERVER_INDEX_HTML): $(HTTPSERVER_OPTIONS_FILE) $(HTTPSERVER_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(HTTPSERVER_OPTIONS_FILE),$(HTTPSERVER_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(HTTPSERVER_OPTIONS_FILE) @$(HTTPSERVER_PACKAGES_FILE) - -# Create file with javadoc options in it -$(HTTPSERVER_OPTIONS_FILE): - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-nodeprecatedlist) ; \ - $(call OptionPair,-doctitle,$(HTTPSERVER_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(HTTPSERVER_WINDOWTITLE) $(DRAFT_WINTITLE));\ - $(call OptionPair,-header,$(HTTPSERVER_HEADER)$(DRAFT_HEADER)); \ - $(call OptionPair,-bottom,$(HTTPSERVER_BOTTOM)$(DRAFT_BOTTOM)); \ - $(call OptionTrip,-linkoffline,$(HTTPSERVER2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(HTTPSERVER_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(HTTPSERVER_PKGS)) - $(prep-target) - $(call PackageFilter,$(HTTPSERVER_PKGS)) - -############################################################# -# -# mgmtdocs -# - -ALL_OTHER_TARGETS += mgmtdocs - -MGMT_DOCDIR := $(JRE_API_DOCSDIR)/management/extension -MGMT2COREAPI := ../../$(JDKJRE2COREAPI) -JVM_MIB_NAME := JVM-MANAGEMENT-MIB.mib -JVM_MIB_SRC := $(CLOSED_SRC)/share/classes/sun/management/snmp/$(JVM_MIB_NAME) -MGMT_DOCTITLE := Monitoring and Management Interface for the Java$(TRADEMARK) Platform -MGMT_WINDOWTITLE := Monitoring and Management Interface for the Java Platform -MGMT_HEADER := Monitoring and Management Interface for the Java Platform -MGMT_BOTTOM := $(call CommonBottom,$(MGMT_FIRST_COPYRIGHT_YEAR)) -MGMT_OVERVIEW := $(SHARE_SRC)/classes/com/sun/management/mgmt-overview.html -# MGMT_PKGS is located in NON_CORE_PKGS.gmk - -# The index.html, options, and packages files -MGMT_INDEX_FILE = $(MGMT_DOCDIR)/index.html -MGMT_OPTIONS_FILE = $(DOCSTMPDIR)/mgmt.options -MGMT_PACKAGES_FILE = $(DOCSTMPDIR)/mgmt.packages - -mgmtdocs: $(MGMT_INDEX_FILE) - -# Set relative location to core api document root -$(MGMT_INDEX_FILE): GET2DOCSDIR=$(MGMT2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(MGMT_INDEX_FILE): $(MGMT_OPTIONS_FILE) $(MGMT_PACKAGES_FILE) - $(prep-javadoc) - @if [ -f $(JVM_MIB_SRC) ] ; then \ - $(ECHO) "$(CP) $(JVM_MIB_SRC) $(@D)/.."; \ - $(CP) $(JVM_MIB_SRC) $(@D)/.. ; \ - else \ - $(ECHO) "WARNING: File $(JVM_MIB_NAME) not available."; \ - fi - $(call JavadocSummary,$(MGMT_OPTIONS_FILE),$(MGMT_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(MGMT_OPTIONS_FILE) @$(MGMT_PACKAGES_FILE) - -# Create file with javadoc options in it -$(MGMT_OPTIONS_FILE): $(MGMT_OVERVIEW) - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-nodeprecatedlist) ; \ - $(call OptionPair,-overview,$(MGMT_OVERVIEW)) ; \ - $(call OptionPair,-doctitle,$(MGMT_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(MGMT_WINDOWTITLE) $(DRAFT_WINTITLE)); \ - $(call OptionPair,-header,$(MGMT_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(MGMT_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-linkoffline,$(MGMT2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(MGMT_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(MGMT_PKGS)) - $(prep-target) - $(call PackageFilter,$(MGMT_PKGS)) - -############################################################# -# -# attachdocs -# - -ALL_OTHER_TARGETS += attachdocs - -ATTACH_DOCDIR := $(JDK_API_DOCSDIR)/attach/spec -ATTACH2COREAPI := ../../$(JDKJRE2COREAPI) -ATTACH_DOCTITLE := Attach API -ATTACH_WINDOWTITLE := Attach API -ATTACH_HEADER := Attach API -ATTACH_BOTTOM := $(call CommonBottom,$(ATTACH_FIRST_COPYRIGHT_YEAR)) -# ATTACH_PKGS is located in NON_CORE_PKGS.gmk - -ATTACH_INDEX_HTML = $(ATTACH_DOCDIR)/index.html -ATTACH_OPTIONS_FILE = $(DOCSTMPDIR)/attach.options -ATTACH_PACKAGES_FILE = $(DOCSTMPDIR)/attach.packages - -attachdocs: $(ATTACH_INDEX_HTML) - -# Set relative location to core api document root -$(ATTACH_INDEX_HTML): GET2DOCSDIR=$(ATTACH2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(ATTACH_INDEX_HTML): $(ATTACH_OPTIONS_FILE) $(ATTACH_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(ATTACH_OPTIONS_FILE),$(ATTACH_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(ATTACH_OPTIONS_FILE) @$(ATTACH_PACKAGES_FILE) - -# Create file with javadoc options in it -$(ATTACH_OPTIONS_FILE): - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-nodeprecatedlist) ; \ - $(call OptionPair,-doctitle,$(ATTACH_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(ATTACH_WINDOWTITLE) $(DRAFT_WINTITLE));\ - $(call OptionPair,-header,$(ATTACH_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(ATTACH_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-linkoffline,$(ATTACH2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(ATTACH_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(ATTACH_PKGS)) - $(prep-target) - $(call PackageFilter,$(ATTACH_PKGS)) - -############################################################# -# -# jconsoledocs -# - -ALL_OTHER_TARGETS += jconsoledocs - -JCONSOLE_DOCDIR := $(JDK_API_DOCSDIR)/jconsole/spec -JCONSOLE2COREAPI := ../../$(JDKJRE2COREAPI) -JCONSOLE_DOCTITLE := JConsole API -JCONSOLE_WINDOWTITLE := JConsole API -JCONSOLE_HEADER := JConsole API -JCONSOLE_BOTTOM := $(call CommonBottom,$(JCONSOLE_FIRST_COPYRIGHT_YEAR)) -# JCONSOLE_PKGS is located in NON_CORE_PKGS.gmk - -JCONSOLE_INDEX_HTML = $(JCONSOLE_DOCDIR)/index.html -JCONSOLE_OPTIONS_FILE = $(DOCSTMPDIR)/jconsole.options -JCONSOLE_PACKAGES_FILE = $(DOCSTMPDIR)/jconsole.packages - -jconsoledocs: $(JCONSOLE_INDEX_HTML) - -# Set relative location to core api document root -$(JCONSOLE_INDEX_HTML): GET2DOCSDIR=$(JCONSOLE2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(JCONSOLE_INDEX_HTML): $(JCONSOLE_OPTIONS_FILE) $(JCONSOLE_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(JCONSOLE_OPTIONS_FILE),$(JCONSOLE_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(JCONSOLE_OPTIONS_FILE) @$(JCONSOLE_PACKAGES_FILE) - -# Create file with javadoc options in it -$(JCONSOLE_OPTIONS_FILE): - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-nodeprecatedlist) ; \ - $(call OptionPair,-doctitle,$(JCONSOLE_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(JCONSOLE_WINDOWTITLE) $(DRAFT_WINTITLE));\ - $(call OptionPair,-header,$(JCONSOLE_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(JCONSOLE_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-linkoffline,$(JCONSOLE2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(JCONSOLE_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(JCONSOLE_PKGS)) - $(prep-target) - $(call PackageFilter,$(JCONSOLE_PKGS)) - -############################################################# -# -# treeapidocs -# - -# Part of langtools -ifdef LANGTOOLS_DIST - ALL_OTHER_TARGETS += treeapidocs -endif - -TREEAPI_DOCDIR := $(JDK_API_DOCSDIR)/javac/tree -TREEAPI2COREAPI := ../../$(JDKJRE2COREAPI) -TREEAPI_DOCTITLE := Compiler Tree API -TREEAPI_WINDOWTITLE := Compiler Tree API -TREEAPI_HEADER := Compiler Tree API -TREEAPI_BOTTOM := $(call CommonBottom,$(TREEAPI_FIRST_COPYRIGHT_YEAR)) -TREEAPI_GROUPNAME := Packages -TREEAPI_REGEXP := com.sun.source.* -# TREEAPI_PKGS is located in NON_CORE_PKGS.gmk - -TREEAPI_INDEX_HTML = $(TREEAPI_DOCDIR)/index.html -TREEAPI_OPTIONS_FILE = $(DOCSTMPDIR)/treeapi.options -TREEAPI_PACKAGES_FILE = $(DOCSTMPDIR)/treeapi.packages - -treeapidocs: $(TREEAPI_INDEX_HTML) - -# Set relative location to core api document root -$(TREEAPI_INDEX_HTML): GET2DOCSDIR=$(TREEAPI2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(TREEAPI_INDEX_HTML): $(TREEAPI_OPTIONS_FILE) $(TREEAPI_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(TREEAPI_OPTIONS_FILE),$(TREEAPI_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(TREEAPI_OPTIONS_FILE) @$(TREEAPI_PACKAGES_FILE) - -# Create file with javadoc options in it -$(TREEAPI_OPTIONS_FILE): - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionPair,-doctitle,$(TREEAPI_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(TREEAPI_WINDOWTITLE) $(DRAFT_WINTITLE));\ - $(call OptionPair,-header,$(TREEAPI_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-tag,$(TAG_JLS)) ; \ - $(call OptionPair,-bottom,$(TREEAPI_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-group,$(TREEAPI_GROUPNAME),$(TREEAPI_REGEXP)); \ - $(call OptionTrip,-linkoffline,$(TREEAPI2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(TREEAPI_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(TREEAPI_PKGS)) - $(prep-target) - $(call PackageFilter,$(TREEAPI_PKGS)) - -############################################################# -# -# sctpdocs -# - -ALL_OTHER_TARGETS += sctpdocs - -SCTPAPI_DOCDIR := $(JRE_API_DOCSDIR)/nio/sctp/spec -SCTPAPI2COREAPI := ../../../$(JDKJRE2COREAPI) -SCTPAPI_DOCTITLE := SCTP API -SCTPAPI_WINDOWTITLE := SCTP API -SCTPAPI_HEADER := SCTP API -SCTPAPI_BOTTOM := $(call CommonBottom,$(SCTPAPI_FIRST_COPYRIGHT_YEAR)) -# SCTPAPI_PKGS is located in NON_CORE_PKGS.gmk - -SCTPAPI_INDEX_HTML = $(SCTPAPI_DOCDIR)/index.html -SCTPAPI_OPTIONS_FILE = $(DOCSTMPDIR)/sctp.options -SCTPAPI_PACKAGES_FILE = $(DOCSTMPDIR)/sctp.packages - -sctpdocs: $(SCTPAPI_INDEX_HTML) - -# Set relative location to core api document root -$(SCTSCTSCTP: GET2DOCSDIR=$(SCTPAPI2COREAPI)/.. - -# Run javadoc if the index file is out of date or missing -$(SCTPAPI_INDEX_HTML): $(SCTPAPI_OPTIONS_FILE) $(SCTPAPI_PACKAGES_FILE) - $(prep-javadoc) - $(call JavadocSummary,$(SCTPAPI_OPTIONS_FILE),$(SCTPAPI_PACKAGES_FILE)) - $(JAVADOC_CMD) $(JAVADOC_VM_MEMORY_FLAGS) -d $(@D) \ - @$(SCTPAPI_OPTIONS_FILE) @$(SCTPAPI_PACKAGES_FILE) - -# Create file with javadoc options in it -$(SCTPAPI_OPTIONS_FILE): - $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ - $(call OptionPair,-encoding,ascii) ; \ - $(call OptionOnly,-nodeprecatedlist) ; \ - $(call OptionPair,-doctitle,$(SCTPAPI_DOCTITLE)) ; \ - $(call OptionPair,-windowtitle,$(SCTPAPI_WINDOWTITLE) $(DRAFT_WINTITLE));\ - $(call OptionPair,-header,$(SCTPAPI_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-bottom,$(SCTPAPI_BOTTOM)$(DRAFT_BOTTOM)) ; \ - $(call OptionTrip,-linkoffline,$(SCTPAPI2COREAPI),$(COREAPI_DOCSDIR)/); \ - ) >> $@ - -# Create a file with the package names in it -$(SCTPAPI_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(SCTPAPI_PKGS)) - $(prep-target) - $(call PackageFilter,$(SCTPAPI_PKGS)) - -############################################################# -# -# Get a cache of all the directories - -$(DIRECTORY_CACHE): $(ALL_EXISTING_SOURCE_DIRS) - $(prep-target) - @for cp in $(ALL_EXISTING_SOURCE_DIRS) ; do \ - $(ECHO) "$(FIND) $${cp} -type f >> $@"; \ - $(FIND) $${cp} -type f >> $@; \ - done - -############################################################# -#release version of core packages ######## -# Maximize performance and ensure that build number & milestone are set. - -rel-coredocs: sanitycheckcoredocs - $(MAKE) coredocs - -rel-docs: rel-coredocs $(ALL_OTHER_TARGETS) -# -# end of production targets - -otherdocs: $(ALL_OTHER_TARGETS) - -clean: - $(RM) -r $(DOCSDIR) $(DOCSTMPDIR) - -############################################################# -# DEBUG TARGET -# List the values defined in the makefile hierarchy, to make sure everything -# is set properly, and to help identify values we can use instead of making new ones. -# (Most of them come from common/shared/Defs.gmk) -# -# Notes: -# * BUILD_NUMBER defaults to b00 if not set on command line with BUILD_NUMBER= -# * MILESTONE defaults to internal unless set to beta, rc, or fcs on command line -# - -echovalues: - @$(ECHO) "" - @$(ECHO) --------------Imports--------------------------- - @$(ECHO) "IMPORT_PACKAGES = $(IMPORT_PACKAGES)" - @$(ECHO) "IMPORT_PACKAGE_FILTER = $(IMPORT_PACKAGE_FILTER)" - @$(ECHO) --------------Imports--------------------------- - @$(ECHO) "" - @$(ECHO) --------------Shared--------------------------- - @$(ECHO) BUILD_NUMBER = $(BUILD_NUMBER) - @$(ECHO) FULL_VERSION = $(FULL_VERSION) - @$(ECHO) JDK_VERSION = $(JDK_VERSION) - @$(ECHO) JDK_MAJOR_VERSION = $(JDK_MAJOR_VERSION) - @$(ECHO) JDK_MINOR_VERSION = $(JDK_MINOR_VERSION) - @$(ECHO) JDK_MICRO_VERSION = $(JDK_MICRO_VERSION) - @$(ECHO) JDK_UPDATE_VERSION = $(JDK_UPDATE_VERSION) - @$(ECHO) JDK_MKTG_VERSION = $(JDK_MKTG_VERSION) - @$(ECHO) JDK_UNDERSCORE_VERSION = $(JDK_UNDERSCORE_VERSION) - @$(ECHO) JDK_MKTG_UNDERSCORE_VERSION = $(JDK_MKTG_UNDERSCORE_VERSION) - @$(ECHO) MARKETING_NUMBER = $(MARKETING_NUMBER) - @$(ECHO) MARKET_NAME = $(MARKET_NAME) - @$(ECHO) MILESTONE = $(MILESTONE) - @$(ECHO) RELEASE = $(RELEASE) - @$(ECHO) USER_RELEASE_SUFFIX = $(USER_RELEASE_SUFFIX) - @$(ECHO) --------------Shared--------------------------- - @$(ECHO) "" - @$(ECHO) --------------common/Defs--------------------------- - @$(ECHO) "RELEASEDOCS_SOURCEPATH" - @$(ECHO) " SHARE_SRC/classes: $(SHARE_SRC)/classes" - @$(ECHO) " PLATFORM_SRC/classes: $(PLATFORM_SRC)/classes" - @$(ECHO) " GENSRCDIR: $(GENSRCDIR)" - @$(ECHO) " SHARE_SRC/doc/stub: $(SHARE_SRC)/doc/stub" - @$(ECHO) " IMPORTSRCDIR: $(IMPORTSRCDIR)" - @$(ECHO) --------------common/Defs--------------------------- - @$(ECHO) "" - -############################################################# -.PHONY: all docs coredocs rel-docs echovalues otherdocs rel-coredocs \ - sanitycheckcoredocs $(ALL_OTHER_TARGETS) - diff --git a/jdk/makefiles/docs/NON_CORE_PKGS.gmk b/jdk/makefiles/docs/NON_CORE_PKGS.gmk deleted file mode 100644 index b68208b3370..00000000000 --- a/jdk/makefiles/docs/NON_CORE_PKGS.gmk +++ /dev/null @@ -1,104 +0,0 @@ -# -# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# This file contains the package names of all the "non-core" -# API published in the Java 2 SDK documentation. "Non-core" means -# it includes all published API outside of the JDK API specification. -# -# These environment variables are used by javadoc in -# make/docs/Makefile and are referenced by the localization -# team when determining which APIs to extract javadoc -# comments from. - -DOMAPI_PKGS = com.sun.java.browser.dom \ - org.w3c.dom \ - org.w3c.dom.bootstrap \ - org.w3c.dom.ls \ - org.w3c.dom.ranges \ - org.w3c.dom.traversal \ - org.w3c.dom.html \ - org.w3c.dom.stylesheets \ - org.w3c.dom.css \ - org.w3c.dom.events \ - org.w3c.dom.views - -JDI_PKGS = com.sun.jdi \ - com.sun.jdi.event \ - com.sun.jdi.request \ - com.sun.jdi.connect \ - com.sun.jdi.connect.spi - -MGMT_PKGS = com.sun.management - -JAAS_PKGS = com.sun.security.auth \ - com.sun.security.auth.callback \ - com.sun.security.auth.login \ - com.sun.security.auth.module - -JGSS_PKGS = com.sun.security.jgss - -OLD_JSSE_PKGS = com.sun.net.ssl - -HTTPSERVER_PKGS = com.sun.net.httpserver \ - com.sun.net.httpserver.spi - -NIO_PKGS = com.sun.nio.file - -DOCLETAPI_PKGS = com.sun.javadoc - -TAGLETAPI_FILE = com/sun/tools/doclets/Taglet.java - -ATTACH_PKGS = com.sun.tools.attach \ - com.sun.tools.attach.spi - -JCONSOLE_PKGS = com.sun.tools.jconsole - -TREEAPI_PKGS = com.sun.source.tree \ - com.sun.source.util - -SMARTCARDIO_PKGS = javax.smartcardio - -SCTPAPI_PKGS = com.sun.nio.sctp - -ifeq ($(PLATFORM), macosx) -APPLE_EXT_PKGS = com.apple.concurrent \ - com.apple.eawt \ - com.apple.eawt.event \ - com.apple.eio -endif - -# non-core packages in rt.jar -NON_CORE_PKGS = $(DOMAPI_PKGS) \ - $(MGMT_PKGS) \ - $(JAAS_PKGS) \ - $(JGSS_PKGS) \ - $(NIO_PKGS) \ - $(OLD_JSSE_PKGS) \ - $(HTTPSERVER_PKGS) \ - $(SMARTCARDIO_PKGS) \ - $(SCTPAPI_PKGS) \ - $(APPLE_EXT_PKGS) - diff --git a/jdk/makefiles/docs/Notes.html b/jdk/makefiles/docs/Notes.html deleted file mode 100644 index e3d8ae1f26b..00000000000 --- a/jdk/makefiles/docs/Notes.html +++ /dev/null @@ -1,49 +0,0 @@ - - - -Doc Process Notes - - - - -


    -REGEXP

    -

    REGEXP is a list of wildcard patterns that determines which packages listed - in CORE_PKGS.gmk go into which summary-table on the main API index page. It - was motivated by the need to divide the world into "core packages" - (java.*) and "extension packages" (javax.*). In time, the distinction - went away. The whole table is now called "Platform Packages"--which - eliminated the need for this list of regular expressions. But it lingered on, - accreting all of the packages in the JVM, one by one. I pruned it back to "*", - so it now covers every package in the Java platform API docs. If some separation - is needed in the future, it can grow back into a colon-separated list, starting - with this, which is in all respects equivalent to "*" at this point - in time:

    -
    -
    REGEXP = "java.*:javax.*:org.ietf*:org.omg.
    -
    -


    - Release Targets

    -

    (Thanks to Kelly O'Hair for this info.)

    -

    The rel-coredocs and rel-docs targets were added by Eric - Armstrong. rel-coredocs assumes the kind of large, 32-bit machine used - in the javapubs group's docs-release process. It specifies memory settings accordingly - to maximize performance.

    -

    The performance settings, like the sanity check, are most important for the - core docs--the platform APIs. Running javadoc on those APIs takes a significant - amount of time and memory. Setting the initial heap size as large as possible - is important to prevent thrashing as the heap grows. Setting the maximum as - large as necessary is also important to keep the job from failing.

    -
    -

    -J-Xmx512 sets a maximum of 512, which became necessary in 6.0
    - -J-Xms256 sets starting size to 256 (default is 8)

    -
    -

    rel-coredocs also includes a sanity check to help ensure that BUILD_NUMBER - and MILESTONE are specified properly when docs are built outside of - the normal release engineering process, with the intention of releasing them - on the web or in a downloaded docs bundle. (When invoked in release engineering's - control build, the values are always set properly. But when the targets are - run by themselves, they default to b00 and "internal"--which silently - sabotage the result of a build that can take many hours to complete.

    - - diff --git a/jdk/makefiles/mapfiles/launchers/mapfile-amd64 b/jdk/makefiles/mapfiles/launchers/mapfile-amd64 deleted file mode 100644 index 760fcc1a90a..00000000000 --- a/jdk/makefiles/mapfiles/launchers/mapfile-amd64 +++ /dev/null @@ -1,39 +0,0 @@ -# -# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# -# Specify what global symbols we export. Note that we're not really -# interested in declaring a version, simply scoping the file is sufficient. -# - -SUNWprivate_1.1 { - global: - main; # Provides basic adb symbol offsets - environ; # Public symbols and required by Java run time - _environ; - __environ_lock; - - local: - *; -}; diff --git a/jdk/makefiles/mapfiles/launchers/mapfile-i586 b/jdk/makefiles/mapfiles/launchers/mapfile-i586 deleted file mode 100644 index 48061dd8e90..00000000000 --- a/jdk/makefiles/mapfiles/launchers/mapfile-i586 +++ /dev/null @@ -1,48 +0,0 @@ -# -# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# -# Specify what global symbols we export. Note that we're not really -# interested in declaring a version, simply scoping the file is sufficient. -# - -SUNWprivate_1.1 { - global: - main; # Provides basic adb symbol offsets - environ; # Public symbols and required by Java run time - _environ; - __environ_lock; - ___Argv; # The following are private, but as they are - _start; # exported from ctr1/crtn, the clever hacker - _init; # might know about them. However note, that - _fini; # their use is strictly not supported. - _lib_version; -# _mcount; - __fsr; - __fsr_init_value; - __longdouble_used; - - local: - *; -}; diff --git a/jdk/makefiles/mapfiles/libawt_headless/reorder-i586 b/jdk/makefiles/mapfiles/libawt_headless/reorder-i586 deleted file mode 100644 index 84e923b586a..00000000000 --- a/jdk/makefiles/mapfiles/libawt_headless/reorder-i586 +++ /dev/null @@ -1 +0,0 @@ -# Temporary file for headless diff --git a/jdk/makefiles/mapfiles/libjava/reorder-i586 b/jdk/makefiles/mapfiles/libjava/reorder-i586 deleted file mode 100644 index deb78fb9799..00000000000 --- a/jdk/makefiles/mapfiles/libjava/reorder-i586 +++ /dev/null @@ -1,109 +0,0 @@ -data = R0x2000; -text = LOAD ?RXO; -# Test Null -text: .text%_init; -text: .text%init64IO: OUTPUTDIR/UnixFileSystem_md.o; -text: .text%JNI_OnLoad; -text: .text%Canonicalize; -text: .text%canonicalize; -text: .text%collapse: OUTPUTDIR/canonicalize_md.o; -text: .text%Java_java_lang_Object_registerNatives; -text: .text%Java_java_lang_System_registerNatives; -text: .text%Java_java_lang_Thread_registerNatives; -text: .text%Java_java_security_AccessController_getStackAccessControlContext; -text: .text%Java_java_security_AccessController_getInheritedAccessControlContext; -text: .text%Java_java_lang_ClassLoader_registerNatives; -text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2; -text: .text%Java_java_lang_Class_registerNatives; -text: .text%Java_java_lang_Class_getPrimitiveClass; -text: .text%Java_java_lang_System_initProperties; -text: .text%GetJavaProperties; -text: .text%uname: OUTPUTDIR/java_props_md.o; -text: .text%mapLookup: OUTPUTDIR/java_props_md.o; -text: .text%setPathEnvironment: OUTPUTDIR/java_props_md.o; -text: .text%JNU_NewStringPlatform; -text: .text%JNU_CallStaticMethodByName; -text: .text%NewStringPlatform; -text: .text%Java_java_io_FileInputStream_initIDs; -text: .text%Java_java_io_FileDescriptor_initIDs; -text: .text%Java_java_io_FileOutputStream_initIDs; -text: .text%Java_java_lang_System_setIn0; -text: .text%Java_sun_reflect_Reflection_getCallerClass; -text: .text%Java_java_lang_Class_forName0; -text: .text%Java_java_lang_String_intern; -text: .text%Java_sun_reflect_NativeConstructorAccessorImpl_newInstance0; -text: .text%Java_java_lang_Throwable_fillInStackTrace; -text: .text%Java_java_lang_System_setOut0; -text: .text%Java_java_lang_System_setErr0; -text: .text%Java_java_lang_Compiler_registerNatives; -text: .text%Java_java_io_FileSystem_getFileSystem; -text: .text%JNU_NewObjectByName; -text: .text%Java_java_io_UnixFileSystem_initIDs; -text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2; -text: .text%Java_java_io_UnixFileSystem_list; -text: .text%JNU_GetStringPlatformChars; -text: .text%JNU_ReleaseStringPlatformChars; -text: .text%JNU_ClassString; -text: .text%JNU_CopyObjectArray; -text: .text%Java_java_io_UnixFileSystem_canonicalize; -text: .text%Java_java_io_UnixFileSystem_getBooleanAttributes0; -text: .text%Java_java_lang_ClassLoader_findLoadedClass; -text: .text%Java_java_lang_ClassLoader_findBootstrapClass; -text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2Ljava_security_AccessControlContext_2; -text: .text%Java_java_lang_System_mapLibraryName; -text: .text%cpchars: OUTPUTDIR/System.o; -text: .text%Java_java_lang_ClassLoader_00024NativeLibrary_load; -text: .text%Java_java_lang_ClassLoader_00024NativeLibrary_find; -text: .text%Java_java_lang_Float_floatToIntBits; -text: .text%Java_java_lang_Double_doubleToLongBits; -text: .text%Java_java_io_FileInputStream_open; -text: .text%fileOpen; -text: .text%Java_java_io_UnixFileSystem_getLength; -text: .text%Java_java_io_FileInputStream_readBytes; -text: .text%readBytes; -text: .text%Java_java_io_FileInputStream_close0; -text: .text%Java_java_lang_Object_getClass; -text: .text%Java_java_lang_ClassLoader_defineClass0; -text: .text%VerifyClassCodes; -# Test Exit -text: .text%Java_java_lang_Shutdown_halt; -# Test Hello -text: .text%Java_java_io_FileOutputStream_writeBytes; -text: .text%writeBytes; -# Test Sleep -# Test IntToString -# Test LoadToolkit -text: .text%Java_java_util_ResourceBundle_getClassContext; -text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2Ljava_security_AccessControlContext_2; -text: .text%JNU_GetEnv; -text: .text%Java_java_io_UnixFileSystem_checkAccess; -text: .text%Java_sun_reflect_NativeMethodAccessorImpl_invoke0; -text: .text%Java_java_lang_ref_Finalizer_invokeFinalizeMethod; -text: .text%Java_java_io_FileInputStream_available; -text: .text%Java_java_lang_reflect_Array_newArray; -text: .text%Java_java_lang_Throwable_getStackTraceDepth; -text: .text%Java_java_lang_Throwable_getStackTraceElement; -text: .text%Java_java_lang_System_identityHashCode; -text: .text%Java_sun_misc_Signal_findSignal; -text: .text%Java_sun_misc_Signal_handle0; -text: .text%JNU_NotifyAll; -# Test LoadFrame -text: .text%JNU_CallMethodByName; -text: .text%JNU_CallMethodByNameV; -text: .text%Java_java_util_logging_FileHandler_lockFile; -text: .text%Java_java_io_FileOutputStream_open; -text: .text%Java_java_io_UnixFileSystem_createDirectory; -text: .text%Java_java_io_UnixFileSystem_getLastModifiedTime; -text: .text%Java_java_util_prefs_FileSystemPreferences_lockFile0; -text: .text%Java_java_io_UnixFileSystem_setLastModifiedTime; -text: .text%Java_java_util_prefs_FileSystemPreferences_unlockFile0; -text: .text%Java_java_io_FileOutputStream_close0; -text: .text%Java_java_util_logging_FileHandler_unlockFile; -# Test LoadJFrame -text: .text%Java_java_lang_Class_isAssignableFrom; -text: .text%Java_java_lang_Class_isInstance; -# Test JHello -# SwingSet -text: .text%Java_java_util_TimeZone_getSystemTimeZoneID; -text: .text%findJavaTZ_md; -text: .text%Java_java_lang_StrictMath_log; diff --git a/jdk/makefiles/mapfiles/libjpeg/reorder-i586 b/jdk/makefiles/mapfiles/libjpeg/reorder-i586 deleted file mode 100644 index 328c6dcd782..00000000000 --- a/jdk/makefiles/mapfiles/libjpeg/reorder-i586 +++ /dev/null @@ -1,119 +0,0 @@ -data = R0x2000; -text = LOAD ?RXO; -# Test Null -# Test Exit -# Test Hello -# Test Sleep -# Test IntToString -# Test LoadToolkit -# Test LoadFrame -# Test LoadJFrame -# Test JHello -# SwingSet -text: .text%JNI_OnLoad; -text: .text%Java_sun_awt_image_JPEGImageDecoder_initIDs; -text: .text%Java_sun_awt_image_JPEGImageDecoder_readImage; -text: .text%jStdError; -text: .text%jCreaDecompress; -text: .text%jIMemMgr; -text: .text%jMemInit; -text: .text%jGetSmall; -text: .text%jIMReader; -text: .text%alloc_small: OUTPUTDIR/jmemmgr.o; -text: .text%reset_marker_reader: OUTPUTDIR/jdmarker.o; -text: .text%jIInCtlr; -# text: .text%GET_ARRAYS: OUTPUTDIR/jpegdecoder.o; -text: .text%jReadHeader; -text: .text%jConsumeInput; -text: .text%reset_input_controller: OUTPUTDIR/jdinput.o; -text: .text%reset_error_mgr: OUTPUTDIR/jerror.o; -text: .text%sun_jpeg_init_source; -text: .text%consume_markers: OUTPUTDIR/jdinput.o; -text: .text%read_markers: OUTPUTDIR/jdmarker.o; -# text: .text%first_marker: OUTPUTDIR/jdmarker.o; -text: .text%sun_jpeg_fill_input_buffer; -# text: .text%RELEASE_ARRAYS: OUTPUTDIR/jpegdecoder.o; -# text: .text%get_soi: OUTPUTDIR/jdmarker.o; -text: .text%emit_message: OUTPUTDIR/jerror.o; -# text: .text%next_marker: OUTPUTDIR/jdmarker.o; -text: .text%get_interesting_appn: OUTPUTDIR/jdmarker.o; -# text: .text%examine_app0: OUTPUTDIR/jdmarker.o; -text: .text%skip_variable: OUTPUTDIR/jdmarker.o; -text: .text%sun_jpeg_skip_input_data; -# text: .text%examine_app14: OUTPUTDIR/jdmarker.o; -text: .text%get_dqt: OUTPUTDIR/jdmarker.o; -text: .text%jAlcQTable; -text: .text%get_sof: OUTPUTDIR/jdmarker.o; -# text: .text%get_dri: OUTPUTDIR/jdmarker.o; -text: .text%get_dht: OUTPUTDIR/jdmarker.o; -text: .text%jAlcHTable; -text: .text%get_sos: OUTPUTDIR/jdmarker.o; -# text: .text%initial_setup: OUTPUTDIR/jdinput.o; -text: .text%jDivRound; -# text: .text%default_decompress_parms: OUTPUTDIR/jdapimin.o; -text: .text%jHasMultScn; -text: .text%jStrtDecompress; -text: .text%jIDMaster; -# text: .text%master_selection: OUTPUTDIR/jdmaster.o; -text: .text%jCalcDimensions; -# text: .text%use_merged_upsample: OUTPUTDIR/jdmaster.o; -# text: .text%prepare_range_limit_table: OUTPUTDIR/jdmaster.o; -text: .text%jIDColor; -# text: .text%build_ycc_rgb_table: OUTPUTDIR/jdcolor.o; -text: .text%jIUpsampler; -text: .text%jRound; -text: .text%alloc_sarray: OUTPUTDIR/jmemmgr.o; -text: .text%alloc_large: OUTPUTDIR/jmemmgr.o; -text: .text%jGetLarge; -text: .text%jIDPostC; -text: .text%jIIDCT; -text: .text%jIHDecoder; -text: .text%jIDCoefC; -text: .text%jIDMainC; -# text: .text%alloc_funny_pointers: OUTPUTDIR/jdmainct.o; -text: .text%realize_virt_arrays: OUTPUTDIR/jmemmgr.o; -text: .text%start_input_pass: OUTPUTDIR/jdinput.o; -# text: .text%per_scan_setup: OUTPUTDIR/jdinput.o; -# text: .text%latch_quant_tables: OUTPUTDIR/jdinput.o; -text: .text%start_pass_huff_decoder: OUTPUTDIR/jdhuff.o; -text: .text%jMkDDerived; -text: .text%start_input_pass: OUTPUTDIR/jdcoefct.o; -# text: .text%start_iMCU_row: OUTPUTDIR/jdcoefct.o; -# text: .text%output_pass_setup: OUTPUTDIR/jdapistd.o; -text: .text%prepare_for_output_pass: OUTPUTDIR/jdmaster.o; -text: .text%start_pass: OUTPUTDIR/jddctmgr.o; -text: .text%start_output_pass: OUTPUTDIR/jdcoefct.o; -text: .text%start_pass_dcolor: OUTPUTDIR/jdcolor.o; -text: .text%start_pass_upsample: OUTPUTDIR/jdsample.o; -text: .text%start_pass_dpost: OUTPUTDIR/jdpostct.o; -text: .text%start_pass_main: OUTPUTDIR/jdmainct.o; -# text: .text%make_funny_pointers: OUTPUTDIR/jdmainct.o; -text: .text%jReadScanlines; -text: .text%process_data_context_main: OUTPUTDIR/jdmainct.o; -text: .text%decompress_onepass: OUTPUTDIR/jdcoefct.o; -text: .text%jZeroFar; -text: .text%decode_mcu: OUTPUTDIR/jdhuff.o; -text: .text%jFilBitBuf; -text: .text%jHufDecode; -text: .text%jRDislow; -text: .text%sep_upsample: OUTPUTDIR/jdsample.o; -text: .text%fullsize_upsample: OUTPUTDIR/jdsample.o; -text: .text%h2v2_fancy_upsample: OUTPUTDIR/jdsample.o; -text: .text%ycc_rgb_convert: OUTPUTDIR/jdcolor.o; -# text: .text%set_wraparound_pointers: OUTPUTDIR/jdmainct.o; -# text: .text%process_restart: OUTPUTDIR/jdhuff.o; -text: .text%read_restart_marker: OUTPUTDIR/jdmarker.o; -text: .text%finish_input_pass: OUTPUTDIR/jdinput.o; -# text: .text%set_bottom_pointers: OUTPUTDIR/jdmainct.o; -text: .text%jFinDecompress; -text: .text%finish_output_pass: OUTPUTDIR/jdmaster.o; -text: .text%sun_jpeg_term_source; -text: .text%jAbort; -text: .text%free_pool: OUTPUTDIR/jmemmgr.o; -text: .text%jFreeLarge; -text: .text%jFreeSmall; -text: .text%jDestDecompress; -text: .text%jDestroy; -text: .text%self_destruct: OUTPUTDIR/jmemmgr.o; -text: .text%jMemTerm; -text: .text%process_data_simple_main: OUTPUTDIR/jdmainct.o; diff --git a/jdk/makefiles/mapfiles/libnio/mapfile-bsd b/jdk/makefiles/mapfiles/libnio/mapfile-bsd deleted file mode 100644 index b3f50fffef4..00000000000 --- a/jdk/makefiles/mapfiles/libnio/mapfile-bsd +++ /dev/null @@ -1,179 +0,0 @@ -# -# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -SUNWprivate_1.1 { - global: - Java_java_nio_MappedByteBuffer_force0; - Java_java_nio_MappedByteBuffer_isLoaded0; - Java_java_nio_MappedByteBuffer_load0; - Java_sun_nio_ch_DatagramChannelImpl_disconnect0; - Java_sun_nio_ch_DatagramChannelImpl_initIDs; - Java_sun_nio_ch_DatagramChannelImpl_receive0; - Java_sun_nio_ch_DatagramChannelImpl_send0; - Java_sun_nio_ch_DatagramDispatcher_read0; - Java_sun_nio_ch_DatagramDispatcher_readv0; - Java_sun_nio_ch_DatagramDispatcher_write0; - Java_sun_nio_ch_DatagramDispatcher_writev0; - Java_sun_nio_ch_FileChannelImpl_close0; - Java_sun_nio_ch_FileChannelImpl_initIDs; - Java_sun_nio_ch_FileChannelImpl_map0; - Java_sun_nio_ch_FileChannelImpl_position0; - Java_sun_nio_ch_FileChannelImpl_transferTo0; - Java_sun_nio_ch_FileChannelImpl_unmap0; - Java_sun_nio_ch_FileDispatcherImpl_close0; - Java_sun_nio_ch_FileDispatcherImpl_closeIntFD; - Java_sun_nio_ch_FileDispatcherImpl_force0; - Java_sun_nio_ch_FileDispatcherImpl_init; - Java_sun_nio_ch_FileDispatcherImpl_lock0; - Java_sun_nio_ch_FileDispatcherImpl_preClose0; - Java_sun_nio_ch_FileDispatcherImpl_pread0; - Java_sun_nio_ch_FileDispatcherImpl_pwrite0; - Java_sun_nio_ch_FileDispatcherImpl_read0; - Java_sun_nio_ch_FileDispatcherImpl_readv0; - Java_sun_nio_ch_FileDispatcherImpl_release0; - Java_sun_nio_ch_FileDispatcherImpl_size0; - Java_sun_nio_ch_FileDispatcherImpl_truncate0; - Java_sun_nio_ch_FileDispatcherImpl_write0; - Java_sun_nio_ch_FileDispatcherImpl_writev0; - Java_sun_nio_ch_FileKey_init; - Java_sun_nio_ch_FileKey_initIDs; - Java_sun_nio_ch_InheritedChannel_close0; - Java_sun_nio_ch_InheritedChannel_dup; - Java_sun_nio_ch_InheritedChannel_dup2; - Java_sun_nio_ch_InheritedChannel_open0; - Java_sun_nio_ch_InheritedChannel_peerAddress0; - Java_sun_nio_ch_InheritedChannel_peerPort0; - Java_sun_nio_ch_InheritedChannel_soType0; - Java_sun_nio_ch_IOUtil_configureBlocking; - Java_sun_nio_ch_IOUtil_drain; - Java_sun_nio_ch_IOUtil_fdVal; - Java_sun_nio_ch_IOUtil_initIDs; - Java_sun_nio_ch_IOUtil_makePipe; - Java_sun_nio_ch_IOUtil_randomBytes; - Java_sun_nio_ch_IOUtil_setfdVal; - Java_sun_nio_ch_KQueue_kqueue; - Java_sun_nio_ch_KQueue_keventRegister; - Java_sun_nio_ch_KQueue_keventPoll; - Java_sun_nio_ch_KQueue_keventSize; - Java_sun_nio_ch_KQueue_identOffset; - Java_sun_nio_ch_KQueue_filterOffset; - Java_sun_nio_ch_KQueue_flagsOffset; - Java_sun_nio_ch_KQueuePort_socketpair; - Java_sun_nio_ch_KQueuePort_interrupt; - Java_sun_nio_ch_KQueuePort_drain1; - Java_sun_nio_ch_KQueuePort_close0; - Java_sun_nio_ch_NativeThread_current; - Java_sun_nio_ch_NativeThread_init; - Java_sun_nio_ch_NativeThread_signal; - Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0; - Java_sun_nio_ch_Net_canJoin6WithIPv4Group0; - Java_sun_nio_ch_Net_socket0; - Java_sun_nio_ch_Net_bind0; - Java_sun_nio_ch_Net_connect0; - Java_sun_nio_ch_Net_listen; - Java_sun_nio_ch_Net_localPort; - Java_sun_nio_ch_Net_localInetAddress; - Java_sun_nio_ch_Net_getIntOption0; - Java_sun_nio_ch_Net_setIntOption0; - Java_sun_nio_ch_Net_initIDs; - Java_sun_nio_ch_Net_isIPv6Available0; - Java_sun_nio_ch_Net_joinOrDrop4; - Java_sun_nio_ch_Net_blockOrUnblock4; - Java_sun_nio_ch_Net_joinOrDrop6; - Java_sun_nio_ch_Net_blockOrUnblock6; - Java_sun_nio_ch_Net_setInterface4; - Java_sun_nio_ch_Net_getInterface4; - Java_sun_nio_ch_Net_setInterface6; - Java_sun_nio_ch_Net_getInterface6; - Java_sun_nio_ch_Net_shutdown; - Java_sun_nio_ch_PollArrayWrapper_interrupt; - Java_sun_nio_ch_PollArrayWrapper_poll0; - Java_sun_nio_ch_ServerSocketChannelImpl_accept0; - Java_sun_nio_ch_ServerSocketChannelImpl_initIDs; - Java_sun_nio_ch_SocketChannelImpl_checkConnect; - Java_sun_nio_ch_SocketChannelImpl_sendOutOfBandData; - Java_sun_nio_ch_UnixAsynchronousServerSocketChannelImpl_accept0; - Java_sun_nio_ch_UnixAsynchronousServerSocketChannelImpl_initIDs; - Java_sun_nio_ch_UnixAsynchronousSocketChannelImpl_checkConnect; - Java_sun_nio_fs_BsdNativeDispatcher_initIDs; - Java_sun_nio_fs_BsdNativeDispatcher_getfsstat; - Java_sun_nio_fs_BsdNativeDispatcher_fsstatEntry; - Java_sun_nio_fs_BsdNativeDispatcher_endfsstat; - Java_sun_nio_fs_GnomeFileTypeDetector_initializeGio; - Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGio; - Java_sun_nio_fs_GnomeFileTypeDetector_initializeGnomeVfs; - Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGnomeVfs; - Java_sun_nio_fs_UnixNativeDispatcher_init; - Java_sun_nio_fs_UnixNativeDispatcher_getcwd; - Java_sun_nio_fs_UnixNativeDispatcher_strerror; - Java_sun_nio_fs_UnixNativeDispatcher_dup; - Java_sun_nio_fs_UnixNativeDispatcher_access0; - Java_sun_nio_fs_UnixNativeDispatcher_stat0; - Java_sun_nio_fs_UnixNativeDispatcher_lstat0; - Java_sun_nio_fs_UnixNativeDispatcher_fstat; - Java_sun_nio_fs_UnixNativeDispatcher_fstatat0; - Java_sun_nio_fs_UnixNativeDispatcher_chmod0; - Java_sun_nio_fs_UnixNativeDispatcher_fchmod; - Java_sun_nio_fs_UnixNativeDispatcher_chown0; - Java_sun_nio_fs_UnixNativeDispatcher_lchown0; - Java_sun_nio_fs_UnixNativeDispatcher_fchown; - Java_sun_nio_fs_UnixNativeDispatcher_utimes0; - Java_sun_nio_fs_UnixNativeDispatcher_futimes; - Java_sun_nio_fs_UnixNativeDispatcher_open0; - Java_sun_nio_fs_UnixNativeDispatcher_openat0; - Java_sun_nio_fs_UnixNativeDispatcher_close; - Java_sun_nio_fs_UnixNativeDispatcher_read; - Java_sun_nio_fs_UnixNativeDispatcher_write; - Java_sun_nio_fs_UnixNativeDispatcher_fopen0; - Java_sun_nio_fs_UnixNativeDispatcher_fclose; - Java_sun_nio_fs_UnixNativeDispatcher_opendir0; - Java_sun_nio_fs_UnixNativeDispatcher_fdopendir; - Java_sun_nio_fs_UnixNativeDispatcher_readdir; - Java_sun_nio_fs_UnixNativeDispatcher_closedir; - Java_sun_nio_fs_UnixNativeDispatcher_link0; - Java_sun_nio_fs_UnixNativeDispatcher_unlink0; - Java_sun_nio_fs_UnixNativeDispatcher_unlinkat0; - Java_sun_nio_fs_UnixNativeDispatcher_rename0; - Java_sun_nio_fs_UnixNativeDispatcher_renameat0; - Java_sun_nio_fs_UnixNativeDispatcher_mkdir0; - Java_sun_nio_fs_UnixNativeDispatcher_rmdir0; - Java_sun_nio_fs_UnixNativeDispatcher_symlink0; - Java_sun_nio_fs_UnixNativeDispatcher_readlink0; - Java_sun_nio_fs_UnixNativeDispatcher_realpath0; - Java_sun_nio_fs_UnixNativeDispatcher_statvfs0; - Java_sun_nio_fs_UnixNativeDispatcher_pathconf0; - Java_sun_nio_fs_UnixNativeDispatcher_fpathconf; - Java_sun_nio_fs_UnixNativeDispatcher_mknod0; - Java_sun_nio_fs_UnixNativeDispatcher_getpwuid; - Java_sun_nio_fs_UnixNativeDispatcher_getgrgid; - Java_sun_nio_fs_UnixNativeDispatcher_getpwnam0; - Java_sun_nio_fs_UnixNativeDispatcher_getgrnam0; - Java_sun_nio_fs_UnixNativeDispatcher_getextmntent; - Java_sun_nio_fs_UnixCopyFile_transfer; - handleSocketError; - - local: - *; -}; diff --git a/jdk/makefiles/mapfiles/libnio/reorder-i586 b/jdk/makefiles/mapfiles/libnio/reorder-i586 deleted file mode 100644 index b1ef113c1d9..00000000000 --- a/jdk/makefiles/mapfiles/libnio/reorder-i586 +++ /dev/null @@ -1,17 +0,0 @@ -data = R0x2000; -text = LOAD ?RXO; -# Test Null -# Test Exit -# Test Hello -# Test Sleep -# Test IntToString -# Test LoadToolkit -text: .text%Java_sun_nio_ch_FileChannelImpl_initIDs; -text: .text%Java_sun_nio_ch_FileDispatcher_initIDs; -text: .text%Java_sun_nio_ch_IOUtil_initIDs; -text: .text%Java_sun_nio_ch_FileDispatcher_read0; -text: .text%convertReturnVal; -# Test LoadFrame -# Test LoadJFrame -# Test JHello -# SwingSet diff --git a/jdk/makefiles/mapfiles/libverify/reorder-i586 b/jdk/makefiles/mapfiles/libverify/reorder-i586 deleted file mode 100644 index 72f02543150..00000000000 --- a/jdk/makefiles/mapfiles/libverify/reorder-i586 +++ /dev/null @@ -1,40 +0,0 @@ -data = R0x2000; -text = LOAD ?RXO; -# Test Null -text: .text%VerifyFixClassname; -text: .text%VerifyClassname; -text: .text%skip_over_fieldname: OUTPUTDIR/check_format.o; -text: .text%skip_over_field_signature: OUTPUTDIR/check_format.o; -text: .text%VerifyClass; -text: .text%make_class_info_from_name: OUTPUTDIR/check_code.o; -text: .text%class_name_to_ID: OUTPUTDIR/check_code.o; -text: .text%make_class_info: OUTPUTDIR/check_code.o; -text: .text%free_block: OUTPUTDIR/check_code.o; -text: .text%verify_method: OUTPUTDIR/check_code.o; -text: .text%verify_opcode_operands: OUTPUTDIR/check_code.o; -text: .text%initialize_dataflow: OUTPUTDIR/check_code.o; -text: .text%signature_to_fieldtype: OUTPUTDIR/check_code.o; -text: .text%check_register_values: OUTPUTDIR/check_code.o; -text: .text%pop_stack: OUTPUTDIR/check_code.o; -text: .text%update_registers: OUTPUTDIR/check_code.o; -text: .text%push_stack: OUTPUTDIR/check_code.o; -text: .text%merge_into_successors: OUTPUTDIR/check_code.o; -text: .text%cp_index_to_class_fullinfo: OUTPUTDIR/check_code.o; -text: .text%set_protected: OUTPUTDIR/check_code.o; -text: .text%merge_into_one_successor: OUTPUTDIR/check_code.o; -text: .text%merge_registers: OUTPUTDIR/check_code.o; -# Test Exit -# Test Hello -text: .text%merge_fullinfo_types: OUTPUTDIR/check_code.o; -text: .text%isAssignableTo: OUTPUTDIR/check_code.o; -# Test Sleep -text: .text%isLegalTarget: OUTPUTDIR/check_code.o; -text: .text%verify_constant_pool_type: OUTPUTDIR/check_code.o; -# Test IntToString -# Test LoadToolkit -# Test LoadFrame -# Test LoadJFrame -# Test JHello -# SwingSet -text: .text%copy_stack: OUTPUTDIR/check_code.o; -text: .text%ntohl: OUTPUTDIR/check_code.o; diff --git a/jdk/makefiles/mapfiles/libzip/reorder-i586 b/jdk/makefiles/mapfiles/libzip/reorder-i586 deleted file mode 100644 index 16bc0de9367..00000000000 --- a/jdk/makefiles/mapfiles/libzip/reorder-i586 +++ /dev/null @@ -1,49 +0,0 @@ -data = R0x2000; -text = LOAD ?RXO; -# Test Null -text: .text%ZIP_Open; -text: .text%ZIP_Open_Generic; -text: .text%InitializeZip; -text: .text%allocZip; -text: .text%readCEN: OUTPUTDIR/zip_util.o; -text: .text%findEND: OUTPUTDIR/zip_util.o; -text: .text%hash: OUTPUTDIR/zip_util.o; -text: .text%isMetaName: OUTPUTDIR/zip_util.o; -text: .text%addMetaName: OUTPUTDIR/zip_util.o; -text: .text%ZIP_FindEntry; -text: .text%ZIP_GetEntry; -text: .text%ZIP_Lock; -text: .text%readLOC: OUTPUTDIR/zip_util.o; -text: .text%ZIP_Unlock; -text: .text%ZIP_FreeEntry; -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_ZipFile_freeEntry; -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_; -text: .text%zcalloc; -text: .text%inflateReset; -text: .text%Java_java_util_zip_Inflater_inflateBytes; -text: .text%inflate; -text: .text%Java_java_util_zip_ZipFile_read; -text: .text%ZIP_Read; -text: .text%huft_build: OUTPUTDIR/inftrees.o; -text: .text%zcfree; -text: .text%Java_java_util_jar_JarFile_getMetaInfEntryNames; -text: .text%ZIP_ReadEntry; -text: .text%InflateFully; -text: .text%inflateEnd; -text: .text%Java_java_util_zip_Inflater_reset; -text: .text%Java_java_util_zip_ZipFile_close; -text: .text%ZIP_Close; -text: .text%Java_java_util_zip_Inflater_end; diff --git a/jdk/makefiles/sun/xawt/ToBin.java b/jdk/makefiles/sun/awt/X11/ToBin.java similarity index 100% rename from jdk/makefiles/sun/xawt/ToBin.java rename to jdk/makefiles/sun/awt/X11/ToBin.java diff --git a/jdk/makefiles/sun/osxapp/ToBin.java b/jdk/makefiles/sun/osxapp/ToBin.java new file mode 100644 index 00000000000..9fdcba32b79 --- /dev/null +++ b/jdk/makefiles/sun/osxapp/ToBin.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.osxapp; + +import java.io.*; + +public class ToBin { + public static void main(String[] args) throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + int nRead; + byte[] data = new byte[4096]; + + while ((nRead = System.in.read(data, 0, data.length)) != -1) { + baos.write(data, 0, nRead); + } + + baos.flush(); + + byte[] buf = baos.toByteArray(); + for (int i = 0; i < buf.length; i++) { + System.out.print(String.format("0x%1$02X", buf[i]) + ", "); + if (i % 20 == 0) { + System.out.println(); + } + } + } +} From c15035bb7fc5e228c0d44177597b9ddd7a3e662a Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Fri, 26 Oct 2012 14:24:21 -0700 Subject: [PATCH 113/241] 8000992: Update new build-infra makefiles Build-infra project integration. Multiple authors on this work: erikj and ihse primarily, also changes from ohair, tbell, and dholmes. Special credit to ohstrom for his smartjavac work. Reviewed-by: erikj, ihse, dholmes, tbell --- corba/makefiles/BuildCorba.gmk | 253 +++++++++++++++++++++++++++++++++ corba/makefiles/Makefile | 246 +++----------------------------- 2 files changed, 274 insertions(+), 225 deletions(-) create mode 100644 corba/makefiles/BuildCorba.gmk diff --git a/corba/makefiles/BuildCorba.gmk b/corba/makefiles/BuildCorba.gmk new file mode 100644 index 00000000000..246c5b9bcec --- /dev/null +++ b/corba/makefiles/BuildCorba.gmk @@ -0,0 +1,253 @@ +# +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# +# Makefile for building the corba workspace. +# + +# This must be the first rule +default: all + +include $(SPEC) +include MakeBase.gmk +include JavaCompilation.gmk +include IdlCompilation.gmk + +JAVAC_JARS ?= "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ + -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar +# The Corba sources are old and generates a LOT of warnings. +# Disable these using Xlint, until someone cares to fix them. +DISABLE_CORBA_WARNINGS:=-Xlint:all,-deprecation,-unchecked,-serial,-fallthrough,-cast,-rawtypes,-static,-dep-ann + +# The "generate old bytecode" javac setup uses the new compiler to compile for the +# boot jdk to generate tools that need to be run with the boot jdk. +# Thus we force the target bytecode to the boot jdk bytecode. +$(eval $(call SetupJavaCompiler,GENERATE_OLDBYTECODE,\ + JVM:=$(JAVA),\ + JAVAC:=$(JAVAC_JARS),\ + FLAGS:=$(BOOT_JDK_SOURCETARGET) -bootclasspath $(BOOT_RTJAR) $(DISABLE_CORBA_WARNINGS),\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) + +# The "generate new bytecode" uses the new compiler to generate bytecode +# for the new jdk that is being built. The code compiled by this setup +# cannot necessarily be run with the boot jdk. +$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE,\ + JVM:=$(JAVA),\ + JAVAC:=$(JAVAC_JARS),\ + FLAGS:=-cp $(BOOT_TOOLSJAR) -XDignore.symbol.file=true $(DISABLE_CORBA_WARNINGS),\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) + +$(eval $(call SetupJavaCompilation,BUILD_STRIPPROP,\ + SETUP:=GENERATE_OLDBYTECODE,\ + SRC:=$(CORBA_TOPDIR)/make/tools/src,\ + BIN:=$(CORBA_OUTPUTDIR)/btclasses/stripprop_classes)) + +$(eval $(call SetupArchive,ARCHIVE_STRIPPROP,$(BUILD_STRIPPROP),\ + SRCS:=$(CORBA_OUTPUTDIR)/btclasses/stripprop_classes,\ + JAR:=$(CORBA_OUTPUTDIR)/btjars/stripproperties.jar,\ + JARMAIN:=build.tools.stripproperties.StripPropertiesCorba)) + +$(eval $(call SetupJavaCompilation,BUILD_IDLJ,\ + SETUP:=GENERATE_OLDBYTECODE,\ + SRC:=$(CORBA_TOPDIR)/src/share/classes,\ + BIN:=$(CORBA_OUTPUTDIR)/btclasses/idlj_classes,\ + COPY:=.prp,\ + INCLUDES:=com/sun/tools/corba/se/idl,\ + EXCLUDE_FILES:=ResourceBundleUtil.java)) + +$(eval $(call SetupArchive,ARCHIVE_IDLJ,$(BUILD_IDLJ),\ + SRCS:=$(CORBA_OUTPUTDIR)/btclasses/idlj_classes,\ + SUFFIXES:=.class .prp,\ + JAR:=$(CORBA_OUTPUTDIR)/btjars/idlj.jar,\ + JARMAIN:=com.sun.tools.corba.se.idl.toJavaPortable.Compile)) + +$(eval $(call SetupJavaCompilation,BUILD_LOGUTIL,\ + SETUP:=GENERATE_OLDBYTECODE,\ + SRC:=$(CORBA_TOPDIR)/src/share/classes,\ + BIN:=$(CORBA_OUTPUTDIR)/btclasses/logutil_classes,\ + INCLUDES:=com/sun/tools/corba/se/logutil)) + +$(eval $(call SetupArchive,ARCHIVE_LOGUTIL,$(BUILD_LOGUTIL),\ + SRCS:=$(CORBA_OUTPUTDIR)/btclasses/logutil_classes,\ + JAR:=$(CORBA_OUTPUTDIR)/btjars/logutil.jar,\ + JARMAIN:=com.sun.tools.corba.se.logutil.MC)) + +# Generate LogWrapper classes +$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/%SystemException.java : \ + $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc \ + $(CORBA_OUTPUTDIR)/btjars/logutil.jar + $(MKDIR) -p $(@D) + $(RM) -f $(@D)/_the_wrappers.d + $(ECHO) $(LOG_INFO) Generating class file from $*.mc + $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-class $< $(@D) + +# Generate LogWrapper properties file by concatening resource files +$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properties: \ + $(CORBA_OUTPUTDIR)/logwrappers/ActivationSystemException.resource \ + $(CORBA_OUTPUTDIR)/logwrappers/IORSystemException.resource \ + $(CORBA_OUTPUTDIR)/logwrappers/InterceptorsSystemException.resource \ + $(CORBA_OUTPUTDIR)/logwrappers/NamingSystemException.resource \ + $(CORBA_OUTPUTDIR)/logwrappers/OMGSystemException.resource \ + $(CORBA_OUTPUTDIR)/logwrappers/ORBUtilSystemException.resource \ + $(CORBA_OUTPUTDIR)/logwrappers/POASystemException.resource \ + $(CORBA_OUTPUTDIR)/logwrappers/UtilSystemException.resource + $(MKDIR) -p $(@D) + $(ECHO) $(LOG_INFO) Concatenating 8 resource files into $(@F) + $(CAT) $^ > $@ + +# The resources files are generated from lisp-like .mc files. +$(CORBA_OUTPUTDIR)/logwrappers/%SystemException.resource : $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc $(CORBA_OUTPUTDIR)/btjars/logutil.jar + $(MKDIR) -p $(@D) + $(RM) -f $(@D)/_the_wrappers.d + $(ECHO) $(LOG_INFO) Generating resource file from $*.mc + $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-resource $< $(@D) + + +$(CORBA_OUTPUTDIR)/logwrappers/_the_wrappers.d : $(CORBA_OUTPUTDIR)/btjars/logutil.jar \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/ActivationSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/IORSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/InterceptorsSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/NamingSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/OMGSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/ORBUtilSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/POASystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/UtilSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properties + $(MKDIR) -p $(@D) + $(ECHO) LOGWRAPPERS_ARE_CREATED=yes > $@ + +# Trigger the generation of the logwrappers. After the logwrapper classes and +# resources have been created, then the makefile will restart and the newly +# created java files will become part of the build further along in the makefile. +-include $(CORBA_OUTPUTDIR)/logwrappers/_the_wrappers.d + +ifeq ($(LOGWRAPPERS_ARE_CREATED),yes) + $(eval $(call SetupIdlCompilation,BUILD_IDLS,\ + IDLJ:=$(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/idlj.jar,\ + SRC:=$(CORBA_TOPDIR)/src/share/classes,\ + BIN:=$(CORBA_OUTPUTDIR)/gensrc,\ + EXCLUDES:=com/sun/tools/corba/se/idl/% \ + org/omg/CORBA/% \ + com/sun/corba/se/GiopIDL/% \ + org/omg/PortableServer/corba.idl,\ + INCLUDES:=%,\ + OLDIMPLBASES:=com/sun/corba/se/PortableActivationIDL/activation.idl \ + com/sun/corba/se/spi/activation/activation.idl,\ + DELETES:=DYNANYDELETEFILES org/omg/DynamicAny/*POA* org/omg/DynamicAny/*Holder* org/omg/DynamicAny/DynValueBoxHelper.java org/omg/DynamicAny/DynValueCommonHelper.java org/omg/DynamicAny/_DynValueCommonStub.java org/omg/DynamicAny/_DynValueBoxStub.java org/omg/DynamicAny/DynAnyPackage/TypeMismatchHolder.java org/omg/DynamicAny/DynAnyPackage/InvalidValueHolder.java org/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCodeHolder.java IOPDELETEFILES org/omg/IOP/BI_DIR_IIOP.java org/omg/IOP/ChainBypassCheck.java org/omg/IOP/ChainBypassInfo.java org/omg/IOP/FORWARDED_IDENTITY.java org/omg/IOP/INVOCATION_POLICIES.java org/omg/IOP/LogicalThreadId.java org/omg/IOP/SendingContextRunTime.java org/omg/IOP/UnknownExceptionInfo.java org/omg/IOP/TaggedComponentSeqHolder.java POAHELHOLFILES org/omg/PortableServer/CurrentPackage/NoContextHolder.java org/omg/PortableServer/ForwardRequestHolder.java org/omg/PortableServer/IdAssignmentPolicyValueHelper.java org/omg/PortableServer/IdAssignmentPolicyValueHolder.java org/omg/PortableServer/IdUniquenessPolicyValueHelper.java org/omg/PortableServer/IdUniquenessPolicyValueHolder.java org/omg/PortableServer/ImplicitActivationPolicyValueHelper.java org/omg/PortableServer/ImplicitActivationPolicyValueHolder.java org/omg/PortableServer/LifespanPolicyValueHelper.java org/omg/PortableServer/LifespanPolicyValueHolder.java org/omg/PortableServer/ServantRetentionPolicyValueHelper.java org/omg/PortableServer/ServantRetentionPolicyValueHolder.java org/omg/PortableServer/ObjectIdHelper.java org/omg/PortableServer/ObjectIdHolder.java org/omg/PortableServer/POAListHelper.java org/omg/PortableServer/POAListHolder.java org/omg/PortableServer/POAManagerPackage/AdapterInactiveHolder.java org/omg/PortableServer/POAManagerPackage/StateHelper.java org/omg/PortableServer/POAManagerPackage/StateHolder.java org/omg/PortableServer/POAPackage/AdapterAlreadyExistsHolder.java org/omg/PortableServer/POAPackage/AdapterNonExistentHolder.java org/omg/PortableServer/POAPackage/InvalidPolicyHolder.java org/omg/PortableServer/POAPackage/NoServantHolder.java org/omg/PortableServer/POAPackage/ObjectAlreadyActiveHolder.java org/omg/PortableServer/POAPackage/ObjectNotActiveHolder.java org/omg/PortableServer/POAPackage/ServantAlreadyActiveHolder.java org/omg/PortableServer/POAPackage/ServantNotActiveHolder.java org/omg/PortableServer/POAPackage/WrongAdapterHolder.java org/omg/PortableServer/POAPackage/WrongPolicyHolder.java org/omg/PortableServer/RequestProcessingPolicyValueHelper.java org/omg/PortableServer/RequestProcessingPolicyValueHolder.java org/omg/PortableServer/ServantActivatorHolder.java org/omg/PortableServer/ServantLocatorHolder.java org/omg/PortableServer/ThreadPolicyValueHelper.java org/omg/PortableServer/ThreadPolicyValueHolder.java PIHELHOLFILES org/omg/PortableInterceptor/ClientRequestInfoHelper.java org/omg/PortableInterceptor/ClientRequestInterceptorHelper.java org/omg/PortableInterceptor/IORInfoHelper.java org/omg/PortableInterceptor/IORInterceptorHelper.java org/omg/PortableInterceptor/InterceptorHelper.java org/omg/PortableInterceptor/ORBInitInfoHelper.java org/omg/PortableInterceptor/ORBInitializerHelper.java org/omg/PortableInterceptor/PolicyFactoryHelper.java org/omg/PortableInterceptor/ReplyStatusHelper.java org/omg/PortableInterceptor/RequestInfoHelper.java org/omg/PortableInterceptor/ServerRequestInfoHelper.java org/omg/PortableInterceptor/ServerRequestInterceptorHelper.java org/omg/PortableInterceptor/SlotIdHelper.java org/omg/PortableInterceptor/ClientRequestInfoHolder.java org/omg/PortableInterceptor/ClientRequestInterceptorHolder.java org/omg/PortableInterceptor/CurrentHolder.java org/omg/PortableInterceptor/ForwardRequestHolder.java org/omg/PortableInterceptor/IORInfoHolder.java org/omg/PortableInterceptor/IORInterceptorHolder.java org/omg/PortableInterceptor/InterceptorHolder.java org/omg/PortableInterceptor/InvalidSlotHolder.java org/omg/PortableInterceptor/ORBInitInfoHolder.java org/omg/PortableInterceptor/ORBInitializerHolder.java org/omg/PortableInterceptor/PolicyFactoryHolder.java org/omg/PortableInterceptor/RequestInfoHolder.java org/omg/PortableInterceptor/ServerRequestInfoHolder.java org/omg/PortableInterceptor/ServerRequestInterceptorHolder.java org/omg/PortableInterceptor/TaggedComponentSeqHolder.java org/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateNameHolder.java org/omg/PortableInterceptor/ORBInitInfoPackage/InvalidNameHolder.java org/omg/IOP/CodecPackage/FormatMismatchHolder.java org/omg/IOP/CodecPackage/InvalidTypeForEncodingHolder.java org/omg/IOP/CodecPackage/TypeMismatchHolder.java org/omg/IOP/CodecHelper.java org/omg/IOP/EncodingFormatHelper.java org/omg/IOP/EncodingHelper.java org/omg/IOP/CodecFactoryPackage/UnknownEncodingHolder.java org/omg/IOP/CodecFactoryHolder.java org/omg/IOP/CodecHolder.java org/omg/IOP/EncodingHolder.java org/omg/IOP/TaggedComponentSeqHelper.java org/omg/Dynamic/ContextListHelper.java org/omg/Dynamic/ExceptionListHelper.java org/omg/Dynamic/ParameterHolder.java org/omg/Dynamic/ParameterListHolder.java org/omg/Dynamic/ExceptionListHolder.java org/omg/Dynamic/ParameterHelper.java org/omg/Dynamic/ParameterListHelper.java org/omg/Dynamic/RequestContextHelper.java CORBAX org/omg/CORBA/OctetSeqHelper.java org/omg/CORBA/OctetSeqHolder.java org/omg/CORBA/PolicyError.java org/omg/CORBA/RepositoryIdHelper.java)) + + $(BUILD_IDLS) : $(CORBA_OUTPUTDIR)/btjars/idlj.jar + + $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d : $(BUILD_IDLS) $(CORBA_OUTPUTDIR)/btjars/idlj.jar + $(MKDIR) -p $(@D) + $(ECHO) IDLS_ARE_CREATED=yes > $@ + + -include $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d + + ifeq ($(IDLS_ARE_CREATED),yes) + $(eval $(call SetupJavaCompilation,BUILD_CORBA,\ + SETUP:=GENERATE_NEWBYTECODE,\ + SRC:=$(CORBA_TOPDIR)/src/share/classes $(CORBA_OUTPUTDIR)/gensrc $(CORBA_OUTPUTDIR)/logwrappers,\ + EXCLUDES:=com/sun/corba/se/PortableActivationIDL\ + com/sun/tools/corba/se/logutil,\ + EXCLUDE_FILES:=com/sun/corba/se/impl/presentation/rmi/JNDIStateFactoryImpl.java \ + com/sun/corba/se/spi/presentation/rmi/StubWrapper.java \ + com/sun/org/omg/CORBA/IDLTypeOperations.java \ + com/sun/org/omg/CORBA/IRObjectOperations.java \ + org/omg/PortableInterceptor/UNKNOWN.java \ + com/sun/tools/corba/se/idl/ResourceBundleUtil.java\ + com/sun/corba/se/impl/presentation/rmi/jndi.properties,\ + COPY:=.prp LogStrings.properties,\ + BIN:=$(CORBA_OUTPUTDIR)/classes)) + + # Separate src.zip call to include sources that were excluded in the build to + # mimic behavior in old build system. + $(eval $(call SetupZipArchive,ARCHIVE_BUILD_CORBA,\ + SRC:=$(CORBA_TOPDIR)/src/share/classes $(CORBA_OUTPUTDIR)/gensrc $(CORBA_OUTPUTDIR)/logwrappers,\ + ZIP:=$(CORBA_OUTPUTDIR)/dist/lib/src.zip)) + + $(BUILD_CORBA) : $(BUILD_IDLS) $(LOGWRAPPER_DEPENDENCIES) + + # Run stripproperties on all sunorb resource files. + STRIP_PROP_SRC_FILES:=$(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb*.properties") + STRIP_PROP_FILES:=$(patsubst $(CORBA_TOPDIR)/src/share/classes/%,$(CORBA_OUTPUTDIR)/classes/%,\ + $(STRIP_PROP_SRC_FILES)) + # Simple delivery of zh_HK properties files just copies zh_TW properties files + STRIP_PROP_FILES+=$(patsubst $(CORBA_TOPDIR)/src/share/classes/%_zh_TW.properties,\ + $(CORBA_OUTPUTDIR)/classes/%_zh_HK.properties,\ + $(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb_zh_TW.properties")) + STRIP_PROP_SRC_FILES+=$(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb_zh_TW.properties") + STRIP_PROP_CMDLINE:=$(subst _SPACE_,$(SPACE),\ + $(join $(addprefix -clean_SPACE_,$(STRIP_PROP_SRC_FILES)), \ + $(addprefix _SPACE_,$(STRIP_PROP_FILES)))) + + $(CORBA_OUTPUTDIR)/_the.stripped_properties: $(STRIP_PROP_SRC_FILES) \ + $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar + $(MKDIR) -p $(sort $(dir $(STRIP_PROP_FILES))) + $(call ListPathsSafely,STRIP_PROP_CMDLINE,\n, >> $(CORBA_OUTPUTDIR)/_the.strip_prop.cmdline) + $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar \ + @$(CORBA_OUTPUTDIR)/_the.strip_prop.cmdline + $(TOUCH) $@ + + $(eval $(call SetupArchive,ARCHIVE_CORBA,\ + $(BUILD_CORBA) $(CORBA_OUTPUTDIR)/_the.stripped_properties,\ + SRCS:=$(CORBA_OUTPUTDIR)/classes,\ + SUFFIXES:=.class .prp .properties,\ + JAR:=$(CORBA_OUTPUTDIR)/dist/lib/classes.jar)) + + # The created classes.jar now contains Corba compiled to run on the target JDK + # and is ready for inclusion in jdk rt.jar. + + # The created src.zip now contains .java and .properties files used to create the classes in classes.jar + # and is ready for inclusion into the jdk src.zip + + BIN_FILES:=$(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/orb.idl \ + $(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/ir.idl + + $(CORBA_OUTPUTDIR)/dist/lib/bin.zip : $(BIN_FILES) $(CORBA_OUTPUTDIR)/dist/lib/classes.jar + $(MKDIR) -p $(CORBA_OUTPUTDIR)/dist/lib + $(MKDIR) -p $(CORBA_OUTPUTDIR)/lib + $(RM) -f $@ + $(ECHO) Creating `basename $@` + $(CP) $(BIN_FILES) $(CORBA_OUTPUTDIR)/lib + $(CHMOD) ug+w $(CORBA_OUTPUTDIR)/lib/* + (cd $(CORBA_OUTPUTDIR); $(ZIP) -q $@ lib/orb.idl lib/ir.idl) + + # The created bin.zip now contains the corba specific binaries: orb.idl, ir.idl + + all: $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar \ + $(CORBA_OUTPUTDIR)/btjars/idlj.jar \ + $(CORBA_OUTPUTDIR)/btjars/logutil.jar \ + $(CORBA_OUTPUTDIR)/dist/lib/classes.jar \ + $(CORBA_OUTPUTDIR)/dist/lib/src.zip \ + $(CORBA_OUTPUTDIR)/dist/lib/bin.zip + endif +endif + +clean: + $(RM) -rf $(CORBA_OUTPUTDIR) + +.PHONY: default all clean clobber diff --git a/corba/makefiles/Makefile b/corba/makefiles/Makefile index ee07dedc49c..9539fe0e255 100644 --- a/corba/makefiles/Makefile +++ b/corba/makefiles/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,231 +23,27 @@ # questions. # -# -# Makefile for building the corba workspace. -# +# Locate this Makefile +ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) + makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path:=$(lastword $(MAKEFILE_LIST)) +endif +repo_dir:=$(patsubst %/makefiles/Makefile,%,$(makefile_path)) -# This must be the first rule -default: all +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name:=$(notdir $(repo_dir)) -include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk -include IdlCompilation.gmk - -JAVAC_JARS ?= "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ - -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar -# The Corba sources are old and generates a LOT of warnings. -# Disable these using Xlint, until someone cares to fix them. -DISABLE_CORBA_WARNINGS:=-Xlint:all,-deprecation,-unchecked,-serial,-fallthrough,-cast,-rawtypes,-static,-dep-ann - -# The "generate old bytecode" javac setup uses the new compiler to compile for the -# boot jdk to generate tools that need to be run with the boot jdk. -# Thus we force the target bytecode to the boot jdk bytecode. -$(eval $(call SetupJavaCompiler,GENERATE_OLDBYTECODE,\ - JVM:=$(JAVA),\ - JAVAC:=$(JAVAC_JARS),\ - FLAGS:=$(BOOT_JDK_SOURCETARGET) -bootclasspath $(BOOT_RTJAR) $(DISABLE_CORBA_WARNINGS),\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - -# The "generate new bytecode" uses the new compiler to generate bytecode -# for the new jdk that is being built. The code compiled by this setup -# cannot necessarily be run with the boot jdk. -$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE,\ - JVM:=$(JAVA),\ - JAVAC:=$(JAVAC_JARS),\ - FLAGS:=-cp $(BOOT_TOOLSJAR) -XDignore.symbol.file=true $(DISABLE_CORBA_WARNINGS),\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - -$(eval $(call SetupJavaCompilation,BUILD_STRIPPROP,\ - SETUP:=GENERATE_OLDBYTECODE,\ - SRC:=$(CORBA_TOPDIR)/make/tools/src,\ - BIN:=$(CORBA_OUTPUTDIR)/btclasses/stripprop_classes)) - -$(eval $(call SetupArchive,ARCHIVE_STRIPPROP,$(BUILD_STRIPPROP),\ - SRCS:=$(CORBA_OUTPUTDIR)/btclasses/stripprop_classes,\ - JAR:=$(CORBA_OUTPUTDIR)/btjars/stripproperties.jar,\ - JARMAIN:=build.tools.stripproperties.StripPropertiesCorba)) - -$(eval $(call SetupJavaCompilation,BUILD_IDLJ,\ - SETUP:=GENERATE_OLDBYTECODE,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes,\ - BIN:=$(CORBA_OUTPUTDIR)/btclasses/idlj_classes,\ - COPY:=.prp,\ - INCLUDES:=com/sun/tools/corba/se/idl,\ - EXCLUDE_FILES:=ResourceBundleUtil.java)) - -$(eval $(call SetupArchive,ARCHIVE_IDLJ,$(BUILD_IDLJ),\ - SRCS:=$(CORBA_OUTPUTDIR)/btclasses/idlj_classes,\ - SUFFIXES:=.class .prp,\ - JAR:=$(CORBA_OUTPUTDIR)/btjars/idlj.jar,\ - JARMAIN:=com.sun.tools.corba.se.idl.toJavaPortable.Compile)) - -$(eval $(call SetupJavaCompilation,BUILD_LOGUTIL,\ - SETUP:=GENERATE_OLDBYTECODE,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes,\ - BIN:=$(CORBA_OUTPUTDIR)/btclasses/logutil_classes,\ - INCLUDES:=com/sun/tools/corba/se/logutil)) - -$(eval $(call SetupArchive,ARCHIVE_LOGUTIL,$(BUILD_LOGUTIL),\ - SRCS:=$(CORBA_OUTPUTDIR)/btclasses/logutil_classes,\ - JAR:=$(CORBA_OUTPUTDIR)/btjars/logutil.jar,\ - JARMAIN:=com.sun.tools.corba.se.logutil.MC)) - -# Generate LogWrapper classes -$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/%SystemException.java : \ - $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc \ - $(CORBA_OUTPUTDIR)/btjars/logutil.jar - $(MKDIR) -p $(@D) - $(RM) -f $(@D)/_the_wrappers.d - $(ECHO) Generating class file from $*.mc - $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-class $< $(@D) - -# Generate LogWrapper properties file by concatening resource files -$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properties: \ - $(CORBA_OUTPUTDIR)/logwrappers/ActivationSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/IORSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/InterceptorsSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/NamingSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/OMGSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/ORBUtilSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/POASystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/UtilSystemException.resource - $(MKDIR) -p $(@D) - $(ECHO) Concatenating 8 resource files into $(@F) - $(CAT) $^ > $@ - -# The resources files are generated from lisp-like .mc files. -$(CORBA_OUTPUTDIR)/logwrappers/%SystemException.resource : $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc $(CORBA_OUTPUTDIR)/btjars/logutil.jar - $(MKDIR) -p $(@D) - $(RM) -f $(@D)/_the_wrappers.d - $(ECHO) Generating resource file from $*.mc - $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-resource $< $(@D) - - -$(CORBA_OUTPUTDIR)/logwrappers/_the_wrappers.d : $(CORBA_OUTPUTDIR)/btjars/logutil.jar \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/ActivationSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/IORSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/InterceptorsSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/NamingSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/OMGSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/ORBUtilSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/POASystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/UtilSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properties - $(MKDIR) -p $(@D) - $(ECHO) LOGWRAPPERS_ARE_CREATED=yes > $@ - -# Trigger the generation of the logwrappers. After the logwrapper classes and -# resources have been created, then the makefile will restart and the newly -# created java files will become part of the build further along in the makefile. --include $(CORBA_OUTPUTDIR)/logwrappers/_the_wrappers.d - -ifeq ($(LOGWRAPPERS_ARE_CREATED),yes) - $(eval $(call SetupIdlCompilation,BUILD_IDLS,\ - IDLJ:=$(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/idlj.jar,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes,\ - BIN:=$(CORBA_OUTPUTDIR)/gensrc,\ - EXCLUDES:=com/sun/tools/corba/se/idl/% \ - org/omg/CORBA/% \ - com/sun/corba/se/GiopIDL/% \ - org/omg/PortableServer/corba.idl,\ - INCLUDES:=%,\ - OLDIMPLBASES:=com/sun/corba/se/PortableActivationIDL/activation.idl \ - com/sun/corba/se/spi/activation/activation.idl,\ - DELETES:=DYNANYDELETEFILES org/omg/DynamicAny/*POA* org/omg/DynamicAny/*Holder* org/omg/DynamicAny/DynValueBoxHelper.java org/omg/DynamicAny/DynValueCommonHelper.java org/omg/DynamicAny/_DynValueCommonStub.java org/omg/DynamicAny/_DynValueBoxStub.java org/omg/DynamicAny/DynAnyPackage/TypeMismatchHolder.java org/omg/DynamicAny/DynAnyPackage/InvalidValueHolder.java org/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCodeHolder.java IOPDELETEFILES org/omg/IOP/BI_DIR_IIOP.java org/omg/IOP/ChainBypassCheck.java org/omg/IOP/ChainBypassInfo.java org/omg/IOP/FORWARDED_IDENTITY.java org/omg/IOP/INVOCATION_POLICIES.java org/omg/IOP/LogicalThreadId.java org/omg/IOP/SendingContextRunTime.java org/omg/IOP/UnknownExceptionInfo.java org/omg/IOP/TaggedComponentSeqHolder.java POAHELHOLFILES org/omg/PortableServer/CurrentPackage/NoContextHolder.java org/omg/PortableServer/ForwardRequestHolder.java org/omg/PortableServer/IdAssignmentPolicyValueHelper.java org/omg/PortableServer/IdAssignmentPolicyValueHolder.java org/omg/PortableServer/IdUniquenessPolicyValueHelper.java org/omg/PortableServer/IdUniquenessPolicyValueHolder.java org/omg/PortableServer/ImplicitActivationPolicyValueHelper.java org/omg/PortableServer/ImplicitActivationPolicyValueHolder.java org/omg/PortableServer/LifespanPolicyValueHelper.java org/omg/PortableServer/LifespanPolicyValueHolder.java org/omg/PortableServer/ServantRetentionPolicyValueHelper.java org/omg/PortableServer/ServantRetentionPolicyValueHolder.java org/omg/PortableServer/ObjectIdHelper.java org/omg/PortableServer/ObjectIdHolder.java org/omg/PortableServer/POAListHelper.java org/omg/PortableServer/POAListHolder.java org/omg/PortableServer/POAManagerPackage/AdapterInactiveHolder.java org/omg/PortableServer/POAManagerPackage/StateHelper.java org/omg/PortableServer/POAManagerPackage/StateHolder.java org/omg/PortableServer/POAPackage/AdapterAlreadyExistsHolder.java org/omg/PortableServer/POAPackage/AdapterNonExistentHolder.java org/omg/PortableServer/POAPackage/InvalidPolicyHolder.java org/omg/PortableServer/POAPackage/NoServantHolder.java org/omg/PortableServer/POAPackage/ObjectAlreadyActiveHolder.java org/omg/PortableServer/POAPackage/ObjectNotActiveHolder.java org/omg/PortableServer/POAPackage/ServantAlreadyActiveHolder.java org/omg/PortableServer/POAPackage/ServantNotActiveHolder.java org/omg/PortableServer/POAPackage/WrongAdapterHolder.java org/omg/PortableServer/POAPackage/WrongPolicyHolder.java org/omg/PortableServer/RequestProcessingPolicyValueHelper.java org/omg/PortableServer/RequestProcessingPolicyValueHolder.java org/omg/PortableServer/ServantActivatorHolder.java org/omg/PortableServer/ServantLocatorHolder.java org/omg/PortableServer/ThreadPolicyValueHelper.java org/omg/PortableServer/ThreadPolicyValueHolder.java PIHELHOLFILES org/omg/PortableInterceptor/ClientRequestInfoHelper.java org/omg/PortableInterceptor/ClientRequestInterceptorHelper.java org/omg/PortableInterceptor/IORInfoHelper.java org/omg/PortableInterceptor/IORInterceptorHelper.java org/omg/PortableInterceptor/InterceptorHelper.java org/omg/PortableInterceptor/ORBInitInfoHelper.java org/omg/PortableInterceptor/ORBInitializerHelper.java org/omg/PortableInterceptor/PolicyFactoryHelper.java org/omg/PortableInterceptor/ReplyStatusHelper.java org/omg/PortableInterceptor/RequestInfoHelper.java org/omg/PortableInterceptor/ServerRequestInfoHelper.java org/omg/PortableInterceptor/ServerRequestInterceptorHelper.java org/omg/PortableInterceptor/SlotIdHelper.java org/omg/PortableInterceptor/ClientRequestInfoHolder.java org/omg/PortableInterceptor/ClientRequestInterceptorHolder.java org/omg/PortableInterceptor/CurrentHolder.java org/omg/PortableInterceptor/ForwardRequestHolder.java org/omg/PortableInterceptor/IORInfoHolder.java org/omg/PortableInterceptor/IORInterceptorHolder.java org/omg/PortableInterceptor/InterceptorHolder.java org/omg/PortableInterceptor/InvalidSlotHolder.java org/omg/PortableInterceptor/ORBInitInfoHolder.java org/omg/PortableInterceptor/ORBInitializerHolder.java org/omg/PortableInterceptor/PolicyFactoryHolder.java org/omg/PortableInterceptor/RequestInfoHolder.java org/omg/PortableInterceptor/ServerRequestInfoHolder.java org/omg/PortableInterceptor/ServerRequestInterceptorHolder.java org/omg/PortableInterceptor/TaggedComponentSeqHolder.java org/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateNameHolder.java org/omg/PortableInterceptor/ORBInitInfoPackage/InvalidNameHolder.java org/omg/IOP/CodecPackage/FormatMismatchHolder.java org/omg/IOP/CodecPackage/InvalidTypeForEncodingHolder.java org/omg/IOP/CodecPackage/TypeMismatchHolder.java org/omg/IOP/CodecHelper.java org/omg/IOP/EncodingFormatHelper.java org/omg/IOP/EncodingHelper.java org/omg/IOP/CodecFactoryPackage/UnknownEncodingHolder.java org/omg/IOP/CodecFactoryHolder.java org/omg/IOP/CodecHolder.java org/omg/IOP/EncodingHolder.java org/omg/IOP/TaggedComponentSeqHelper.java org/omg/Dynamic/ContextListHelper.java org/omg/Dynamic/ExceptionListHelper.java org/omg/Dynamic/ParameterHolder.java org/omg/Dynamic/ParameterListHolder.java org/omg/Dynamic/ExceptionListHolder.java org/omg/Dynamic/ParameterHelper.java org/omg/Dynamic/ParameterListHelper.java org/omg/Dynamic/RequestContextHelper.java CORBAX org/omg/CORBA/OctetSeqHelper.java org/omg/CORBA/OctetSeqHolder.java org/omg/CORBA/PolicyError.java org/omg/CORBA/RepositoryIdHelper.java)) - - $(BUILD_IDLS) : $(CORBA_OUTPUTDIR)/btjars/idlj.jar - - $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d : $(BUILD_IDLS) $(CORBA_OUTPUTDIR)/btjars/idlj.jar - $(MKDIR) -p $(@D) - $(ECHO) IDLS_ARE_CREATED=yes > $@ - - -include $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d - - ifeq ($(IDLS_ARE_CREATED),yes) - $(eval $(call SetupJavaCompilation,BUILD_CORBA,\ - SETUP:=GENERATE_NEWBYTECODE,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes $(CORBA_OUTPUTDIR)/gensrc $(CORBA_OUTPUTDIR)/logwrappers,\ - EXCLUDES:=com/sun/corba/se/PortableActivationIDL\ - com/sun/tools/corba/se/logutil,\ - EXCLUDE_FILES:=com/sun/corba/se/impl/presentation/rmi/JNDIStateFactoryImpl.java \ - com/sun/corba/se/spi/presentation/rmi/StubWrapper.java \ - com/sun/org/omg/CORBA/IDLTypeOperations.java \ - com/sun/org/omg/CORBA/IRObjectOperations.java \ - org/omg/PortableInterceptor/UNKNOWN.java \ - com/sun/tools/corba/se/idl/ResourceBundleUtil.java\ - com/sun/corba/se/impl/presentation/rmi/jndi.properties,\ - COPY:=.prp LogStrings.properties,\ - BIN:=$(CORBA_OUTPUTDIR)/classes)) - - # Separate src.zip call to include sources that were excluded in the build to - # mimic behavior in old build system. - $(eval $(call SetupZipArchive,ARCHIVE_BUILD_CORBA,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes $(CORBA_OUTPUTDIR)/gensrc $(CORBA_OUTPUTDIR)/logwrappers,\ - ZIP:=$(CORBA_OUTPUTDIR)/dist/lib/src.zip)) - - $(BUILD_CORBA) : $(BUILD_IDLS) $(LOGWRAPPER_DEPENDENCIES) - - # Run stripproperties on all sunorb resource files. - STRIP_PROP_SRC_FILES:=$(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb*.properties") - STRIP_PROP_FILES:=$(patsubst $(CORBA_TOPDIR)/src/share/classes/%,$(CORBA_OUTPUTDIR)/classes/%,\ - $(STRIP_PROP_SRC_FILES)) - # Simple delivery of zh_HK properties files just copies zh_TW properties files - STRIP_PROP_FILES+=$(patsubst $(CORBA_TOPDIR)/src/share/classes/%_zh_TW.properties,\ - $(CORBA_OUTPUTDIR)/classes/%_zh_HK.properties,\ - $(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb_zh_TW.properties")) - STRIP_PROP_SRC_FILES+=$(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb_zh_TW.properties") - STRIP_PROP_CMDLINE:=$(subst _SPACE_,$(SPACE),\ - $(join $(addprefix -clean_SPACE_,$(STRIP_PROP_SRC_FILES)), \ - $(addprefix _SPACE_,$(STRIP_PROP_FILES)))) - - $(CORBA_OUTPUTDIR)/_the.stripped_properties: $(STRIP_PROP_SRC_FILES) \ - $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar - $(MKDIR) -p $(sort $(dir $(STRIP_PROP_FILES))) - $(call ListPathsSafely,STRIP_PROP_CMDLINE,\n, >> $(CORBA_OUTPUTDIR)/_the.strip_prop.cmdline) - $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar \ - @$(CORBA_OUTPUTDIR)/_the.strip_prop.cmdline - $(TOUCH) $@ - - $(eval $(call SetupArchive,ARCHIVE_CORBA,\ - $(BUILD_CORBA) $(CORBA_OUTPUTDIR)/_the.stripped_properties,\ - SRCS:=$(CORBA_OUTPUTDIR)/classes,\ - SUFFIXES:=.class .prp .properties,\ - JAR:=$(CORBA_OUTPUTDIR)/dist/lib/classes.jar)) - - # The created classes.jar now contains Corba compiled to run on the target JDK - # and is ready for inclusion in jdk rt.jar. - - # The created src.zip now contains .java and .properties files used to create the classes in classes.jar - # and is ready for inclusion into the jdk src.zip - - BIN_FILES:=$(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/orb.idl \ - $(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/ir.idl - - $(CORBA_OUTPUTDIR)/dist/lib/bin.zip : $(BIN_FILES) $(CORBA_OUTPUTDIR)/dist/lib/classes.jar - $(MKDIR) -p $(CORBA_OUTPUTDIR)/dist/lib - $(MKDIR) -p $(CORBA_OUTPUTDIR)/lib - $(RM) -f $@ - $(ECHO) Creating `basename $@` - $(CP) $(BIN_FILES) $(CORBA_OUTPUTDIR)/lib - $(CHMOD) ug+w $(CORBA_OUTPUTDIR)/lib/* - (cd $(CORBA_OUTPUTDIR); $(ZIP) -q $@ lib/orb.idl lib/ir.idl) - - # The created bin.zip now contains the corba specific binaries: orb.idl, ir.idl - - all: $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar \ - $(CORBA_OUTPUTDIR)/btjars/idlj.jar \ - $(CORBA_OUTPUTDIR)/btjars/logutil.jar \ - $(CORBA_OUTPUTDIR)/dist/lib/classes.jar \ - $(CORBA_OUTPUTDIR)/dist/lib/src.zip \ - $(CORBA_OUTPUTDIR)/dist/lib/bin.zip - endif +# Try to locate top-level makefile +top_level_makefile:=$(repo_dir)/../common/makefiles/Makefile +ifneq ($(wildcard $(top_level_makefile)),) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) endif -clean: - $(RM) -rf $(CORBA_OUTPUTDIR) - -.PHONY: default all clean clobber +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) From 4a59eea32bc136152416c1389cac0f6ae8632acc Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Fri, 26 Oct 2012 14:25:17 -0700 Subject: [PATCH 114/241] 8000992: Update new build-infra makefiles Build-infra project integration. Multiple authors on this work: erikj and ihse primarily, also changes from ohair, tbell, and dholmes. Special credit to ohstrom for his smartjavac work. Reviewed-by: erikj, ihse, dholmes, tbell --- jaxp/makefiles/BuildJaxp.gmk | 61 ++++++++++++++++++++++++++++++++++++ jaxp/makefiles/Makefile | 56 +++++++++++++-------------------- 2 files changed, 83 insertions(+), 34 deletions(-) create mode 100644 jaxp/makefiles/BuildJaxp.gmk diff --git a/jaxp/makefiles/BuildJaxp.gmk b/jaxp/makefiles/BuildJaxp.gmk new file mode 100644 index 00000000000..85649849f2b --- /dev/null +++ b/jaxp/makefiles/BuildJaxp.gmk @@ -0,0 +1,61 @@ +# +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This must be the first rule +default: all + +-include $(SPEC) +include MakeBase.gmk +include JavaCompilation.gmk + +JAVAC_JARS ?= "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ + -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar +DISABLE_JAXP_WARNINGS:=-Xlint:all,-deprecation,-unchecked,-rawtypes,-cast,-serial,-dep-ann,-static,-fallthrough + +# The generate new bytecode uses the new compiler for to generate bytecode +# for the new jdk that is being built. The code compiled by this setup +# cannot necessarily be run with the boot jdk. +$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG,\ + JVM:=$(JAVA),\ + JAVAC:=$(JAVAC_JARS),\ + FLAGS:=-XDignore.symbol.file=true $(DISABLE_JAXP_WARNINGS) -g,\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) + +$(eval $(call SetupJavaCompilation,BUILD_JAXP,\ + SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ + SRC:=$(JAXP_TOPDIR)/src,\ + CLEAN:=.properties,\ + BIN:=$(JAXP_OUTPUTDIR)/classes,\ + SRCZIP:=$(JAXP_OUTPUTDIR)/dist/lib/src.zip)) + +$(eval $(call SetupArchive,ARCHIVE_JAXP,$(BUILD_JAXP),\ + SRCS:=$(JAXP_OUTPUTDIR)/classes,\ + SUFFIXES:=.class .properties,\ + JAR:=$(JAXP_OUTPUTDIR)/dist/lib/classes.jar)) + +all: $(JAXP_OUTPUTDIR)/dist/lib/classes.jar $(JAXP_OUTPUTDIR)/dist/lib/src.zip + +.PHONY: default all diff --git a/jaxp/makefiles/Makefile b/jaxp/makefiles/Makefile index 85649849f2b..9539fe0e255 100644 --- a/jaxp/makefiles/Makefile +++ b/jaxp/makefiles/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,39 +23,27 @@ # questions. # -# This must be the first rule -default: all +# Locate this Makefile +ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) + makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path:=$(lastword $(MAKEFILE_LIST)) +endif +repo_dir:=$(patsubst %/makefiles/Makefile,%,$(makefile_path)) --include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name:=$(notdir $(repo_dir)) -JAVAC_JARS ?= "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ - -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar -DISABLE_JAXP_WARNINGS:=-Xlint:all,-deprecation,-unchecked,-rawtypes,-cast,-serial,-dep-ann,-static,-fallthrough +# Try to locate top-level makefile +top_level_makefile:=$(repo_dir)/../common/makefiles/Makefile +ifneq ($(wildcard $(top_level_makefile)),) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) +endif -# The generate new bytecode uses the new compiler for to generate bytecode -# for the new jdk that is being built. The code compiled by this setup -# cannot necessarily be run with the boot jdk. -$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG,\ - JVM:=$(JAVA),\ - JAVAC:=$(JAVAC_JARS),\ - FLAGS:=-XDignore.symbol.file=true $(DISABLE_JAXP_WARNINGS) -g,\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - -$(eval $(call SetupJavaCompilation,BUILD_JAXP,\ - SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ - SRC:=$(JAXP_TOPDIR)/src,\ - CLEAN:=.properties,\ - BIN:=$(JAXP_OUTPUTDIR)/classes,\ - SRCZIP:=$(JAXP_OUTPUTDIR)/dist/lib/src.zip)) - -$(eval $(call SetupArchive,ARCHIVE_JAXP,$(BUILD_JAXP),\ - SRCS:=$(JAXP_OUTPUTDIR)/classes,\ - SUFFIXES:=.class .properties,\ - JAR:=$(JAXP_OUTPUTDIR)/dist/lib/classes.jar)) - -all: $(JAXP_OUTPUTDIR)/dist/lib/classes.jar $(JAXP_OUTPUTDIR)/dist/lib/src.zip - -.PHONY: default all +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) From 4e44b9cf81c913e4bf9d71b65a119852c9429d21 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Fri, 26 Oct 2012 14:25:29 -0700 Subject: [PATCH 115/241] 8000992: Update new build-infra makefiles Build-infra project integration. Multiple authors on this work: erikj and ihse primarily, also changes from ohair, tbell, and dholmes. Special credit to ohstrom for his smartjavac work. Reviewed-by: erikj, ihse, dholmes, tbell --- jaxws/makefiles/BuildJaxws.gmk | 92 ++++++++++++++++++++++++++++++++++ jaxws/makefiles/Makefile | 87 ++++++++------------------------ 2 files changed, 114 insertions(+), 65 deletions(-) create mode 100644 jaxws/makefiles/BuildJaxws.gmk diff --git a/jaxws/makefiles/BuildJaxws.gmk b/jaxws/makefiles/BuildJaxws.gmk new file mode 100644 index 00000000000..a745ec8041e --- /dev/null +++ b/jaxws/makefiles/BuildJaxws.gmk @@ -0,0 +1,92 @@ +# +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This must be the first rule +default: all + +include $(SPEC) +include MakeBase.gmk +include JavaCompilation.gmk + +JAVAC_JARS ?= -Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ + -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar +DISABLE_JAXWS_WARNINGS:=-Xlint:all,-varargs,-rawtypes,-deprecation,-unchecked,-serial,-dep-ann,-cast,-fallthrough,-static + +# The generate new bytecode uses the new compiler for to generate bytecode +# for the new jdk that is being built. The code compiled by this setup +# cannot necessarily be run with the boot jdk. +$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG,\ + JVM:=$(JAVA),\ + JAVAC:=$(JAVAC_JARS),\ + FLAGS:=-XDignore.symbol.file=true $(DISABLE_JAXWS_WARNINGS) -g,\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) + +# Dummy here is needed to trigger copying of META-INF +$(eval $(call SetupJavaCompilation,BUILD_JAF,\ + SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ + SRC:=$(JAXWS_TOPDIR)/src/share/jaf_classes,\ + CLEAN:=.properties,\ + COPY:="dummy",\ + BIN:=$(JAXWS_OUTPUTDIR)/jaf_classes)) + +$(eval $(call SetupJavaCompilation,BUILD_JAXWS,\ + SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ + SRC:=$(JAXWS_TOPDIR)/src/share/jaxws_classes,\ + CLEAN:=.properties,\ + BIN:=$(JAXWS_OUTPUTDIR)/jaxws_classes,\ + COPY:=.xsd,\ + COPY_FILES:=$(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/internal/xjc/runtime/JAXBContextFactory.java \ + $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/internal/xjc/runtime/ZeroOneBooleanAdapter.java,\ + ADD_JAVAC_FLAGS=-cp $(OUTPUT_ROOT)/jaxp/dist/lib/classes.jar)) + +$(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin: \ + $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/etc/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin + mkdir -p $(@D) + cp $< $@ + +$(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.xjc.Plugin: \ + $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/etc/META-INF/services/com.sun.tools.internal.xjc.Plugin + mkdir -p $(@D) + cp $< $@ + +# There are two META-INF services files that are needed, add these to the list of goals +BUILD_JAXWS += $(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin \ + $(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.xjc.Plugin + +$(eval $(call SetupArchive,ARCHIVE_JAXWS,$(BUILD_JAXWS) $(BUILD_JAF),\ + SRCS:=$(JAXWS_OUTPUTDIR)/jaxws_classes $(JAXWS_OUTPUTDIR)/jaf_classes,\ + SUFFIXES:=.class .properties .xsd .java \ + com.sun.mirror.apt.AnnotationProcessorFactory \ + com.sun.tools.internal.xjc.Plugin,\ + JAR:=$(JAXWS_OUTPUTDIR)/dist/lib/classes.jar)) + +$(eval $(call SetupZipArchive,ZIP_JAXWS_SOURCES,\ + SRC:=$(JAXWS_TOPDIR)/src/share/jaf_classes $(JAXWS_TOPDIR)/src/share/jaxws_classes,\ + ZIP:=$(JAXWS_OUTPUTDIR)/dist/lib/src.zip)) + +all: $(JAXWS_OUTPUTDIR)/dist/lib/classes.jar $(JAXWS_OUTPUTDIR)/dist/lib/src.zip + +.PHONY: default all diff --git a/jaxws/makefiles/Makefile b/jaxws/makefiles/Makefile index a745ec8041e..9539fe0e255 100644 --- a/jaxws/makefiles/Makefile +++ b/jaxws/makefiles/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,70 +23,27 @@ # questions. # -# This must be the first rule -default: all +# Locate this Makefile +ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) + makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path:=$(lastword $(MAKEFILE_LIST)) +endif +repo_dir:=$(patsubst %/makefiles/Makefile,%,$(makefile_path)) -include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name:=$(notdir $(repo_dir)) -JAVAC_JARS ?= -Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ - -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar -DISABLE_JAXWS_WARNINGS:=-Xlint:all,-varargs,-rawtypes,-deprecation,-unchecked,-serial,-dep-ann,-cast,-fallthrough,-static +# Try to locate top-level makefile +top_level_makefile:=$(repo_dir)/../common/makefiles/Makefile +ifneq ($(wildcard $(top_level_makefile)),) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) +endif -# The generate new bytecode uses the new compiler for to generate bytecode -# for the new jdk that is being built. The code compiled by this setup -# cannot necessarily be run with the boot jdk. -$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG,\ - JVM:=$(JAVA),\ - JAVAC:=$(JAVAC_JARS),\ - FLAGS:=-XDignore.symbol.file=true $(DISABLE_JAXWS_WARNINGS) -g,\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - -# Dummy here is needed to trigger copying of META-INF -$(eval $(call SetupJavaCompilation,BUILD_JAF,\ - SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ - SRC:=$(JAXWS_TOPDIR)/src/share/jaf_classes,\ - CLEAN:=.properties,\ - COPY:="dummy",\ - BIN:=$(JAXWS_OUTPUTDIR)/jaf_classes)) - -$(eval $(call SetupJavaCompilation,BUILD_JAXWS,\ - SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ - SRC:=$(JAXWS_TOPDIR)/src/share/jaxws_classes,\ - CLEAN:=.properties,\ - BIN:=$(JAXWS_OUTPUTDIR)/jaxws_classes,\ - COPY:=.xsd,\ - COPY_FILES:=$(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/internal/xjc/runtime/JAXBContextFactory.java \ - $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/internal/xjc/runtime/ZeroOneBooleanAdapter.java,\ - ADD_JAVAC_FLAGS=-cp $(OUTPUT_ROOT)/jaxp/dist/lib/classes.jar)) - -$(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin: \ - $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/etc/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin - mkdir -p $(@D) - cp $< $@ - -$(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.xjc.Plugin: \ - $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/etc/META-INF/services/com.sun.tools.internal.xjc.Plugin - mkdir -p $(@D) - cp $< $@ - -# There are two META-INF services files that are needed, add these to the list of goals -BUILD_JAXWS += $(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin \ - $(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.xjc.Plugin - -$(eval $(call SetupArchive,ARCHIVE_JAXWS,$(BUILD_JAXWS) $(BUILD_JAF),\ - SRCS:=$(JAXWS_OUTPUTDIR)/jaxws_classes $(JAXWS_OUTPUTDIR)/jaf_classes,\ - SUFFIXES:=.class .properties .xsd .java \ - com.sun.mirror.apt.AnnotationProcessorFactory \ - com.sun.tools.internal.xjc.Plugin,\ - JAR:=$(JAXWS_OUTPUTDIR)/dist/lib/classes.jar)) - -$(eval $(call SetupZipArchive,ZIP_JAXWS_SOURCES,\ - SRC:=$(JAXWS_TOPDIR)/src/share/jaf_classes $(JAXWS_TOPDIR)/src/share/jaxws_classes,\ - ZIP:=$(JAXWS_OUTPUTDIR)/dist/lib/src.zip)) - -all: $(JAXWS_OUTPUTDIR)/dist/lib/classes.jar $(JAXWS_OUTPUTDIR)/dist/lib/src.zip - -.PHONY: default all +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) From ab0a4530c8757cc98b452381f52cc0bf35d43cbc Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Fri, 26 Oct 2012 14:25:52 -0700 Subject: [PATCH 116/241] 8000992: Update new build-infra makefiles Build-infra project integration. Multiple authors on this work: erikj and ihse primarily, also changes from ohair, tbell, and dholmes. Special credit to ohstrom for his smartjavac work. Reviewed-by: erikj, ihse, dholmes, tbell --- langtools/makefiles/BuildLangtools.gmk | 205 +++++++++++++++++++++++++ langtools/makefiles/Makefile | 204 +++--------------------- 2 files changed, 229 insertions(+), 180 deletions(-) create mode 100644 langtools/makefiles/BuildLangtools.gmk diff --git a/langtools/makefiles/BuildLangtools.gmk b/langtools/makefiles/BuildLangtools.gmk new file mode 100644 index 00000000000..c5870703870 --- /dev/null +++ b/langtools/makefiles/BuildLangtools.gmk @@ -0,0 +1,205 @@ +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This must be the first rule +default: all + +include $(SPEC) +include MakeBase.gmk +include JavaCompilation.gmk + +# The BOOT_JAVAC setup uses the bootdir compiler to compile the tools +# and the bootstrap javac, to be run by the bootdir jvm. +$(eval $(call SetupJavaCompiler,BOOT_JAVAC,\ + JAVAC:=$(JAVAC),\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA),\ + FLAGS:=-XDignore.symbol.file=true -g -Xlint:all$(COMMA)-deprecation -Werror)) + +# Now setup the compilation of the properties compilation tool. You can depend +# upon $(BUILD_TOOLS) to trigger a compilation of the tools. Note that we +# add src/share/classes to the sourcepath. This is necessary since the GenStubs +# program needs to be linked and run towards the new javac sources. +$(eval $(call SetupJavaCompilation,BUILD_TOOLS,\ + SETUP:=BOOT_JAVAC,\ + DISABLE_SJAVAC:=true,\ + ADD_JAVAC_FLAGS:=-Xprefer:source,\ + SRC:=$(LANGTOOLS_TOPDIR)/make/tools $(LANGTOOLS_TOPDIR)/src/share/classes,\ + INCLUDES:=compileproperties genstubs,\ + BIN:=$(LANGTOOLS_OUTPUTDIR)/btclasses)) + +# The compileprops tools compiles a properties file into a resource bundle. +TOOL_COMPILEPROPS_CMD:=$(JAVA) -cp $(LANGTOOLS_OUTPUTDIR)/btclasses compileproperties.CompileProperties -quiet +# Lookup the properties that need to be compiled into resource bundles. +PROPSOURCES:=$(shell find $(LANGTOOLS_TOPDIR)/src/share/classes -name "*.properties") +# Strip away prefix and suffix, leaving for example only: "com/sun/tools/javac/resources/javac_zh_CN" +PROPPATHS:=$(patsubst $(LANGTOOLS_TOPDIR)/src/share/classes/%.properties,%,$(PROPSOURCES)) +# Generate the list of java files to be created. +PROPJAVAS:=$(patsubst %,$(LANGTOOLS_OUTPUTDIR)/gensrc/%.java,$(PROPPATHS)) +# Generate the package dirs for the tobe generated java files. +PROPDIRS:=$(dir $(PROPJAVAS)) +# Now generate a sequence of "-compile ...javac_zh_CN.properties ...javac_zh_CN.java java.util.ListResourceBundle" +# suitable to be fed into the CompileProperties command. +PROPCMDLINE:=$(subst _SPACE_,$(SPACE),$(join $(addprefix -compile_SPACE_,$(PROPSOURCES)), \ + $(addsuffix _SPACE_java.util.ListResourceBundle,$(addprefix _SPACE_$(LANGTOOLS_OUTPUTDIR)/gensrc/,$(addsuffix .java,$(PROPPATHS)))))) + +# Now setup the rule for the generation of the resource bundles. +$(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d : $(PROPSOURCES) $(BUILD_TOOLS) + rm -rf $(@D)/* + mkdir -p $(@D) $(PROPDIRS) + printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties + printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties + printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties + echo Compiling $(words $(PROPSOURCES) v1 v2 v3) properties into resource bundles + $(TOOL_COMPILEPROPS_CMD) $(PROPCMDLINE) \ + -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties \ + $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.java \ + java.util.ListResourceBundle \ + -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties \ + $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.java \ + java.util.ListResourceBundle \ + -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties \ + $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.java \ + java.util.ListResourceBundle + echo PROPS_ARE_CREATED=yes > $@ + +# Trigger the generation of the resource bundles. After the resource bundles have +# been compiled, then the makefile will restart and the newly created java files +# will become part of the build further along in the makefile. +-include $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d + +ifeq ($(PROPS_ARE_CREATED),yes) + # Setup the rules to build a dist/bootstrap/lib/javac.jar, ie a smaller intermediate javac + # that can be compiled with an old javac. The intermediate javac is then used + # to compile javac again and to build the complete new jdk. + $(eval $(call SetupJavaCompilation,BUILD_BOOTSTRAP_LANGTOOLS,\ + SETUP:=BOOT_JAVAC,\ + DISABLE_SJAVAC:=true,\ + SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc,\ + EXCLUDES:=com/sun/tools/javac/nio,\ + BIN:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap)) + + $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAC,$(BUILD_BOOTSTRAP_LANGTOOLS),\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar,\ + JARMAIN:=com.sun.tools.javac.Main)) + + $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAH,$(BUILD_BOOTSTRAP_LANGTOOLS),\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javah.jar,\ + JARMAIN:=com.sun.tools.javah.Main)) + + $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAP,$(BUILD_BOOTSTRAP_LANGTOOLS),\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javap.jar,\ + JARMAIN:=com.sun.tools.javap.Main)) + + $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVADOC,$(BUILD_BOOTSTRAP_LANGTOOLS),\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javadoc.jar,\ + JARMAIN:=com.sun.tools.javadoc.Main)) + + # GenStubs is used to bootstrap any dependencies from javac to the new JDK that is not + # yet built. It is currently not needed but might be again in the future. The following + # exercises the functionality to verify that it works. + TOOL_GENSTUBS_CMD=$(JAVA) \ + "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ + -classpath $(LANGTOOLS_OUTPUTDIR)/btclasses \ + genstubs.GenStubs + # We fetch source from the JDK... + JDKS=$(JDK_TOPDIR)/src/share/classes + # Build the list of classes to generate stubs from. java/util/Objects.java isn't + # currently needed, but is used as a demo for now. + STUBSOURCES:=$(shell $(FIND) $(JDKS) -name "*.java" | $(GREP) \ + -e "$(JDKS)/java/util/Objects.java") + # Rewrite the file names into class names because the GenStubs tool require this. + STUBCLASSES:=$(subst /,.,$(patsubst $(JDKS)/%.java,%,$(STUBSOURCES))) + + # Now setup the build recipe for genstubs. + $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d : $(STUBSOURCES) $(BUILD_TOOLS) \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ + $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d + mkdir -p $(@D) + mkdir -p $(LANGTOOLS_OUTPUTDIR)/tmpstubs + echo $(LOG_INFO) Generating stubs from JDK sources. + ($(TOOL_GENSTUBS_CMD) -s $(LANGTOOLS_OUTPUTDIR)/tmpstubs -sourcepath $(JDKS) $(STUBCLASSES) && echo STUBS_ARE_CREATED=yes > $@) + if $(DIFF) -x "_the*" -rq $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(LANGTOOLS_OUTPUTDIR)/genstubs > /dev/null 2>&1; then \ + echo $(LOG_INFO) No changes in the stubs!; \ + rm -rf $(LANGTOOLS_OUTPUTDIR)/tmpstubs; \ + else \ + echo $(LOG_INFO) Changes in stubs detected!; \ + rm -rf $(@D); \ + mv $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(@D); \ + fi + echo STUBS_ARE_CREATED=yes > $@ + + # Trigger a generation of the genstubs java source code and a restart + # of the makefile to make sure that the following build setup use the + # newly created java files. + -include $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d + + ifeq ($(STUBS_ARE_CREATED),yes) + # Setup a compiler configuration using the intermediate javac in dist/bootstrap/lib/javac.jar + # that generates code for the new jdk that is being built. + # The code compiled by this compiler setup, cannot necessarily be run with the bootstrap jvm. + $(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE,\ + JVM:=$(JAVA),\ + JAVAC:="-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ + -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar,\ + FLAGS:=-XDignore.symbol.file=true -Xlint:all$(COMMA)-deprecation -Werror,\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) + + # javax.tools.JavaCompilerTool isn't really a suffix but this gets the file copied. + RESOURCE_SUFFIXES:=.gif .xml .css javax.tools.JavaCompilerTool + + $(eval $(call SetupJavaCompilation,BUILD_FULL_JAVAC,\ + SETUP:=GENERATE_NEWBYTECODE,\ + SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc \ + $(LANGTOOLS_OUTPUTDIR)/genstubs,\ + EXCLUDES:=java/util java/io java/nio,\ + COPY:=$(RESOURCE_SUFFIXES),\ + BIN:=$(LANGTOOLS_OUTPUTDIR)/classes)) + + $(eval $(call SetupArchive,ARCHIVE_FULL_JAVAC,$(BUILD_FULL_JAVAC),\ + SETUP:=GENERATE_NEWBYTECODE,\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/classes,\ + SUFFIXES:=.class $(RESOURCE_SUFFIXES),\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar)) + + $(eval $(call SetupZipArchive,ZIP_FULL_JAVAC_SOURCE,\ + SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc,\ + ZIP:=$(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip)) + + all: $(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar \ + $(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javah.jar \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javap.jar \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javadoc.jar + + + endif +endif diff --git a/langtools/makefiles/Makefile b/langtools/makefiles/Makefile index 2f8b4e08bc3..9539fe0e255 100644 --- a/langtools/makefiles/Makefile +++ b/langtools/makefiles/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,183 +23,27 @@ # questions. # -# This must be the first rule -default: all - -include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk - -# The BOOT_JAVAC setup uses the bootdir compiler to compile the tools -# and the bootstrap javac, to be run by the bootdir jvm. -$(eval $(call SetupJavaCompiler,BOOT_JAVAC,\ - JAVAC:=$(JAVAC),\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA),\ - FLAGS:=-XDignore.symbol.file=true -g -Xlint:all$(COMMA)-deprecation -Werror)) - -# Now setup the compilation of the properties compilation tool. You can depend -# upon $(BUILD_TOOLS) to trigger a compilation of the tools. Note that we -# add src/share/classes to the sourcepath. This is necessary since the GenStubs -# program needs to be linked and run towards the new javac sources. -$(eval $(call SetupJavaCompilation,BUILD_TOOLS,\ - SETUP:=BOOT_JAVAC,\ - DISABLE_SJAVAC:=true,\ - ADD_JAVAC_FLAGS:=-Xprefer:source,\ - SRC:=$(LANGTOOLS_TOPDIR)/make/tools $(LANGTOOLS_TOPDIR)/src/share/classes,\ - INCLUDES:=compileproperties genstubs,\ - BIN:=$(LANGTOOLS_OUTPUTDIR)/btclasses)) - -# The compileprops tools compiles a properties file into a resource bundle. -TOOL_COMPILEPROPS_CMD:=$(JAVA) -cp $(LANGTOOLS_OUTPUTDIR)/btclasses compileproperties.CompileProperties -quiet -# Lookup the properties that need to be compiled into resource bundles. -PROPSOURCES:=$(shell find $(LANGTOOLS_TOPDIR)/src/share/classes -name "*.properties") -# Strip away prefix and suffix, leaving for example only: "com/sun/tools/javac/resources/javac_zh_CN" -PROPPATHS:=$(patsubst $(LANGTOOLS_TOPDIR)/src/share/classes/%.properties,%,$(PROPSOURCES)) -# Generate the list of java files to be created. -PROPJAVAS:=$(patsubst %,$(LANGTOOLS_OUTPUTDIR)/gensrc/%.java,$(PROPPATHS)) -# Generate the package dirs for the tobe generated java files. -PROPDIRS:=$(dir $(PROPJAVAS)) -# Now generate a sequence of "-compile ...javac_zh_CN.properties ...javac_zh_CN.java java.util.ListResourceBundle" -# suitable to be fed into the CompileProperties command. -PROPCMDLINE:=$(subst _SPACE_,$(SPACE),$(join $(addprefix -compile_SPACE_,$(PROPSOURCES)), \ - $(addsuffix _SPACE_java.util.ListResourceBundle,$(addprefix _SPACE_$(LANGTOOLS_OUTPUTDIR)/gensrc/,$(addsuffix .java,$(PROPPATHS)))))) - -# Now setup the rule for the generation of the resource bundles. -$(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d : $(PROPSOURCES) $(BUILD_TOOLS) - rm -rf $(@D)/* - mkdir -p $(@D) $(PROPDIRS) - printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties - printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties - printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties - echo Compiling $(words $(PROPSOURCES) v1 v2 v3) properties into resource bundles - $(TOOL_COMPILEPROPS_CMD) $(PROPCMDLINE) \ - -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties \ - $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.java \ - java.util.ListResourceBundle \ - -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties \ - $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.java \ - java.util.ListResourceBundle \ - -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties \ - $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.java \ - java.util.ListResourceBundle - echo PROPS_ARE_CREATED=yes > $@ - -# Trigger the generation of the resource bundles. After the resource bundles have -# been compiled, then the makefile will restart and the newly created java files -# will become part of the build further along in the makefile. --include $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d - -ifeq ($(PROPS_ARE_CREATED),yes) - # Setup the rules to build a dist/bootstrap/lib/javac.jar, ie a smaller intermediate javac - # that can be compiled with an old javac. The intermediate javac is then used - # to compile javac again and to build the complete new jdk. - $(eval $(call SetupJavaCompilation,BUILD_BOOTSTRAP_LANGTOOLS,\ - SETUP:=BOOT_JAVAC,\ - DISABLE_SJAVAC:=true,\ - SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc,\ - EXCLUDES:=com/sun/tools/javac/nio,\ - BIN:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap)) - - $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAC,$(BUILD_BOOTSTRAP_LANGTOOLS),\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar,\ - JARMAIN:=com.sun.tools.javac.Main)) - - $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAH,$(BUILD_BOOTSTRAP_LANGTOOLS),\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javah.jar,\ - JARMAIN:=com.sun.tools.javah.Main)) - - $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAP,$(BUILD_BOOTSTRAP_LANGTOOLS),\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javap.jar,\ - JARMAIN:=com.sun.tools.javap.Main)) - - $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVADOC,$(BUILD_BOOTSTRAP_LANGTOOLS),\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javadoc.jar,\ - JARMAIN:=com.sun.tools.javadoc.Main)) - - # GenStubs is used to bootstrap any dependencies from javac to the new JDK that is not - # yet built. It is currently not needed but might be again in the future. The following - # exercises the functionality to verify that it works. - TOOL_GENSTUBS_CMD=$(JAVA) \ - "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ - -classpath $(LANGTOOLS_OUTPUTDIR)/btclasses \ - genstubs.GenStubs - # We fetch source from the JDK... - JDKS=$(JDK_TOPDIR)/src/share/classes - # Build the list of classes to generate stubs from. java/util/Objects.java isn't - # currently needed, but is used as a demo for now. - STUBSOURCES:=$(shell $(FIND) $(JDKS) -name "*.java" | $(GREP) \ - -e "$(JDKS)/java/util/Objects.java") - # Rewrite the file names into class names because the GenStubs tool require this. - STUBCLASSES:=$(subst /,.,$(patsubst $(JDKS)/%.java,%,$(STUBSOURCES))) - - # Now setup the build recipe for genstubs. - $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d : $(STUBSOURCES) $(BUILD_TOOLS) \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ - $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d - mkdir -p $(@D) - mkdir -p $(LANGTOOLS_OUTPUTDIR)/tmpstubs - echo Generating stubs from JDK sources. - ($(TOOL_GENSTUBS_CMD) -s $(LANGTOOLS_OUTPUTDIR)/tmpstubs -sourcepath $(JDKS) $(STUBCLASSES) && echo STUBS_ARE_CREATED=yes > $@) - if $(DIFF) -x "_the*" -rq $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(LANGTOOLS_OUTPUTDIR)/genstubs > /dev/null 2>&1; then \ - echo No changes in the stubs!; \ - rm -rf $(LANGTOOLS_OUTPUTDIR)/tmpstubs; \ - else \ - echo Changes in stubs detected!; \ - rm -rf $(@D); \ - mv $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(@D); \ - fi - echo STUBS_ARE_CREATED=yes > $@ - - # Trigger a generation of the genstubs java source code and a restart - # of the makefile to make sure that the following build setup use the - # newly created java files. - -include $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d - - ifeq ($(STUBS_ARE_CREATED),yes) - # Setup a compiler configuration using the intermediate javac in dist/bootstrap/lib/javac.jar - # that generates code for the new jdk that is being built. - # The code compiled by this compiler setup, cannot necessarily be run with the bootstrap jvm. - $(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE,\ - JVM:=$(JAVA),\ - JAVAC:="-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ - -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar,\ - FLAGS:=-XDignore.symbol.file=true -Xlint:all$(COMMA)-deprecation -Werror,\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - - # javax.tools.JavaCompilerTool isn't really a suffix but this gets the file copied. - RESOURCE_SUFFIXES:=.gif .xml .css javax.tools.JavaCompilerTool - - $(eval $(call SetupJavaCompilation,BUILD_FULL_JAVAC,\ - SETUP:=GENERATE_NEWBYTECODE,\ - SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc \ - $(LANGTOOLS_OUTPUTDIR)/genstubs,\ - EXCLUDES:=java/util java/io java/nio,\ - COPY:=$(RESOURCE_SUFFIXES),\ - BIN:=$(LANGTOOLS_OUTPUTDIR)/classes)) - - $(eval $(call SetupArchive,ARCHIVE_FULL_JAVAC,$(BUILD_FULL_JAVAC),\ - SETUP:=GENERATE_NEWBYTECODE,\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/classes,\ - SUFFIXES:=.class $(RESOURCE_SUFFIXES),\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar)) - - $(eval $(call SetupZipArchive,ZIP_FULL_JAVAC_SOURCE,\ - SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc,\ - ZIP:=$(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip)) - - all: $(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar \ - $(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javah.jar \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javap.jar \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javadoc.jar - - - endif +# Locate this Makefile +ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) + makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path:=$(lastword $(MAKEFILE_LIST)) endif +repo_dir:=$(patsubst %/makefiles/Makefile,%,$(makefile_path)) + +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name:=$(notdir $(repo_dir)) + +# Try to locate top-level makefile +top_level_makefile:=$(repo_dir)/../common/makefiles/Makefile +ifneq ($(wildcard $(top_level_makefile)),) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) +endif + +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) From f9c6f4bd18e3e68225f1e4a91a8baef061e6348e Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Fri, 26 Oct 2012 14:29:57 -0700 Subject: [PATCH 117/241] 8000992: Update new build-infra makefiles Build-infra project integration. Multiple authors on this work: erikj and ihse primarily, also changes from ohair, tbell, and dholmes. Special credit to ohstrom for his smartjavac work. Reviewed-by: erikj, ihse, dholmes, tbell --- NewMakefile.gmk | 144 +- common/autoconf/autogen.sh | 17 +- common/autoconf/basics.m4 | 506 +- common/autoconf/basics_windows.m4 | 406 + common/autoconf/boot-jdk.m4 | 42 +- common/autoconf/build-aux/config.guess | 3 + common/autoconf/build-performance.m4 | 22 +- common/autoconf/builddeps.m4 | 17 +- common/autoconf/closed.version.numbers | 4 + common/autoconf/compare.sh.in | 1609 +- common/autoconf/configure | 175 +- common/autoconf/configure.ac | 61 +- common/autoconf/generated-configure.sh | 19901 +++++++++++++--- common/autoconf/help.m4 | 23 +- common/autoconf/hotspot-spec.gmk.in | 16 +- common/autoconf/jdk-options.m4 | 113 +- common/autoconf/libraries.m4 | 80 +- common/autoconf/platform.m4 | 60 +- common/autoconf/spec.gmk.in | 80 +- common/autoconf/toolchain.m4 | 396 +- common/autoconf/toolchain_windows.m4 | 258 + common/autoconf/version.numbers | 4 + common/bin/compare.sh | 1220 + common/bin/compare_exceptions.sh.incl | 935 + common/bin/compareimage.sh | 335 - common/bin/diffexec.sh | 186 - common/bin/diffjarzip.sh | 155 - common/bin/difflib.sh | 207 - common/bin/difftext.sh | 157 - common/bin/exception_list_linux | 114 - common/bin/extractvcvars.sh | 53 - .../bin/hide_important_warnings_from_javac.sh | 2 +- common/bin/logger.sh | 2 +- common/bin/shell-tracer.sh | 47 + common/makefiles/HotspotWrapper.gmk | 5 +- common/makefiles/IdlCompilation.gmk | 14 +- common/makefiles/JavaCompilation.gmk | 228 +- common/makefiles/Main.gmk | 208 + common/makefiles/MakeBase.gmk | 179 +- common/makefiles/MakeHelpers.gmk | 275 +- common/makefiles/Makefile | 233 +- common/makefiles/NativeCompilation.gmk | 69 +- common/makefiles/RMICompilation.gmk | 17 +- .../ListPathsSafely-post-compress.incl} | 2 +- .../ListPathsSafely-pre-compress.incl} | 2 +- .../ListPathsSafely-uncompress.sed} | 0 .../{bin => makefiles/support}/unicode2x.sed | 0 common/src/{uncygdrive.c => fixpath.c} | 98 +- configure | 29 + 49 files changed, 20667 insertions(+), 8042 deletions(-) create mode 100644 common/autoconf/basics_windows.m4 create mode 100644 common/autoconf/toolchain_windows.m4 create mode 100644 common/bin/compare.sh create mode 100644 common/bin/compare_exceptions.sh.incl delete mode 100644 common/bin/compareimage.sh delete mode 100644 common/bin/diffexec.sh delete mode 100644 common/bin/diffjarzip.sh delete mode 100644 common/bin/difflib.sh delete mode 100644 common/bin/difftext.sh delete mode 100644 common/bin/exception_list_linux delete mode 100644 common/bin/extractvcvars.sh create mode 100644 common/bin/shell-tracer.sh create mode 100644 common/makefiles/Main.gmk rename common/makefiles/{compress.post => support/ListPathsSafely-post-compress.incl} (87%) rename common/makefiles/{compress.pre => support/ListPathsSafely-pre-compress.incl} (98%) rename common/makefiles/{uncompress.sed => support/ListPathsSafely-uncompress.sed} (100%) rename common/{bin => makefiles/support}/unicode2x.sed (100%) rename common/src/{uncygdrive.c => fixpath.c} (66%) create mode 100644 configure diff --git a/NewMakefile.gmk b/NewMakefile.gmk index 252f98b5bd3..f38d7396a7d 100644 --- a/NewMakefile.gmk +++ b/NewMakefile.gmk @@ -31,8 +31,9 @@ CMP=cmp CP=cp ECHO=echo MKDIR=mkdir +PRINTF=printf PWD=pwd -SH=sh +TAR=tar ifeq ($(PLATFORM),windows) ZIP=zip else @@ -63,10 +64,48 @@ all images clean: checks $(ECHO) "ERROR: No configurations to build"; exit 1; \ fi @for bdir in $(dir $(ALL_MAKEFILES)) ; do \ - $(ECHO) "$(CD) $${bdir} && $(MAKE) $(EXTRA_MAKE_ARGS) $@" ; \ - $(CD) $${bdir} && $(MAKE) $(EXTRA_MAKE_ARGS) $@ ; \ + $(ECHO) "$(CD) $${bdir} && $(MAKE) $@" ; \ + $(CD) $${bdir} && $(MAKE) $@ ; \ done +# TBD: Deploy input +$(BUILD_DIR_ROOT)/.deploy_input: + @if [ "$(ALL_MAKEFILES)" = "" ] ; then \ + $(ECHO) "ERROR: No configurations to build"; exit 1; \ + fi + @for bdir in $(dir $(ALL_MAKEFILES)) ; do \ + if [ deploy/make/Makefile ] ; then \ + echo "Attempting deploy build." ; \ + ( \ + $(RM) -r $${bdir}/deploy_input ; \ + $(MKDIR) -p $${bdir}/deploy_input ; \ + ( $(CD) $${bdir}/images && $(TAR) -cf - j2sdk-image j2re-image ) \ + | ( $(CD) $${bdir}/deploy_input && $(TAR) -xf - ) ; \ + ) ; \ + fi; \ + done + touch $@ + +# TBD: Deploy images +deploy: $(BUILD_DIR_ROOT)/.deploy_input + @if [ "$(ALL_MAKEFILES)" = "" ] ; then \ + $(ECHO) "ERROR: No configurations to build"; exit 1; \ + fi + @for bdir in $(dir $(ALL_MAKEFILES)) ; do \ + if [ deploy/make/Makefile ] ; then \ + echo "Attempting deploy build." ; \ + ( \ + $(CD) deploy/make && \ + $(MAKE) \ + ABS_OUTPUTDIR=$${bdir}/deploy_input \ + OUTPUTDIR=$${bdir}/deploy_input \ + ) ; \ + fi; \ + done + +# TBD: Install bundles +install: + # Bundle creation bundles: @if [ "$(ALL_IMAGE_DIRS)" = "" ] ; then \ @@ -91,8 +130,8 @@ clobber:: checks: @$(ECHO) "No checks yet" -# Keep track of phony targets -PHONY_LIST += all images clean clobber checks +# Keep track of user targets +USER_TARGETS += all deploy install images clean clobber checks ########################################################################### # To help in adoption of the new configure&&make build process, a bridge @@ -102,32 +141,18 @@ PHONY_LIST += all images clean clobber checks bridgeBuild: bridge2configure images # Bridge from old Makefile ALT settings to configure options -bridge2configure: .bridge2configureOpts - $(CD) common/makefiles && sh ../autoconf/configure $(strip $(shell $(CAT) $<)) +bridge2configure: $(BUILD_DIR_ROOT)/.bridge2configureOpts + bash ./configure $(strip $(shell $(CAT) $<)) # Create a file with configure options created from old Makefile mechanisms. -.bridge2configureOpts: .bridge2configureOptsLatest +$(BUILD_DIR_ROOT)/.bridge2configureOpts: $(BUILD_DIR_ROOT)/.bridge2configureOptsLatest $(RM) $@ $(CP) $< $@ -# In case make was invoked from a specific path -_MAKE_COMMAND_PATH:=$(firstword $(MAKE)) -ifneq ($(dir $(_MAKE_COMMAND_PATH)),./) - # This could be removed someday if JPRT was fixed and we could assume that - # the path to make was always in PATH. - MAKE_BINDIR:=$(call UnixPath,$(dir $(_MAKE_COMMAND_PATH))) - NEWPATH:=$(MAKE_BINDIR):${PATH} - PATH:=$(NEWPATH) - export PATH - MAKE_COMMAND=$(MAKE_BINDIR)/$(notdir $(_MAKE_COMMAND_PATH)) -else - MAKE_COMMAND=$(_MAKE_COMMAND_PATH) -endif - # Use this file to only change when obvious things have changed -.bridge2configureOptsLatest: FRC +$(BUILD_DIR_ROOT)/.bridge2configureOptsLatest: FRC $(RM) $@.tmp - @$(ECHO) " MAKE=$(MAKE_COMMAND) " >> $@.tmp + $(MKDIR) -p $(BUILD_DIR_ROOT) @$(ECHO) " --with-debug-level=$(if $(DEBUG_LEVEL),$(DEBUG_LEVEL),release) " >> $@.tmp ifdef ARCH_DATA_MODEL @$(ECHO) " --with-target-bits=$(ARCH_DATA_MODEL) " >> $@.tmp @@ -156,11 +181,21 @@ endif # Clobber all the built files clobber:: bridge2clobber bridge2clobber:: - $(RM) .bridge2* + $(RM) $(BUILD_DIR_ROOT)/.bridge2* + $(RM) $(BUILD_DIR_ROOT)/.deploy_input # Keep track of phony targets PHONY_LIST += bridge2configure bridgeBuild bridge2clobber +########################################################################### +# Sanity checks (history target) +# + +sanity: checks + +# Keep track of user targets +USER_TARGETS += sanity + ########################################################################### # Javadocs # @@ -168,8 +203,8 @@ PHONY_LIST += bridge2configure bridgeBuild bridge2clobber javadocs: cd common/makefiles && $(MAKE) -f MakefileJavadoc.gmk -# Keep track of phony targets -PHONY_LIST += javadocs +# Keep track of user targets +USER_TARGETS += javadocs ########################################################################### # JPRT targets @@ -190,7 +225,6 @@ jprt_build_debug: DEBUG_LEVEL=slowdebug jprt_build_debug: BUILD_DIRNAME=*-debug jprt_build_debug: jprt_build_generic -jprt_build_generic: EXTRA_MAKE_ARGS=LOG=nofile,info jprt_build_generic: $(JPRT_ARCHIVE_BUNDLE) $(JPRT_ARCHIVE_BUNDLE): bridgeBuild bundles @@ -202,10 +236,60 @@ $(JPRT_ARCHIVE_BUNDLE): bridgeBuild bundles PHONY_LIST += jprt_build_product jprt_build_fastdebug jprt_build_debug \ jprt_build_generic +########################################################################### +# Help target + +HELP_FORMAT=%12s%s\n + +help: + @$(PRINTF) "# JDK Makefile\n" + @$(PRINTF) "#\n" + @$(PRINTF) "# Usage: make [Target]\n" + @$(PRINTF) "#\n" + @$(PRINTF) "# $(HELP_FORMAT)" "Target " "Description" + @$(PRINTF) "# $(HELP_FORMAT)" "------ " "-----------" + @for i in $(USER_TARGETS) ; do \ + $(MAKE) help_$${i} ; \ + done + @$(PRINTF) "#\n" + +help_all: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Build the entire jdk but not the images" +help_images: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Create the jdk images for the builds" +help_deploy: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Create the jdk deploy images from the jdk images" +help_install: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Create the jdk install bundles from the deploy images" +help_clean: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Clean and prepare for a fresh build from scratch" +help_clobber: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Clean and also purge any hidden derived data" +help_checks: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Perform various checks to make sure we can build" +help_sanity: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Same as 'make checks'" +help_javadocs: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Build the javadocs" +help_help: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Print out the help messages" + +# Keep track of user targets +USER_TARGETS += help + ########################################################################### # Phony targets -.PHONY: $(PHONY_LIST) +.PHONY: $(PHONY_LIST) $(USER_TARGETS) # Force target FRC: - diff --git a/common/autoconf/autogen.sh b/common/autoconf/autogen.sh index 1ab55f77ff6..d4da90c77ee 100644 --- a/common/autoconf/autogen.sh +++ b/common/autoconf/autogen.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -29,14 +29,11 @@ if test "x`uname -s`" = "xSunOS"; then # date +%s is not available on Solaris, use this workaround # from http://solarisjedi.blogspot.co.uk/2006/06/solaris-date-command-and-epoch-time.html TIMESTAMP=`/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);print $2}'` - # On Solaris /bin/sh doesn't support test -e but /usr/bin/test does. - TEST=`which test` else TIMESTAMP=`date +%s` - TEST="test" fi -if $TEST "$CUSTOM_CONFIG_DIR" = ""; then +if test "x$CUSTOM_CONFIG_DIR" = "x"; then custom_script_dir="$script_dir/../../jdk/make/closed/autoconf" else custom_script_dir=$CUSTOM_CONFIG_DIR @@ -44,16 +41,22 @@ fi custom_hook=$custom_script_dir/custom-hook.m4 +if test "x`which autoconf 2> /dev/null`" = x; then + echo You need autoconf installed to be able to regenerate the configure script + echo Error: Cannot find autoconf 1>&2 + exit 1 +fi + echo Generating generated-configure.sh cat $script_dir/configure.ac | sed -e "s|@DATE_WHEN_GENERATED@|$TIMESTAMP|" | autoconf -W all -I$script_dir - > $script_dir/generated-configure.sh rm -rf autom4te.cache -if $TEST -e $custom_hook; then +if test -e $custom_hook; then echo Generating custom generated-configure.sh # We have custom sources available; also generate configure script # with custom hooks compiled in. cat $script_dir/configure.ac | sed -e "s|@DATE_WHEN_GENERATED@|$TIMESTAMP|" | \ - sed -e "s|AC_DEFUN_ONCE(\[CUSTOM_HOOK\])|m4_include([$custom_hook])|" | autoconf -W all -I$script_dir - > $custom_script_dir/generated-configure.sh + sed -e "s|#CUSTOM_AUTOCONF_INCLUDE|m4_include([$custom_hook])|" | autoconf -W all -I$script_dir - > $custom_script_dir/generated-configure.sh rm -rf autom4te.cache else echo No custom hook found: $custom_hook diff --git a/common/autoconf/basics.m4 b/common/autoconf/basics.m4 index e0e7cf63d11..6c30a22ab2a 100644 --- a/common/autoconf/basics.m4 +++ b/common/autoconf/basics.m4 @@ -34,84 +34,102 @@ AC_DEFUN([ADD_JVM_ARG_IF_OK], fi ]) -AC_DEFUN([SET_FULL_PATH], +# This will make sure the given variable points to a full and proper +# path. This means: +# 1) There will be no spaces in the path. On posix platforms, +# spaces in the path will result in an error. On Windows, +# the path will be rewritten using short-style to be space-free. +# 2) The path will be absolute, and it will be in unix-style (on +# cygwin). +# $1: The name of the variable to fix +AC_DEFUN([BASIC_FIXUP_PATH], [ - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="[$]$1" - car="${tmp%% *}" - tmp="[$]$1 EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - SET_FULL_PATH_SPACESAFE(car) - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - $1="$car ${cdr% *}" - else - $1="$car" - fi -]) - -AC_DEFUN([SPACESAFE], -[ - # Fail with message $2 if var $1 contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "[$]$1" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - $1=`$CYGPATH -s -m -a "[$]$1"` - # Now it's case insensitive; let's make it lowercase to improve readability - $1=`$ECHO "[$]$1" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - $1=`$CYGPATH -u "[$]$1"` - else - AC_MSG_ERROR([You cannot have spaces in $2! "[$]$1"]) - fi - fi -]) - -AC_DEFUN([SET_FULL_PATH_SPACESAFE], -[ - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="[$]$1" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + BASIC_FIXUP_PATH_CYGWIN($1) + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + BASIC_FIXUP_PATH_MSYS($1) + else + # We're on a posix platform. Hooray! :) + path="[$]$1" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "[$]$1"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + if test ! -f "$path" && test ! -d "$path"; then + AC_MSG_ERROR([The path of $1, which resolves as "$path", is not found.]) fi - $1="$tmp" + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + AC_MSG_NOTICE([The path of $1, which resolves as "$path", is invalid.]) + AC_MSG_ERROR([Spaces are not allowed in this path.]) + fi + fi ]) -AC_DEFUN([REMOVE_SYMBOLIC_LINKS], +# This will make sure the given variable points to a executable +# with a full and proper path. This means: +# 1) There will be no spaces in the path. On posix platforms, +# spaces in the path will result in an error. On Windows, +# the path will be rewritten using short-style to be space-free. +# 2) The path will be absolute, and it will be in unix-style (on +# cygwin). +# Any arguments given to the executable is preserved. +# If the input variable does not have a directory specification, then +# it need to be in the PATH. +# $1: The name of the variable to fix +AC_DEFUN([BASIC_FIXUP_EXECUTABLE], +[ + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + BASIC_FIXUP_EXECUTABLE_CYGWIN($1) + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + BASIC_FIXUP_EXECUTABLE_MSYS($1) + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="[$]$1" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + AC_MSG_NOTICE([Resolving $1 (as $path) with 'which' failed, using $path directly.]) + new_path="$path" + else + AC_MSG_NOTICE([The path of $1, which resolves as "$complete", is not found.]) + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + AC_MSG_NOTICE([This might be caused by spaces in the path, which is not allowed.]) + fi + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + $1="$new_complete" + AC_MSG_NOTICE([Rewriting $1 to "$new_complete"]) + fi +]) + +AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS], [ if test "x$OPENJDK_BUILD_OS" != xwindows; then # Follow a chain of symbolic links. Use readlink # where it exists, else fall back to horribly # complicated shell code. - AC_PATH_PROG(READLINK, readlink) if test "x$READLINK_TESTED" != yes; then # On MacOSX there is a readlink tool with a different # purpose than the GNU readlink tool. Check the found readlink. - ISGNU=`$READLINK --help 2>&1 | grep GNU` + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` if test "x$ISGNU" = x; then # A readlink that we do not know how to use. # Are there other non-GNU readlinks out there? @@ -125,23 +143,25 @@ AC_DEFUN([REMOVE_SYMBOLIC_LINKS], else STARTDIR=$PWD COUNTER=0 - DIR=`dirname [$]$1` - FIL=`basename [$]$1` + DIR=`$DIRNAME [$]$1` + FILE=`$BASENAME [$]$1` while test $COUNTER -lt 20; do - ISLINK=`ls -l $DIR/$FIL | grep '\->' | sed -e 's/.*-> \(.*\)/\1/'` + ISLINK=`$LS -l $DIR/$FILE | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` if test "x$ISLINK" == x; then # This is not a symbolic link! We are done! break fi # The link might be relative! We have to use cd to travel safely. cd $DIR - cd `dirname $ISLINK` - DIR=`pwd` - FIL=`basename $ISLINK` + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + DIR=`$THEPWDCMD` + FILE=`$BASENAME $ISLINK` let COUNTER=COUNTER+1 done cd $STARTDIR - $1=$DIR/$FIL + $1=$DIR/$FILE fi fi ]) @@ -152,6 +172,107 @@ AC_DEFUN_ONCE([BASIC_INIT], AC_SUBST(CONFIGURE_COMMAND_LINE) DATE_WHEN_CONFIGURED=`LANG=C date` AC_SUBST(DATE_WHEN_CONFIGURED) +AC_MSG_NOTICE([Configuration created at $DATE_WHEN_CONFIGURED.]) +AC_MSG_NOTICE([configure script generated at timestamp $DATE_WHEN_GENERATED.]) +]) + +# Test that variable $1 denoting a program is not empty. If empty, exit with an error. +# $1: variable to check +# $2: executable name to print in warning (optional) +AC_DEFUN([BASIC_CHECK_NONEMPTY], +[ + if test "x[$]$1" = x; then + if test "x$2" = x; then + PROG_NAME=translit($1,A-Z,a-z) + else + PROG_NAME=$2 + fi + AC_MSG_NOTICE([Could not find $PROG_NAME!]) + AC_MSG_ERROR([Cannot continue]) + fi +]) + +# Does AC_PATH_PROG followed by BASIC_CHECK_NONEMPTY. +# Arguments as AC_PATH_PROG: +# $1: variable to set +# $2: executable name to look for +AC_DEFUN([BASIC_REQUIRE_PROG], +[ + AC_PATH_PROGS($1, $2) + BASIC_CHECK_NONEMPTY($1, $2) +]) + +# Setup the most fundamental tools that relies on not much else to set up, +# but is used by much of the early bootstrap code. +AC_DEFUN_ONCE([BASIC_SETUP_FUNDAMENTAL_TOOLS], +[ + +# Start with tools that do not need have cross compilation support +# and can be expected to be found in the default PATH. These tools are +# used by configure. Nor are these tools expected to be found in the +# devkit from the builddeps server either, since they are +# needed to download the devkit. + +# First are all the simple required tools. +BASIC_REQUIRE_PROG(BASENAME, basename) +BASIC_REQUIRE_PROG(BASH, bash) +BASIC_REQUIRE_PROG(CAT, cat) +BASIC_REQUIRE_PROG(CHMOD, chmod) +BASIC_REQUIRE_PROG(CMP, cmp) +BASIC_REQUIRE_PROG(CP, cp) +BASIC_REQUIRE_PROG(CUT, cut) +BASIC_REQUIRE_PROG(DATE, date) +BASIC_REQUIRE_PROG(DIFF, [gdiff diff]) +BASIC_REQUIRE_PROG(DIRNAME, dirname) +BASIC_REQUIRE_PROG(ECHO, echo) +BASIC_REQUIRE_PROG(EXPR, expr) +BASIC_REQUIRE_PROG(FILE, file) +BASIC_REQUIRE_PROG(FIND, find) +BASIC_REQUIRE_PROG(HEAD, head) +BASIC_REQUIRE_PROG(LN, ln) +BASIC_REQUIRE_PROG(LS, ls) +BASIC_REQUIRE_PROG(MKDIR, mkdir) +BASIC_REQUIRE_PROG(MKTEMP, mktemp) +BASIC_REQUIRE_PROG(MV, mv) +BASIC_REQUIRE_PROG(PRINTF, printf) +BASIC_REQUIRE_PROG(THEPWDCMD, pwd) +BASIC_REQUIRE_PROG(RM, rm) +BASIC_REQUIRE_PROG(SH, sh) +BASIC_REQUIRE_PROG(SORT, sort) +BASIC_REQUIRE_PROG(TAIL, tail) +BASIC_REQUIRE_PROG(TAR, tar) +BASIC_REQUIRE_PROG(TEE, tee) +BASIC_REQUIRE_PROG(TOUCH, touch) +BASIC_REQUIRE_PROG(TR, tr) +BASIC_REQUIRE_PROG(UNAME, uname) +BASIC_REQUIRE_PROG(UNIQ, uniq) +BASIC_REQUIRE_PROG(WC, wc) +BASIC_REQUIRE_PROG(WHICH, which) +BASIC_REQUIRE_PROG(XARGS, xargs) + +# Then required tools that require some special treatment. +AC_PROG_AWK +BASIC_CHECK_NONEMPTY(AWK) +AC_PROG_GREP +BASIC_CHECK_NONEMPTY(GREP) +AC_PROG_EGREP +BASIC_CHECK_NONEMPTY(EGREP) +AC_PROG_FGREP +BASIC_CHECK_NONEMPTY(FGREP) +AC_PROG_SED +BASIC_CHECK_NONEMPTY(SED) + +AC_PATH_PROGS(NAWK, [nawk gawk awk]) +BASIC_CHECK_NONEMPTY(NAWK) + +# Always force rm. +RM="$RM -f" + +# These are not required on all platforms +AC_PATH_PROG(CYGPATH, cygpath) +AC_PATH_PROG(READLINK, readlink) +AC_PATH_PROG(DF, df) +AC_PATH_PROG(SETFILE, SetFile) ]) # Setup basic configuration paths, and platform-specific stuff related to PATHs. @@ -159,46 +280,37 @@ AC_DEFUN_ONCE([BASIC_SETUP_PATHS], [ # Locate the directory of this script. SCRIPT="[$]0" -REMOVE_SYMBOLIC_LINKS(SCRIPT) -AUTOCONF_DIR=`dirname [$]0` +BASIC_REMOVE_SYMBOLIC_LINKS(SCRIPT) +AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD` # Where is the source? It is located two levels above the configure script. CURDIR="$PWD" cd "$AUTOCONF_DIR/../.." SRC_ROOT="`pwd`" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - SRC_ROOT_LENGTH=`pwd|wc -m` - if test $SRC_ROOT_LENGTH -gt 100; then - AC_MSG_ERROR([Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported]) - fi + +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + PATH_SEP=";" + BASIC_CHECK_PATHS_WINDOWS +else + PATH_SEP=":" fi + AC_SUBST(SRC_ROOT) +AC_SUBST(PATH_SEP) cd "$CURDIR" -SPACESAFE(SRC_ROOT,[the path to the source root]) -SPACESAFE(CURDIR,[the path to the current directory]) +BASIC_FIXUP_PATH(SRC_ROOT) +BASIC_FIXUP_PATH(CURDIR) if test "x$OPENJDK_BUILD_OS" = "xsolaris"; then # Add extra search paths on solaris for utilities like ar and as etc... PATH="$PATH:/usr/ccs/bin:/usr/sfw/bin:/opt/csw/bin" fi -# For cygwin we need cygpath first, since it is used everywhere. -AC_PATH_PROG(CYGPATH, cygpath) -PATH_SEP=":" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - if test "x$CYGPATH" = x; then - AC_MSG_ERROR([Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path]) - fi - PATH_SEP=";" -fi -AC_SUBST(PATH_SEP) - # You can force the sys-root if the sys-root encoded into the cross compiler tools # is not correct. AC_ARG_WITH(sys-root, [AS_HELP_STRING([--with-sys-root], - [pass this sys-root to the compilers and linker (useful if the sys-root encoded in - the cross compiler tools is incorrect)])]) + [pass this sys-root to the compilers and tools (for cross-compiling)])]) if test "x$with_sys_root" != x; then SYS_ROOT=$with_sys_root @@ -208,7 +320,7 @@ fi AC_SUBST(SYS_ROOT) AC_ARG_WITH([tools-dir], [AS_HELP_STRING([--with-tools-dir], - [search this directory for (cross-compiling) compilers and tools])], [TOOLS_DIR=$with_tools_dir]) + [search this directory for compilers and tools (for cross-compiling)])], [TOOLS_DIR=$with_tools_dir]) AC_ARG_WITH([devkit], [AS_HELP_STRING([--with-devkit], [use this directory as base for tools-dir and sys-root (for cross-compiling)])], @@ -228,8 +340,9 @@ AC_ARG_WITH([devkit], [AS_HELP_STRING([--with-devkit], AC_DEFUN_ONCE([BASIC_SETUP_OUTPUT_DIR], [ +AC_MSG_CHECKING([what configuration name to use]) AC_ARG_WITH(conf-name, [AS_HELP_STRING([--with-conf-name], - [use this as the name of the configuration, overriding the generated default])], + [use this as the name of the configuration @<:@generated from important configuration options@:>@])], [ CONF_NAME=${with_conf_name} ]) # Test from where we are running configure, in or outside of src root. @@ -240,7 +353,7 @@ if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" || te CONF_NAME="${OPENJDK_TARGET_OS}-${OPENJDK_TARGET_CPU}-${JDK_VARIANT}-${ANDED_JVM_VARIANTS}-${DEBUG_LEVEL}" fi OUTPUT_ROOT="$SRC_ROOT/build/${CONF_NAME}" - mkdir -p "$OUTPUT_ROOT" + $MKDIR -p "$OUTPUT_ROOT" if test ! -d "$OUTPUT_ROOT"; then AC_MSG_ERROR([Could not create build directory $OUTPUT_ROOT]) fi @@ -254,8 +367,9 @@ else fi OUTPUT_ROOT="$CURDIR" fi +AC_MSG_RESULT([$CONF_NAME]) -SPACESAFE(OUTPUT_ROOT,[the path to the output root]) +BASIC_FIXUP_PATH(OUTPUT_ROOT) AC_SUBST(SPEC, $OUTPUT_ROOT/spec.gmk) AC_SUBST(CONF_NAME, $CONF_NAME) @@ -287,7 +401,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_LOGGING], # Setup default logging of stdout and stderr to build.log in the output root. BUILD_LOG='$(OUTPUT_ROOT)/build.log' BUILD_LOG_PREVIOUS='$(OUTPUT_ROOT)/build.log.old' -BUILD_LOG_WRAPPER='$(SH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)' +BUILD_LOG_WRAPPER='$(BASH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)' AC_SUBST(BUILD_LOG) AC_SUBST(BUILD_LOG_PREVIOUS) AC_SUBST(BUILD_LOG_WRAPPER) @@ -305,7 +419,6 @@ AC_DEFUN([BASIC_CHECK_MAKE_VERSION], DESCRIPTION="$2" if test "x$MAKE_CANDIDATE" != x; then AC_MSG_NOTICE([Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION]) - SET_FULL_PATH(MAKE_CANDIDATE) MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` if test "x$IS_GNU_MAKE" = x; then @@ -314,8 +427,27 @@ AC_DEFUN([BASIC_CHECK_MAKE_VERSION], IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[[12346789]]'` if test "x$IS_MODERN_MAKE" = x; then AC_MSG_NOTICE([Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring.]) - else - FOUND_MAKE=$MAKE_CANDIDATE + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + AC_MSG_ERROR([Unknown Windows environment]) + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + AC_MSG_NOTICE([Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring.]) + else + FOUND_MAKE=$MAKE_CANDIDATE + BASIC_FIXUP_EXECUTABLE(FOUND_MAKE) + fi fi fi fi @@ -330,7 +462,7 @@ AC_DEFUN([BASIC_CHECK_GNU_MAKE], if test ! -f "$MAKE"; then AC_MSG_ERROR([The specified make (by MAKE=$MAKE) is not found.]) fi - BASIC_CHECK_MAKE_VERSION("$MAKE", [user supplied MAKE=]) + BASIC_CHECK_MAKE_VERSION("$MAKE", [user supplied MAKE=$MAKE]) if test "x$FOUND_MAKE" = x; then AC_MSG_ERROR([The specified make (by MAKE=$MAKE) is not GNU make 3.81 or newer.]) fi @@ -375,7 +507,7 @@ AC_DEFUN([BASIC_CHECK_FIND_DELETE], AC_MSG_CHECKING([if find supports -delete]) FIND_DELETE="-delete" - DELETEDIR=`mktemp -d tmp.XXXXXXXXXX` || (echo Could not create temporary directory!; exit $?) + DELETEDIR=`$MKTEMP -d tmp.XXXXXXXXXX` || (echo Could not create temporary directory!; exit $?) echo Hejsan > $DELETEDIR/TestIfFindSupportsDelete @@ -389,102 +521,22 @@ AC_DEFUN([BASIC_CHECK_FIND_DELETE], AC_MSG_RESULT([yes]) fi rmdir $DELETEDIR + AC_SUBST(FIND_DELETE) ]) -# Test that variable $1 denoting a program is not empty. If empty, exit with an error. -# $1: variable to check -# $2: executable name to print in warning (optional) -AC_DEFUN([CHECK_NONEMPTY], +AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS], [ - if test "x[$]$1" = x; then - if test "x$2" = x; then - PROG_NAME=translit($1,A-Z,a-z) - else - PROG_NAME=$2 - fi - AC_MSG_NOTICE([Could not find $PROG_NAME!]) - AC_MSG_ERROR([Cannot continue]) - fi -]) - -# Does AC_PATH_PROG followed by CHECK_NONEMPTY. -# Arguments as AC_PATH_PROG: -# $1: variable to set -# $2: executable name to look for -AC_DEFUN([BASIC_REQUIRE_PROG], -[ - AC_PATH_PROGS($1, $2) - CHECK_NONEMPTY($1, $2) -]) - -AC_DEFUN_ONCE([BASIC_SETUP_TOOLS], -[ -# Start with tools that do not need have cross compilation support -# and can be expected to be found in the default PATH. These tools are -# used by configure. Nor are these tools expected to be found in the -# devkit from the builddeps server either, since they are -# needed to download the devkit. - -# First are all the simple required tools. -BASIC_REQUIRE_PROG(BASENAME, basename) -BASIC_REQUIRE_PROG(CAT, cat) -BASIC_REQUIRE_PROG(CHMOD, chmod) -BASIC_REQUIRE_PROG(CMP, cmp) -BASIC_REQUIRE_PROG(CP, cp) -BASIC_REQUIRE_PROG(CPIO, cpio) -BASIC_REQUIRE_PROG(CUT, cut) -BASIC_REQUIRE_PROG(DATE, date) -BASIC_REQUIRE_PROG(DF, df) -BASIC_REQUIRE_PROG(DIFF, [gdiff diff]) -BASIC_REQUIRE_PROG(ECHO, echo) -BASIC_REQUIRE_PROG(EXPR, expr) -BASIC_REQUIRE_PROG(FILE, file) -BASIC_REQUIRE_PROG(FIND, find) -BASIC_REQUIRE_PROG(HEAD, head) -BASIC_REQUIRE_PROG(LN, ln) -BASIC_REQUIRE_PROG(LS, ls) -BASIC_REQUIRE_PROG(MKDIR, mkdir) -BASIC_REQUIRE_PROG(MV, mv) -BASIC_REQUIRE_PROG(PRINTF, printf) -BASIC_REQUIRE_PROG(SH, sh) -BASIC_REQUIRE_PROG(SORT, sort) -BASIC_REQUIRE_PROG(TAIL, tail) -BASIC_REQUIRE_PROG(TAR, tar) -BASIC_REQUIRE_PROG(TEE, tee) -BASIC_REQUIRE_PROG(TOUCH, touch) -BASIC_REQUIRE_PROG(TR, tr) -BASIC_REQUIRE_PROG(UNIQ, uniq) -BASIC_REQUIRE_PROG(UNZIP, unzip) -BASIC_REQUIRE_PROG(WC, wc) -BASIC_REQUIRE_PROG(XARGS, xargs) -BASIC_REQUIRE_PROG(ZIP, zip) - -# Then required tools that require some special treatment. -AC_PROG_AWK -CHECK_NONEMPTY(AWK) -AC_PROG_GREP -CHECK_NONEMPTY(GREP) -AC_PROG_EGREP -CHECK_NONEMPTY(EGREP) -AC_PROG_FGREP -CHECK_NONEMPTY(FGREP) -AC_PROG_SED -CHECK_NONEMPTY(SED) - -AC_PATH_PROGS(NAWK, [nawk gawk awk]) -CHECK_NONEMPTY(NAWK) - BASIC_CHECK_GNU_MAKE -BASIC_REQUIRE_PROG(RM, rm) -RM="$RM -f" - BASIC_CHECK_FIND_DELETE -AC_SUBST(FIND_DELETE) + +# These tools might not be installed by default, +# need hint on how to install them. +BASIC_REQUIRE_PROG(UNZIP, unzip) +BASIC_REQUIRE_PROG(ZIP, zip) # Non-required basic tools -AC_PATH_PROG(THEPWDCMD, pwd) AC_PATH_PROG(LDD, ldd) if test "x$LDD" = "x"; then # List shared lib dependencies is used for @@ -497,52 +549,17 @@ if test "x$OTOOL" = "x"; then OTOOL="true" fi AC_PATH_PROGS(READELF, [readelf greadelf]) -AC_PATH_PROGS(OBJDUMP, [objdump gobjdump]) AC_PATH_PROG(HG, hg) -]) +AC_PATH_PROG(STAT, stat) +AC_PATH_PROG(TIME, time) -AC_DEFUN_ONCE([BASIC_COMPILE_UNCYGDRIVE], -[ -# When using cygwin, we need a wrapper binary that renames -# /cygdrive/c/ arguments into c:/ arguments and peeks into -# @files and rewrites these too! This wrapper binary is -# called uncygdrive.exe. -UNCYGDRIVE= -if test "x$OPENJDK_BUILD_OS" = xwindows; then - AC_MSG_CHECKING([if uncygdrive can be created]) - UNCYGDRIVE_SRC=`$CYGPATH -m $SRC_ROOT/common/src/uncygdrive.c` - rm -f $OUTPUT_ROOT/uncygdrive* - UNCYGDRIVE=`$CYGPATH -m $OUTPUT_ROOT/uncygdrive.exe` - cd $OUTPUT_ROOT - $CC $UNCYGDRIVE_SRC /Fe$UNCYGDRIVE > $OUTPUT_ROOT/uncygdrive1.log 2>&1 - cd $CURDIR - - if test ! -x $OUTPUT_ROOT/uncygdrive.exe; then - AC_MSG_RESULT([no]) - cat $OUTPUT_ROOT/uncygdrive1.log - AC_MSG_ERROR([Could not create $OUTPUT_ROOT/uncygdrive.exe]) - fi - AC_MSG_RESULT([$UNCYGDRIVE]) - AC_MSG_CHECKING([if uncygdrive.exe works]) - cd $OUTPUT_ROOT - $UNCYGDRIVE $CC $SRC_ROOT/common/src/uncygdrive.c /Fe$OUTPUT_ROOT/uncygdrive2.exe > $OUTPUT_ROOT/uncygdrive2.log 2>&1 - cd $CURDIR - if test ! -x $OUTPUT_ROOT/uncygdrive2.exe; then - AC_MSG_RESULT([no]) - cat $OUTPUT_ROOT/uncygdrive2.log - AC_MSG_ERROR([Uncygdrive did not work!]) - fi - AC_MSG_RESULT([yes]) - rm -f $OUTPUT_ROOT/uncygdrive?.??? $OUTPUT_ROOT/uncygdrive.obj - # The path to uncygdrive to use should be Unix-style - UNCYGDRIVE="$OUTPUT_ROOT/uncygdrive.exe" +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + BASIC_REQUIRE_PROG(COMM, comm) fi - -AC_SUBST(UNCYGDRIVE) ]) - -# Check if build directory is on local disk. +# Check if build directory is on local disk. If not possible to determine, +# we prefer to claim it's local. # Argument 1: directory to test # Argument 2: what to do if it is on local disk # Argument 3: what to do otherwise (remote disk or failure) @@ -550,11 +567,26 @@ AC_DEFUN([BASIC_CHECK_DIR_ON_LOCAL_DISK], [ # df -l lists only local disks; if the given directory is not found then # a non-zero exit code is given - if $DF -l $1 > /dev/null 2>&1; then - $2 - else - $3 - fi + if test "x$DF" = x; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + # msys does not have df; use Windows "net use" instead. + IS_NETWORK_DISK=`net use | grep \`pwd -W | cut -d ":" -f 1 | tr a-z A-Z\`:` + if test "x$IS_NETWORK_DISK" = x; then + $2 + else + $3 + fi + else + # No df here, say it's local + $2 + fi + else + if $DF -l $1 > /dev/null 2>&1; then + $2 + else + $3 + fi + fi ]) AC_DEFUN_ONCE([BASIC_TEST_USABILITY_ISSUES], diff --git a/common/autoconf/basics_windows.m4 b/common/autoconf/basics_windows.m4 new file mode 100644 index 00000000000..548b3e4922c --- /dev/null +++ b/common/autoconf/basics_windows.m4 @@ -0,0 +1,406 @@ +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +AC_DEFUN([BASIC_WINDOWS_REWRITE_AS_UNIX_PATH], +[ + windows_path="[$]$1" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + $1="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + $1="$unix_path" + fi +]) + +AC_DEFUN([BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH], +[ + unix_path="[$]$1" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + $1="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + $1="$windows_path" + fi +]) + +# Helper function which possibly converts a path using DOS-style short mode. +# If so, the updated path is stored in $new_path. +# $1: The path to check +AC_DEFUN([BASIC_MAKE_WINDOWS_SPACE_SAFE_CYGWIN], +[ + input_path="$1" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use @<:@ and @:>@ instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP @<:@^-._/a-zA-Z0-9@:>@` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $1 | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi +]) + +# Helper function which possibly converts a path using DOS-style short mode. +# If so, the updated path is stored in $new_path. +# $1: The path to check +AC_DEFUN([BASIC_MAKE_WINDOWS_SPACE_SAFE_MSYS], +[ + input_path="$1" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use @<:@ and @:>@ instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP @<:@^-_/:a-zA-Z0-9@:>@` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi +]) + +# FIXME: The BASIC_FIXUP_*_CYGWIN/MSYS is most likely too convoluted +# and could probably be heavily simplified. However, all changes in this +# area tend to need lot of testing in different scenarios, and in lack of +# proper unit testing, cleaning this up has not been deemed worth the effort +# at the moment. + +AC_DEFUN([BASIC_FIXUP_PATH_CYGWIN], +[ + # Input might be given as Windows format, start by converting to + # unix format. + path="[$]$1" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + AC_MSG_NOTICE([The path of $1, which resolves as "$path", is invalid.]) + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + BASIC_MAKE_WINDOWS_SPACE_SAFE_CYGWIN([$new_path]) + + if test "x$path" != "x$new_path"; then + $1="$new_path" + AC_MSG_NOTICE([Rewriting $1 to "$new_path"]) + fi +]) + +AC_DEFUN([BASIC_FIXUP_PATH_MSYS], +[ + path="[$]$1" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + BASIC_MAKE_WINDOWS_SPACE_SAFE_MSYS([$new_path]) + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(new_path) + if test "x$path" != "x$new_path"; then + $1="$new_path" + AC_MSG_NOTICE([Rewriting $1 to "$new_path"]) + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes@<:@@@:>@}" "${new_path:0:10}") +]) + +AC_DEFUN([BASIC_FIXUP_EXECUTABLE_CYGWIN], +[ + # First separate the path from the arguments. This will split at the first + # space. + complete="[$]$1" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + AC_MSG_NOTICE([The path of $1, which resolves as "$complete", is not found.]) + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + AC_MSG_NOTICE([You might be mixing spaces in the path and extra arguments, which is not allowed.]) + fi + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + AC_MSG_NOTICE([The path of $1, which resolves as "$new_path", is invalid.]) + AC_MSG_NOTICE([Neither "$new_path" nor "$new_path.exe/cmd" can be found]) + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + BASIC_MAKE_WINDOWS_SPACE_SAFE_CYGWIN([$input_to_shortpath]) + # remove trailing .exe if any + new_path="${new_path/%.exe/}" +]) + +AC_DEFUN([BASIC_FIXUP_EXECUTABLE_MSYS], +[ + # First separate the path from the arguments. This will split at the first + # space. + complete="[$]$1" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(new_path) + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(new_path) + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + AC_MSG_NOTICE([The path of $1, which resolves as "$complete", is not found.]) + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + AC_MSG_NOTICE([You might be mixing spaces in the path and extra arguments, which is not allowed.]) + fi + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + BASIC_MAKE_WINDOWS_SPACE_SAFE_MSYS([$new_path]) + # Output is in $new_path + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(new_path) + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes@<:@@@:>@}" "${new_path:0:10}") + fi +]) + +# Setup basic configuration paths, and platform-specific stuff related to PATHs. +AC_DEFUN([BASIC_CHECK_PATHS_WINDOWS], +[ + SRC_ROOT_LENGTH=`$THEPWDCMD|$WC -m` + if test $SRC_ROOT_LENGTH -gt 100; then + AC_MSG_ERROR([Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported]) + fi + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + AC_MSG_CHECKING([cygwin release]) + CYGWIN_VERSION=`$UNAME -r` + AC_MSG_RESULT([$CYGWIN_VERSION]) + WINDOWS_ENV_VENDOR='cygwin' + WINDOWS_ENV_VERSION="$CYGWIN_VERSION" + + CYGWIN_VERSION_OK=`$ECHO $CYGWIN_VERSION | $GREP ^1.7.` + if test "x$CYGWIN_VERSION_OK" = x; then + AC_MSG_NOTICE([Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade.]) + AC_MSG_ERROR([Cannot continue]) + fi + if test "x$CYGPATH" = x; then + AC_MSG_ERROR([Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path]) + fi + AC_MSG_CHECKING([cygwin root directory as unix-style path]) + # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away + cygwin_winpath_root=`cd / ; cmd /c cd | grep ".*"` + # Force cygpath to report the proper root by including a trailing space, and then stripping it off again. + CYGWIN_ROOT_PATH=`$CYGPATH -u "$cygwin_winpath_root " | $CUT -f 1 -d " "` + AC_MSG_RESULT([$CYGWIN_ROOT_PATH]) + WINDOWS_ENV_ROOT_PATH="$CYGWIN_ROOT_PATH" + test_cygdrive_prefix=`$ECHO $CYGWIN_ROOT_PATH | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + AC_MSG_ERROR([Your cygdrive prefix is not /cygdrive. This is currently not supported. Change with mount -c.]) + fi + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + AC_MSG_CHECKING([msys release]) + MSYS_VERSION=`$UNAME -r` + AC_MSG_RESULT([$MSYS_VERSION]) + + WINDOWS_ENV_VENDOR='msys' + WINDOWS_ENV_VERSION="$MSYS_VERSION" + + AC_MSG_CHECKING([msys root directory as unix-style path]) + # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away + MSYS_ROOT_PATH=`cd / ; cmd /c cd | grep ".*"` + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(MSYS_ROOT_PATH) + AC_MSG_RESULT([$MSYS_ROOT_PATH]) + WINDOWS_ENV_ROOT_PATH="$MSYS_ROOT_PATH" + else + AC_MSG_ERROR([Unknown Windows environment. Neither cygwin nor msys was detected.]) + fi + + # Test if windows or unix (cygwin/msys) find is first in path. + AC_MSG_CHECKING([what kind of 'find' is first on the PATH]) + FIND_BINARY_OUTPUT=`find --version 2>&1` + if test "x`echo $FIND_BINARY_OUTPUT | $GREP GNU`" != x; then + AC_MSG_RESULT([unix style]) + elif test "x`echo $FIND_BINARY_OUTPUT | $GREP FIND`" != x; then + AC_MSG_RESULT([Windows]) + AC_MSG_NOTICE([Your path contains Windows tools (C:\Windows\system32) before your unix (cygwin or msys) tools.]) + AC_MSG_NOTICE([This will not work. Please correct and make sure /usr/bin (or similar) is first in path.]) + AC_MSG_ERROR([Cannot continue]) + else + AC_MSG_RESULT([unknown]) + AC_MSG_WARN([It seems that your find utility is non-standard.]) + fi +]) + +AC_DEFUN_ONCE([BASIC_COMPILE_FIXPATH], +[ +# When using cygwin or msys, we need a wrapper binary that renames +# /cygdrive/c/ arguments into c:/ arguments and peeks into +# @files and rewrites these too! This wrapper binary is +# called fixpath. +FIXPATH= +if test "x$OPENJDK_BUILD_OS" = xwindows; then + AC_MSG_CHECKING([if fixpath can be created]) + FIXPATH_SRC="$SRC_ROOT/common/src/fixpath.c" + FIXPATH_BIN="$OUTPUT_ROOT/fixpath.exe" + if test "x$OPENJDK_BUILD_OS_ENV" = xwindows.cygwin; then + FIXPATH_SRC=`$CYGPATH -m $FIXPATH_SRC` + FIXPATH_BIN=`$CYGPATH -m $FIXPATH_BIN` + # Important to keep the .exe suffix on Cygwin for Hotspot makefiles + FIXPATH="$OUTPUT_ROOT/fixpath.exe -c" + elif test "x$OPENJDK_BUILD_OS_ENV" = xwindows.msys; then + FIXPATH_SRC=`cmd //c echo $FIXPATH_SRC` + FIXPATH_BIN=`cmd //c echo $FIXPATH_BIN` + + # Take all collected prefixes and turn them into a -m/c/foo@/c/bar@... command line + # @ was chosen as separator to minimize risk of other tools messing around with it + all_unique_prefixes=`echo "${all_fixpath_prefixes@<:@@@:>@}" | tr ' ' '\n' | grep '^/./' | sort | uniq` + fixpath_argument_list=`echo $all_unique_prefixes | tr ' ' '@'` + + FIXPATH="$OUTPUT_ROOT/fixpath -m$fixpath_argument_list" + fi + rm -f $OUTPUT_ROOT/fixpath* + cd $OUTPUT_ROOT + $CC $FIXPATH_SRC -Fe$FIXPATH_BIN > $OUTPUT_ROOT/fixpath1.log 2>&1 + cd $CURDIR + + if test ! -x $OUTPUT_ROOT/fixpath.exe; then + AC_MSG_RESULT([no]) + cat $OUTPUT_ROOT/fixpath1.log + AC_MSG_ERROR([Could not create $OUTPUT_ROOT/fixpath.exe]) + fi + AC_MSG_RESULT([yes]) + AC_MSG_CHECKING([if fixpath.exe works]) + cd $OUTPUT_ROOT + $FIXPATH $CC $SRC_ROOT/common/src/fixpath.c -Fe$OUTPUT_ROOT/fixpath2.exe > $OUTPUT_ROOT/fixpath2.log 2>&1 + cd $CURDIR + if test ! -x $OUTPUT_ROOT/fixpath2.exe; then + AC_MSG_RESULT([no]) + cat $OUTPUT_ROOT/fixpath2.log + AC_MSG_ERROR([fixpath did not work!]) + fi + AC_MSG_RESULT([yes]) + rm -f $OUTPUT_ROOT/fixpath?.??? $OUTPUT_ROOT/fixpath.obj +fi + +AC_SUBST(FIXPATH) +]) diff --git a/common/autoconf/boot-jdk.m4 b/common/autoconf/boot-jdk.m4 index c4ce883363a..4a4ea36b50d 100644 --- a/common/autoconf/boot-jdk.m4 +++ b/common/autoconf/boot-jdk.m4 @@ -62,9 +62,12 @@ AC_DEFUN([BOOTJDK_DO_CHECK], else # We're done! :-) BOOT_JDK_FOUND=yes - SPACESAFE(BOOT_JDK,[the path to the Boot JDK]) + BASIC_FIXUP_PATH(BOOT_JDK) AC_MSG_CHECKING([for Boot JDK]) - AC_MSG_RESULT([$BOOT_JDK ($BOOT_JDK_VERSION)]) + AC_MSG_RESULT([$BOOT_JDK]) + AC_MSG_CHECKING([Boot JDK version]) + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + AC_MSG_RESULT([$BOOT_JDK_VERSION]) fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -93,12 +96,8 @@ AC_DEFUN([BOOTJDK_CHECK_BUILDDEPS], AC_DEFUN([BOOTJDK_CHECK_JAVA_HOME], [ if test "x$JAVA_HOME" != x; then - if test "x$OPENJDK_TARGET_OS" = xwindows; then - # On Windows, JAVA_HOME is likely in DOS-style - JAVA_HOME_PROCESSED="`$CYGPATH -u "$JAVA_HOME"`" - else - JAVA_HOME_PROCESSED="$JAVA_HOME" - fi + JAVA_HOME_PROCESSED="$JAVA_HOME" + BASIC_FIXUP_PATH(JAVA_HOME_PROCESSED) if test ! -d "$JAVA_HOME_PROCESSED"; then AC_MSG_NOTICE([Your JAVA_HOME points to a non-existing directory!]) else @@ -125,8 +124,7 @@ AC_DEFUN([BOOTJDK_CHECK_JAVA_IN_PATH_IS_SYMLINK], # Lets find the JDK/JRE directory by following symbolic links. # Linux/GNU systems often have links from /usr/bin/java to # /etc/alternatives/java to the real JDK binary. - SET_FULL_PATH_SPACESAFE(BINARY) - REMOVE_SYMBOLIC_LINKS(BINARY) + BASIC_REMOVE_SYMBOLIC_LINKS(BINARY) BOOT_JDK=`dirname "$BINARY"` BOOT_JDK=`cd "$BOOT_JDK/.."; pwd` if test -x "$BOOT_JDK/bin/javac" && test -x "$BOOT_JDK/bin/java"; then @@ -155,13 +153,17 @@ AC_DEFUN([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY], [ BOOT_JDK_PREFIX="$1" BOOT_JDK_SUFFIX="$2" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - AC_MSG_NOTICE([Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)]) - fi + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + BOOTJDK_DO_CHECK([ + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + AC_MSG_NOTICE([Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)]) + fi + ]) + done fi ]) @@ -171,7 +173,9 @@ AC_DEFUN([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY], AC_DEFUN([BOOTJDK_FIND_BEST_JDK_IN_WINDOWS_VIRTUAL_DIRECTORY], [ if test "x[$]$1" != x; then - BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY([`$CYGPATH -u "[$]$1"`/Java]) + VIRTUAL_DIR="[$]$1/Java" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(VIRTUAL_DIR) + BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY($VIRTUAL_DIR) fi ]) @@ -187,6 +191,8 @@ AC_DEFUN([BOOTJDK_CHECK_WELL_KNOWN_LOCATIONS], elif test "x$OPENJDK_TARGET_OS" = xmacosx; then BOOTJDK_DO_CHECK([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY([/Library/Java/JavaVirtualMachines],[/Contents/Home])]) BOOTJDK_DO_CHECK([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY([/System/Library/Java/JavaVirtualMachines],[/Contents/Home])]) + elif test "x$OPENJDK_TARGET_OS" = xlinux; then + BOOTJDK_DO_CHECK([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY([/usr/lib/jvm])]) fi ]) diff --git a/common/autoconf/build-aux/config.guess b/common/autoconf/build-aux/config.guess index 9d9d29b0b23..572ed2be3e8 100644 --- a/common/autoconf/build-aux/config.guess +++ b/common/autoconf/build-aux/config.guess @@ -48,6 +48,9 @@ fi # Test and fix cygwin on x86_64 echo $OUT | grep 86-pc-cygwin > /dev/null 2> /dev/null +if test $? != 0; then + echo $OUT | grep 86-pc-mingw > /dev/null 2> /dev/null +fi if test $? = 0; then case `echo $PROCESSOR_IDENTIFIER | cut -f1 -d' '` in intel64|Intel64|INTEL64|em64t|EM64T|amd64|AMD64|8664|x86_64) diff --git a/common/autoconf/build-performance.m4 b/common/autoconf/build-performance.m4 index 5ad5837eb78..0838e867028 100644 --- a/common/autoconf/build-performance.m4 +++ b/common/autoconf/build-performance.m4 @@ -41,6 +41,10 @@ AC_DEFUN([BPERF_CHECK_CORES], # Looks like a MacOSX system NUM_CORES=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Cores' | awk '{print [$]5}'` FOUND_CORES=yes + elif test -n "$NUMBER_OF_PROCESSORS"; then + # On windows, look in the env + NUM_CORES=$NUMBER_OF_PROCESSORS + FOUND_CORES=yes fi # For c/c++ code we run twice as many concurrent build @@ -50,7 +54,8 @@ AC_DEFUN([BPERF_CHECK_CORES], if test "x$FOUND_CORES" = xyes; then AC_MSG_RESULT([$NUM_CORES]) else - AC_MSG_RESULT([could not detect number of cores, defaulting to 1!]) + AC_MSG_RESULT([could not detect number of cores, defaulting to 1]) + AC_MSG_WARN([This will disable all parallelism from build!]) fi ]) @@ -76,16 +81,18 @@ AC_DEFUN([BPERF_CHECK_MEMORY_SIZE], MEMORY_SIZE=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Memory' | awk '{print [$]2}'` MEMORY_SIZE=`expr $MEMORY_SIZE \* 1024` FOUND_MEM=yes - elif test "x$build_os" = xwindows; then + elif test "x$OPENJDK_BUILD_OS" = xwindows; then # Windows, but without cygwin - MEMORY_SIZE=`systeminfo | grep 'Total Physical Memory:' | awk '{ print [$]4 }' | sed 's/,//'` + MEMORY_SIZE=`wmic computersystem get totalphysicalmemory -value | grep = | cut -d "=" -f 2-` + MEMORY_SIZE=`expr $MEMORY_SIZE / 1024 / 1024` FOUND_MEM=yes fi if test "x$FOUND_MEM" = xyes; then AC_MSG_RESULT([$MEMORY_SIZE MB]) else - AC_MSG_RESULT([could not detect memory size defaulting to 1024 MB!]) + AC_MSG_RESULT([could not detect memory size, defaulting to 1024 MB]) + AC_MSG_WARN([This might seriously impact build performance!]) fi ]) @@ -123,7 +130,7 @@ AC_DEFUN([BPERF_SETUP_CCACHE], [ AC_ARG_ENABLE([ccache], [AS_HELP_STRING([--disable-ccache], - [use ccache to speed up recompilations @<:@enabled@:>@])], + [disable using ccache to speed up recompilations @<:@enabled@:>@])], [ENABLE_CCACHE=${enable_ccache}], [ENABLE_CCACHE=yes]) if test "x$ENABLE_CCACHE" = xyes; then AC_PATH_PROG(CCACHE, ccache) @@ -196,7 +203,7 @@ AC_DEFUN_ONCE([BPERF_SETUP_PRECOMPILED_HEADERS], # Can the C/C++ compiler use precompiled headers? # AC_ARG_ENABLE([precompiled-headers], [AS_HELP_STRING([--disable-precompiled-headers], - [use precompiled headers when compiling C++ @<:@enabled@:>@])], + [disable using precompiled headers when compiling C++ @<:@enabled@:>@])], [ENABLE_PRECOMPH=${enable_precompiled-headers}], [ENABLE_PRECOMPH=yes]) USE_PRECOMPILED_HEADER=1 @@ -228,8 +235,7 @@ AC_SUBST(USE_PRECOMPILED_HEADER) AC_DEFUN_ONCE([BPERF_SETUP_SMART_JAVAC], [ AC_ARG_WITH(sjavac-server-java, [AS_HELP_STRING([--with-sjavac-server-java], - [use this java binary for running the sjavac background server and other long running java tasks in the build process, - e.g. ---with-sjavac-server-java="/opt/jrockit/bin/java -server"])]) + [use this java binary for running the sjavac background server @<:@Boot JDK java@:>@])]) if test "x$with_sjavac_server_java" != x; then SJAVAC_SERVER_JAVA="$with_sjavac_server_java" diff --git a/common/autoconf/builddeps.m4 b/common/autoconf/builddeps.m4 index 661001d7d24..207be33c88a 100644 --- a/common/autoconf/builddeps.m4 +++ b/common/autoconf/builddeps.m4 @@ -235,26 +235,13 @@ AC_ARG_WITH(builddeps-conf, [AS_HELP_STRING([--with-builddeps-conf], [use this configuration file for the builddeps])]) AC_ARG_WITH(builddeps-server, [AS_HELP_STRING([--with-builddeps-server], - [download and use build dependencies from this server url, e.g. --with-builddeps-server=ftp://example.com/dir])]) + [download and use build dependencies from this server url])]) AC_ARG_WITH(builddeps-dir, [AS_HELP_STRING([--with-builddeps-dir], - [store downloaded build dependencies here @<:@d/localhome/builddeps@:>@])], + [store downloaded build dependencies here @<:@/localhome/builddeps@:>@])], [], [with_builddeps_dir=/localhome/builddeps]) AC_ARG_WITH(builddeps-group, [AS_HELP_STRING([--with-builddeps-group], [chgrp the downloaded build dependencies to this group])]) - -AC_ARG_ENABLE([list-builddeps], [AS_HELP_STRING([--enable-list-builddeps], - [list all build dependencies known to the configure script])], - [LIST_BUILDDEPS="${enableval}"], [LIST_BUILDDEPS='no']) - -if test "x$LIST_BUILDDEPS" = xyes; then - echo - echo List of build dependencies known to the configure script, - echo that can be used in builddeps.conf files: - cat $AUTOCONF_DIR/*.ac $AUTOCONF_DIR/*.m4 | grep BDEPS_CHECK_MODUL[E]\( | cut -f 2 -d ',' | tr -d ' ' | sort - echo - exit 1 -fi ]) diff --git a/common/autoconf/closed.version.numbers b/common/autoconf/closed.version.numbers index b119cd9bd97..b22ad976cbc 100644 --- a/common/autoconf/closed.version.numbers +++ b/common/autoconf/closed.version.numbers @@ -26,3 +26,7 @@ PRODUCT_NAME="Java(TM)" PRODUCT_SUFFIX="SE Runtime Environment" JDK_RC_PLATFORM_NAME="Platform SE" COMPANY_NAME="Oracle Corporation" + +# Might need better names for these +MACOSX_BUNDLE_NAME_BASE="Java SE" +MACOSX_BUNDLE_ID_BASE="com.oracle.java" diff --git a/common/autoconf/compare.sh.in b/common/autoconf/compare.sh.in index 25c8c7e9fad..53d60b76d81 100644 --- a/common/autoconf/compare.sh.in +++ b/common/autoconf/compare.sh.in @@ -40,12 +40,12 @@ CMP="@CMP@" CP="@CP@" CUT="@CUT@" DIFF="@DIFF@" -DUMPBIN="@UNCYGDRIVE@ @DUMPBIN@" +DUMPBIN="@FIXPATH@ @DUMPBIN@" EXPR="@EXPR@" FILE="@FILE@" FIND="@FIND@" GREP="@GREP@" -JAVAP="@UNCYGDRIVE@ @BOOT_JDK@/bin/javap" +JAVAP="@FIXPATH@ @BOOT_JDK@/bin/javap" LDD="@LDD@" MKDIR="@MKDIR@" NM="@NM@" @@ -56,6 +56,7 @@ READELF="@READELF@" RM="@RM@" SED="@SED@" SORT="@SORT@" +STAT="@STAT@" STRIP="@POST_STRIP_CMD@" TEE="@TEE@" UNIQ="@UNIQ@" @@ -63,1607 +64,15 @@ UNZIP="@UNZIP@" SRC_ROOT="@SRC_ROOT@" -if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then - READELF_CMD="otool -v -V -h -X -t -d" -elif [ -n "$READELF" ] && [ "$OPENJDK_TARGET_OS" != "windows" ]; then - READELF_CMD="$READELF -a" -fi - -if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then - LDD_CMD="$OTOOL -L" -elif [ -n "$LDD" ]; then - LDD_CMD="$LDD" -fi - -########################################################################################## -# Diff exceptions - -if [ "$OPENJDK_TARGET_OS" = "linux" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then -STRIP_BEFORE_COMPARE=" -./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/libgctest.so -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/heapViewer/lib/libheapViewer.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/minst/lib/libminst.so -./demo/jvmti/mtrace/lib/libmtrace.so -./demo/jvmti/versionCheck/lib/libversionCheck.so -./demo/jvmti/waiters/lib/libwaiters.so -" - -KNOWN_BIN_DIFF=" -" - -ACCEPTED_BIN_DIFF=" -./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/libgctest.so -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/heapViewer/lib/libheapViewer.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/minst/lib/libminst.so -./demo/jvmti/mtrace/lib/libmtrace.so -./demo/jvmti/versionCheck/lib/libversionCheck.so -./demo/jvmti/waiters/lib/libwaiters.so -./jre/lib/amd64/libattach.so -./jre/lib/amd64/libdt_socket.so -./jre/lib/amd64/libhprof.so -./jre/lib/amd64/libinstrument.so -./jre/lib/amd64/libjava_crw_demo.so -./jre/lib/amd64/libjsdt.so -./jre/lib/amd64/libjsig.so -./jre/lib/amd64/libmanagement.so -./jre/lib/amd64/libnpt.so -./jre/lib/amd64/libsaproc.so -./jre/lib/amd64/libverify.so -./jre/lib/amd64/server/libjsig.so -./jre/lib/amd64/server/libjvm.so -./bin/appletviewer -./bin/extcheck -./bin/idlj -./bin/jar -./bin/jarsigner -./bin/java -./bin/javac -./bin/javadoc -./bin/javah -./bin/javap -./bin/jcmd -./bin/jconsole -./bin/jdb -./bin/jhat -./bin/jinfo -./bin/jmap -./bin/jps -./bin/jrunscript -./bin/jsadebugd -./bin/jstack -./bin/jstat -./bin/jstatd -./bin/keytool -./bin/native2ascii -./bin/orbd -./bin/pack200 -./bin/policytool -./bin/rmic -./bin/rmid -./bin/rmiregistry -./bin/schemagen -./bin/serialver -./bin/servertool -./bin/tnameserv -./bin/wsgen -./bin/wsimport -./bin/xjc -./jre/bin/java -./jre/bin/keytool -./jre/bin/orbd -./jre/bin/pack200 -./jre/bin/policytool -./jre/bin/rmid -./jre/bin/rmiregistry -./jre/bin/servertool -./jre/bin/tnameserv -" - -KNOWN_SIZE_DIFF=" -" - -KNOWN_SYM_DIFF=" -" - -KNOWN_ELF_DIFF=" -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/waiters/lib/libwaiters.so -" -fi - -if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86" ]; then - -STRIP_BEFORE_COMPARE=" -./demo/jni/Poller/lib/libPoller.so -./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/libgctest.so -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/heapViewer/lib/libheapViewer.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/minst/lib/libminst.so -./demo/jvmti/mtrace/lib/libmtrace.so -./demo/jvmti/versionCheck/lib/libversionCheck.so -./demo/jvmti/waiters/lib/libwaiters.so -./jre/lib/i386/jexec -" - -SORT_SYMBOLS=" -./jre/lib/i386/client/libjvm.so -./jre/lib/i386/server/libjvm.so -" - -SKIP_BIN_DIFF="true" - -ACCEPTED_SMALL_SIZE_DIFF=" -./demo/jni/Poller/lib/libPoller.so -./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/libgctest.so -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/heapViewer/lib/libheapViewer.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/minst/lib/libminst.so -./demo/jvmti/mtrace/lib/libmtrace.so -./demo/jvmti/versionCheck/lib/libversionCheck.so -./demo/jvmti/waiters/lib/libwaiters.so -./jre/lib/i386/client/libjvm.so -./jre/lib/i386/jli/libjli.so -./jre/lib/i386/libJdbcOdbc.so -./jre/lib/i386/libattach.so -./jre/lib/i386/libawt.so -./jre/lib/i386/libawt_headless.so -./jre/lib/i386/libawt_xawt.so -./jre/lib/i386/libdcpr.so -./jre/lib/i386/libdt_socket.so -./jre/lib/i386/libfontmanager.so -./jre/lib/i386/libhprof.so -./jre/lib/i386/libinstrument.so -./jre/lib/i386/libj2gss.so -./jre/lib/i386/libj2pcsc.so -./jre/lib/i386/libj2pkcs11.so -./jre/lib/i386/libj2ucrypto.so -./jre/lib/i386/libjaas_unix.so -./jre/lib/i386/libjava.so -./jre/lib/i386/libjava_crw_demo.so -./jre/lib/i386/libjawt.so -./jre/lib/i386/libjdwp.so -./jre/lib/i386/libjfr.so -./jre/lib/i386/libjpeg.so -./jre/lib/i386/libjsdt.so -./jre/lib/i386/libjsound.so -./jre/lib/i386/libkcms.so -./jre/lib/i386/libmanagement.so -./jre/lib/i386/libmlib_image.so -./jre/lib/i386/libnet.so -./jre/lib/i386/libnio.so -./jre/lib/i386/libnpt.so -./jre/lib/i386/libsctp.so -./jre/lib/i386/libsplashscreen.so -./jre/lib/i386/libsunec.so -./jre/lib/i386/libsunwjdga.so -./jre/lib/i386/libt2k.so -./jre/lib/i386/libunpack.so -./jre/lib/i386/libverify.so -./jre/lib/i386/libzip.so -./jre/lib/i386/server/libjvm.so -./bin/appletviewer -./bin/extcheck -./bin/idlj -./bin/jar -./bin/jarsigner -./bin/java -./bin/javac -./bin/javadoc -./bin/javah -./bin/javap -./bin/jcmd -./bin/jconsole -./bin/jdb -./bin/jhat -./bin/jinfo -./bin/jmap -./bin/jps -./bin/jrunscript -./bin/jsadebugd -./bin/jstack -./bin/jstat -./bin/jstatd -./bin/keytool -./bin/native2ascii -./bin/orbd -./bin/pack200 -./bin/policytool -./bin/rmic -./bin/rmid -./bin/rmiregistry -./bin/schemagen -./bin/serialver -./bin/servertool -./bin/tnameserv -./bin/unpack200 -./bin/wsgen -./bin/wsimport -./bin/xjc -./jre/bin/java -./jre/bin/keytool -./jre/bin/orbd -./jre/bin/pack200 -./jre/bin/policytool -./jre/bin/rmid -./jre/bin/rmiregistry -./jre/bin/servertool -./jre/bin/tnameserv -./jre/bin/unpack200 -./jre/lib/i386/jexec -" - -SKIP_ELF_DIFF="true" - -# libjvm.so differs in the random 15 char prefix on some symbols. -ACCEPTED_DIS_DIFF=" -./jre/lib/i386/client/libjvm.so -./jre/lib/i386/server/libjvm.so -" - -fi - -if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then - -STRIP_BEFORE_COMPARE=" -./demo/jni/Poller/lib/amd64/libPoller.so -./demo/jvmti/compiledMethodLoad/lib/amd64/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/amd64/libgctest.so -./demo/jvmti/heapTracker/lib/amd64/libheapTracker.so -./demo/jvmti/heapViewer/lib/amd64/libheapViewer.so -./demo/jvmti/hprof/lib/amd64/libhprof.so -./demo/jvmti/minst/lib/amd64/libminst.so -./demo/jvmti/mtrace/lib/amd64/libmtrace.so -./demo/jvmti/versionCheck/lib/amd64/libversionCheck.so -./demo/jvmti/waiters/lib/amd64/libwaiters.so -" - -SORT_SYMBOLS=" -./jre/lib/amd64/server/libjvm.so -" - -SKIP_BIN_DIFF="true" - -ACCEPTED_SMALL_SIZE_DIFF=" -./demo/jni/Poller/lib/amd64/libPoller.so -./demo/jvmti/compiledMethodLoad/lib/amd64/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/amd64/libgctest.so -./demo/jvmti/heapTracker/lib/amd64/libheapTracker.so -./demo/jvmti/heapViewer/lib/amd64/libheapViewer.so -./demo/jvmti/hprof/lib/amd64/libhprof.so -./demo/jvmti/minst/lib/amd64/libminst.so -./demo/jvmti/mtrace/lib/amd64/libmtrace.so -./demo/jvmti/versionCheck/lib/amd64/libversionCheck.so -./demo/jvmti/waiters/lib/amd64/libwaiters.so -./jre/lib/amd64/jli/libjli.so -./jre/lib/amd64/libJdbcOdbc.so -./jre/lib/amd64/libattach.so -./jre/lib/amd64/libawt.so -./jre/lib/amd64/libawt_headless.so -./jre/lib/amd64/libawt_xawt.so -./jre/lib/amd64/libdcpr.so -./jre/lib/amd64/libdt_socket.so -./jre/lib/amd64/libfontmanager.so -./jre/lib/amd64/libhprof.so -./jre/lib/amd64/libinstrument.so -./jre/lib/amd64/libj2gss.so -./jre/lib/amd64/libj2pcsc.so -./jre/lib/amd64/libj2pkcs11.so -./jre/lib/amd64/libj2ucrypto.so -./jre/lib/amd64/libjaas_unix.so -./jre/lib/amd64/libjava.so -./jre/lib/amd64/libjava_crw_demo.so -./jre/lib/amd64/libjawt.so -./jre/lib/amd64/libjdwp.so -./jre/lib/amd64/libjfr.so -./jre/lib/amd64/libjpeg.so -./jre/lib/amd64/libjsdt.so -./jre/lib/amd64/libjsound.so -./jre/lib/amd64/libkcms.so -./jre/lib/amd64/libmanagement.so -./jre/lib/amd64/libmlib_image.so -./jre/lib/amd64/libnet.so -./jre/lib/amd64/libnio.so -./jre/lib/amd64/libnpt.so -./jre/lib/amd64/libsctp.so -./jre/lib/amd64/libsplashscreen.so -./jre/lib/amd64/libsunec.so -./jre/lib/amd64/libsunwjdga.so -./jre/lib/amd64/libt2k.so -./jre/lib/amd64/libunpack.so -./jre/lib/amd64/libverify.so -./jre/lib/amd64/libzip.so -./jre/lib/amd64/server/64/libjvm_db.so -./jre/lib/amd64/server/64/libjvm_dtrace.so -./bin/amd64/appletviewer -./bin/amd64/extcheck -./bin/amd64/idlj -./bin/amd64/jar -./bin/amd64/jarsigner -./bin/amd64/java -./bin/amd64/javac -./bin/amd64/javadoc -./bin/amd64/javah -./bin/amd64/javap -./bin/amd64/jcmd -./bin/amd64/jconsole -./bin/amd64/jdb -./bin/amd64/jhat -./bin/amd64/jinfo -./bin/amd64/jmap -./bin/amd64/jps -./bin/amd64/jrunscript -./bin/amd64/jsadebugd -./bin/amd64/jstack -./bin/amd64/jstat -./bin/amd64/jstatd -./bin/amd64/keytool -./bin/amd64/native2ascii -./bin/amd64/orbd -./bin/amd64/pack200 -./bin/amd64/policytool -./bin/amd64/rmic -./bin/amd64/rmid -./bin/amd64/rmiregistry -./bin/amd64/schemagen -./bin/amd64/serialver -./bin/amd64/servertool -./bin/amd64/tnameserv -./bin/amd64/unpack200 -./bin/amd64/wsgen -./bin/amd64/wsimport -./bin/amd64/xjc -./jre/bin/amd64/java -./jre/bin/amd64/keytool -./jre/bin/amd64/orbd -./jre/bin/amd64/pack200 -./jre/bin/amd64/policytool -./jre/bin/amd64/rmid -./jre/bin/amd64/rmiregistry -./jre/bin/amd64/servertool -./jre/bin/amd64/tnameserv -./jre/bin/amd64/unpack200 -./jre/lib/amd64/jexec -" - -SKIP_ELF_DIFF="true" - -# Can't find an explaination for the diff in libmlib_image.so. -KNOWN_DIS_DIFF=" -./jre/lib/amd64/libmlib_image.so -" -# libjvm.so differs in the random 15 char prefix on some symbols. -ACCEPTED_DIS_DIFF=" -./jre/lib/amd64/server/libjvm.so -" - -fi - -if [ "$OPENJDK_TARGET_OS" = "windows" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then - -ACCEPTED_BIN_DIFF=" -./bin/jli.dll -./demo/jvmti/compiledMethodLoad/lib/compiledMethodLoad.dll -./demo/jvmti/gctest/lib/gctest.dll -./demo/jvmti/heapTracker/lib/heapTracker.dll -./demo/jvmti/heapViewer/lib/heapViewer.dll -./demo/jvmti/hprof/lib/hprof.dll -./demo/jvmti/minst/lib/minst.dll -./demo/jvmti/mtrace/lib/mtrace.dll -./demo/jvmti/versionCheck/lib/versionCheck.dll -./demo/jvmti/waiters/lib/waiters.dll -./jre/bin/attach.dll -./jre/bin/awt.dll -./jre/bin/dcpr.dll -./jre/bin/dt_shmem.dll -./jre/bin/dt_socket.dll -./jre/bin/fontmanager.dll -./jre/bin/hprof.dll -./jre/bin/instrument.dll -./jre/bin/j2pcsc.dll -./jre/bin/j2pkcs11.dll -./jre/bin/jaas_nt.dll -./jre/bin/java.dll -./jre/bin/java_crw_demo.dll -./jre/bin/jawt.dll -./jre/bin/JdbcOdbc.dll -./jre/bin/jdwp.dll -./jre/bin/jfr.dll -./jre/bin/jli.dll -./jre/bin/jpeg.dll -./jre/bin/jsdt.dll -./jre/bin/jsound.dll -./jre/bin/jsoundds.dll -./jre/bin/kcms.dll -./jre/bin/management.dll -./jre/bin/mlib_image.dll -./jre/bin/net.dll -./jre/bin/nio.dll -./jre/bin/npt.dll -./jre/bin/sawindbg.dll -./jre/bin/server/jvm.dll -./jre/bin/splashscreen.dll -./jre/bin/sunec.dll -./jre/bin/sunmscapi.dll -./jre/bin/t2k.dll -./jre/bin/unpack.dll -./jre/bin/verify.dll -./jre/bin/w2k_lsa_auth.dll -./jre/bin/zip.dll -./bin/appletviewer.exe -./bin/extcheck.exe -./bin/idlj.exe -./bin/jar.exe -./bin/jarsigner.exe -./bin/java.exe -./bin/javac.exe -./bin/javadoc.exe -./bin/javah.exe -./bin/javap.exe -./bin/java-rmi.exe -./bin/javaw.exe -./bin/jcmd.exe -./bin/jconsole.exe -./bin/jdb.exe -./bin/jhat.exe -./bin/jinfo.exe -./bin/jmap.exe -./bin/jps.exe -./bin/jrunscript.exe -./bin/jsadebugd.exe -./bin/jstack.exe -./bin/jstat.exe -./bin/jstatd.exe -./bin/keytool.exe -./bin/kinit.exe -./bin/klist.exe -./bin/ktab.exe -./bin/native2ascii.exe -./bin/orbd.exe -./bin/pack200.exe -./bin/policytool.exe -./bin/rmic.exe -./bin/rmid.exe -./bin/rmiregistry.exe -./bin/schemagen.exe -./bin/serialver.exe -./bin/servertool.exe -./bin/tnameserv.exe -./bin/unpack200.exe -./bin/wsgen.exe -./bin/wsimport.exe -./bin/xjc.exe -./jre/bin/java.exe -./jre/bin/java-rmi.exe -./jre/bin/javaw.exe -./jre/bin/keytool.exe -./jre/bin/kinit.exe -./jre/bin/klist.exe -./jre/bin/ktab.exe -./jre/bin/orbd.exe -./jre/bin/pack200.exe -./jre/bin/policytool.exe -./jre/bin/rmid.exe -./jre/bin/rmiregistry.exe -./jre/bin/servertool.exe -./jre/bin/tnameserv.exe -./jre/bin/unpack200.exe -" - -KNOWN_SIZE_DIFF=" -./demo/jvmti/heapTracker/lib/heapTracker.dll -./demo/jvmti/minst/lib/minst.dll -./jre/bin/awt.dll -./jre/bin/java_crw_demo.dll -./bin/java.exe -./bin/javaw.exe -./bin/unpack200.exe -./jre/bin/java.exe -./jre/bin/javaw.exe -./jre/bin/unpack200.exe -" - -KNOWN_SYM_DIFF=" -./jre/bin/awt.dll -./jre/bin/java_crw_demo.dll -" -fi - - - -if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then -ACCEPTED_JARZIP_CONTENTS=" -/META-INF/INDEX.LIST -" - -KNOWN_BIN_DIFF=" -./jre/lib/libJObjC.dylib -./jre/lib/libsaproc.dylib -./jre/lib/server/libjvm.dylib -" - -ACCEPTED_BIN_DIFF=" -./bin/appletviewer -./bin/extcheck -./bin/idlj -./bin/jar -./bin/jarsigner -./bin/java -./bin/javac -./bin/javadoc -./bin/javah -./bin/javap -./bin/jcmd -./bin/jconsole -./bin/jdb -./bin/jhat -./bin/jinfo -./bin/jmap -./bin/jps -./bin/jrunscript -./bin/jsadebugd -./bin/jstack -./bin/jstat -./bin/jstatd -./bin/keytool -./bin/native2ascii -./bin/orbd -./bin/pack200 -./bin/policytool -./bin/rmic -./bin/rmid -./bin/rmiregistry -./bin/schemagen -./bin/serialver -./bin/servertool -./bin/tnameserv -./bin/wsgen -./bin/wsimport -./bin/xjc -./jre/bin/java -./jre/bin/keytool -./jre/bin/orbd -./jre/bin/pack200 -./jre/bin/policytool -./jre/bin/rmid -./jre/bin/rmiregistry -./jre/bin/servertool -./jre/bin/tnameserv -" - -KNOWN_SIZE_DIFF=" -./jre/lib/libJObjC.dylib -./jre/lib/server/libjvm.dylib -" - -KNOWN_SYM_DIFF=" -./jre/lib/libJObjC.dylib -./jre/lib/server/libjvm.dylib -" - -KNOWN_ELF_DIFF=" -./jre/lib/libJObjC.dylib -./jre/lib/server/libjvm.dylib -" - -SKIP_DIS_DIFF="true" - -fi - -########################################################################################## -# Compare text files and ignore specific differences: -# -# * Timestamps in Java sources generated by idl2java -# * Sorting order and cleanup style in .properties files - -diff_text() { - OTHER_FILE=$1 - THIS_FILE=$2 - - SUFFIX="${THIS_FILE##*.}" - - TMP=1 - - if [[ "$THIS_FILE" = *"META-INF/MANIFEST.MF" ]]; then - TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \ - $GREP '^[<>]' | \ - $SED -e '/[<>] Ant-Version: Apache Ant .*/d' \ - -e '/[<>] Created-By: .* (Oracle Corporation).*/d') - fi - if test "x$SUFFIX" = "xjava"; then - TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \ - $GREP '^[<>]' | \ - $SED -e '/[<>] \* from.*\.idl/d' \ - -e '/[<>] \*.*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \ - -e '/[<>] \*.*[0-9]\{4\} [0-9][0-9]*:[0-9]\{2\}:[0-9]\{2\}.*/d' \ - -e '/\/\/ Generated from input file.*/d' \ - -e '/\/\/ This file was generated AUTOMATICALLY from a template file.*/d' \ - -e '/\/\/ java GenerateCharacter.*/d') - fi - # Ignore date strings in class files. - # On Macosx the system sources for generated java classes produce different output on - # consequtive invokations seemingly randomly. - # For example a method parameter randomly named "thePoint" or "aPoint". Ignore this. - if test "x$SUFFIX" = "xclass"; then - $JAVAP -c -constants -l -p ${OTHER_FILE} > ${OTHER_FILE}.javap - $JAVAP -c -constants -l -p ${THIS_FILE} > ${THIS_FILE}.javap - TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \ - $GREP '^[<>]' | \ - $SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \ - -e '/[<>].*Point Lcom\/apple\/jobjc\/foundation\/NSPoint;/d' \ - -e '/[<>].*public com\.apple\.jobjc\.Pointer].*public void setItemsPtr(com\.apple\.jobjc\.Pointer $OTHER_FILE.cleaned - TMP=$(LANG=C $DIFF $OTHER_FILE.cleaned $THIS_FILE) - fi - if test -n "$TMP"; then - echo Files $OTHER_FILE and $THIS_FILE differ - return 1 - fi - - return 0 -} - -########################################################################################## -# Compare directory structure - -compare_dirs() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - mkdir -p $WORK_DIR - - (cd $OTHER_DIR && $FIND . -type d | $SORT > $WORK_DIR/other_dirs) - (cd $THIS_DIR && $FIND . -type d | $SORT > $WORK_DIR/this_dirs) - - echo -n Directory structure... - if $DIFF $WORK_DIR/other_dirs $WORK_DIR/this_dirs > /dev/null; then - echo Identical! - else - echo Differences found. - REGRESSIONS=true - # Differences in directories found. - ONLY_OTHER=$($DIFF $WORK_DIR/other_dirs $WORK_DIR/this_dirs | $GREP '<') - if [ "$ONLY_OTHER" ]; then - echo Only in $OTHER - echo $ONLY_OTHER | $SED 's|< ./|\t|g' | $SED 's/ /\n/g' - fi - # Differences in directories found. - ONLY_THIS=$($DIFF $WORK_DIR/other_dirs $WORK_DIR/this_dirs | $GREP '>') - if [ "$ONLY_THIS" ]; then - echo Only in $THIS - echo $ONLY_THIS | $SED 's|> ./|\t|g' | $SED 's/ /\n/g' - fi - fi -} - - -########################################################################################## -# Compare file structure - -compare_files() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - mkdir -p $WORK_DIR - - (cd $OTHER_DIR && $FIND . -type f | $SORT > $WORK_DIR/other_files) - (cd $THIS_DIR && $FIND . -type f | $SORT > $WORK_DIR/this_files) - - echo -n File names... - if diff $WORK_DIR/other_files $WORK_DIR/this_files > /dev/null; then - echo Identical! - else - echo Differences found. - REGRESSIONS=true - # Differences in directories found. - ONLY_OTHER=$(diff $WORK_DIR/other_files $WORK_DIR/this_files | $GREP '<') - if [ "$ONLY_OTHER" ]; then - echo Only in $OTHER - echo "$ONLY_OTHER" | sed 's|< ./| |g' - fi - # Differences in directories found. - ONLY_THIS=$(diff $WORK_DIR/other_files $WORK_DIR/this_files | $GREP '>') - if [ "$ONLY_THIS" ]; then - echo Only in $THIS - echo "$ONLY_THIS" | sed 's|> ./| |g' - fi - fi -} - - -########################################################################################## -# Compare permissions - -compare_permissions() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - mkdir -p $WORK_DIR - - echo -n Permissions... - found="" - for f in `cd $OTHER_DIR && $FIND . -type f` - do - if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi - if [ ! -f ${THIS_DIR}/$f ]; then continue; fi - OP=`ls -l ${OTHER_DIR}/$f | awk '{printf("%.10s\n", $1);}'` - TP=`ls -l ${THIS_DIR}/$f | awk '{printf("%.10s\n", $1);}'` - if [ "$OP" != "$TP" ] - then - if [ -z "$found" ]; then echo ; found="yes"; fi - $PRINTF "\told: ${OP} new: ${TP}\t$f\n" - fi - done - if [ -z "$found" ]; then - echo "Identical!" - else - REGRESSIONS=true - fi -} - -########################################################################################## -# Compare file command output - -compare_file_types() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - $MKDIR -p $WORK_DIR - - echo -n File types... - found="" - for f in `cd $OTHER_DIR && $FIND . -type f` - do - if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi - if [ ! -f ${THIS_DIR}/$f ]; then continue; fi - OF=`cd ${OTHER_DIR} && $FILE $f` - TF=`cd ${THIS_DIR} && $FILE $f` - if [ "$f" = "./src.zip" ] || [ "$f" = "./jre/lib/JObjC.jar" ] || [ "$f" = "./lib/JObjC.jar" ] - then - if [ "`echo $OF | $GREP -ic zip`" -gt 0 -a "`echo $TF | $GREP -ic zip`" -gt 0 ] - then - # the way we produces zip-files make it so that directories are stored in old file - # but not in new (only files with full-path) - # this makes file-5.09 report them as different - continue; - fi - fi - - if [ "$OF" != "$TF" ] - then - if [ -z "$found" ]; then echo ; found="yes"; fi - $PRINTF "\tother: ${OF}\n\tthis : ${TF}\n" - fi - done - if [ -z "$found" ]; then - echo "Identical!" - else - REGRESSIONS=true - fi -} - -########################################################################################## -# Compare the rest of the files - -compare_general_files() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \ - ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \ - ! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \ - ! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \ - ! -name "*.lib" \ - | $GREP -v "./bin/" | $SORT | $FILTER) - - echo General files... - for f in $GENERAL_FILES - do - if [ -e $OTHER_DIR/$f ]; then - DIFF_OUT=$($DIFF $OTHER_DIR/$f $THIS_DIR/$f 2>&1) - if [ -n "$DIFF_OUT" ]; then - echo $f - REGRESSIONS=true - if [ "$SHOW_DIFFS" = "true" ]; then - echo "$DIFF_OUT" - fi - fi - fi - done - - -} - -########################################################################################## -# Compare zip file - -compare_zip_file() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - ZIP_FILE=$4 - - THIS_ZIP=$THIS_DIR/$ZIP_FILE - OTHER_ZIP=$OTHER_DIR/$ZIP_FILE - - THIS_SUFFIX="${THIS_ZIP##*.}" - OTHER_SUFFIX="${OTHER_ZIP##*.}" - if [ "$THIS_SUFFIX" != "$OTHER_SUFFIX" ]; then - echo The files do not have the same suffix type! - return 2 - fi - - UNARCHIVE="$UNZIP -q" - - TYPE="$THIS_SUFFIX" - - if $CMP $OTHER_ZIP $THIS_ZIP > /dev/null - then - return 0 - fi - # Not quite identical, the might still contain the same data. - # Unpack the jar/zip files in temp dirs - - THIS_UNZIPDIR=$WORK_DIR/$ZIP_FILE.this - OTHER_UNZIPDIR=$WORK_DIR/$ZIP_FILE.other - $RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR - $MKDIR -p $THIS_UNZIPDIR - $MKDIR -p $OTHER_UNZIPDIR - (cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP) - (cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP) - - CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff - LANG=C $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE - - ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE) - ONLY_THIS=$($GREP "^Only in $THIS_UNZIPDIR" $CONTENTS_DIFF_FILE) - - return_value=0 - - if [ -n "$ONLY_OTHER" ]; then - echo " Only OTHER $ZIP_FILE contains:" - echo "$ONLY_OTHER" | sed "s|Only in $OTHER_UNZIPDIR| |"g | sed 's|: |/|g' - return_value=1 - fi - - if [ -n "$ONLY_THIS" ]; then - echo " Only THIS $ZIP_FILE contains:" - echo "$ONLY_THIS" | sed "s|Only in $THIS_UNZIPDIR| |"g | sed 's|: |/|g' - return_value=1 - fi - - DIFFING_FILES=$($GREP differ $CONTENTS_DIFF_FILE | $CUT -f 2 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g") - - $RM -f $WORK_DIR/$ZIP_FILE.diffs - for file in $DIFFING_FILES; do - if [[ "$ACCEPTED_JARZIP_CONTENTS" != *"$file"* ]]; then - diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs - fi - done - - if [ -s "$WORK_DIR/$ZIP_FILE.diffs" ]; then - return_value=1 - echo " Differing files in $ZIP_FILE" - $CAT $WORK_DIR/$ZIP_FILE.diffs | $GREP differ | cut -f 2 -d ' ' | \ - $SED "s|$OTHER_UNZIPDIR| |g" > $WORK_DIR/$ZIP_FILE.difflist - $CAT $WORK_DIR/$ZIP_FILE.difflist - - if [ -n "$SHOW_DIFFS" ]; then - for i in $(cat $WORK_DIR/$ZIP_FILE.difflist) ; do - if [ -f "${OTHER_UNZIPDIR}/$i.javap" ]; then - LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.javap ${THIS_UNZIPDIR}/$i.javap - elif [ -f "${OTHER_UNZIPDIR}/$i.cleaned" ]; then - LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.cleaned ${THIS_UNZIPDIR}/$i - else - LANG=C $DIFF ${OTHER_UNZIPDIR}/$i ${THIS_UNZIPDIR}/$i - fi - done - fi - fi - - return $return_value -} - - -########################################################################################## -# Compare all zip files - -compare_all_zip_files() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.zip" | $SORT | $FILTER ) - - if [ -n "$ZIPS" ]; then - echo Zip files... - - return_value=0 - for f in $ZIPS; do - if [ -f "$OTHER_DIR/$f" ]; then - compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f - if [ "$?" != "0" ]; then - return_value=1 - REGRESSIONS=true - fi - fi - done - fi - - return $return_value -} - -########################################################################################## -# Compare all jar files - -compare_all_jar_files() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - # TODO filter? - ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.jar" | $SORT | $FILTER) - - if [ -n "$ZIPS" ]; then - echo Jar files... - - return_value=0 - for f in $ZIPS; do - if [ -f "$OTHER_DIR/$f" ]; then - compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f - if [ "$?" != "0" ]; then - return_value=1 - REGRESSIONS=true - fi - fi - done - fi - - return $return_value -} - -########################################################################################## -# Compare binary (executable/library) file - -compare_bin_file() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - BIN_FILE=$4 - - THIS_FILE=$THIS_DIR/$BIN_FILE - OTHER_FILE=$OTHER_DIR/$BIN_FILE - NAME=$(basename $BIN_FILE) - WORK_FILE_BASE=$WORK_DIR/$BIN_FILE - FILE_WORK_DIR=$(dirname $WORK_FILE_BASE) - - $MKDIR -p $FILE_WORK_DIR - - ORIG_THIS_FILE="$THIS_FILE" - ORIG_OTHER_FILE="$OTHER_FILE" - - if [[ "$STRIP_BEFORE_COMPARE" = *"$BIN_FILE"* ]]; then - THIS_STRIPPED_FILE=$FILE_WORK_DIR/this/$NAME - OTHER_STRIPPED_FILE=$FILE_WORK_DIR/other/$NAME - $MKDIR -p $FILE_WORK_DIR/this $FILE_WORK_DIR/other - $CP $THIS_FILE $THIS_STRIPPED_FILE - $CP $OTHER_FILE $OTHER_STRIPPED_FILE - $STRIP $THIS_STRIPPED_FILE - $STRIP $OTHER_STRIPPED_FILE - THIS_FILE="$THIS_STRIPPED_FILE" - OTHER_FILE="$OTHER_STRIPPED_FILE" - fi - - if [ -z "$SKIP_BIN_DIFF" ]; then - if cmp $OTHER_FILE $THIS_FILE > /dev/null; then - # The files were bytewise identical. - if [ -n "$VERBOSE" ]; then - echo " : : : : : $BIN_FILE" - fi - return 0 - fi - BIN_MSG=" diff " - if [[ "$ACCEPTED_BIN_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_BIN=true - if [[ "$KNOWN_BIN_DIFF" != *"$BIN_FILE"* ]]; then - BIN_MSG="*$BIN_MSG*" - REGRESSIONS=true - else - BIN_MSG=" $BIN_MSG " - fi - else - BIN_MSG="($BIN_MSG)" - DIFF_BIN= - fi - fi - - THIS_SIZE=$(ls -l "$THIS_FILE" | awk '{ print $5 }') - OTHER_SIZE=$(ls -l "$OTHER_FILE" | awk '{ print $5 }') - if [ $THIS_SIZE -ne $OTHER_SIZE ]; then - DIFF_SIZE_NUM=$($EXPR $THIS_SIZE - $OTHER_SIZE) - DIFF_SIZE_REL=$($EXPR $THIS_SIZE \* 100 / $OTHER_SIZE) - SIZE_MSG=$($PRINTF "%3d%% %4d" $DIFF_SIZE_REL $DIFF_SIZE_NUM) - if [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] && [ "$DIFF_SIZE_REL" -gt 98 ] && [ "$DIFF_SIZE_REL" -lt 102 ]; then - SIZE_MSG="($SIZE_MSG)" - DIFF_SIZE= - else - if [[ "$ACCEPTED_SIZE_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_SIZE=true - if [[ "$KNOWN_SIZE_DIFF" != *"$BIN_FILE"* ]]; then - SIZE_MSG="*$SIZE_MSG*" - REGRESSIONS=true - else - SIZE_MSG=" $SIZE_MSG " - fi - else - SIZE_MSG="($SIZE_MSG)" - DIFF_SIZE= - fi - fi - else - SIZE_MSG=" " - DIFF_SIZE= - if [[ "$KNOWN_SIZE_DIFF $ACCEPTED_SIZE_DIFF" = *"$BIN_FILE"* ]]; then - SIZE_MSG=" ! " - fi - fi - - if [[ "$SORT_SYMBOLS" = *"$BIN_FILE"* ]]; then - SYM_SORT_CMD="sort" - else - SYM_SORT_CMD="cat" - fi - - # Check symbols - if [ "$OPENJDK_TARGET_OS" = "windows" ]; then - $DUMPBIN -exports $OTHER_FILE | $GREP " = " | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other - $DUMPBIN -exports $THIS_FILE | $GREP " = " | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this - elif [ "$OPENJDK_TARGET_OS" = "solaris" ]; then - # Some symbols get seemingly random 15 character prefixes. Filter them out. - $NM -a $ORIG_OTHER_FILE | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] \.\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other - $NM -a $ORIG_THIS_FILE | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] \.\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this - else - $NM -a $ORIG_OTHER_FILE | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other - $NM -a $ORIG_THIS_FILE | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this - fi - - LANG=C $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff - if [ -s $WORK_FILE_BASE.symbols.diff ]; then - SYM_MSG=" diff " - if [[ "$ACCEPTED_SYM_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_SYM=true - if [[ "$KNOWN_SYM_DIFF" != *"$BIN_FILE"* ]]; then - SYM_MSG="*$SYM_MSG*" - REGRESSIONS=true - else - SYM_MSG=" $SYM_MSG " - fi - else - SYM_MSG="($SYM_MSG)" - DIFF_SYM= - fi - else - SYM_MSG=" " - DIFF_SYM= - if [[ "$KNOWN_SYM_DIFF $ACCEPTED_SYM_DIFF" = *"$BIN_FILE"* ]]; then - SYM_MSG=" ! " - fi - fi - - # Check dependencies - if [ -n "$LDD_CMD" ];then - (cd $FILE_WORK_DIR && $CP $OTHER_FILE . && $LDD_CMD $NAME | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.other | $UNIQ > $WORK_FILE_BASE.deps.other.uniq) - (cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.this | $UNIQ > $WORK_FILE_BASE.deps.this.uniq) - (cd $FILE_WORK_DIR && $RM -f $NAME) - - LANG=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this > $WORK_FILE_BASE.deps.diff - LANG=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq > $WORK_FILE_BASE.deps.diff.uniq - - if [ -s $WORK_FILE_BASE.deps.diff ]; then - if [ -s $WORK_FILE_BASE.deps.diff.uniq ]; then - DEP_MSG=" diff " - else - DEP_MSG=" redun " - fi - if [[ "$ACCEPTED_DEP_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_DEP=true - if [[ "$KNOWN_DEP_DIFF" != *"$BIN_FILE"* ]]; then - DEP_MSG="*$DEP_MSG*" - REGRESSIONS=true - else - DEP_MSG=" $DEP_MSG " - fi - else - DEP_MSG="($DEP_MSG)" - DIFF_DEP= - fi - else - DEP_MSG=" " - DIFF_DEP= - if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then - DEP_MSG=" ! " - fi - fi - fi - - # Compare readelf output - if [ -n "$READELF_CMD" ] && [ -z "$SKIP_ELF_DIFF" ]; then - $READELF_CMD $OTHER_FILE > $WORK_FILE_BASE.readelf.other 2>&1 - $READELF_CMD $THIS_FILE > $WORK_FILE_BASE.readelf.this 2>&1 - - LANG=C $DIFF $WORK_FILE_BASE.readelf.other $WORK_FILE_BASE.readelf.this > $WORK_FILE_BASE.readelf.diff - - if [ -s $WORK_FILE_BASE.readelf.diff ]; then - ELF_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.readelf.diff | awk '{print $5}') - ELF_MSG=$($PRINTF "%8d" $ELF_DIFF_SIZE) - if [[ "$ACCEPTED_ELF_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_ELF=true - if [[ "$KNOWN_ELF_DIFF" != *"$BIN_FILE"* ]]; then - ELF_MSG="*$ELF_MSG*" - REGRESSIONS=true - else - ELF_MSG=" $ELF_MSG " - fi - else - ELF_MSG="($ELF_MSG)" - DIFF_ELF= - fi - else - ELF_MSG=" " - DIFF_ELF= - if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then - ELF_MSG=" ! " - fi - fi - fi - - # Compare disassemble output - if [ -f "$OBJDUMP" ] && [ -z "$SKIP_DIS_DIFF" ]; then - $OBJDUMP -d $OTHER_FILE | $GREP -v $NAME > $WORK_FILE_BASE.dis.other 2>&1 - $OBJDUMP -d $THIS_FILE | $GREP -v $NAME > $WORK_FILE_BASE.dis.this 2>&1 - - LANG=C $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff - - if [ -s $WORK_FILE_BASE.dis.diff ]; then - DIS_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.dis.diff | awk '{print $5}') - DIS_MSG=$($PRINTF "%8d" $DIS_DIFF_SIZE) - if [[ "$ACCEPTED_DIS_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_DIS=true - if [[ "$KNOWN_DIS_DIFF" != *"$BIN_FILE"* ]]; then - DIS_MSG="*$DIS_MSG*" - REGRESSIONS=true - else - DIS_MSG=" $DIS_MSG " - fi - else - DIS_MSG="($DIS_MSG)" - DIFF_DIS= - fi - else - DIS_MSG=" " - DIFF_DIS= - if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then - DIS_MSG=" ! " - fi - fi - fi - - - if [ -n "$DIFF_BIN$DIFF_SIZE$DIFF_SYM$DIFF_DEP$DIFF_ELF$DIFF_DIS" ] || [ -n "$VERBOSE" ]; then - if [ -n "$BIN_MSG" ]; then echo -n "$BIN_MSG:"; fi - if [ -n "$SIZE_MSG" ]; then echo -n "$SIZE_MSG:"; fi - if [ -n "$SYM_MSG" ]; then echo -n "$SYM_MSG:"; fi - if [ -n "$DEP_MSG" ]; then echo -n "$DEP_MSG:"; fi - if [ -n "$ELF_MSG" ]; then echo -n "$ELF_MSG:"; fi - if [ -n "$DIS_MSG" ]; then echo -n "$DIS_MSG:"; fi - echo " $BIN_FILE" - if [ "$SHOW_DIFFS" = "true" ]; then - if [ -s "$WORK_FILE_BASE.symbols.diff" ]; then - echo "Symbols diff:" - $CAT $WORK_FILE_BASE.symbols.diff - fi - if [ -s "$WORK_FILE_BASE.deps.diff" ]; then - echo "Deps diff:" - $CAT $WORK_FILE_BASE.deps.diff - fi - if [ -s "$WORK_FILE_BASE.readelf.diff" ]; then - echo "Readelf diff:" - $CAT $WORK_FILE_BASE.readelf.diff - fi - if [ -s "$WORK_FILE_BASE.dis.diff" ]; then - echo "Disassembly diff:" - $CAT $WORK_FILE_BASE.dis.diff - fi - fi - return 1 - fi - return 0 -} - -########################################################################################## -# Print binary diff header - -print_binary_diff_header() { - if [ -z "$SKIP_BIN_DIFF" ]; then echo -n " Binary :"; fi - if [ -z "$SKIP_SIZE_DIFF" ]; then echo -n " Size :"; fi - if [ -z "$SKIP_SYM_DIFF" ]; then echo -n " Symbols :"; fi - if [ -z "$SKIP_DEP_DIFF" ]; then echo -n " Deps :"; fi - if [ -z "$SKIP_ELF_DIFF" ]; then echo -n " Readelf :"; fi - if [ -z "$SKIP_DIS_DIFF" ]; then echo -n " Disass :"; fi - echo -} - -########################################################################################## -# Compare all libraries - -compare_all_libs() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - LIBS=$(cd $THIS_DIR && $FIND . -name 'lib*.so' -o -name '*.dylib' -o -name '*.dll' | $SORT | $FILTER) - - if [ -n "$LIBS" ]; then - echo Libraries... - print_binary_diff_header - for l in $LIBS; do - if [ -f "$OTHER_DIR/$l" ]; then - compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $l - if [ "$?" != "0" ]; then - return_value=1 - fi - fi - done - fi - - return $return_value -} - -########################################################################################## -# Compare all executables - -compare_all_execs() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - if [ "$OPENJDK_TARGET_OS" = "windows" ]; then - EXECS=$(cd $THIS_DIR && $FIND . -type f -name '*.exe' | $SORT | $FILTER) - else - EXECS=$(cd $THIS_DIR && $FIND . -name db -prune -o -type f -perm -100 \! \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' -o -name '*.cgi' \) | $SORT | $FILTER) - fi - - if [ -n "$EXECS" ]; then - echo Executables... - print_binary_diff_header - for e in $EXECS; do - if [ -f "$OTHER_DIR/$e" ]; then - compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $e - if [ "$?" != "0" ]; then - return_value=1 - fi - fi - done - fi - - return $return_value -} - -########################################################################################## -# Initiate configuration - -COMPARE_ROOT=/tmp/cimages.$USER -$MKDIR -p $COMPARE_ROOT if [ "$OPENJDK_TARGET_OS" = "windows" ]; then - if [ "$(uname -o)" = "Cygwin" ]; then - COMPARE_ROOT=$(cygpath -msa $COMPARE_ROOT) - fi + PATH="@VS_PATH@" fi -THIS="$( cd "$( dirname "$0" )" && pwd )" -echo "$THIS" -THIS_SCRIPT="$0" - -if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ] || [ "$1" = "/h" ] || [ "$1" = "/?" ] || [ "$1" = "-help" ] || [ "$1" = "--help" ]; then - echo "bash ./compare.sh [OPTIONS] [FILTER]" - echo "" - echo "-all Compare all files in all known ways" - echo "-names Compare the file names and directory structure" - echo "-perms Compare the permission bits on all files and directories" - echo "-types Compare the output of the file command on all files" - echo "-general Compare the files not convered by the specialized comparisons" - echo "-zips Compare the contents of all zip files" - echo "-jars Compare the contents of all jar files" - echo "-libs Compare all native libraries" - echo "-execs Compare all executables" - echo "-v Verbose output, does not hide known differences" - echo "-vv More verbose output, shows diff output of all comparisons" - echo "-o [OTHER] Compare with build in other directory. Will default to the old build directory" - echo "" - echo "[FILTER] List filenames in the image to compare, works for jars, zips, libs and execs" - echo "Example:" - echo "bash ./common/bin/compareimages.sh CodePointIM.jar" - exit 10 -fi - -CMP_NAMES=false -CMP_PERMS=false -CMP_TYPES=false -CMP_GENERAL=false -CMP_ZIPS=false -CMP_JARS=false -CMP_LIBS=false -CMP_EXECS=false - -while [ -n "$1" ]; do - case "$1" in - -v) - VERBOSE=true - ;; - -vv) - VERBOSE=true - SHOW_DIFFS=true - ;; - -o) - OTHER=$2 - shift - ;; - -all) - CMP_NAMES=true - if [ "$OPENJDK_TARGET_OS" != "windows" ]; then - CMP_PERMS=true - fi - CMP_TYPES=true - CMP_GENERAL=true - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true - ;; - -names) - CMP_NAMES=true - ;; - -perms) - CMP_PERMS=true - ;; - -types) - CMP_TYPES=true - ;; - -general) - CMP_GENERAL=true - ;; - -zips) - CMP_ZIPS=true - ;; - -jars) - CMP_JARS=true - ;; - -libs) - CMP_LIBS=true - ;; - -execs) - CMP_EXECS=true - ;; - *) - CMP_NAMES=false - CMP_PERMS=false - CMP_TYPES=false - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true - - if [ -z "$FILTER" ]; then - FILTER="$GREP" - fi - FILTER="$FILTER -e $1" - ;; - esac - shift -done - -if [ "$CMP_NAMES" = "false" ] && [ "$CMP_TYPES" = "false" ] && [ "$CMP_PERMS" = "false" ] && [ "$CMP_GENERAL" = "false" ] && [ "$CMP_ZIPS" = "false" ] && [ "$CMP_JARS" = "false" ] && [ "$CMP_LIBS" = "false" ] && [ "$CMP_EXECS" = "false" ]; then - CMP_NAMES=true - CMP_PERMS=true - CMP_TYPES=true - CMP_GENERAL=true - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true -fi - -if [ -z "$FILTER" ]; then - FILTER="$CAT" -fi - -if [ -z "$OTHER" ]; then - OTHER="$THIS/../$LEGACY_BUILD_DIR" - if [ -d "$OTHER" ]; then - OTHER="$( cd "$OTHER" && pwd )" - else - echo "Default old build directory does not exist:" - echo "$OTHER" - fi - echo "Comparing to default old build:" - echo "$OTHER" - echo -else - echo "Comparing to:" - echo "$OTHER" - echo -fi - -if [ ! -d "$OTHER" ]; then - echo "Other build directory does not exist:" - echo "$OTHER" - exit 1; -fi - -# Figure out the layout of the new build. Which kinds of images have been produced -if [ -d "$THIS/images/j2sdk-image" ]; then - THIS_J2SDK="$THIS/images/j2sdk-image" - THIS_J2RE="$THIS/images/j2re-image" -fi -if [ -d "$THIS/images/j2sdk-overlay-image" ]; then - THIS_J2SDK_OVERLAY="$THIS/images/j2sdk-overlay-image" - THIS_J2RE_OVERLAY="$THIS/images/j2re-overlay-image" -fi - -# Figure out the layout of the other build (old or new, normal or overlay image) -if [ -d "$OTHER/j2sdk-image" ]; then - if [ -f "$OTHER/j2sdk-image/LICENSE" ]; then - OTHER_J2SDK="$OTHER/j2sdk-image" - OTHER_J2RE="$OTHER/j2re-image" - else - OTHER_J2SDK_OVERLAY="$OTHER/j2sdk-image" - OTHER_J2RE_OVERLAY="$OTHER/j2re-image" - fi - -fi - -if [ -z "$OTHER_J2SDK" ] && [ -n "$OTHER_J2SDK_OVERLAY" ] && [ -z "$THIS_J2SDK_OVERLAY" ]; then - echo "OTHER build only has an overlay image while this build does not. Nothing to compare!" +# Now locate the main script and run it. +REAL_COMPARE_SCRIPT="$SRC_ROOT/common/bin/compare.sh" +if [ ! -e "$REAL_COMPARE_SCRIPT" ]; then + echo "Error: Cannot locate compare script, it should have been in $REAL_COMPARE_SCRIPT" exit 1 fi - -########################################################################################## -# Do the work - -if [ "$CMP_NAMES" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - echo -n "J2SDK " - compare_dirs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_dirs $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - - echo -n "J2SDK " - compare_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "J2SDK Overlay " - compare_dirs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_dirs $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - - echo -n "J2SDK Overlay " - compare_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - fi -fi - -if [ "$CMP_PERMS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - echo -n "J2SDK " - compare_permissions $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_permissions $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "J2SDK Overlay " - compare_permissions $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_permissions $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - fi -fi - -if [ "$CMP_TYPES" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - echo -n "J2SDK " - compare_file_types $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_file_types $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "J2SDK Overlay " - compare_file_types $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_file_types $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - fi -fi - -if [ "$CMP_GENERAL" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - echo -n "J2SDK " - compare_general_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_general_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "J2SDK Overlay " - compare_general_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_general_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - fi -fi - -if [ "$CMP_ZIPS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - compare_all_zip_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - fi -fi - -if [ "$CMP_JARS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - compare_all_jar_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - fi -fi - -if [ "$CMP_LIBS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - compare_all_libs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "Overlay " - compare_all_libs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - fi -fi - -if [ "$CMP_EXECS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - compare_all_execs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "Overlay " - compare_all_execs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - fi -fi - -echo - -if [ -n "$REGRESSIONS" ]; then - echo "REGRESSIONS FOUND!" - echo - exit 1 -else - echo "No regressions found" - echo - exit 0 -fi +. "$REAL_COMPARE_SCRIPT" "$@" diff --git a/common/autoconf/configure b/common/autoconf/configure index 5007a617e8c..8e4560df114 100644 --- a/common/autoconf/configure +++ b/common/autoconf/configure @@ -1,4 +1,32 @@ -#!/bin/sh +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +if test "x$BASH_VERSION" = x; then + echo This script needs bash to run. + echo It is recommended to use the configure script in the source tree root instead. + exit 1 +fi CONFIGURE_COMMAND_LINE="$@" conf_script_dir=`dirname $0` @@ -13,58 +41,81 @@ fi ### Test that the generated configure is up-to-date ### -# On Solaris /bin/sh doesn't support test -nt but /usr/bin/test does. -TEST=`which test` - -print_error_not_up_to_date() { - echo "Error: The configure source files is newer than the generated files." - echo "Please run 'sh autogen.sh' to update the generated files." - echo "Note that this test might trigger incorrectly sometimes due to hg timestamps". +run_autogen_or_fail() { + if test "x`which autoconf 2> /dev/null`" = x; then + echo "Cannot locate autoconf, unable to correct situation." + echo "Please install autoconf and run 'bash autogen.sh' to update the generated files." + echo "Error: Cannot continue" 1>&2 + exit 1 + else + echo "Running autogen.sh to correct the situation" + bash $conf_script_dir/autogen.sh + fi } -# NOTE: This test can occasionally go wrong due to the way mercurial handles -# timestamps. It it supposed to aid during development of build-infra, but should -# go away before making this the default build system. -for file in configure.ac *.m4 ; do - if $TEST $file -nt generated-configure.sh; then - print_error_not_up_to_date - exit 1 - fi -done - -if $TEST -e $conf_custom_script_dir/generated-configure.sh; then - # If custom source configure is available, make sure it is up-to-date as well. - for file in configure.ac *.m4 $conf_custom_script_dir/*.m4; do - if $TEST $file -nt $conf_custom_script_dir/generated-configure.sh; then - print_error_not_up_to_date - exit 1 +check_autoconf_timestamps() { + for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 ; do + if test $file -nt $conf_script_dir/generated-configure.sh; then + echo "Warning: The configure source files is newer than the generated files." + run_autogen_or_fail fi done + if test -e $conf_custom_script_dir/generated-configure.sh; then + # If custom source configure is available, make sure it is up-to-date as well. + for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 $conf_custom_script_dir/*.m4; do + if test $file -nt $conf_custom_script_dir/generated-configure.sh; then + echo "Warning: The configure source files is newer than the custom generated files." + run_autogen_or_fail + fi + done + fi +} + +check_hg_updates() { + if test "x`which hg 2> /dev/null`" != x; then + conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard 2> /dev/null | grep autoconf` + if test "x$conf_updated_autoconf_files" != x; then + echo "Configure source code has been updated, checking time stamps" + check_autoconf_timestamps + fi + + if test -e $conf_custom_script_dir; then + # If custom source configure is available, make sure it is up-to-date as well. + conf_custom_updated_autoconf_files=`cd $conf_custom_script_dir && hg status -mard 2> /dev/null | grep autoconf` + if test "x$conf_custom_updated_autoconf_files" != x; then + echo "Configure custom source code has been updated, checking time stamps" + check_autoconf_timestamps + fi + fi + + fi +} + +# Check for local changes +check_hg_updates + +if test -e $conf_custom_script_dir/generated-configure.sh; then # Test if open configure is newer than custom configure, if so, custom needs to # be regenerated. This test is required to ensure consistency with custom source. - conf_open_configure_timestamp=`grep DATE_WHEN_GENERATED: $conf_script_dir/generated-configure.sh | cut -d" " -f 3` - conf_custom_configure_timestamp=`grep DATE_WHEN_GENERATED: $conf_custom_script_dir/generated-configure.sh | cut -d" " -f 3` - if $TEST $conf_open_configure_timestamp -gt $conf_custom_configure_timestamp; then - echo "Error: The generated configure file contains changes not present in the custom generated file." - echo "Please run 'sh autogen.sh' to update the generated files." - exit 1 + conf_open_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_script_dir/generated-configure.sh | cut -d"=" -f 2` + conf_custom_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_custom_script_dir/generated-configure.sh | cut -d"=" -f 2` + if test $conf_open_configure_timestamp -gt $conf_custom_configure_timestamp; then + echo "Warning: The generated configure file contains changes not present in the custom generated file." + run_autogen_or_fail fi - fi # Autoconf calls the configure script recursively sometimes. # Don't start logging twice in that case -if $TEST "x$conf_debug_configure" = xtrue; then +if test "x$conf_debug_configure" = xtrue; then conf_debug_configure=recursive fi ### ### Process command-line arguments ### -conf_processed_arguments= +conf_processed_arguments=() conf_openjdk_target= -conf_extra_cflags= -conf_extra_cxxflags= for conf_option do @@ -72,20 +123,14 @@ do --openjdk-target=*) conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'` continue ;; - --with-extra-cflags=*) - conf_extra_cflags=`expr "X$conf_option" : '[^=]*=\(.*\)'` - continue ;; - --with-extra-cxxflags=*) - conf_extra_cxxflags=`expr "X$conf_option" : '[^=]*=\(.*\)'` - continue ;; --debug-configure) - if $TEST "x$conf_debug_configure" != xrecursive; then + if test "x$conf_debug_configure" != xrecursive; then conf_debug_configure=true export conf_debug_configure fi continue ;; *) - conf_processed_arguments="$conf_processed_arguments $conf_option" ;; + conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option") ;; esac case $conf_option in @@ -95,11 +140,13 @@ do conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;; -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*) conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;; + -help | --help | --hel | --he | -h) + conf_print_help=true ;; esac done -if $TEST "x$conf_legacy_crosscompile" != "x"; then - if $TEST "x$conf_openjdk_target" != "x"; then +if test "x$conf_legacy_crosscompile" != "x"; then + if test "x$conf_openjdk_target" != "x"; then echo "Error: Specifying --openjdk-target together with autoconf" echo "legacy cross-compilation flags is not supported." echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile." @@ -112,20 +159,20 @@ if $TEST "x$conf_legacy_crosscompile" != "x"; then fi fi -if $TEST "x$conf_openjdk_target" != "x"; then +if test "x$conf_openjdk_target" != "x"; then conf_build_platform=`sh $conf_script_dir/build-aux/config.guess` - conf_processed_arguments="--build=$conf_build_platform --host=$conf_openjdk_target --target=$conf_openjdk_target $conf_processed_arguments" + conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}") fi # Make configure exit with error on invalid options as default. # Can be overridden by --disable-option-checking, since we prepend our argument # and later options override earlier. -conf_processed_arguments="--enable-option-checking=fatal $conf_processed_arguments" +conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}") ### ### Call the configure script ### -if $TEST -e $conf_custom_script_dir/generated-configure.sh; then +if test -e $conf_custom_script_dir/generated-configure.sh; then # Custom source configure available; run that instead echo Running custom generated-configure.sh conf_script_to_run=$conf_custom_script_dir/generated-configure.sh @@ -134,17 +181,17 @@ else conf_script_to_run=$conf_script_dir/generated-configure.sh fi -if $TEST "x$conf_debug_configure" != x; then +if test "x$conf_debug_configure" != x; then # Turn on shell debug output if requested (initial or recursive) set -x fi -if $TEST "x$conf_debug_configure" = xtrue; then +if test "x$conf_debug_configure" = xtrue; then # Turn on logging, but don't turn on twice when called recursive conf_debug_logfile=./debug-configure.log - (exec 3>&1 ; (. $conf_script_to_run $conf_processed_arguments --with-extra-cflags="$conf_extra_cflags" --with-extra-cxxflags="$conf_extra_cxxflags" 2>&1 1>&3 ) | tee -a $conf_debug_logfile 1>&2 ; exec 3>&-) | tee -a $conf_debug_logfile + (exec 3>&1 ; (. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) | tee -a $conf_debug_logfile 1>&2 ; exec 3>&-) | tee -a $conf_debug_logfile else - . $conf_script_to_run $conf_processed_arguments --with-extra-cflags="$conf_extra_cflags" --with-extra-cxxflags="$conf_extra_cxxflags" + ( . $conf_script_to_run "${conf_processed_arguments[@]}" ) fi conf_result_code=$? @@ -152,8 +199,28 @@ conf_result_code=$? ### Post-processing ### +if test $conf_result_code -eq 0; then + if test "x$conf_print_help" = xtrue; then + cat < + --debug-configure Run the configure script with additional debug + logging enabled. + +Please be aware that, when cross-compiling, the OpenJDK configure script will +generally use 'target' where autoconf traditionally uses 'host'. +EOT + fi +else + echo configure exiting with result code $conf_result_code +fi + # Move the log file to the output root, if this was successfully created -if $TEST -d "$OUTPUT_ROOT"; then +if test -d "$OUTPUT_ROOT"; then mv -f config.log "$OUTPUT_ROOT" 2> /dev/null fi diff --git a/common/autoconf/configure.ac b/common/autoconf/configure.ac index d9b1f6b8757..0dc235535ea 100644 --- a/common/autoconf/configure.ac +++ b/common/autoconf/configure.ac @@ -31,16 +31,14 @@ AC_PREREQ([2.61]) -AC_INIT(openjdk, jdk8, build-dev@openjdk.java.net) - -# Do not change or remove the following line, it is needed for consistency checks: -# DATE_WHEN_GENERATED: @DATE_WHEN_GENERATED@ +AC_INIT(OpenJDK, jdk8, build-dev@openjdk.java.net,,http://openjdk.java.net) AC_CONFIG_AUX_DIR([build-aux]) m4_include([build-aux/pkg.m4]) # Include these first... m4_include([basics.m4]) +m4_include([basics_windows.m4]) m4_include([builddeps.m4]) # ... then the rest m4_include([boot-jdk.m4]) @@ -51,35 +49,57 @@ m4_include([libraries.m4]) m4_include([platform.m4]) m4_include([source-dirs.m4]) m4_include([toolchain.m4]) +m4_include([toolchain_windows.m4]) -# This line needs to be here, verbatim, after all includes. -# It is replaced with custom functionality when building +AC_DEFUN_ONCE([CUSTOM_EARLY_HOOK]) +AC_DEFUN_ONCE([CUSTOM_LATE_HOOK]) + +# This line needs to be here, verbatim, after all includes and the dummy hook +# definitions. It is replaced with custom functionality when building # custom sources. -AC_DEFUN_ONCE([CUSTOM_HOOK]) +#CUSTOM_AUTOCONF_INCLUDE + +# Do not change or remove the following line, it is needed for consistency checks: +DATE_WHEN_GENERATED=@DATE_WHEN_GENERATED@ ############################################################################### # -# Initialization +# Initialization / Boot-strapping +# +# The bootstrapping process needs to solve the "chicken or the egg" problem, +# thus it jumps back and forth, each time gaining something needed later on. # ############################################################################### # Basic initialization that must happen first of all BASIC_INIT +BASIC_SETUP_FUNDAMENTAL_TOOLS # Now we can determine OpenJDK build and target platforms. This is required to # have early on. PLATFORM_SETUP_OPENJDK_BUILD_AND_TARGET -# Continue setting up basic stuff. +# Continue setting up basic stuff. Most remaining code require fundamental tools. BASIC_SETUP_PATHS BASIC_SETUP_LOGGING +# These are needed to be able to create a configuration name (and thus the output directory) +JDKOPT_SETUP_JDK_VARIANT +JDKOPT_SETUP_JVM_VARIANTS +JDKOPT_SETUP_DEBUG_LEVEL + +# With basic setup done, call the custom early hook. +CUSTOM_EARLY_HOOK + +# To properly create a configuration name, we need to have the OpenJDK target +# and options (variants and debug level) parsed. +BASIC_SETUP_OUTPUT_DIR + # Must be done before we can call HELP_MSG_MISSING_DEPENDENCY. HELP_SETUP_DEPENDENCY_HELP -# Setup simple tools, that do not need have cross compilation support. -# Without these, we can't properly run the rest of the configure script. -BASIC_SETUP_TOOLS +# Setup tools that requires more complex handling, or that is not needed by the configure script. +BASIC_SETUP_COMPLEX_TOOLS # Check if pkg-config is available. PKG_PROG_PKG_CONFIG @@ -100,16 +120,9 @@ BDEPS_SCAN_FOR_BUILDDEPS ############################################################################### # We need build & target for this. -JDKOPT_SETUP_JDK_VARIANT -JDKOPT_SETUP_JVM_VARIANTS -JDKOPT_SETUP_DEBUG_LEVEL JDKOPT_SETUP_JDK_OPTIONS JDKOPT_SETUP_JDK_VERSION_NUMBERS -# To properly create a configuration name, we need to have the OpenJDK target -# and options (variants and debug level) parsed. -BASIC_SETUP_OUTPUT_DIR - ############################################################################### # # Setup BootJDK, used to bootstrap the build. @@ -137,7 +150,6 @@ SRCDIRS_SETUP_OUTPUT_DIRS ############################################################################### TOOLCHAIN_SETUP_SYSROOT_AND_OUT_OPTIONS -TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV # Locate the actual tools TOOLCHAIN_SETUP_PATHS @@ -152,10 +164,6 @@ TOOLCHAIN_SETUP_COMPILER_FLAGS_FOR_LIBS TOOLCHAIN_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION TOOLCHAIN_SETUP_COMPILER_FLAGS_FOR_JDK -# After we have toolchain, we can compile the uncygdrive helper -BASIC_COMPILE_UNCYGDRIVE - - # Setup debug symbols (need objcopy from the toolchain for that) JDKOPT_SETUP_DEBUG_SYMBOLS @@ -173,6 +181,9 @@ LIB_SETUP_ALSA LIB_SETUP_MISC_LIBS LIB_SETUP_STATIC_LINK_LIBSTDCPP +# After we have toolchain and the paths to all libraries (needed by msys), we can compile the fixpath helper +BASIC_COMPILE_FIXPATH + ############################################################################### # # We need to do some final tweaking, when everything else is done. @@ -210,7 +221,7 @@ BPERF_SETUP_CCACHE BASIC_TEST_USABILITY_ISSUES # At the end, call the custom hook. (Dummy macro if no custom sources available) -CUSTOM_HOOK +CUSTOM_LATE_HOOK # We're messing a bit with internal autoconf variables to put the config.status # in the output directory instead of the current directory. diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index 9dc456112b3..d5a739abfea 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.67 for openjdk jdk8. +# Generated by GNU Autoconf 2.67 for OpenJDK jdk8. # # Report bugs to . # @@ -550,12 +550,12 @@ MFLAGS= MAKEFLAGS= # Identity of this package. -PACKAGE_NAME='openjdk' +PACKAGE_NAME='OpenJDK' PACKAGE_TARNAME='openjdk' PACKAGE_VERSION='jdk8' -PACKAGE_STRING='openjdk jdk8' +PACKAGE_STRING='OpenJDK jdk8' PACKAGE_BUGREPORT='build-dev@openjdk.java.net' -PACKAGE_URL='' +PACKAGE_URL='http://openjdk.java.net' # Factoring default headers for most tests. ac_includes_default="\ @@ -606,7 +606,9 @@ CONCURRENT_BUILD_JOBS NUM_CORES SALIB_NAME HOTSPOT_MAKE_ARGS +FIXPATH LIBCXX +STATIC_CXX_SETTING LIBDL LIBM LIBZIP_CAN_USE_MMAP @@ -619,7 +621,6 @@ FREETYPE2_LIB_PATH USING_SYSTEM_FT_LIB FREETYPE2_LIBS FREETYPE2_CFLAGS -CUPS_LIBS CUPS_CFLAGS OPENWIN_HOME X_EXTRA_LIBS @@ -631,7 +632,6 @@ CXXFLAGS_DEBUG_SYMBOLS CFLAGS_DEBUG_SYMBOLS ZIP_DEBUGINFO_FILES ENABLE_DEBUG_SYMBOLS -UNCYGDRIVE LDFLAGS_CXX_JDK LDFLAGS_JDKEXE_SUFFIX LDFLAGS_JDKLIB_SUFFIX @@ -672,6 +672,9 @@ STATIC_LIBRARY SHARED_LIBRARY OBJ_SUFFIX LIPO +ac_ct_OBJDUMP +OBJDUMP +ac_ct_OBJCOPY OBJCOPY MCS STRIP @@ -683,9 +686,13 @@ COMPILER_TYPE RC_FLAGS DUMPBIN WINAR +HOTSPOT_RC +HOTSPOT_MT RC MT WINLD +HOTSPOT_LD +HOTSPOT_CXX ARFLAGS AR LDEXECXX @@ -698,6 +705,9 @@ OBJC ac_ct_CXX CXXFLAGS CXX +ac_ct_PROPER_COMPILER_CXX +PROPER_COMPILER_CXX +POTENTIAL_CXX OBJEXT EXEEXT ac_ct_CC @@ -705,12 +715,16 @@ CPPFLAGS LDFLAGS CFLAGS CC +ac_ct_PROPER_COMPILER_CC +PROPER_COMPILER_CC +POTENTIAL_CC BUILD_LD BUILD_CXX BUILD_CC -MSVCR100DLL -CHECK_FOR_VCINSTALLDIR -SETUPDEVENV +MSVCR_DLL +VS_PATH +VS_LIB +VS_INCLUDE CYGWIN_LINK AR_OUT_OPTION LD_OUT_OPTION @@ -733,15 +747,14 @@ BOOT_TOOLSJAR BOOT_RTJAR JAVA_CHECK JAVAC_CHECK -OUTPUT_ROOT -CONF_NAME -SPEC COOKED_BUILD_NUMBER FULL_VERSION RELEASE JDK_VERSION RUNTIME_NAME COPYRIGHT_YEAR +MACOSX_BUNDLE_ID_BASE +MACOSX_BUNDLE_NAME_BASE COMPANY_NAME JDK_RC_PLATFORM_NAME PRODUCT_SUFFIX @@ -753,16 +766,38 @@ JDK_UPDATE_VERSION JDK_MICRO_VERSION JDK_MINOR_VERSION JDK_MAJOR_VERSION -ENABLE_JFR COMPRESS_JARS CACERTS_FILE TEST_IN_BUILD -DISABLE_NIMBUS BUILD_HEADLESS SUPPORT_HEADFUL SUPPORT_HEADLESS -JIGSAW SET_OPENJDK +BDEPS_FTP +BDEPS_UNZIP +OS_VERSION_MICRO +OS_VERSION_MINOR +OS_VERSION_MAJOR +PKG_CONFIG +COMM +TIME +STAT +HG +READELF +OTOOL +LDD +ZIP +UNZIP +FIND_DELETE +MAKE +CHECK_TOOLSDIR_MAKE +CHECK_TOOLSDIR_GMAKE +CHECK_MAKE +CHECK_GMAKE +PKGHANDLER +OUTPUT_ROOT +CONF_NAME +SPEC BUILD_VARIANT_RELEASE DEBUG_CLASSFILES FASTDEBUG @@ -776,72 +811,12 @@ JVM_VARIANT_CLIENT JVM_VARIANT_SERVER JVM_VARIANTS JDK_VARIANT -BDEPS_FTP -BDEPS_UNZIP -OS_VERSION_MICRO -OS_VERSION_MINOR -OS_VERSION_MAJOR -PKG_CONFIG -HG -OBJDUMP -READELF -OTOOL -LDD -THEPWDCMD -FIND_DELETE -RM -MAKE -CHECK_TOOLSDIR_MAKE -CHECK_TOOLSDIR_GMAKE -CHECK_MAKE -CHECK_GMAKE -NAWK -SED -FGREP -EGREP -GREP -AWK -ZIP -XARGS -WC -UNZIP -UNIQ -TR -TOUCH -TEE -TAR -TAIL -SORT -SH -PRINTF -MV -MKDIR -LS -LN -HEAD -FIND -FILE -EXPR -ECHO -DIFF -DF -DATE -CUT -CPIO -CP -CMP -CHMOD -CAT -BASENAME -PKGHANDLER BUILD_LOG_WRAPPER BUILD_LOG_PREVIOUS BUILD_LOG SYS_ROOT PATH_SEP -CYGPATH SRC_ROOT -READLINK DEFINE_CROSS_COMPILE_ARCH LP64 OPENJDK_TARGET_OS_API_DIR @@ -854,18 +829,18 @@ OPENJDK_TARGET_CPU_LEGACY REQUIRED_OS_VERSION REQUIRED_OS_NAME COMPILE_TYPE -OPENJDK_BUILD_CPU_ENDIAN -OPENJDK_BUILD_CPU_BITS -OPENJDK_BUILD_CPU_ARCH -OPENJDK_BUILD_CPU -OPENJDK_BUILD_OS_API -OPENJDK_BUILD_OS OPENJDK_TARGET_CPU_ENDIAN OPENJDK_TARGET_CPU_BITS OPENJDK_TARGET_CPU_ARCH OPENJDK_TARGET_CPU OPENJDK_TARGET_OS_API OPENJDK_TARGET_OS +OPENJDK_BUILD_CPU_ENDIAN +OPENJDK_BUILD_CPU_BITS +OPENJDK_BUILD_CPU_ARCH +OPENJDK_BUILD_CPU +OPENJDK_BUILD_OS_API +OPENJDK_BUILD_OS OPENJDK_BUILD_AUTOCONF_NAME OPENJDK_TARGET_AUTOCONF_NAME target_os @@ -880,6 +855,51 @@ build_os build_vendor build_cpu build +SETFILE +DF +READLINK +CYGPATH +NAWK +SED +FGREP +EGREP +GREP +AWK +XARGS +WHICH +WC +UNIQ +UNAME +TR +TOUCH +TEE +TAR +TAIL +SORT +SH +RM +THEPWDCMD +PRINTF +MV +MKTEMP +MKDIR +LS +LN +HEAD +FIND +FILE +EXPR +ECHO +DIRNAME +DIFF +DATE +CUT +CP +CMP +CHMOD +CAT +BASH +BASENAME DATE_WHEN_CONFIGURED CONFIGURE_COMMAND_LINE CUSTOM_MAKE_DIR @@ -929,23 +949,19 @@ with_target_bits with_sys_root with_tools_dir with_devkit -with_builddeps_conf -with_builddeps_server -with_builddeps_dir -with_builddeps_group -enable_list_builddeps with_jdk_variant with_jvm_variants enable_debug with_debug_level +with_conf_name +with_builddeps_conf +with_builddeps_server +with_builddeps_dir +with_builddeps_group enable_openjdk_only -enable_jigsaw enable_headful -enable_nimbus enable_hotspot_test_in_build with_cacerts_file -enable_jfr -with_conf_name with_boot_jdk with_boot_jdk_jvmargs with_add_source_root @@ -957,7 +973,7 @@ with_override_jaxp with_override_jaxws with_override_hotspot with_override_jdk -with_msvcr100dll +with_msvcr_dll with_extra_cflags with_extra_cxxflags with_extra_ldflags @@ -967,7 +983,6 @@ enable_macosx_runtime_support with_x with_cups with_cups_include -with_cups_lib with_freetype with_alsa with_alsa_include @@ -1546,7 +1561,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures openjdk jdk8 to adapt to many kinds of systems. +\`configure' configures OpenJDK jdk8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1616,7 +1631,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of openjdk jdk8:";; + short | recursive ) echo "Configuration of OpenJDK jdk8:";; esac cat <<\_ACEOF @@ -1624,24 +1639,17 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-list-builddeps list all build dependencies known to the configure - script --enable-debug set the debug level to fastdebug (shorthand for --with-debug-level=fastdebug) [disabled] - --enable-openjdk-only build OpenJDK regardless of the presence of closed - repositories [disabled] - --enable-jigsaw build Jigsaw images (not yet available) [disabled] - --disable-headful build headful support (graphical UI support) - [enabled] - --disable-nimbus disable Nimbus L&F [enabled] + --enable-openjdk-only supress building closed source even if present + [disabled] + --disable-headful disable building headful support (graphical UI + support) [enabled] --enable-hotspot-test-in-build - enable running of Queens test after Hotspot build - (not yet available) [disabled] - --enable-jfr enable jfr (default is no) - ENABLE_JFR="${enableval}" - --disable-debug-symbols disable generation of debug symbols ([enabled]) + run the Queens test after Hotspot build [disabled] + --disable-debug-symbols disable generation of debug symbols [enabled] --disable-zip-debug-info - don't zip debug-info files ([enabled@:@) + disable zipping of debug-info files [enabled] --disable-macosx-runtime-support disable the use of MacOSX Java runtime support framework [enabled] @@ -1651,38 +1659,38 @@ Optional Features: --enable-sjavac use sjavac to do fast incremental compiles [disabled] --disable-precompiled-headers - use precompiled headers when compiling C++ [enabled] - --disable-ccache use ccache to speed up recompilations [enabled] + disable using precompiled headers when compiling C++ + [enabled] + --disable-ccache disable using ccache to speed up recompilations + [enabled] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-custom-make-dir directory containing custom build/make files + --with-custom-make-dir use this directory for custom build/make files --with-target-bits build 32-bit or 64-bit binaries (for platforms that support it), e.g. --with-target-bits=32 [guessed] - --with-sys-root pass this sys-root to the compilers and linker - (useful if the sys-root encoded in the cross - compiler tools is incorrect) - --with-tools-dir search this directory for (cross-compiling) - compilers and tools + --with-sys-root pass this sys-root to the compilers and tools (for + cross-compiling) + --with-tools-dir search this directory for compilers and tools (for + cross-compiling) --with-devkit use this directory as base for tools-dir and sys-root (for cross-compiling) - --with-builddeps-conf use this configuration file for the builddeps - --with-builddeps-server download and use build dependencies from this server - url, e.g. - --with-builddeps-server=ftp://example.com/dir - --with-builddeps-dir store downloaded build dependencies here - [d/localhome/builddeps] - --with-builddeps-group chgrp the downloaded build dependencies to this - group --with-jdk-variant JDK variant to build (normal) [normal] --with-jvm-variants JVM variants (separated by commas) to build (server, client, kernel, zero, zeroshark) [server] --with-debug-level set the debug level (release, fastdebug, slowdebug) [release] + --with-conf-name use this as the name of the configuration [generated + from important configuration options] + --with-builddeps-conf use this configuration file for the builddeps + --with-builddeps-server download and use build dependencies from this server + url + --with-builddeps-dir store downloaded build dependencies here + [/localhome/builddeps] + --with-builddeps-group chgrp the downloaded build dependencies to this + group --with-cacerts-file specify alternative cacerts file - --with-conf-name use this as the name of the configuration, - overriding the generated default --with-boot-jdk path to Boot JDK (used to bootstrap build) [probed] --with-boot-jdk-jvmargs specify JVM arguments to be passed to all invocations of the Boot JDK, overriding the default @@ -1707,16 +1715,15 @@ Optional Packages: --with-override-jaxws use this jaxws dir for the build --with-override-hotspot use this hotspot dir for the build --with-override-jdk use this jdk dir for the build - --with-msvcr100dll copy this msvcr100.dll into the built JDK + --with-msvcr-dll copy this msvcr100.dll into the built JDK (Windows + only) [probed] --with-extra-cflags extra flags to be used when compiling jdk c-files --with-extra-cxxflags extra flags to be used when compiling jdk c++-files --with-extra-ldflags extra flags to be used when linking jdk --with-x use the X Window System --with-cups specify prefix directory for the cups package - (expecting the libraries under PATH/lib and the - headers under PATH/include) + (expecting the headers under PATH/include) --with-cups-include specify directory for the cups include files - --with-cups-lib specify directory for the cups library --with-freetype specify prefix directory for the freetype2 package (expecting the libraries under PATH/lib and the headers under PATH/include) @@ -1733,10 +1740,7 @@ Optional Packages: --with-memory-size=1024 [probed] --with-sjavac-server-java use this java binary for running the sjavac - background server and other long running java tasks - in the build process, e.g. - ---with-sjavac-server-java="/opt/jrockit/bin/java - -server" + background server [Boot JDK java] --with-sjavac-server-cores use at most this number of concurrent threads on the sjavac server [probed] @@ -1769,6 +1773,7 @@ Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . +OpenJDK home page: . _ACEOF ac_status=$? fi @@ -1831,7 +1836,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -openjdk configure jdk8 +OpenJDK configure jdk8 generated by GNU Autoconf 2.67 Copyright (C) 2010 Free Software Foundation, Inc. @@ -2488,101 +2493,41 @@ $as_echo "$ac_res" >&6; } } # ac_fn_cxx_check_func -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes + eval "$3=yes" else - ac_header_compiler=no + eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ----------------------------------------- ## -## Report this to build-dev@openjdk.java.net ## -## ----------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } -fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} -} # ac_fn_c_check_header_mongrel +} # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by openjdk $as_me jdk8, which was +It was created by OpenJDK $as_me jdk8, which was generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ @@ -2931,9 +2876,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -# Do not change or remove the following line, it is needed for consistency checks: -# DATE_WHEN_GENERATED: 1347963060 - ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then @@ -3053,14 +2995,46 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +# This will make sure the given variable points to a full and proper +# path. This means: +# 1) There will be no spaces in the path. On posix platforms, +# spaces in the path will result in an error. On Windows, +# the path will be rewritten using short-style to be space-free. +# 2) The path will be absolute, and it will be in unix-style (on +# cygwin). +# $1: The name of the variable to fix + + +# This will make sure the given variable points to a executable +# with a full and proper path. This means: +# 1) There will be no spaces in the path. On posix platforms, +# spaces in the path will result in an error. On Windows, +# the path will be rewritten using short-style to be space-free. +# 2) The path will be absolute, and it will be in unix-style (on +# cygwin). +# Any arguments given to the executable is preserved. +# If the input variable does not have a directory specification, then +# it need to be in the PATH. +# $1: The name of the variable to fix +# Test that variable $1 denoting a program is not empty. If empty, exit with an error. +# $1: variable to check +# $2: executable name to print in warning (optional) +# Does AC_PATH_PROG followed by BASIC_CHECK_NONEMPTY. +# Arguments as AC_PATH_PROG: +# $1: variable to set +# $2: executable name to look for + + +# Setup the most fundamental tools that relies on not much else to set up, +# but is used by much of the early bootstrap code. # Setup basic configuration paths, and platform-specific stuff related to PATHs. @@ -3083,23 +3057,10 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -# Test that variable $1 denoting a program is not empty. If empty, exit with an error. -# $1: variable to check -# $2: executable name to print in warning (optional) -# Does AC_PATH_PROG followed by CHECK_NONEMPTY. -# Arguments as AC_PATH_PROG: -# $1: variable to set -# $2: executable name to look for - - - - - - - -# Check if build directory is on local disk. +# Check if build directory is on local disk. If not possible to determine, +# we prefer to claim it's local. # Argument 1: directory to test # Argument 2: what to do if it is on local disk # Argument 3: what to do otherwise (remote disk or failure) @@ -3136,6 +3097,64 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +# Helper function which possibly converts a path using DOS-style short mode. +# If so, the updated path is stored in $new_path. +# $1: The path to check + + +# Helper function which possibly converts a path using DOS-style short mode. +# If so, the updated path is stored in $new_path. +# $1: The path to check + + +# FIXME: The BASIC_FIXUP_*_CYGWIN/MSYS is most likely too convoluted +# and could probably be heavily simplified. However, all changes in this +# area tend to need lot of testing in different scenarios, and in lack of +# proper unit testing, cleaning this up has not been deemed worth the effort +# at the moment. + + + + + + + + + +# Setup basic configuration paths, and platform-specific stuff related to PATHs. + + + + +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + + + + + @@ -3287,6 +3306,19 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +cygwin_help() { + case $1 in + unzip) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P unzip" ;; + zip) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P zip" ;; + make) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P make" ;; + * ) + break ;; + esac +} + apt_help() { case $1 in devkit) @@ -3561,6 +3593,16 @@ fi # questions. # +# $1 = compiler to test (CC or CXX) +# $2 = human readable name of compiler (C or C++) + + + + + +# $1 = compiler to test (CC or CXX) +# $2 = human readable name of compiler (C or C++) +# $3 = list of compiler names to search for @@ -3573,16 +3615,60 @@ fi +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# -# This line needs to be here, verbatim, after all includes. -# It is replaced with custom functionality when building + + + + + +# Check if the VS env variables were setup prior to running configure. +# If not, then find vcvarsall.bat and run it automatically, and integrate +# the set env variables into the spec file. + + + + + + +# This line needs to be here, verbatim, after all includes and the dummy hook +# definitions. It is replaced with custom functionality when building # custom sources. +#CUSTOM_AUTOCONF_INCLUDE +# Do not change or remove the following line, it is needed for consistency checks: +DATE_WHEN_GENERATED=1351257228 ############################################################################### # -# Initialization +# Initialization / Boot-strapping +# +# The bootstrapping process needs to solve the "chicken or the egg" problem, +# thus it jumps back and forth, each time gaining something needed later on. # ############################################################################### @@ -3592,789 +3678,12 @@ fi DATE_WHEN_CONFIGURED=`LANG=C date` +{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuration created at $DATE_WHEN_CONFIGURED." >&5 +$as_echo "$as_me: Configuration created at $DATE_WHEN_CONFIGURED." >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: configure script generated at timestamp $DATE_WHEN_GENERATED." >&5 +$as_echo "$as_me: configure script generated at timestamp $DATE_WHEN_GENERATED." >&6;} -# Now we can determine OpenJDK build and target platforms. This is required to -# have early on. -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if test "${ac_cv_build+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if test "${ac_cv_host+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 -$as_echo_n "checking target system type... " >&6; } -if test "${ac_cv_target+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "x$target_alias" = x; then - ac_cv_target=$ac_cv_host -else - ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 -$as_echo "$ac_cv_target" >&6; } -case $ac_cv_target in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;; -esac -target=$ac_cv_target -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_target -shift -target_cpu=$1 -target_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -target_os=$* -IFS=$ac_save_IFS -case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac - - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -test -n "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -# Figure out the build and target systems. # Note that in autoconf terminology, "build" is obvious, but "target" -# is confusing; it assumes you are cross-compiling a cross-compiler (!) and "target" is thus the target of the -# product you're building. The target of this build is called "host". Since this is confusing to most people, we -# have not adopted that system, but use "target" as the platform we are building for. In some places though we need -# to use the configure naming style. - - - - - - # Copy the autoconf trip/quadruplet verbatim to OPENJDK_TARGET_AUTOCONF_NAME - # (from the autoconf "host") and OPENJDK_BUILD_AUTOCONF_NAME - # Note that we might later on rewrite e.g. OPENJDK_TARGET_CPU due to reduced build, - # but this will not change the value of OPENJDK_TARGET_AUTOCONF_NAME. - OPENJDK_TARGET_AUTOCONF_NAME="$host" - OPENJDK_BUILD_AUTOCONF_NAME="$build" - - - - # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. - - case "$host_os" in - *linux*) - VAR_OS=linux - VAR_OS_API=posix - ;; - *solaris*) - VAR_OS=solaris - VAR_OS_API=posix - ;; - *darwin*) - VAR_OS=macosx - VAR_OS_API=posix - ;; - *bsd*) - VAR_OS=bsd - VAR_OS_API=posix - ;; - *cygwin*|*windows*) - VAR_OS=windows - VAR_OS_API=winapi - ;; - *) - as_fn_error $? "unsupported operating system $host_os" "$LINENO" 5 - ;; - esac - - - # First argument is the cpu name from the trip/quad - case "$host_cpu" in - x86_64) - VAR_CPU=x86_64 - VAR_CPU_ARCH=x86 - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=little - ;; - i?86) - VAR_CPU=x86 - VAR_CPU_ARCH=x86 - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=little - ;; - arm*) - VAR_CPU=arm - VAR_CPU_ARCH=arm - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=little - ;; - powerpc) - VAR_CPU=ppc - VAR_CPU_ARCH=ppc - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=big - ;; - powerpc64) - VAR_CPU=ppc64 - VAR_CPU_ARCH=ppc - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=big - ;; - sparc) - VAR_CPU=sparc - VAR_CPU_ARCH=sparc - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=big - ;; - sparcv9) - VAR_CPU=sparcv9 - VAR_CPU_ARCH=sparc - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=big - ;; - *) - as_fn_error $? "unsupported cpu $host_cpu" "$LINENO" 5 - ;; - esac - - # ... and setup our own variables. (Do this explicitely to facilitate searching) - OPENJDK_TARGET_OS="$VAR_OS" - OPENJDK_TARGET_OS_API="$VAR_OS_API" - OPENJDK_TARGET_CPU="$VAR_CPU" - OPENJDK_TARGET_CPU_ARCH="$VAR_CPU_ARCH" - OPENJDK_TARGET_CPU_BITS="$VAR_CPU_BITS" - OPENJDK_TARGET_CPU_ENDIAN="$VAR_CPU_ENDIAN" - - - - - - - - # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. - - case "$build_os" in - *linux*) - VAR_OS=linux - VAR_OS_API=posix - ;; - *solaris*) - VAR_OS=solaris - VAR_OS_API=posix - ;; - *darwin*) - VAR_OS=macosx - VAR_OS_API=posix - ;; - *bsd*) - VAR_OS=bsd - VAR_OS_API=posix - ;; - *cygwin*|*windows*) - VAR_OS=windows - VAR_OS_API=winapi - ;; - *) - as_fn_error $? "unsupported operating system $build_os" "$LINENO" 5 - ;; - esac - - - # First argument is the cpu name from the trip/quad - case "$build_cpu" in - x86_64) - VAR_CPU=x86_64 - VAR_CPU_ARCH=x86 - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=little - ;; - i?86) - VAR_CPU=x86 - VAR_CPU_ARCH=x86 - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=little - ;; - arm*) - VAR_CPU=arm - VAR_CPU_ARCH=arm - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=little - ;; - powerpc) - VAR_CPU=ppc - VAR_CPU_ARCH=ppc - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=big - ;; - powerpc64) - VAR_CPU=ppc64 - VAR_CPU_ARCH=ppc - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=big - ;; - sparc) - VAR_CPU=sparc - VAR_CPU_ARCH=sparc - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=big - ;; - sparcv9) - VAR_CPU=sparcv9 - VAR_CPU_ARCH=sparc - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=big - ;; - *) - as_fn_error $? "unsupported cpu $build_cpu" "$LINENO" 5 - ;; - esac - - # ..and setup our own variables. (Do this explicitely to facilitate searching) - OPENJDK_BUILD_OS="$VAR_OS" - OPENJDK_BUILD_OS_API="$VAR_OS_API" - OPENJDK_BUILD_CPU="$VAR_CPU" - OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH" - OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS" - OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN" - - - - - - - - - -# Check whether --with-target-bits was given. -if test "${with_target_bits+set}" = set; then : - withval=$with_target_bits; -fi - - - # We have three types of compiles: - # native == normal compilation, target system == build system - # cross == traditional cross compilation, target system != build system; special toolchain needed - # reduced == using native compilers, but with special flags (e.g. -m32) to produce 32-bit builds on 64-bit machines - # - if test "x$OPENJDK_BUILD_AUTOCONF_NAME" != "x$OPENJDK_TARGET_AUTOCONF_NAME"; then - # We're doing a proper cross-compilation - COMPILE_TYPE="cross" - else - COMPILE_TYPE="native" - fi - - if test "x$with_target_bits" != x; then - if test "x$COMPILE_TYPE" = "xcross"; then - as_fn_error $? "It is not possible to combine --with-target-bits=X and proper cross-compilation. Choose either." "$LINENO" 5 - fi - - if test "x$with_target_bits" = x32 && test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - # A reduced build is requested - COMPILE_TYPE="reduced" - OPENJDK_TARGET_CPU_BITS=32 - if test "x$OPENJDK_TARGET_CPU_ARCH" = "xx86"; then - OPENJDK_TARGET_CPU=x86 - elif test "x$OPENJDK_TARGET_CPU_ARCH" = "xsparc"; then - OPENJDK_TARGET_CPU=sparc - else - as_fn_error $? "Reduced build (--with-target-bits=32) is only supported on x86_64 and sparcv9" "$LINENO" 5 - fi - elif test "x$with_target_bits" = x64 && test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - as_fn_error $? "It is not possible to use --with-target-bits=64 on a 32 bit system. Use proper cross-compilation instead." "$LINENO" 5 - elif test "x$with_target_bits" = "x$OPENJDK_TARGET_CPU_BITS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: --with-target-bits are set to build platform address size; argument has no meaning" >&5 -$as_echo "$as_me: --with-target-bits are set to build platform address size; argument has no meaning" >&6;} - else - as_fn_error $? "--with-target-bits can only be 32 or 64, you specified $with_target_bits!" "$LINENO" 5 - fi - fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compilation type" >&5 -$as_echo_n "checking for compilation type... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $COMPILE_TYPE" >&5 -$as_echo "$COMPILE_TYPE" >&6; } - - - if test "x$OPENJDK_TARGET_OS" = "xsolaris"; then - REQUIRED_OS_NAME=SunOS - REQUIRED_OS_VERSION=5.10 - fi - if test "x$OPENJDK_TARGET_OS" = "xlinux"; then - REQUIRED_OS_NAME=Linux - REQUIRED_OS_VERSION=2.6 - fi - if test "x$OPENJDK_TARGET_OS" = "xwindows"; then - REQUIRED_OS_NAME=Windows - if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then - REQUIRED_OS_VERSION=5.2 - else - REQUIRED_OS_VERSION=5.1 - fi - fi - if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then - REQUIRED_OS_NAME=Darwin - REQUIRED_OS_VERSION=11.2 - fi - - - - - - # Also store the legacy naming of the cpu. - # Ie i586 and amd64 instead of x86 and x86_64 - OPENJDK_TARGET_CPU_LEGACY="$OPENJDK_TARGET_CPU" - if test "x$OPENJDK_TARGET_CPU" = xx86; then - OPENJDK_TARGET_CPU_LEGACY="i586" - elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then - # On all platforms except MacOSX replace x86_64 with amd64. - OPENJDK_TARGET_CPU_LEGACY="amd64" - fi - - - # And the second legacy naming of the cpu. - # Ie i386 and amd64 instead of x86 and x86_64. - OPENJDK_TARGET_CPU_LEGACY_LIB="$OPENJDK_TARGET_CPU" - if test "x$OPENJDK_TARGET_CPU" = xx86; then - OPENJDK_TARGET_CPU_LEGACY_LIB="i386" - elif test "x$OPENJDK_TARGET_CPU" = xx86_64; then - OPENJDK_TARGET_CPU_LEGACY_LIB="amd64" - fi - - - # This is the name of the cpu (but using i386 and amd64 instead of - # x86 and x86_64, respectively), preceeded by a /, to be used when - # locating libraries. On macosx, it's empty, though. - OPENJDK_TARGET_CPU_LIBDIR="/$OPENJDK_TARGET_CPU_LEGACY_LIB" - if test "x$OPENJDK_TARGET_OS" = xmacosx; then - OPENJDK_TARGET_CPU_LIBDIR="" - fi - - - # OPENJDK_TARGET_CPU_ISADIR is normally empty. On 64-bit Solaris systems, it is set to - # /amd64 or /sparcv9. This string is appended to some library paths, like this: - # /usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libexample.so - OPENJDK_TARGET_CPU_ISADIR="" - if test "x$OPENJDK_TARGET_OS" = xsolaris; then - if test "x$OPENJDK_TARGET_CPU" = xx86_64; then - OPENJDK_TARGET_CPU_ISADIR="/amd64" - elif test "x$OPENJDK_TARGET_CPU" = xsparcv9; then - OPENJDK_TARGET_CPU_ISADIR="/sparcv9" - fi - fi - - - # Setup OPENJDK_TARGET_CPU_OSARCH, which is used to set the os.arch Java system property - OPENJDK_TARGET_CPU_OSARCH="$OPENJDK_TARGET_CPU" - if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$OPENJDK_TARGET_CPU" = xx86; then - # On linux only, we replace x86 with i386. - OPENJDK_TARGET_CPU_OSARCH="i386" - elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then - # On all platforms except macosx, we replace x86_64 with amd64. - OPENJDK_TARGET_CPU_OSARCH="amd64" - fi - - - OPENJDK_TARGET_CPU_JLI="$OPENJDK_TARGET_CPU" - if test "x$OPENJDK_TARGET_CPU" = xx86; then - OPENJDK_TARGET_CPU_JLI="i386" - elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then - # On all platforms except macosx, we replace x86_64 with amd64. - OPENJDK_TARGET_CPU_JLI="amd64" - fi - # Now setup the -D flags for building libjli. - OPENJDK_TARGET_CPU_JLI_CFLAGS="-DLIBARCHNAME='\"$OPENJDK_TARGET_CPU_JLI\"'" - if test "x$OPENJDK_TARGET_OS" = xsolaris; then - if test "x$OPENJDK_TARGET_CPU_ARCH" = xsparc; then - OPENJDK_TARGET_CPU_JLI_CFLAGS="$OPENJDK_TARGET_CPU_JLI_CFLAGS -DLIBARCH32NAME='\"sparc\"' -DLIBARCH64NAME='\"sparcv9\"'" - elif test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then - OPENJDK_TARGET_CPU_JLI_CFLAGS="$OPENJDK_TARGET_CPU_JLI_CFLAGS -DLIBARCH32NAME='\"i386\"' -DLIBARCH64NAME='\"amd64\"'" - fi - fi - - - # Setup OPENJDK_TARGET_OS_API_DIR, used in source paths. - if test "x$OPENJDK_TARGET_OS_API" = xposix; then - OPENJDK_TARGET_OS_API_DIR="solaris" - fi - if test "x$OPENJDK_TARGET_OS_API" = xwinapi; then - OPENJDK_TARGET_OS_API_DIR="windows" - fi - - - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - A_LP64="LP64:=" - ADD_LP64="-D_LP64=1" - fi - LP64=$A_LP64 - - - if test "x$COMPILE_TYPE" = "xcross"; then - # FIXME: ... or should this include reduced builds..? - DEFINE_CROSS_COMPILE_ARCH="CROSS_COMPILE_ARCH:=$OPENJDK_TARGET_CPU_LEGACY" - else - DEFINE_CROSS_COMPILE_ARCH="" - fi - - - - -# Continue setting up basic stuff. - -# Locate the directory of this script. -SCRIPT="$0" - - if test "x$OPENJDK_BUILD_OS" != xwindows; then - # Follow a chain of symbolic links. Use readlink - # where it exists, else fall back to horribly - # complicated shell code. - # Extract the first word of "readlink", so it can be a program name with args. -set dummy readlink; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_READLINK+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $READLINK in - [\\/]* | ?:[\\/]*) - ac_cv_path_READLINK="$READLINK" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_READLINK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -READLINK=$ac_cv_path_READLINK -if test -n "$READLINK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINK" >&5 -$as_echo "$READLINK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test "x$READLINK_TESTED" != yes; then - # On MacOSX there is a readlink tool with a different - # purpose than the GNU readlink tool. Check the found readlink. - ISGNU=`$READLINK --help 2>&1 | grep GNU` - if test "x$ISGNU" = x; then - # A readlink that we do not know how to use. - # Are there other non-GNU readlinks out there? - READLINK_TESTED=yes - READLINK= - fi - fi - - if test "x$READLINK" != x; then - SCRIPT=`$READLINK -f $SCRIPT` - else - STARTDIR=$PWD - COUNTER=0 - DIR=`dirname $SCRIPT` - FIL=`basename $SCRIPT` - while test $COUNTER -lt 20; do - ISLINK=`ls -l $DIR/$FIL | grep '\->' | sed -e 's/.*-> \(.*\)/\1/'` - if test "x$ISLINK" == x; then - # This is not a symbolic link! We are done! - break - fi - # The link might be relative! We have to use cd to travel safely. - cd $DIR - cd `dirname $ISLINK` - DIR=`pwd` - FIL=`basename $ISLINK` - let COUNTER=COUNTER+1 - done - cd $STARTDIR - SCRIPT=$DIR/$FIL - fi - fi - -AUTOCONF_DIR=`dirname $0` - -# Where is the source? It is located two levels above the configure script. -CURDIR="$PWD" -cd "$AUTOCONF_DIR/../.." -SRC_ROOT="`pwd`" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - SRC_ROOT_LENGTH=`pwd|wc -m` - if test $SRC_ROOT_LENGTH -gt 100; then - as_fn_error $? "Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported" "$LINENO" 5 - fi -fi - -cd "$CURDIR" - - - # Fail with message the path to the source root if var SRC_ROOT contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$SRC_ROOT" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - SRC_ROOT=`$CYGPATH -s -m -a "$SRC_ROOT"` - # Now it's case insensitive; let's make it lowercase to improve readability - SRC_ROOT=`$ECHO "$SRC_ROOT" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - SRC_ROOT=`$CYGPATH -u "$SRC_ROOT"` - else - as_fn_error $? "You cannot have spaces in the path to the source root! \"$SRC_ROOT\"" "$LINENO" 5 - fi - fi - - - # Fail with message the path to the current directory if var CURDIR contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$CURDIR" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - CURDIR=`$CYGPATH -s -m -a "$CURDIR"` - # Now it's case insensitive; let's make it lowercase to improve readability - CURDIR=`$ECHO "$CURDIR" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - CURDIR=`$CYGPATH -u "$CURDIR"` - else - as_fn_error $? "You cannot have spaces in the path to the current directory! \"$CURDIR\"" "$LINENO" 5 - fi - fi - - -if test "x$OPENJDK_BUILD_OS" = "xsolaris"; then - # Add extra search paths on solaris for utilities like ar and as etc... - PATH="$PATH:/usr/ccs/bin:/usr/sfw/bin:/opt/csw/bin" -fi - -# For cygwin we need cygpath first, since it is used everywhere. -# Extract the first word of "cygpath", so it can be a program name with args. -set dummy cygpath; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CYGPATH+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CYGPATH in - [\\/]* | ?:[\\/]*) - ac_cv_path_CYGPATH="$CYGPATH" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CYGPATH="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CYGPATH=$ac_cv_path_CYGPATH -if test -n "$CYGPATH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 -$as_echo "$CYGPATH" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -PATH_SEP=":" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - if test "x$CYGPATH" = x; then - as_fn_error $? "Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" "$LINENO" 5 - fi - PATH_SEP=";" -fi - - -# You can force the sys-root if the sys-root encoded into the cross compiler tools -# is not correct. - -# Check whether --with-sys-root was given. -if test "${with_sys_root+set}" = set; then : - withval=$with_sys_root; -fi - - -if test "x$with_sys_root" != x; then - SYS_ROOT=$with_sys_root -else - SYS_ROOT=/ -fi - - - -# Check whether --with-tools-dir was given. -if test "${with_tools_dir+set}" = set; then : - withval=$with_tools_dir; TOOLS_DIR=$with_tools_dir -fi - - - -# Check whether --with-devkit was given. -if test "${with_devkit+set}" = set; then : - withval=$with_devkit; - if test "x$with_sys_root" != x; then - as_fn_error $? "Cannot specify both --with-devkit and --with-sys-root at the same time" "$LINENO" 5 - fi - if test "x$with_tools_dir" != x; then - as_fn_error $? "Cannot specify both --with-devkit and --with-tools-dir at the same time" "$LINENO" 5 - fi - TOOLS_DIR=$with_devkit/bin - SYS_ROOT=$with_devkit/$host_alias/libc - -fi - - - - -# Setup default logging of stdout and stderr to build.log in the output root. -BUILD_LOG='$(OUTPUT_ROOT)/build.log' -BUILD_LOG_PREVIOUS='$(OUTPUT_ROOT)/build.log.old' -BUILD_LOG_WRAPPER='$(SH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)' - - - - - -# Must be done before we can call HELP_MSG_MISSING_DEPENDENCY. - - for ac_prog in apt-get yum port pkgutil pkgadd -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_PKGHANDLER+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$PKGHANDLER"; then - ac_cv_prog_PKGHANDLER="$PKGHANDLER" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_PKGHANDLER="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -PKGHANDLER=$ac_cv_prog_PKGHANDLER -if test -n "$PKGHANDLER"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGHANDLER" >&5 -$as_echo "$PKGHANDLER" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$PKGHANDLER" && break -done - - - -# Setup simple tools, that do not need have cross compilation support. -# Without these, we can't properly run the rest of the configure script. # Start with tools that do not need have cross compilation support # and can be expected to be found in the default PATH. These tools are @@ -4443,6 +3752,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in bash +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_BASH+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $BASH in + [\\/]* | ?:[\\/]*) + ac_cv_path_BASH="$BASH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_BASH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +BASH=$ac_cv_path_BASH +if test -n "$BASH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BASH" >&5 +$as_echo "$BASH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$BASH" && break +done + + + if test "x$BASH" = x; then + if test "xbash" = x; then + PROG_NAME=bash + else + PROG_NAME=bash + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in cat do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -4679,65 +4047,6 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - for ac_prog in cpio -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CPIO+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CPIO in - [\\/]* | ?:[\\/]*) - ac_cv_path_CPIO="$CPIO" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CPIO="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CPIO=$ac_cv_path_CPIO -if test -n "$CPIO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPIO" >&5 -$as_echo "$CPIO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CPIO" && break -done - - - if test "x$CPIO" = x; then - if test "xcpio" = x; then - PROG_NAME=cpio - else - PROG_NAME=cpio - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - - for ac_prog in cut do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -4856,65 +4165,6 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - for ac_prog in df -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_DF+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $DF in - [\\/]* | ?:[\\/]*) - ac_cv_path_DF="$DF" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_DF="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DF=$ac_cv_path_DF -if test -n "$DF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DF" >&5 -$as_echo "$DF" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DF" && break -done - - - if test "x$DF" = x; then - if test "xdf" = x; then - PROG_NAME=df - else - PROG_NAME=df - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - - for ac_prog in gdiff diff do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -4974,6 +4224,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in dirname +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_DIRNAME+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $DIRNAME in + [\\/]* | ?:[\\/]*) + ac_cv_path_DIRNAME="$DIRNAME" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_DIRNAME="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DIRNAME=$ac_cv_path_DIRNAME +if test -n "$DIRNAME"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DIRNAME" >&5 +$as_echo "$DIRNAME" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DIRNAME" && break +done + + + if test "x$DIRNAME" = x; then + if test "xdirname" = x; then + PROG_NAME=dirname + else + PROG_NAME=dirname + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in echo do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -5446,6 +4755,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in mktemp +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_MKTEMP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $MKTEMP in + [\\/]* | ?:[\\/]*) + ac_cv_path_MKTEMP="$MKTEMP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_MKTEMP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +MKTEMP=$ac_cv_path_MKTEMP +if test -n "$MKTEMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKTEMP" >&5 +$as_echo "$MKTEMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$MKTEMP" && break +done + + + if test "x$MKTEMP" = x; then + if test "xmktemp" = x; then + PROG_NAME=mktemp + else + PROG_NAME=mktemp + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in mv do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -5564,6 +4932,124 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in pwd +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_THEPWDCMD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $THEPWDCMD in + [\\/]* | ?:[\\/]*) + ac_cv_path_THEPWDCMD="$THEPWDCMD" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_THEPWDCMD="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +THEPWDCMD=$ac_cv_path_THEPWDCMD +if test -n "$THEPWDCMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $THEPWDCMD" >&5 +$as_echo "$THEPWDCMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$THEPWDCMD" && break +done + + + if test "x$THEPWDCMD" = x; then + if test "xpwd" = x; then + PROG_NAME=thepwdcmd + else + PROG_NAME=pwd + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + + for ac_prog in rm +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_RM+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $RM in + [\\/]* | ?:[\\/]*) + ac_cv_path_RM="$RM" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +RM=$ac_cv_path_RM +if test -n "$RM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 +$as_echo "$RM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$RM" && break +done + + + if test "x$RM" = x; then + if test "xrm" = x; then + PROG_NAME=rm + else + PROG_NAME=rm + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in sh do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -5977,6 +5463,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in uname +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_UNAME+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $UNAME in + [\\/]* | ?:[\\/]*) + ac_cv_path_UNAME="$UNAME" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_UNAME="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +UNAME=$ac_cv_path_UNAME +if test -n "$UNAME"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNAME" >&5 +$as_echo "$UNAME" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$UNAME" && break +done + + + if test "x$UNAME" = x; then + if test "xuname" = x; then + PROG_NAME=uname + else + PROG_NAME=uname + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in uniq do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -6036,65 +5581,6 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - for ac_prog in unzip -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_UNZIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $UNZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_UNZIP="$UNZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_UNZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -UNZIP=$ac_cv_path_UNZIP -if test -n "$UNZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNZIP" >&5 -$as_echo "$UNZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$UNZIP" && break -done - - - if test "x$UNZIP" = x; then - if test "xunzip" = x; then - PROG_NAME=unzip - else - PROG_NAME=unzip - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - - for ac_prog in wc do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -6154,6 +5640,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in which +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_WHICH+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $WHICH in + [\\/]* | ?:[\\/]*) + ac_cv_path_WHICH="$WHICH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_WHICH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +WHICH=$ac_cv_path_WHICH +if test -n "$WHICH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WHICH" >&5 +$as_echo "$WHICH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$WHICH" && break +done + + + if test "x$WHICH" = x; then + if test "xwhich" = x; then + PROG_NAME=which + else + PROG_NAME=which + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in xargs do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -6213,65 +5758,6 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - for ac_prog in zip -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ZIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ZIP=$ac_cv_path_ZIP -if test -n "$ZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 -$as_echo "$ZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ZIP" && break -done - - - if test "x$ZIP" = x; then - if test "xzip" = x; then - PROG_NAME=zip - else - PROG_NAME=zip - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - - # Then required tools that require some special treatment. for ac_prog in gawk mawk nawk awk do @@ -6700,647 +6186,20 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} fi - - # We need to find a recent version of GNU make. Especially on Solaris, this can be tricky. - if test "x$MAKE" != x; then - # User has supplied a make, test it. - if test ! -f "$MAKE"; then - as_fn_error $? "The specified make (by MAKE=$MAKE) is not found." "$LINENO" 5 - fi - - MAKE_CANDIDATE=""$MAKE"" - DESCRIPTION="user supplied MAKE=" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - if test "x$FOUND_MAKE" = x; then - as_fn_error $? "The specified make (by MAKE=$MAKE) is not GNU make 3.81 or newer." "$LINENO" 5 - fi - else - # Try our hardest to locate a correct version of GNU make - for ac_prog in gmake -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_GMAKE+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CHECK_GMAKE in - [\\/]* | ?:[\\/]*) - ac_cv_path_CHECK_GMAKE="$CHECK_GMAKE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CHECK_GMAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CHECK_GMAKE=$ac_cv_path_CHECK_GMAKE -if test -n "$CHECK_GMAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_GMAKE" >&5 -$as_echo "$CHECK_GMAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CHECK_GMAKE" && break -done - - - MAKE_CANDIDATE=""$CHECK_GMAKE"" - DESCRIPTION="gmake in PATH" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - - if test "x$FOUND_MAKE" = x; then - for ac_prog in make -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_MAKE+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CHECK_MAKE in - [\\/]* | ?:[\\/]*) - ac_cv_path_CHECK_MAKE="$CHECK_MAKE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CHECK_MAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CHECK_MAKE=$ac_cv_path_CHECK_MAKE -if test -n "$CHECK_MAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_MAKE" >&5 -$as_echo "$CHECK_MAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CHECK_MAKE" && break -done - - - MAKE_CANDIDATE=""$CHECK_MAKE"" - DESCRIPTION="make in PATH" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - fi - - if test "x$FOUND_MAKE" = x; then - if test "x$TOOLS_DIR" != x; then - # We have a tools-dir, check that as well before giving up. - OLD_PATH=$PATH - PATH=$TOOLS_DIR:$PATH - for ac_prog in gmake -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_TOOLSDIR_GMAKE+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CHECK_TOOLSDIR_GMAKE in - [\\/]* | ?:[\\/]*) - ac_cv_path_CHECK_TOOLSDIR_GMAKE="$CHECK_TOOLSDIR_GMAKE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CHECK_TOOLSDIR_GMAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CHECK_TOOLSDIR_GMAKE=$ac_cv_path_CHECK_TOOLSDIR_GMAKE -if test -n "$CHECK_TOOLSDIR_GMAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_GMAKE" >&5 -$as_echo "$CHECK_TOOLSDIR_GMAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CHECK_TOOLSDIR_GMAKE" && break -done - - - MAKE_CANDIDATE=""$CHECK_TOOLSDIR_GMAKE"" - DESCRIPTION="gmake in tools-dir" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - if test "x$FOUND_MAKE" = x; then - for ac_prog in make -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_TOOLSDIR_MAKE+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CHECK_TOOLSDIR_MAKE in - [\\/]* | ?:[\\/]*) - ac_cv_path_CHECK_TOOLSDIR_MAKE="$CHECK_TOOLSDIR_MAKE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CHECK_TOOLSDIR_MAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CHECK_TOOLSDIR_MAKE=$ac_cv_path_CHECK_TOOLSDIR_MAKE -if test -n "$CHECK_TOOLSDIR_MAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_MAKE" >&5 -$as_echo "$CHECK_TOOLSDIR_MAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CHECK_TOOLSDIR_MAKE" && break -done - - - MAKE_CANDIDATE=""$CHECK_TOOLSDIR_MAKE"" - DESCRIPTION="make in tools-dir" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - fi - PATH=$OLD_PATH - fi - fi - - if test "x$FOUND_MAKE" = x; then - as_fn_error $? "Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure." "$LINENO" 5 - fi - fi - - MAKE=$FOUND_MAKE - - { $as_echo "$as_me:${as_lineno-$LINENO}: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&5 -$as_echo "$as_me: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&6;} - - - - for ac_prog in rm -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_RM+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $RM in - [\\/]* | ?:[\\/]*) - ac_cv_path_RM="$RM" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -RM=$ac_cv_path_RM -if test -n "$RM"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 -$as_echo "$RM" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$RM" && break -done - - - if test "x$RM" = x; then - if test "xrm" = x; then - PROG_NAME=rm - else - PROG_NAME=rm - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - +# Always force rm. RM="$RM -f" - - # Test if find supports -delete - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if find supports -delete" >&5 -$as_echo_n "checking if find supports -delete... " >&6; } - FIND_DELETE="-delete" - - DELETEDIR=`mktemp -d tmp.XXXXXXXXXX` || (echo Could not create temporary directory!; exit $?) - - echo Hejsan > $DELETEDIR/TestIfFindSupportsDelete - - TEST_DELETE=`$FIND "$DELETEDIR" -name TestIfFindSupportsDelete $FIND_DELETE 2>&1` - if test -f $DELETEDIR/TestIfFindSupportsDelete; then - # No, it does not. - rm $DELETEDIR/TestIfFindSupportsDelete - FIND_DELETE="-exec rm \{\} \+" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - fi - rmdir $DELETEDIR - - - -# Non-required basic tools - -# Extract the first word of "pwd", so it can be a program name with args. -set dummy pwd; ac_word=$2 +# These are not required on all platforms +# Extract the first word of "cygpath", so it can be a program name with args. +set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_THEPWDCMD+set}" = set; then : +if test "${ac_cv_path_CYGPATH+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $THEPWDCMD in + case $CYGPATH in [\\/]* | ?:[\\/]*) - ac_cv_path_THEPWDCMD="$THEPWDCMD" # Let the user override the test with a path. + ac_cv_path_CYGPATH="$CYGPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7350,7 +6209,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_THEPWDCMD="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_CYGPATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7361,26 +6220,26 @@ IFS=$as_save_IFS ;; esac fi -THEPWDCMD=$ac_cv_path_THEPWDCMD -if test -n "$THEPWDCMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $THEPWDCMD" >&5 -$as_echo "$THEPWDCMD" >&6; } +CYGPATH=$ac_cv_path_CYGPATH +if test -n "$CYGPATH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 +$as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -# Extract the first word of "ldd", so it can be a program name with args. -set dummy ldd; ac_word=$2 +# Extract the first word of "readlink", so it can be a program name with args. +set dummy readlink; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_LDD+set}" = set; then : +if test "${ac_cv_path_READLINK+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $LDD in + case $READLINK in [\\/]* | ?:[\\/]*) - ac_cv_path_LDD="$LDD" # Let the user override the test with a path. + ac_cv_path_READLINK="$READLINK" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7390,7 +6249,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_LDD="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_READLINK="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7401,32 +6260,26 @@ IFS=$as_save_IFS ;; esac fi -LDD=$ac_cv_path_LDD -if test -n "$LDD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDD" >&5 -$as_echo "$LDD" >&6; } +READLINK=$ac_cv_path_READLINK +if test -n "$READLINK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINK" >&5 +$as_echo "$READLINK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -if test "x$LDD" = "x"; then - # List shared lib dependencies is used for - # debug output and checking for forbidden dependencies. - # We can build without it. - LDD="true" -fi -# Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 +# Extract the first word of "df", so it can be a program name with args. +set dummy df; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_OTOOL+set}" = set; then : +if test "${ac_cv_path_DF+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $OTOOL in + case $DF in [\\/]* | ?:[\\/]*) - ac_cv_path_OTOOL="$OTOOL" # Let the user override the test with a path. + ac_cv_path_DF="$DF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7436,7 +6289,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_OTOOL="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_DF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7447,31 +6300,26 @@ IFS=$as_save_IFS ;; esac fi -OTOOL=$ac_cv_path_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } +DF=$ac_cv_path_DF +if test -n "$DF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DF" >&5 +$as_echo "$DF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -if test "x$OTOOL" = "x"; then - OTOOL="true" -fi -for ac_prog in readelf greadelf -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 +# Extract the first word of "SetFile", so it can be a program name with args. +set dummy SetFile; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_READELF+set}" = set; then : +if test "${ac_cv_path_SETFILE+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $READELF in + case $SETFILE in [\\/]* | ?:[\\/]*) - ac_cv_path_READELF="$READELF" # Let the user override the test with a path. + ac_cv_path_SETFILE="$SETFILE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7481,7 +6329,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_READELF="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_SETFILE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7492,439 +6340,996 @@ IFS=$as_save_IFS ;; esac fi -READELF=$ac_cv_path_READELF -if test -n "$READELF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5 -$as_echo "$READELF" >&6; } +SETFILE=$ac_cv_path_SETFILE +if test -n "$SETFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 +$as_echo "$SETFILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - test -n "$READELF" && break -done -for ac_prog in objdump gobjdump -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_OBJDUMP+set}" = set; then : + +# Now we can determine OpenJDK build and target platforms. This is required to +# have early on. +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $OBJDUMP in - [\\/]* | ?:[\\/]*) - ac_cv_path_OBJDUMP="$OBJDUMP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_OBJDUMP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - ;; +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; esac -fi -OBJDUMP=$ac_cv_path_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - test -n "$OBJDUMP" && break -done - -# Extract the first word of "hg", so it can be a program name with args. -set dummy hg; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_HG+set}" = set; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $HG in - [\\/]* | ?:[\\/]*) - ac_cv_path_HG="$HG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_HG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -HG=$ac_cv_path_HG -if test -n "$HG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HG" >&5 -$as_echo "$HG" >&6; } + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - -# Check if pkg-config is available. - - -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. -set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if test "${ac_cv_target+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi - ;; +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;; esac -fi -PKG_CONFIG=$ac_cv_path_PKG_CONFIG -if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -$as_echo "$PKG_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +# Figure out the build and target systems. # Note that in autoconf terminology, "build" is obvious, but "target" +# is confusing; it assumes you are cross-compiling a cross-compiler (!) and "target" is thus the target of the +# product you're building. The target of this build is called "host". Since this is confusing to most people, we +# have not adopted that system, but use "target" as the platform we are building for. In some places though we need +# to use the configure naming style. + + + + + + # Copy the autoconf trip/quadruplet verbatim to OPENJDK_TARGET_AUTOCONF_NAME + # (from the autoconf "host") and OPENJDK_BUILD_AUTOCONF_NAME + # Note that we might later on rewrite e.g. OPENJDK_TARGET_CPU due to reduced build, + # but this will not change the value of OPENJDK_TARGET_AUTOCONF_NAME. + OPENJDK_TARGET_AUTOCONF_NAME="$host" + OPENJDK_BUILD_AUTOCONF_NAME="$build" + + + + # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. + + case "$build_os" in + *linux*) + VAR_OS=linux + VAR_OS_API=posix + VAR_OS_ENV=linux + ;; + *solaris*) + VAR_OS=solaris + VAR_OS_API=posix + VAR_OS_ENV=solaris + ;; + *darwin*) + VAR_OS=macosx + VAR_OS_API=posix + VAR_OS_ENV=macosx + ;; + *bsd*) + VAR_OS=bsd + VAR_OS_API=posix + VAR_OS_ENV=bsd + ;; + *cygwin*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.cygwin + ;; + *mingw*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.msys + ;; + *) + as_fn_error $? "unsupported operating system $build_os" "$LINENO" 5 + ;; + esac + + + # First argument is the cpu name from the trip/quad + case "$build_cpu" in + x86_64) + VAR_CPU=x86_64 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=little + ;; + i?86) + VAR_CPU=x86 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=little + ;; + arm*) + VAR_CPU=arm + VAR_CPU_ARCH=arm + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=little + ;; + powerpc) + VAR_CPU=ppc + VAR_CPU_ARCH=ppc + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=big + ;; + powerpc64) + VAR_CPU=ppc64 + VAR_CPU_ARCH=ppc + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; + sparc) + VAR_CPU=sparc + VAR_CPU_ARCH=sparc + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=big + ;; + sparcv9) + VAR_CPU=sparcv9 + VAR_CPU_ARCH=sparc + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; + *) + as_fn_error $? "unsupported cpu $build_cpu" "$LINENO" 5 + ;; + esac + + # ..and setup our own variables. (Do this explicitely to facilitate searching) + OPENJDK_BUILD_OS="$VAR_OS" + OPENJDK_BUILD_OS_API="$VAR_OS_API" + OPENJDK_BUILD_OS_ENV="$VAR_OS_ENV" + OPENJDK_BUILD_CPU="$VAR_CPU" + OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH" + OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS" + OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN" + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking openjdk-build os-cpu" >&5 +$as_echo_n "checking openjdk-build os-cpu... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&5 +$as_echo "$OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&6; } + + # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. + + case "$host_os" in + *linux*) + VAR_OS=linux + VAR_OS_API=posix + VAR_OS_ENV=linux + ;; + *solaris*) + VAR_OS=solaris + VAR_OS_API=posix + VAR_OS_ENV=solaris + ;; + *darwin*) + VAR_OS=macosx + VAR_OS_API=posix + VAR_OS_ENV=macosx + ;; + *bsd*) + VAR_OS=bsd + VAR_OS_API=posix + VAR_OS_ENV=bsd + ;; + *cygwin*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.cygwin + ;; + *mingw*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.msys + ;; + *) + as_fn_error $? "unsupported operating system $host_os" "$LINENO" 5 + ;; + esac + + + # First argument is the cpu name from the trip/quad + case "$host_cpu" in + x86_64) + VAR_CPU=x86_64 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=little + ;; + i?86) + VAR_CPU=x86 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=little + ;; + arm*) + VAR_CPU=arm + VAR_CPU_ARCH=arm + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=little + ;; + powerpc) + VAR_CPU=ppc + VAR_CPU_ARCH=ppc + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=big + ;; + powerpc64) + VAR_CPU=ppc64 + VAR_CPU_ARCH=ppc + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; + sparc) + VAR_CPU=sparc + VAR_CPU_ARCH=sparc + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=big + ;; + sparcv9) + VAR_CPU=sparcv9 + VAR_CPU_ARCH=sparc + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; + *) + as_fn_error $? "unsupported cpu $host_cpu" "$LINENO" 5 + ;; + esac + + # ... and setup our own variables. (Do this explicitely to facilitate searching) + OPENJDK_TARGET_OS="$VAR_OS" + OPENJDK_TARGET_OS_API="$VAR_OS_API" + OPENJDK_TARGET_OS_ENV="$VAR_OS_ENV" + OPENJDK_TARGET_CPU="$VAR_CPU" + OPENJDK_TARGET_CPU_ARCH="$VAR_CPU_ARCH" + OPENJDK_TARGET_CPU_BITS="$VAR_CPU_BITS" + OPENJDK_TARGET_CPU_ENDIAN="$VAR_CPU_ENDIAN" + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking openjdk-target os-cpu" >&5 +$as_echo_n "checking openjdk-target os-cpu... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" >&5 +$as_echo "$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" >&6; } + + + +# Check whether --with-target-bits was given. +if test "${with_target_bits+set}" = set; then : + withval=$with_target_bits; fi -fi -if test -z "$ac_cv_path_PKG_CONFIG"; then - ac_pt_PKG_CONFIG=$PKG_CONFIG - # Extract the first word of "pkg-config", so it can be a program name with args. -set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG -if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -$as_echo "$ac_pt_PKG_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_PKG_CONFIG" = x; then - PKG_CONFIG="" + # We have three types of compiles: + # native == normal compilation, target system == build system + # cross == traditional cross compilation, target system != build system; special toolchain needed + # reduced == using native compilers, but with special flags (e.g. -m32) to produce 32-bit builds on 64-bit machines + # + if test "x$OPENJDK_BUILD_AUTOCONF_NAME" != "x$OPENJDK_TARGET_AUTOCONF_NAME"; then + # We're doing a proper cross-compilation + COMPILE_TYPE="cross" else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - PKG_CONFIG=$ac_pt_PKG_CONFIG + COMPILE_TYPE="native" fi -else - PKG_CONFIG="$ac_cv_path_PKG_CONFIG" -fi -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=0.9.0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 -$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - PKG_CONFIG="" - fi - -fi - -# After basic tools have been setup, we can check build os specific details. - -############################################################################### - -# Note that this is the build platform OS version! - -OS_VERSION="`uname -r | ${SED} 's!\.! !g' | ${SED} 's!-! !g'`" -OS_VERSION_MAJOR="`${ECHO} ${OS_VERSION} | ${CUT} -f 1 -d ' '`" -OS_VERSION_MINOR="`${ECHO} ${OS_VERSION} | ${CUT} -f 2 -d ' '`" -OS_VERSION_MICRO="`${ECHO} ${OS_VERSION} | ${CUT} -f 3 -d ' '`" - - - - - -# Setup builddeps, for automatic downloading of tools we need. -# This is needed before we can call BDEPS_CHECK_MODULE, which is done in -# boot-jdk setup, but we need to have basic tools setup first. - - -# Check whether --with-builddeps-conf was given. -if test "${with_builddeps_conf+set}" = set; then : - withval=$with_builddeps_conf; -fi - - - -# Check whether --with-builddeps-server was given. -if test "${with_builddeps_server+set}" = set; then : - withval=$with_builddeps_server; -fi - - - -# Check whether --with-builddeps-dir was given. -if test "${with_builddeps_dir+set}" = set; then : - withval=$with_builddeps_dir; -else - with_builddeps_dir=/localhome/builddeps -fi - - - -# Check whether --with-builddeps-group was given. -if test "${with_builddeps_group+set}" = set; then : - withval=$with_builddeps_group; -fi - - -# Check whether --enable-list-builddeps was given. -if test "${enable_list_builddeps+set}" = set; then : - enableval=$enable_list_builddeps; LIST_BUILDDEPS="${enableval}" -else - LIST_BUILDDEPS='no' -fi - - -if test "x$LIST_BUILDDEPS" = xyes; then - echo - echo List of build dependencies known to the configure script, - echo that can be used in builddeps.conf files: - cat $AUTOCONF_DIR/*.ac $AUTOCONF_DIR/*.m4 | grep BDEPS_CHECK_MODULE\( | cut -f 2 -d ',' | tr -d ' ' | sort - echo - exit 1 -fi - - - - if test "x$with_builddeps_server" != x || test "x$with_builddeps_conf" != x; then - if test "x$with_builddeps_conf" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for supplied builddeps configuration file" >&5 -$as_echo_n "checking for supplied builddeps configuration file... " >&6; } - builddepsfile=$with_builddeps_conf - if test -s $builddepsfile; then - . $builddepsfile - { $as_echo "$as_me:${as_lineno-$LINENO}: result: loaded!" >&5 -$as_echo "loaded!" >&6; } - else - as_fn_error $? "The given builddeps conf file $with_builddeps_conf could not be loaded!" "$LINENO" 5 - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for builddeps.conf files in sources..." >&5 -$as_echo_n "checking for builddeps.conf files in sources...... " >&6; } - builddepsfile=`mktemp` - touch $builddepsfile - # Put all found confs into a single file. - find ${SRC_ROOT} -name builddeps.conf -exec cat \{\} \; >> $builddepsfile - # Source the file to acquire the variables - if test -s $builddepsfile; then - . $builddepsfile - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found at least one!" >&5 -$as_echo "found at least one!" >&6; } - else - as_fn_error $? "Could not find any builddeps.conf at all!" "$LINENO" 5 - fi - fi - # Create build and target names that use _ instead of "-" and ".". - # This is necessary to use them in variable names. - build_var=`echo ${OPENJDK_BUILD_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'` - target_var=`echo ${OPENJDK_TARGET_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'` - # Extract rewrite information for build and target - eval rewritten_build=\${REWRITE_${build_var}} - if test "x$rewritten_build" = x; then - rewritten_build=${OPENJDK_BUILD_AUTOCONF_NAME} - echo Build stays the same $rewritten_build - else - echo Rewriting build for builddeps into $rewritten_build - fi - eval rewritten_target=\${REWRITE_${target_var}} - if test "x$rewritten_target" = x; then - rewritten_target=${OPENJDK_TARGET_AUTOCONF_NAME} - echo Target stays the same $rewritten_target - else - echo Rewriting target for builddeps into $rewritten_target - fi - rewritten_build_var=`echo ${rewritten_build} | tr '-' '_' | tr '.' '_'` - rewritten_target_var=`echo ${rewritten_target} | tr '-' '_' | tr '.' '_'` - fi - for ac_prog in 7z unzip -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_BDEPS_UNZIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$BDEPS_UNZIP"; then - ac_cv_prog_BDEPS_UNZIP="$BDEPS_UNZIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_BDEPS_UNZIP="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -BDEPS_UNZIP=$ac_cv_prog_BDEPS_UNZIP -if test -n "$BDEPS_UNZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_UNZIP" >&5 -$as_echo "$BDEPS_UNZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$BDEPS_UNZIP" && break -done - - if test "x$BDEPS_UNZIP" = x7z; then - BDEPS_UNZIP="7z x" + if test "x$with_target_bits" != x; then + if test "x$COMPILE_TYPE" = "xcross"; then + as_fn_error $? "It is not possible to combine --with-target-bits=X and proper cross-compilation. Choose either." "$LINENO" 5 fi - for ac_prog in wget lftp ftp -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_BDEPS_FTP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$BDEPS_FTP"; then - ac_cv_prog_BDEPS_FTP="$BDEPS_FTP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_BDEPS_FTP="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + if test "x$with_target_bits" = x32 && test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + # A reduced build is requested + COMPILE_TYPE="reduced" + OPENJDK_TARGET_CPU_BITS=32 + if test "x$OPENJDK_TARGET_CPU_ARCH" = "xx86"; then + OPENJDK_TARGET_CPU=x86 + elif test "x$OPENJDK_TARGET_CPU_ARCH" = "xsparc"; then + OPENJDK_TARGET_CPU=sparc + else + as_fn_error $? "Reduced build (--with-target-bits=32) is only supported on x86_64 and sparcv9" "$LINENO" 5 + fi + elif test "x$with_target_bits" = x64 && test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + as_fn_error $? "It is not possible to use --with-target-bits=64 on a 32 bit system. Use proper cross-compilation instead." "$LINENO" 5 + elif test "x$with_target_bits" = "x$OPENJDK_TARGET_CPU_BITS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: --with-target-bits are set to build platform address size; argument has no meaning" >&5 +$as_echo "$as_me: --with-target-bits are set to build platform address size; argument has no meaning" >&6;} + else + as_fn_error $? "--with-target-bits can only be 32 or 64, you specified $with_target_bits!" "$LINENO" 5 + fi + fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compilation type" >&5 +$as_echo_n "checking compilation type... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $COMPILE_TYPE" >&5 +$as_echo "$COMPILE_TYPE" >&6; } + + + if test "x$OPENJDK_TARGET_OS" = "xsolaris"; then + REQUIRED_OS_NAME=SunOS + REQUIRED_OS_VERSION=5.10 + fi + if test "x$OPENJDK_TARGET_OS" = "xlinux"; then + REQUIRED_OS_NAME=Linux + REQUIRED_OS_VERSION=2.6 + fi + if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + REQUIRED_OS_NAME=Windows + if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then + REQUIRED_OS_VERSION=5.2 + else + REQUIRED_OS_VERSION=5.1 + fi + fi + if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then + REQUIRED_OS_NAME=Darwin + REQUIRED_OS_VERSION=11.2 + fi + + + + + + # Also store the legacy naming of the cpu. + # Ie i586 and amd64 instead of x86 and x86_64 + OPENJDK_TARGET_CPU_LEGACY="$OPENJDK_TARGET_CPU" + if test "x$OPENJDK_TARGET_CPU" = xx86; then + OPENJDK_TARGET_CPU_LEGACY="i586" + elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + # On all platforms except MacOSX replace x86_64 with amd64. + OPENJDK_TARGET_CPU_LEGACY="amd64" + fi + + + # And the second legacy naming of the cpu. + # Ie i386 and amd64 instead of x86 and x86_64. + OPENJDK_TARGET_CPU_LEGACY_LIB="$OPENJDK_TARGET_CPU" + if test "x$OPENJDK_TARGET_CPU" = xx86; then + OPENJDK_TARGET_CPU_LEGACY_LIB="i386" + elif test "x$OPENJDK_TARGET_CPU" = xx86_64; then + OPENJDK_TARGET_CPU_LEGACY_LIB="amd64" + fi + + + # This is the name of the cpu (but using i386 and amd64 instead of + # x86 and x86_64, respectively), preceeded by a /, to be used when + # locating libraries. On macosx, it's empty, though. + OPENJDK_TARGET_CPU_LIBDIR="/$OPENJDK_TARGET_CPU_LEGACY_LIB" + if test "x$OPENJDK_TARGET_OS" = xmacosx; then + OPENJDK_TARGET_CPU_LIBDIR="" + fi + + + # OPENJDK_TARGET_CPU_ISADIR is normally empty. On 64-bit Solaris systems, it is set to + # /amd64 or /sparcv9. This string is appended to some library paths, like this: + # /usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libexample.so + OPENJDK_TARGET_CPU_ISADIR="" + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + if test "x$OPENJDK_TARGET_CPU" = xx86_64; then + OPENJDK_TARGET_CPU_ISADIR="/amd64" + elif test "x$OPENJDK_TARGET_CPU" = xsparcv9; then + OPENJDK_TARGET_CPU_ISADIR="/sparcv9" + fi + fi + + + # Setup OPENJDK_TARGET_CPU_OSARCH, which is used to set the os.arch Java system property + OPENJDK_TARGET_CPU_OSARCH="$OPENJDK_TARGET_CPU" + if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$OPENJDK_TARGET_CPU" = xx86; then + # On linux only, we replace x86 with i386. + OPENJDK_TARGET_CPU_OSARCH="i386" + elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + # On all platforms except macosx, we replace x86_64 with amd64. + OPENJDK_TARGET_CPU_OSARCH="amd64" + fi + + + OPENJDK_TARGET_CPU_JLI="$OPENJDK_TARGET_CPU" + if test "x$OPENJDK_TARGET_CPU" = xx86; then + OPENJDK_TARGET_CPU_JLI="i386" + elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + # On all platforms except macosx, we replace x86_64 with amd64. + OPENJDK_TARGET_CPU_JLI="amd64" + fi + # Now setup the -D flags for building libjli. + OPENJDK_TARGET_CPU_JLI_CFLAGS="-DLIBARCHNAME='\"$OPENJDK_TARGET_CPU_JLI\"'" + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + if test "x$OPENJDK_TARGET_CPU_ARCH" = xsparc; then + OPENJDK_TARGET_CPU_JLI_CFLAGS="$OPENJDK_TARGET_CPU_JLI_CFLAGS -DLIBARCH32NAME='\"sparc\"' -DLIBARCH64NAME='\"sparcv9\"'" + elif test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then + OPENJDK_TARGET_CPU_JLI_CFLAGS="$OPENJDK_TARGET_CPU_JLI_CFLAGS -DLIBARCH32NAME='\"i386\"' -DLIBARCH64NAME='\"amd64\"'" + fi + fi + + + # Setup OPENJDK_TARGET_OS_API_DIR, used in source paths. + if test "x$OPENJDK_TARGET_OS_API" = xposix; then + OPENJDK_TARGET_OS_API_DIR="solaris" + fi + if test "x$OPENJDK_TARGET_OS_API" = xwinapi; then + OPENJDK_TARGET_OS_API_DIR="windows" + fi + + + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + A_LP64="LP64:=" + # -D_LP64=1 is only set on linux and mac. Setting on windows causes diff in + # unpack200.exe + if test "x$OPENJDK_TARGET_OS" = xlinux || test "x$OPENJDK_TARGET_OS" = xmacosx; then + ADD_LP64="-D_LP64=1" + fi + fi + LP64=$A_LP64 + + + if test "x$COMPILE_TYPE" = "xcross"; then + # FIXME: ... or should this include reduced builds..? + DEFINE_CROSS_COMPILE_ARCH="CROSS_COMPILE_ARCH:=$OPENJDK_TARGET_CPU_LEGACY" + else + DEFINE_CROSS_COMPILE_ARCH="" + fi + + + + +# Continue setting up basic stuff. Most remaining code require fundamental tools. + +# Locate the directory of this script. +SCRIPT="$0" + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + SCRIPT=`$READLINK -f $SCRIPT` + else + STARTDIR=$PWD + COUNTER=0 + DIR=`$DIRNAME $SCRIPT` + FILE=`$BASENAME $SCRIPT` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $DIR/$FILE | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $DIR + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + DIR=`$THEPWDCMD` + FILE=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + SCRIPT=$DIR/$FILE + fi + fi + +AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD` + +# Where is the source? It is located two levels above the configure script. +CURDIR="$PWD" +cd "$AUTOCONF_DIR/../.." +SRC_ROOT="`pwd`" + +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + PATH_SEP=";" + + SRC_ROOT_LENGTH=`$THEPWDCMD|$WC -m` + if test $SRC_ROOT_LENGTH -gt 100; then + as_fn_error $? "Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported" "$LINENO" 5 + fi + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking cygwin release" >&5 +$as_echo_n "checking cygwin release... " >&6; } + CYGWIN_VERSION=`$UNAME -r` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGWIN_VERSION" >&5 +$as_echo "$CYGWIN_VERSION" >&6; } + WINDOWS_ENV_VENDOR='cygwin' + WINDOWS_ENV_VERSION="$CYGWIN_VERSION" + + CYGWIN_VERSION_OK=`$ECHO $CYGWIN_VERSION | $GREP ^1.7.` + if test "x$CYGWIN_VERSION_OK" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&5 +$as_echo "$as_me: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + if test "x$CYGPATH" = x; then + as_fn_error $? "Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking cygwin root directory as unix-style path" >&5 +$as_echo_n "checking cygwin root directory as unix-style path... " >&6; } + # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away + cygwin_winpath_root=`cd / ; cmd /c cd | grep ".*"` + # Force cygpath to report the proper root by including a trailing space, and then stripping it off again. + CYGWIN_ROOT_PATH=`$CYGPATH -u "$cygwin_winpath_root " | $CUT -f 1 -d " "` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGWIN_ROOT_PATH" >&5 +$as_echo "$CYGWIN_ROOT_PATH" >&6; } + WINDOWS_ENV_ROOT_PATH="$CYGWIN_ROOT_PATH" + test_cygdrive_prefix=`$ECHO $CYGWIN_ROOT_PATH | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + as_fn_error $? "Your cygdrive prefix is not /cygdrive. This is currently not supported. Change with mount -c." "$LINENO" 5 + fi + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking msys release" >&5 +$as_echo_n "checking msys release... " >&6; } + MSYS_VERSION=`$UNAME -r` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSYS_VERSION" >&5 +$as_echo "$MSYS_VERSION" >&6; } + + WINDOWS_ENV_VENDOR='msys' + WINDOWS_ENV_VERSION="$MSYS_VERSION" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking msys root directory as unix-style path" >&5 +$as_echo_n "checking msys root directory as unix-style path... " >&6; } + # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away + MSYS_ROOT_PATH=`cd / ; cmd /c cd | grep ".*"` + + windows_path="$MSYS_ROOT_PATH" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + MSYS_ROOT_PATH="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + MSYS_ROOT_PATH="$unix_path" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSYS_ROOT_PATH" >&5 +$as_echo "$MSYS_ROOT_PATH" >&6; } + WINDOWS_ENV_ROOT_PATH="$MSYS_ROOT_PATH" + else + as_fn_error $? "Unknown Windows environment. Neither cygwin nor msys was detected." "$LINENO" 5 + fi + + # Test if windows or unix (cygwin/msys) find is first in path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking what kind of 'find' is first on the PATH" >&5 +$as_echo_n "checking what kind of 'find' is first on the PATH... " >&6; } + FIND_BINARY_OUTPUT=`find --version 2>&1` + if test "x`echo $FIND_BINARY_OUTPUT | $GREP GNU`" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unix style" >&5 +$as_echo "unix style" >&6; } + elif test "x`echo $FIND_BINARY_OUTPUT | $GREP FIND`" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Windows" >&5 +$as_echo "Windows" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: Your path contains Windows tools (C:\Windows\system32) before your unix (cygwin or msys) tools." >&5 +$as_echo "$as_me: Your path contains Windows tools (C:\Windows\system32) before your unix (cygwin or msys) tools." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: This will not work. Please correct and make sure /usr/bin (or similar) is first in path." >&5 +$as_echo "$as_me: This will not work. Please correct and make sure /usr/bin (or similar) is first in path." >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 +$as_echo "unknown" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: It seems that your find utility is non-standard." >&5 +$as_echo "$as_me: WARNING: It seems that your find utility is non-standard." >&2;} fi -done - done -IFS=$as_save_IFS -fi -fi -BDEPS_FTP=$ac_cv_prog_BDEPS_FTP -if test -n "$BDEPS_FTP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_FTP" >&5 -$as_echo "$BDEPS_FTP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + PATH_SEP=":" fi - test -n "$BDEPS_FTP" && break -done + +cd "$CURDIR" + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$SRC_ROOT" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of SRC_ROOT" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + SRC_ROOT="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting SRC_ROOT to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting SRC_ROOT to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$SRC_ROOT" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + SRC_ROOT="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting SRC_ROOT to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting SRC_ROOT to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$SRC_ROOT" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of SRC_ROOT, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$CURDIR" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CURDIR, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of CURDIR, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of CURDIR" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + CURDIR="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CURDIR to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting CURDIR to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$CURDIR" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + CURDIR="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CURDIR to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting CURDIR to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$CURDIR" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of CURDIR, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CURDIR, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of CURDIR, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + +if test "x$OPENJDK_BUILD_OS" = "xsolaris"; then + # Add extra search paths on solaris for utilities like ar and as etc... + PATH="$PATH:/usr/ccs/bin:/usr/sfw/bin:/opt/csw/bin" +fi + +# You can force the sys-root if the sys-root encoded into the cross compiler tools +# is not correct. + +# Check whether --with-sys-root was given. +if test "${with_sys_root+set}" = set; then : + withval=$with_sys_root; +fi + + +if test "x$with_sys_root" != x; then + SYS_ROOT=$with_sys_root +else + SYS_ROOT=/ +fi -############################################################################### -# -# Determine OpenJDK variants, options and version numbers. -# -############################################################################### +# Check whether --with-tools-dir was given. +if test "${with_tools_dir+set}" = set; then : + withval=$with_tools_dir; TOOLS_DIR=$with_tools_dir +fi -# We need build & target for this. + + +# Check whether --with-devkit was given. +if test "${with_devkit+set}" = set; then : + withval=$with_devkit; + if test "x$with_sys_root" != x; then + as_fn_error $? "Cannot specify both --with-devkit and --with-sys-root at the same time" "$LINENO" 5 + fi + if test "x$with_tools_dir" != x; then + as_fn_error $? "Cannot specify both --with-devkit and --with-tools-dir at the same time" "$LINENO" 5 + fi + TOOLS_DIR=$with_devkit/bin + SYS_ROOT=$with_devkit/$host_alias/libc + +fi + + + + +# Setup default logging of stdout and stderr to build.log in the output root. +BUILD_LOG='$(OUTPUT_ROOT)/build.log' +BUILD_LOG_PREVIOUS='$(OUTPUT_ROOT)/build.log.old' +BUILD_LOG_WRAPPER='$(BASH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)' + + + + + +# These are needed to be able to create a configuration name (and thus the output directory) ############################################################################### # @@ -7969,8 +7374,8 @@ $as_echo "$JDK_VARIANT" >&6; } # ie normal interpreter and C1, only the serial GC, kernel jvmti etc # zero: no machine code interpreter, no compiler # zeroshark: zero interpreter and shark/llvm compiler backend -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which variants of the JVM that should be built" >&5 -$as_echo_n "checking which variants of the JVM that should be built... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which variants of the JVM to build" >&5 +$as_echo_n "checking which variants of the JVM to build... " >&6; } # Check whether --with-jvm-variants was given. if test "${with_jvm_variants+set}" = set; then : @@ -8151,6 +7556,2661 @@ fi +# With basic setup done, call the custom early hook. + + +# To properly create a configuration name, we need to have the OpenJDK target +# and options (variants and debug level) parsed. + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what configuration name to use" >&5 +$as_echo_n "checking what configuration name to use... " >&6; } + +# Check whether --with-conf-name was given. +if test "${with_conf_name+set}" = set; then : + withval=$with_conf_name; CONF_NAME=${with_conf_name} +fi + + +# Test from where we are running configure, in or outside of src root. +if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" || test "x$CURDIR" = "x$SRC_ROOT/common/autoconf" || test "x$CURDIR" = "x$SRC_ROOT/common/makefiles" ; then + # We are running configure from the src root. + # Create a default ./build/target-variant-debuglevel output root. + if test "x${CONF_NAME}" = x; then + CONF_NAME="${OPENJDK_TARGET_OS}-${OPENJDK_TARGET_CPU}-${JDK_VARIANT}-${ANDED_JVM_VARIANTS}-${DEBUG_LEVEL}" + fi + OUTPUT_ROOT="$SRC_ROOT/build/${CONF_NAME}" + $MKDIR -p "$OUTPUT_ROOT" + if test ! -d "$OUTPUT_ROOT"; then + as_fn_error $? "Could not create build directory $OUTPUT_ROOT" "$LINENO" 5 + fi +else + # We are running configure from outside of the src dir. + # Then use the current directory as output dir! + # If configuration is situated in normal build directory, just use the build + # directory name as configuration name, otherwise use the complete path. + if test "x${CONF_NAME}" = x; then + CONF_NAME=`$ECHO $CURDIR | $SED -e "s!^${SRC_ROOT}/build/!!"` + fi + OUTPUT_ROOT="$CURDIR" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CONF_NAME" >&5 +$as_echo "$CONF_NAME" >&6; } + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$OUTPUT_ROOT" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of OUTPUT_ROOT" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + OUTPUT_ROOT="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OUTPUT_ROOT to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting OUTPUT_ROOT to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$OUTPUT_ROOT" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + OUTPUT_ROOT="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OUTPUT_ROOT to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting OUTPUT_ROOT to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$OUTPUT_ROOT" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of OUTPUT_ROOT, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + +SPEC=$OUTPUT_ROOT/spec.gmk + +CONF_NAME=$CONF_NAME + +OUTPUT_ROOT=$OUTPUT_ROOT + + +# Most of the probed defines are put into config.h +ac_config_headers="$ac_config_headers $OUTPUT_ROOT/config.h:$AUTOCONF_DIR/config.h.in" + +# The spec.gmk file contains all variables for the make system. +ac_config_files="$ac_config_files $OUTPUT_ROOT/spec.gmk:$AUTOCONF_DIR/spec.gmk.in" + +# The hotspot-spec.gmk file contains legacy variables for the hotspot make system. +ac_config_files="$ac_config_files $OUTPUT_ROOT/hotspot-spec.gmk:$AUTOCONF_DIR/hotspot-spec.gmk.in" + +# The bootcycle-spec.gmk file contains support for boot cycle builds. +ac_config_files="$ac_config_files $OUTPUT_ROOT/bootcycle-spec.gmk:$AUTOCONF_DIR/bootcycle-spec.gmk.in" + +# The compare.sh is used to compare the build output to other builds. +ac_config_files="$ac_config_files $OUTPUT_ROOT/compare.sh:$AUTOCONF_DIR/compare.sh.in" + +# Spec.sh is currently used by compare-objects.sh +ac_config_files="$ac_config_files $OUTPUT_ROOT/spec.sh:$AUTOCONF_DIR/spec.sh.in" + +# The generated Makefile knows where the spec.gmk is and where the source is. +# You can run make from the OUTPUT_ROOT, or from the top-level Makefile +# which will look for generated configurations +ac_config_files="$ac_config_files $OUTPUT_ROOT/Makefile:$AUTOCONF_DIR/Makefile.in" + + +# Save the arguments given to us +echo "$CONFIGURE_COMMAND_LINE" > $OUTPUT_ROOT/configure-arguments + + +# Must be done before we can call HELP_MSG_MISSING_DEPENDENCY. + + for ac_prog in apt-get yum port pkgutil pkgadd +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PKGHANDLER+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PKGHANDLER"; then + ac_cv_prog_PKGHANDLER="$PKGHANDLER" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PKGHANDLER="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PKGHANDLER=$ac_cv_prog_PKGHANDLER +if test -n "$PKGHANDLER"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGHANDLER" >&5 +$as_echo "$PKGHANDLER" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PKGHANDLER" && break +done + + + +# Setup tools that requires more complex handling, or that is not needed by the configure script. + + + # We need to find a recent version of GNU make. Especially on Solaris, this can be tricky. + if test "x$MAKE" != x; then + # User has supplied a make, test it. + if test ! -f "$MAKE"; then + as_fn_error $? "The specified make (by MAKE=$MAKE) is not found." "$LINENO" 5 + fi + + MAKE_CANDIDATE=""$MAKE"" + DESCRIPTION="user supplied MAKE=$MAKE" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + if test "x$FOUND_MAKE" = x; then + as_fn_error $? "The specified make (by MAKE=$MAKE) is not GNU make 3.81 or newer." "$LINENO" 5 + fi + else + # Try our hardest to locate a correct version of GNU make + for ac_prog in gmake +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CHECK_GMAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CHECK_GMAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CHECK_GMAKE="$CHECK_GMAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CHECK_GMAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CHECK_GMAKE=$ac_cv_path_CHECK_GMAKE +if test -n "$CHECK_GMAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_GMAKE" >&5 +$as_echo "$CHECK_GMAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CHECK_GMAKE" && break +done + + + MAKE_CANDIDATE=""$CHECK_GMAKE"" + DESCRIPTION="gmake in PATH" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + + if test "x$FOUND_MAKE" = x; then + for ac_prog in make +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CHECK_MAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CHECK_MAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CHECK_MAKE="$CHECK_MAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CHECK_MAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CHECK_MAKE=$ac_cv_path_CHECK_MAKE +if test -n "$CHECK_MAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_MAKE" >&5 +$as_echo "$CHECK_MAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CHECK_MAKE" && break +done + + + MAKE_CANDIDATE=""$CHECK_MAKE"" + DESCRIPTION="make in PATH" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + fi + + if test "x$FOUND_MAKE" = x; then + if test "x$TOOLS_DIR" != x; then + # We have a tools-dir, check that as well before giving up. + OLD_PATH=$PATH + PATH=$TOOLS_DIR:$PATH + for ac_prog in gmake +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CHECK_TOOLSDIR_GMAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CHECK_TOOLSDIR_GMAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CHECK_TOOLSDIR_GMAKE="$CHECK_TOOLSDIR_GMAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CHECK_TOOLSDIR_GMAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CHECK_TOOLSDIR_GMAKE=$ac_cv_path_CHECK_TOOLSDIR_GMAKE +if test -n "$CHECK_TOOLSDIR_GMAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_GMAKE" >&5 +$as_echo "$CHECK_TOOLSDIR_GMAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CHECK_TOOLSDIR_GMAKE" && break +done + + + MAKE_CANDIDATE=""$CHECK_TOOLSDIR_GMAKE"" + DESCRIPTION="gmake in tools-dir" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + if test "x$FOUND_MAKE" = x; then + for ac_prog in make +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CHECK_TOOLSDIR_MAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CHECK_TOOLSDIR_MAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CHECK_TOOLSDIR_MAKE="$CHECK_TOOLSDIR_MAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CHECK_TOOLSDIR_MAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CHECK_TOOLSDIR_MAKE=$ac_cv_path_CHECK_TOOLSDIR_MAKE +if test -n "$CHECK_TOOLSDIR_MAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_MAKE" >&5 +$as_echo "$CHECK_TOOLSDIR_MAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CHECK_TOOLSDIR_MAKE" && break +done + + + MAKE_CANDIDATE=""$CHECK_TOOLSDIR_MAKE"" + DESCRIPTION="make in tools-dir" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + fi + PATH=$OLD_PATH + fi + fi + + if test "x$FOUND_MAKE" = x; then + as_fn_error $? "Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure." "$LINENO" 5 + fi + fi + + MAKE=$FOUND_MAKE + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&5 +$as_echo "$as_me: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&6;} + + + + # Test if find supports -delete + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if find supports -delete" >&5 +$as_echo_n "checking if find supports -delete... " >&6; } + FIND_DELETE="-delete" + + DELETEDIR=`$MKTEMP -d tmp.XXXXXXXXXX` || (echo Could not create temporary directory!; exit $?) + + echo Hejsan > $DELETEDIR/TestIfFindSupportsDelete + + TEST_DELETE=`$FIND "$DELETEDIR" -name TestIfFindSupportsDelete $FIND_DELETE 2>&1` + if test -f $DELETEDIR/TestIfFindSupportsDelete; then + # No, it does not. + rm $DELETEDIR/TestIfFindSupportsDelete + FIND_DELETE="-exec rm \{\} \+" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + fi + rmdir $DELETEDIR + + + +# These tools might not be installed by default, +# need hint on how to install them. + + for ac_prog in unzip +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_UNZIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $UNZIP in + [\\/]* | ?:[\\/]*) + ac_cv_path_UNZIP="$UNZIP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_UNZIP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +UNZIP=$ac_cv_path_UNZIP +if test -n "$UNZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNZIP" >&5 +$as_echo "$UNZIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$UNZIP" && break +done + + + if test "x$UNZIP" = x; then + if test "xunzip" = x; then + PROG_NAME=unzip + else + PROG_NAME=unzip + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + + for ac_prog in zip +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ZIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ZIP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ZIP=$ac_cv_path_ZIP +if test -n "$ZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 +$as_echo "$ZIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ZIP" && break +done + + + if test "x$ZIP" = x; then + if test "xzip" = x; then + PROG_NAME=zip + else + PROG_NAME=zip + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + +# Non-required basic tools + +# Extract the first word of "ldd", so it can be a program name with args. +set dummy ldd; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_LDD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $LDD in + [\\/]* | ?:[\\/]*) + ac_cv_path_LDD="$LDD" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_LDD="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LDD=$ac_cv_path_LDD +if test -n "$LDD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDD" >&5 +$as_echo "$LDD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "x$LDD" = "x"; then + # List shared lib dependencies is used for + # debug output and checking for forbidden dependencies. + # We can build without it. + LDD="true" +fi +# Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_OTOOL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $OTOOL in + [\\/]* | ?:[\\/]*) + ac_cv_path_OTOOL="$OTOOL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_OTOOL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +OTOOL=$ac_cv_path_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "x$OTOOL" = "x"; then + OTOOL="true" +fi +for ac_prog in readelf greadelf +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_READELF+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $READELF in + [\\/]* | ?:[\\/]*) + ac_cv_path_READELF="$READELF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_READELF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +READELF=$ac_cv_path_READELF +if test -n "$READELF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5 +$as_echo "$READELF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$READELF" && break +done + +# Extract the first word of "hg", so it can be a program name with args. +set dummy hg; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_HG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $HG in + [\\/]* | ?:[\\/]*) + ac_cv_path_HG="$HG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_HG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +HG=$ac_cv_path_HG +if test -n "$HG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HG" >&5 +$as_echo "$HG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "stat", so it can be a program name with args. +set dummy stat; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_STAT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $STAT in + [\\/]* | ?:[\\/]*) + ac_cv_path_STAT="$STAT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_STAT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +STAT=$ac_cv_path_STAT +if test -n "$STAT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STAT" >&5 +$as_echo "$STAT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "time", so it can be a program name with args. +set dummy time; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_TIME+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $TIME in + [\\/]* | ?:[\\/]*) + ac_cv_path_TIME="$TIME" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_TIME="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +TIME=$ac_cv_path_TIME +if test -n "$TIME"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TIME" >&5 +$as_echo "$TIME" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + + for ac_prog in comm +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_COMM+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $COMM in + [\\/]* | ?:[\\/]*) + ac_cv_path_COMM="$COMM" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_COMM="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +COMM=$ac_cv_path_COMM +if test -n "$COMM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $COMM" >&5 +$as_echo "$COMM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$COMM" && break +done + + + if test "x$COMM" = x; then + if test "xcomm" = x; then + PROG_NAME=comm + else + PROG_NAME=comm + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + +fi + + +# Check if pkg-config is available. + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi + +fi + +# After basic tools have been setup, we can check build os specific details. + +############################################################################### + +# Note that this is the build platform OS version! + +OS_VERSION="`uname -r | ${SED} 's!\.! !g' | ${SED} 's!-! !g'`" +OS_VERSION_MAJOR="`${ECHO} ${OS_VERSION} | ${CUT} -f 1 -d ' '`" +OS_VERSION_MINOR="`${ECHO} ${OS_VERSION} | ${CUT} -f 2 -d ' '`" +OS_VERSION_MICRO="`${ECHO} ${OS_VERSION} | ${CUT} -f 3 -d ' '`" + + + + + +# Setup builddeps, for automatic downloading of tools we need. +# This is needed before we can call BDEPS_CHECK_MODULE, which is done in +# boot-jdk setup, but we need to have basic tools setup first. + + +# Check whether --with-builddeps-conf was given. +if test "${with_builddeps_conf+set}" = set; then : + withval=$with_builddeps_conf; +fi + + + +# Check whether --with-builddeps-server was given. +if test "${with_builddeps_server+set}" = set; then : + withval=$with_builddeps_server; +fi + + + +# Check whether --with-builddeps-dir was given. +if test "${with_builddeps_dir+set}" = set; then : + withval=$with_builddeps_dir; +else + with_builddeps_dir=/localhome/builddeps +fi + + + +# Check whether --with-builddeps-group was given. +if test "${with_builddeps_group+set}" = set; then : + withval=$with_builddeps_group; +fi + + + + + if test "x$with_builddeps_server" != x || test "x$with_builddeps_conf" != x; then + if test "x$with_builddeps_conf" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for supplied builddeps configuration file" >&5 +$as_echo_n "checking for supplied builddeps configuration file... " >&6; } + builddepsfile=$with_builddeps_conf + if test -s $builddepsfile; then + . $builddepsfile + { $as_echo "$as_me:${as_lineno-$LINENO}: result: loaded!" >&5 +$as_echo "loaded!" >&6; } + else + as_fn_error $? "The given builddeps conf file $with_builddeps_conf could not be loaded!" "$LINENO" 5 + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for builddeps.conf files in sources..." >&5 +$as_echo_n "checking for builddeps.conf files in sources...... " >&6; } + builddepsfile=`mktemp` + touch $builddepsfile + # Put all found confs into a single file. + find ${SRC_ROOT} -name builddeps.conf -exec cat \{\} \; >> $builddepsfile + # Source the file to acquire the variables + if test -s $builddepsfile; then + . $builddepsfile + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found at least one!" >&5 +$as_echo "found at least one!" >&6; } + else + as_fn_error $? "Could not find any builddeps.conf at all!" "$LINENO" 5 + fi + fi + # Create build and target names that use _ instead of "-" and ".". + # This is necessary to use them in variable names. + build_var=`echo ${OPENJDK_BUILD_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'` + target_var=`echo ${OPENJDK_TARGET_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'` + # Extract rewrite information for build and target + eval rewritten_build=\${REWRITE_${build_var}} + if test "x$rewritten_build" = x; then + rewritten_build=${OPENJDK_BUILD_AUTOCONF_NAME} + echo Build stays the same $rewritten_build + else + echo Rewriting build for builddeps into $rewritten_build + fi + eval rewritten_target=\${REWRITE_${target_var}} + if test "x$rewritten_target" = x; then + rewritten_target=${OPENJDK_TARGET_AUTOCONF_NAME} + echo Target stays the same $rewritten_target + else + echo Rewriting target for builddeps into $rewritten_target + fi + rewritten_build_var=`echo ${rewritten_build} | tr '-' '_' | tr '.' '_'` + rewritten_target_var=`echo ${rewritten_target} | tr '-' '_' | tr '.' '_'` + fi + for ac_prog in 7z unzip +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_BDEPS_UNZIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$BDEPS_UNZIP"; then + ac_cv_prog_BDEPS_UNZIP="$BDEPS_UNZIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_BDEPS_UNZIP="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +BDEPS_UNZIP=$ac_cv_prog_BDEPS_UNZIP +if test -n "$BDEPS_UNZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_UNZIP" >&5 +$as_echo "$BDEPS_UNZIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$BDEPS_UNZIP" && break +done + + if test "x$BDEPS_UNZIP" = x7z; then + BDEPS_UNZIP="7z x" + fi + + for ac_prog in wget lftp ftp +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_BDEPS_FTP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$BDEPS_FTP"; then + ac_cv_prog_BDEPS_FTP="$BDEPS_FTP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_BDEPS_FTP="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +BDEPS_FTP=$ac_cv_prog_BDEPS_FTP +if test -n "$BDEPS_FTP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_FTP" >&5 +$as_echo "$BDEPS_FTP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$BDEPS_FTP" && break +done + + + +############################################################################### +# +# Determine OpenJDK variants, options and version numbers. +# +############################################################################### + +# We need build & target for this. + ############################################################################### # @@ -8159,44 +10219,47 @@ fi # Check whether --enable-openjdk-only was given. if test "${enable_openjdk_only+set}" = set; then : enableval=$enable_openjdk_only; +else + enable_openjdk_only="no" fi -if test "x$enable_openjdk_only" = "xyes"; then - OPENJDK=true -elif test "x$enable_openjdk_only" = "xno"; then - OPENJDK=false -elif test -d "$SRC_ROOT/jdk/src/closed"; then - OPENJDK=false +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for presence of closed sources" >&5 +$as_echo_n "checking for presence of closed sources... " >&6; } +if test -d "$SRC_ROOT/jdk/src/closed"; then + CLOSED_SOURCE_PRESENT=yes else + CLOSED_SOURCE_PRESENT=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CLOSED_SOURCE_PRESENT" >&5 +$as_echo "$CLOSED_SOURCE_PRESENT" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if closed source is supressed (openjdk-only)" >&5 +$as_echo_n "checking if closed source is supressed (openjdk-only)... " >&6; } +SUPRESS_CLOSED_SOURCE="$enable_openjdk_only" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SUPRESS_CLOSED_SOURCE" >&5 +$as_echo "$SUPRESS_CLOSED_SOURCE" >&6; } + +if test "x$CLOSED_SOURCE_PRESENT" = xno; then + OPENJDK=true + if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No closed source present, --enable-openjdk-only makes no sense" >&5 +$as_echo "$as_me: WARNING: No closed source present, --enable-openjdk-only makes no sense" >&2;} + fi +else + if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then OPENJDK=true + else + OPENJDK=false + fi fi if test "x$OPENJDK" = "xtrue"; then - SET_OPENJDK=OPENJDK=true + SET_OPENJDK="OPENJDK=true" fi -############################################################################### -# -# JIGSAW or not. The JIGSAW variable is used during the intermediate -# stage when we are building both the old style JDK and the new style modularized JDK. -# When the modularized JDK is finalized, this option will go away. -# -# Check whether --enable-jigsaw was given. -if test "${enable_jigsaw+set}" = set; then : - enableval=$enable_jigsaw; -fi - - -if test "x$enable_jigsaw" = "xyes"; then - JIGSAW=true -else - JIGSAW=false -fi - - ############################################################################### # # Should we build a JDK/JVM with headful support (ie a graphical ui)? @@ -8233,28 +10296,6 @@ $as_echo "$headful_msg" >&6; } -############################################################################### -# -# Should we compile nimbus swing L&F? We can probably remove this option -# since nimbus is officially part of javax now. -# -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build nimbus L&F" >&5 -$as_echo_n "checking whether to build nimbus L&F... " >&6; } -# Check whether --enable-nimbus was given. -if test "${enable_nimbus+set}" = set; then : - enableval=$enable_nimbus; ENABLE_NIMBUS="${enableval}" -else - ENABLE_NIMBUS='yes' -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ENABLE_NIMBUS" >&5 -$as_echo "$ENABLE_NIMBUS" >&6; } -DISABLE_NIMBUS= -if test "x$ENABLE_NIMBUS" = xno; then - DISABLE_NIMBUS=true -fi - - # Control wether Hotspot runs Queens test after build. # Check whether --enable-hotspot-test-in-build was given. if test "${enable_hotspot_test_in_build+set}" = set; then : @@ -8299,42 +10340,6 @@ COMPRESS_JARS=false -############################################################################### -# -# Should we compile JFR -# default no, except for on closed-jdk -# -ENABLE_JFR=no - -# Is the JFR source present - -# -# For closed default is yes -# -if test "x${OPENJDK}" != "xtrue"; then - ENABLE_JFR=yes -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build jfr" >&5 -$as_echo_n "checking whether to build jfr... " >&6; } -# Check whether --enable-jfr was given. -if test "${enable_jfr+set}" = set; then : - enableval=$enable_jfr; -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ENABLE_JFR}" >&5 -$as_echo "${ENABLE_JFR}" >&6; } - -if test "x$ENABLE_JFR" = "xyes"; then - ENABLE_JFR=true -elif test "x$ENABLE_JFR" = "xno"; then - ENABLE_JFR=false -else - as_fn_error $? "Invalid argument to --enable-jfr" "$LINENO" 5 -fi - - - # Source the version numbers . $AUTOCONF_DIR/version.numbers @@ -8354,6 +10359,8 @@ fi + + COPYRIGHT_YEAR=`date +'%Y'` @@ -8381,7 +10388,7 @@ else BUILD_DATE=`date '+%Y_%m_%d_%H_%M'` # Avoid [:alnum:] since it depends on the locale. CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyz0123456789'` - USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` + USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FULL_VERSION="${RELEASE}-${USER_RELEASE_SUFFIX}-${JDK_BUILD_NUMBER}" fi @@ -8389,93 +10396,6 @@ COOKED_BUILD_NUMBER=`$ECHO $JDK_BUILD_NUMBER | $SED -e 's/^b//' -e 's/^0//'` -# To properly create a configuration name, we need to have the OpenJDK target -# and options (variants and debug level) parsed. - - - -# Check whether --with-conf-name was given. -if test "${with_conf_name+set}" = set; then : - withval=$with_conf_name; CONF_NAME=${with_conf_name} -fi - - -# Test from where we are running configure, in or outside of src root. -if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" || test "x$CURDIR" = "x$SRC_ROOT/common/autoconf" || test "x$CURDIR" = "x$SRC_ROOT/common/makefiles" ; then - # We are running configure from the src root. - # Create a default ./build/target-variant-debuglevel output root. - if test "x${CONF_NAME}" = x; then - CONF_NAME="${OPENJDK_TARGET_OS}-${OPENJDK_TARGET_CPU}-${JDK_VARIANT}-${ANDED_JVM_VARIANTS}-${DEBUG_LEVEL}" - fi - OUTPUT_ROOT="$SRC_ROOT/build/${CONF_NAME}" - mkdir -p "$OUTPUT_ROOT" - if test ! -d "$OUTPUT_ROOT"; then - as_fn_error $? "Could not create build directory $OUTPUT_ROOT" "$LINENO" 5 - fi -else - # We are running configure from outside of the src dir. - # Then use the current directory as output dir! - # If configuration is situated in normal build directory, just use the build - # directory name as configuration name, otherwise use the complete path. - if test "x${CONF_NAME}" = x; then - CONF_NAME=`$ECHO $CURDIR | $SED -e "s!^${SRC_ROOT}/build/!!"` - fi - OUTPUT_ROOT="$CURDIR" -fi - - - # Fail with message the path to the output root if var OUTPUT_ROOT contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$OUTPUT_ROOT" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - OUTPUT_ROOT=`$CYGPATH -s -m -a "$OUTPUT_ROOT"` - # Now it's case insensitive; let's make it lowercase to improve readability - OUTPUT_ROOT=`$ECHO "$OUTPUT_ROOT" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - OUTPUT_ROOT=`$CYGPATH -u "$OUTPUT_ROOT"` - else - as_fn_error $? "You cannot have spaces in the path to the output root! \"$OUTPUT_ROOT\"" "$LINENO" 5 - fi - fi - - -SPEC=$OUTPUT_ROOT/spec.gmk - -CONF_NAME=$CONF_NAME - -OUTPUT_ROOT=$OUTPUT_ROOT - - -# Most of the probed defines are put into config.h -ac_config_headers="$ac_config_headers $OUTPUT_ROOT/config.h:$AUTOCONF_DIR/config.h.in" - -# The spec.gmk file contains all variables for the make system. -ac_config_files="$ac_config_files $OUTPUT_ROOT/spec.gmk:$AUTOCONF_DIR/spec.gmk.in" - -# The hotspot-spec.gmk file contains legacy variables for the hotspot make system. -ac_config_files="$ac_config_files $OUTPUT_ROOT/hotspot-spec.gmk:$AUTOCONF_DIR/hotspot-spec.gmk.in" - -# The bootcycle-spec.gmk file contains support for boot cycle builds. -ac_config_files="$ac_config_files $OUTPUT_ROOT/bootcycle-spec.gmk:$AUTOCONF_DIR/bootcycle-spec.gmk.in" - -# The compare.sh is used to compare the build output to other builds. -ac_config_files="$ac_config_files $OUTPUT_ROOT/compare.sh:$AUTOCONF_DIR/compare.sh.in" - -# Spec.sh is currently used by compare-objects.sh -ac_config_files="$ac_config_files $OUTPUT_ROOT/spec.sh:$AUTOCONF_DIR/spec.sh.in" - -# The generated Makefile knows where the spec.gmk is and where the source is. -# You can run make from the OUTPUT_ROOT, or from the top-level Makefile -# which will look for generated configurations -ac_config_files="$ac_config_files $OUTPUT_ROOT/Makefile:$AUTOCONF_DIR/Makefile.in" - - -# Save the arguments given to us -echo "$CONFIGURE_COMMAND_LINE" > $OUTPUT_ROOT/configure-arguments - - ############################################################################### # # Setup BootJDK, used to bootstrap the build. @@ -8546,26 +10466,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -8768,26 +10795,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -8802,12 +10936,126 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$JAVA_HOME" != x; then - if test "x$OPENJDK_TARGET_OS" = xwindows; then - # On Windows, JAVA_HOME is likely in DOS-style - JAVA_HOME_PROCESSED="`$CYGPATH -u "$JAVA_HOME"`" - else - JAVA_HOME_PROCESSED="$JAVA_HOME" - fi + JAVA_HOME_PROCESSED="$JAVA_HOME" + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$JAVA_HOME_PROCESSED" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of JAVA_HOME_PROCESSED" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + JAVA_HOME_PROCESSED="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$JAVA_HOME_PROCESSED" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + JAVA_HOME_PROCESSED="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$JAVA_HOME_PROCESSED" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + if test ! -d "$JAVA_HOME_PROCESSED"; then { $as_echo "$as_me:${as_lineno-$LINENO}: Your JAVA_HOME points to a non-existing directory!" >&5 $as_echo "$as_me: Your JAVA_HOME points to a non-existing directory!" >&6;} @@ -8859,26 +11107,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -8937,26 +11292,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9060,75 +11522,14 @@ fi # Linux/GNU systems often have links from /usr/bin/java to # /etc/alternatives/java to the real JDK binary. - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$BINARY" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$BINARY"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - BINARY="$tmp" - - if test "x$OPENJDK_BUILD_OS" != xwindows; then # Follow a chain of symbolic links. Use readlink # where it exists, else fall back to horribly # complicated shell code. - # Extract the first word of "readlink", so it can be a program name with args. -set dummy readlink; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_READLINK+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $READLINK in - [\\/]* | ?:[\\/]*) - ac_cv_path_READLINK="$READLINK" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_READLINK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -READLINK=$ac_cv_path_READLINK -if test -n "$READLINK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINK" >&5 -$as_echo "$READLINK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$READLINK_TESTED" != yes; then # On MacOSX there is a readlink tool with a different # purpose than the GNU readlink tool. Check the found readlink. - ISGNU=`$READLINK --help 2>&1 | grep GNU` + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` if test "x$ISGNU" = x; then # A readlink that we do not know how to use. # Are there other non-GNU readlinks out there? @@ -9142,23 +11543,25 @@ fi else STARTDIR=$PWD COUNTER=0 - DIR=`dirname $BINARY` - FIL=`basename $BINARY` + DIR=`$DIRNAME $BINARY` + FILE=`$BASENAME $BINARY` while test $COUNTER -lt 20; do - ISLINK=`ls -l $DIR/$FIL | grep '\->' | sed -e 's/.*-> \(.*\)/\1/'` + ISLINK=`$LS -l $DIR/$FILE | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` if test "x$ISLINK" == x; then # This is not a symbolic link! We are done! break fi # The link might be relative! We have to use cd to travel safely. cd $DIR - cd `dirname $ISLINK` - DIR=`pwd` - FIL=`basename $ISLINK` + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + DIR=`$THEPWDCMD` + FILE=`$BASENAME $ISLINK` let COUNTER=COUNTER+1 done cd $STARTDIR - BINARY=$DIR/$FIL + BINARY=$DIR/$FILE fi fi @@ -9210,26 +11613,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9249,19 +11759,209 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$ProgramW6432" != x; then + VIRTUAL_DIR="$ProgramW6432/Java" - BOOT_JDK_PREFIX="`$CYGPATH -u "$ProgramW6432"`/Java" + windows_path="$VIRTUAL_DIR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VIRTUAL_DIR="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + VIRTUAL_DIR="$unix_path" + fi + + + BOOT_JDK_PREFIX="$VIRTUAL_DIR" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi fi + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + fi @@ -9302,26 +12002,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9334,19 +12141,209 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$PROGRAMW6432" != x; then + VIRTUAL_DIR="$PROGRAMW6432/Java" - BOOT_JDK_PREFIX="`$CYGPATH -u "$PROGRAMW6432"`/Java" + windows_path="$VIRTUAL_DIR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VIRTUAL_DIR="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + VIRTUAL_DIR="$unix_path" + fi + + + BOOT_JDK_PREFIX="$VIRTUAL_DIR" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi fi + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + fi @@ -9387,26 +12384,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9419,19 +12523,209 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$PROGRAMFILES" != x; then + VIRTUAL_DIR="$PROGRAMFILES/Java" - BOOT_JDK_PREFIX="`$CYGPATH -u "$PROGRAMFILES"`/Java" + windows_path="$VIRTUAL_DIR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VIRTUAL_DIR="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + VIRTUAL_DIR="$unix_path" + fi + + + BOOT_JDK_PREFIX="$VIRTUAL_DIR" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi fi + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + fi @@ -9472,26 +12766,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9504,19 +12905,209 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$ProgramFiles" != x; then + VIRTUAL_DIR="$ProgramFiles/Java" - BOOT_JDK_PREFIX="`$CYGPATH -u "$ProgramFiles"`/Java" + windows_path="$VIRTUAL_DIR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VIRTUAL_DIR="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + VIRTUAL_DIR="$unix_path" + fi + + + BOOT_JDK_PREFIX="$VIRTUAL_DIR" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi fi + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + fi @@ -9557,26 +13148,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9590,16 +13288,195 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } BOOT_JDK_PREFIX="/cygdrive/c/Program Files/Java" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi fi + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. if test "x$BOOT_JDK_FOUND" = xmaybe; then @@ -9638,26 +13515,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9672,16 +13656,195 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } BOOT_JDK_PREFIX="/Library/Java/JavaVirtualMachines" BOOT_JDK_SUFFIX="/Contents/Home" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi fi + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. if test "x$BOOT_JDK_FOUND" = xmaybe; then @@ -9720,26 +13883,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9753,16 +14023,195 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } BOOT_JDK_PREFIX="/System/Library/Java/JavaVirtualMachines" BOOT_JDK_SUFFIX="/Contents/Home" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi fi + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. if test "x$BOOT_JDK_FOUND" = xmaybe; then @@ -9801,26 +14250,501 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + elif test "x$OPENJDK_TARGET_OS" = xlinux; then + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK_PREFIX="/usr/lib/jvm" + BOOT_JDK_SUFFIX="" + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9868,26 +14792,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -10465,16 +15496,13 @@ AR_OUT_OPTION='rcs$(SPACE)' +# Locate the actual tools +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then -# Check if the VS env variables were setup prior to running configure. -# If not, then find vcvarsall.bat and run it automatically, and integrate -# the set env variables into the spec file. -SETUPDEVENV="# No special vars" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # Store path to cygwin link.exe to help excluding it when searching for - # VS linker. - # Extract the first word of "link", so it can be a program name with args. + # Store path to cygwin link.exe to help excluding it when searching for + # VS linker. This must be done before changing the PATH when looking for VS. + # Extract the first word of "link", so it can be a program name with args. set dummy link; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } @@ -10514,6 +15542,7 @@ $as_echo "no" >&6; } fi + if test "x$CYGWIN_LINK" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the first found link.exe is actually the Cygwin link tool" >&5 $as_echo_n "checking if the first found link.exe is actually the Cygwin link tool... " >&6; } "$CYGWIN_LINK" --version > /dev/null @@ -10526,124 +15555,862 @@ $as_echo "no" >&6; } # This might be the VS linker. Don't exclude it later on. CYGWIN_LINK="" fi + fi - # If vcvarsall.bat has been run, then VCINSTALLDIR is set. - if test "x$VCINSTALLDIR" != x; then - # No further setup is needed. The build will happen from this kind - # of shell. - SETUPDEVENV="# This spec file expects that you are running bash from within a VS command prompt." - # Make sure to remind you, if you forget to run make from a cygwin bash shell - # that is spawned "bash -l" from a VS command prompt. - CHECK_FOR_VCINSTALLDIR=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if you are running from within a VS command prompt" >&5 -$as_echo_n "checking if you are running from within a VS command prompt... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + # First-hand choice is to locate and run the vsvars bat file. + + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILE="vc/bin/vcvars32.bat" + else + VCVARSFILE="vc/bin/amd64/vcvars64.bat" + fi + + VS_ENV_CMD="" + VS_ENV_ARGS="" + if test "x$with_toolsdir" != x; then + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="$with_toolsdir/../.." + METHOD="--with-tools-dir" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + fi + + if test "x$with_toolsdir" != x && test "x$VS_ENV_CMD" = x; then + # Having specified an argument which is incorrect will produce an instant failure; + # we should not go on looking + { $as_echo "$as_me:${as_lineno-$LINENO}: The path given by --with-tools-dir does not contain a valid Visual Studio installation" >&5 +$as_echo "$as_me: The path given by --with-tools-dir does not contain a valid Visual Studio installation" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Please point to the VC/bin directory within the Visual Studio installation" >&5 +$as_echo "$as_me: Please point to the VC/bin directory within the Visual Studio installation" >&6;} + as_fn_error $? "Cannot locate a valid Visual Studio installation" "$LINENO" 5 + fi + + if test "x$ProgramW6432" != x; then + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="$ProgramW6432/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + fi + if test "x$PROGRAMW6432" != x; then + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="$PROGRAMW6432/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + fi + if test "x$PROGRAMFILES" != x; then + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="$PROGRAMFILES/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + fi + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="C:/Program Files/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + + if test "x$VS100COMNTOOLS" != x; then + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="$VS100COMNTOOLS/../.." + METHOD="VS100COMNTOOLS variable" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + fi + if test "x$PROGRAMFILES" != x; then + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="$PROGRAMFILES/Microsoft Visual Studio 10.0" + METHOD="well-known name" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + fi + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="C:/Program Files/Microsoft Visual Studio 10.0" + METHOD="well-known name" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="C:/Program Files (x86)/Microsoft Visual Studio 10.0" + METHOD="well-known name" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + + if test "x$VS_ENV_CMD" != x; then + # We have found a Visual Studio environment on disk, let's extract variables from the vsvars bat file. + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$VS_ENV_CMD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" else - # Ah, we have not yet run vcvarsall.bat/vsvars32.bat/vsvars64.bat. Lets do that. First find it. - if test "x$VS100COMNTOOLS" != x; then - VARSBAT=`find "$VS100COMNTOOLS/../.." -name vcvarsall.bat` - SEARCH_ROOT="$VS100COMNTOOLS" - else - VARSBAT=`find "$PROGRAMFILES" -name vcvarsall.bat` - SEARCH_ROOT="$PROGRAMFILES" - fi - VCPATH=`dirname "$VARSBAT"` - VCPATH=`cygpath -w "$VCPATH"` - if test "x$VARSBAT" = x || test ! -d "$VCPATH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can find the VS installation" >&5 -$as_echo_n "checking if we can find the VS installation... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "Tried to find a VS installation using both $SEARCH_ROOT but failed. Please run \"c:\\cygwin\\bin\\bash.exe -l\" from a VS command prompt and then run configure/make from there." "$LINENO" 5 - fi - case "$OPENJDK_TARGET_CPU" in - x86) - VARSBAT_ARCH=x86 - ;; - x86_64) - VARSBAT_ARCH=amd64 - ;; - esac - # Lets extract the variables that are set by vcvarsall.bat/vsvars32.bat/vsvars64.bat - cd $OUTPUT_ROOT - bash $SRC_ROOT/common/bin/extractvcvars.sh "$VARSBAT" "$VARSBAT_ARCH" - cd $CURDIR - if test ! -s $OUTPUT_ROOT/localdevenv.sh || test ! -s $OUTPUT_ROOT/localdevenv.gmk; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can extract the needed env variables" >&5 -$as_echo_n "checking if we can extract the needed env variables... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "Could not succesfully extract the env variables needed for the VS setup. Please run \"c:\\cygwin\\bin\\bash.exe -l\" from a VS command prompt and then run configure/make from there." "$LINENO" 5 - fi - # Now set all paths and other env variables. This will allow the rest of - # the configure script to find and run the compiler in the proper way. - . $OUTPUT_ROOT/localdevenv.sh - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can find the VS installation" >&5 -$as_echo_n "checking if we can find the VS installation... " >&6; } - if test "x$VCINSTALLDIR" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VCINSTALLDIR" >&5 -$as_echo "$VCINSTALLDIR" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "Could not find VS installation. Please install. If you are sure you have installed VS, then please run \"c:\\cygwin\\bin\\bash.exe -l\" from a VS command prompt and then run configure/make from there." "$LINENO" 5 - fi - CHECK_FOR_VCINSTALLDIR=no - SETUPDEVENV="include $OUTPUT_ROOT/localdevenv.gmk" + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for msvcr100.dll" >&5 + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$VS_ENV_CMD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$VS_ENV_CMD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving VS_ENV_CMD (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving VS_ENV_CMD (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + VS_ENV_CMD="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting VS_ENV_CMD to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting VS_ENV_CMD to \"$new_complete\"" >&6;} + fi + + + # Lets extract the variables that are set by vcvarsall.bat/vsvars32.bat/vsvars64.bat + { $as_echo "$as_me:${as_lineno-$LINENO}: Trying to extract Visual Studio environment variables" >&5 +$as_echo "$as_me: Trying to extract Visual Studio environment variables" >&6;} + cd $OUTPUT_ROOT + # FIXME: The code betweeen ---- was inlined from a separate script and is not properly adapted + # to autoconf standards. + + #---- + + # Cannot use the VS10 setup script directly (since it only updates the DOS subshell environment) + # but calculate the difference in Cygwin environment before/after running it and then + # apply the diff. + + if test "x$OPENJDK_BUILD_OS_ENV" = xwindows.cygwin; then + _vs10varsall=`cygpath -a -m -s "$VS_ENV_CMD"` + _dosvs10varsall=`cygpath -a -w -s $_vs10varsall` + _dosbash=`cygpath -a -w -s \`which bash\`.*` + else + _dosvs10varsall=`cmd //c echo $VS_ENV_CMD` + _dosbash=`cmd //c echo \`which bash\`` + fi + + # generate the set of exported vars before/after the vs10 setup + $ECHO "@echo off" > localdevenvtmp.bat + $ECHO "$_dosbash -c \"export -p\" > localdevenvtmp.export0" >> localdevenvtmp.bat + $ECHO "call $_dosvs10varsall $VS_ENV_ARGS" >> localdevenvtmp.bat + $ECHO "$_dosbash -c \"export -p\" > localdevenvtmp.export1" >> localdevenvtmp.bat + + # Now execute the newly created bat file. + # The | cat is to stop SetEnv.Cmd to mess with system colors on msys + cmd /c localdevenvtmp.bat | cat + + # apply the diff (less some non-vs10 vars named by "!") + $SORT localdevenvtmp.export0 | $GREP -v "!" > localdevenvtmp.export0.sort + $SORT localdevenvtmp.export1 | $GREP -v "!" > localdevenvtmp.export1.sort + $COMM -1 -3 localdevenvtmp.export0.sort localdevenvtmp.export1.sort > localdevenv.sh + + # cleanup + $RM localdevenvtmp* + #---- + cd $CURDIR + if test ! -s $OUTPUT_ROOT/localdevenv.sh; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not succesfully extract the envionment variables needed for the VS setup." >&5 +$as_echo "$as_me: Could not succesfully extract the envionment variables needed for the VS setup." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&5 +$as_echo "$as_me: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&5 +$as_echo "$as_me: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + # Now set all paths and other env variables. This will allow the rest of + # the configure script to find and run the compiler in the proper way. + { $as_echo "$as_me:${as_lineno-$LINENO}: Setting extracted environment variables" >&5 +$as_echo "$as_me: Setting extracted environment variables" >&6;} + . $OUTPUT_ROOT/localdevenv.sh + else + # We did not find a vsvars bat file, let's hope we are run from a VS command prompt. + { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot locate a valid Visual Studio installation, checking current environment" >&5 +$as_echo "$as_me: Cannot locate a valid Visual Studio installation, checking current environment" >&6;} + fi + + # At this point, we should have corrent variables in the environment, or we can't continue. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Visual Studio variables" >&5 +$as_echo_n "checking for Visual Studio variables... " >&6; } + + if test "x$VCINSTALLDIR" != x || test "x$WindowsSDKDir" != x || test "x$WINDOWSSDKDIR" != x; then + if test "x$INCLUDE" = x || test "x$LIB" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: present but broken" >&5 +$as_echo "present but broken" >&6; } + as_fn_error $? "Your VC command prompt seems broken, INCLUDE and/or LIB is missing." "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + VS_INCLUDE="$INCLUDE" + VS_LIB="$LIB" + VS_PATH="$PATH" + + + + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + + if test "x$VS_ENV_CMD" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot locate a valid Visual Studio or Windows SDK installation on disk," >&5 +$as_echo "$as_me: Cannot locate a valid Visual Studio or Windows SDK installation on disk," >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: nor is this script run from a Visual Studio command prompt." >&5 +$as_echo "$as_me: nor is this script run from a Visual Studio command prompt." >&6;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Running the extraction script failed." >&5 +$as_echo "$as_me: Running the extraction script failed." >&6;} + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&5 +$as_echo "$as_me: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&5 +$as_echo "$as_me: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for msvcr100.dll" >&5 $as_echo_n "checking for msvcr100.dll... " >&6; } -# Check whether --with-msvcr100dll was given. -if test "${with_msvcr100dll+set}" = set; then : - withval=$with_msvcr100dll; +# Check whether --with-msvcr-dll was given. +if test "${with_msvcr_dll+set}" = set; then : + withval=$with_msvcr_dll; fi - if test "x$with_msvcr100dll" != x; then - MSVCR100DLL="$with_msvcr100dll" - else - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | grep x64 | head --lines 1` - else - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | grep x86 | grep -v ia64 | grep -v x64 | head --lines 1` - if test "x$MSVCR100DLL" = x; then - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | head --lines 1` - fi - fi + if test "x$with_msvcr_dll" != x; then + MSVCR_DLL="$with_msvcr_dll" + else + if test "x$VCINSTALLDIR" != x; then + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | grep x64 | head --lines 1` + else + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | grep x86 | grep -v ia64 | grep -v x64 | head --lines 1` + if test "x$MSVCR_DLL" = x; then + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | head --lines 1` fi - if test "x$MSVCR100DLL" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + fi + if test "x$MSVCR_DLL" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: msvcr100.dll found in VCINSTALLDIR: $VCINSTALLDIR" >&5 +$as_echo "$as_me: msvcr100.dll found in VCINSTALLDIR: $VCINSTALLDIR" >&6;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: msvcr100.dll not found in VCINSTALLDIR: $VCINSTALLDIR" >&5 +$as_echo "$as_me: Warning: msvcr100.dll not found in VCINSTALLDIR: $VCINSTALLDIR" >&6;} + fi + fi + if test "x$MSVCR_DLL" = x; then + if test -f "$SYSTEMROOT/system32/msvcr100.dll"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: msvcr100.dll found in $SYSTEMROOT/system32" >&5 +$as_echo "$as_me: msvcr100.dll found in $SYSTEMROOT/system32" >&6;} + MSVCR_DLL="$SYSTEMROOT/system32/msvcr100.dll" + fi + fi + fi + if test "x$MSVCR_DLL" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - as_fn_error $? "Could not find msvcr100.dll !" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSVCR100DLL" >&5 -$as_echo "$MSVCR100DLL" >&6; } + as_fn_error $? "Could not find msvcr100.dll !" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSVCR_DLL" >&5 +$as_echo "$MSVCR_DLL" >&6; } - # Fail with message the path to msvcr100.dll if var MSVCR100DLL contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$MSVCR100DLL" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - MSVCR100DLL=`$CYGPATH -s -m -a "$MSVCR100DLL"` - # Now it's case insensitive; let's make it lowercase to improve readability - MSVCR100DLL=`$ECHO "$MSVCR100DLL" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - MSVCR100DLL=`$CYGPATH -u "$MSVCR100DLL"` - else - as_fn_error $? "You cannot have spaces in the path to msvcr100.dll! \"$MSVCR100DLL\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$MSVCR_DLL" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of MSVCR_DLL" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + MSVCR_DLL="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MSVCR_DLL to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting MSVCR_DLL to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$MSVCR_DLL" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + MSVCR_DLL="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MSVCR_DLL to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting MSVCR_DLL to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$MSVCR_DLL" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of MSVCR_DLL, which resolves as \"$path\", is not found." "$LINENO" 5 fi + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 fi + fi + + fi - -# Locate the actual tools - # If --build AND --host is set, then the configure script will find any # cross compilation tools in the PATH. Cross compilation tools # follows the cross compilation standard where they are prefixed with ${host}. @@ -10707,47 +16474,245 @@ fi done - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$BUILD_CC" - car="${tmp%% *}" - tmp="$BUILD_CC EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of BUILD_CC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving BUILD_CC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving BUILD_CC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - BUILD_CC="$car ${cdr% *}" - else - BUILD_CC="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + BUILD_CC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BUILD_CC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting BUILD_CC to \"$new_complete\"" >&6;} + fi for ac_prog in cl CC g++ do @@ -10795,47 +16760,245 @@ fi done - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$BUILD_CXX" - car="${tmp%% *}" - tmp="$BUILD_CXX EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving BUILD_CXX (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving BUILD_CXX (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - BUILD_CXX="$car ${cdr% *}" - else - BUILD_CXX="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + BUILD_CXX="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BUILD_CXX to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting BUILD_CXX to \"$new_complete\"" >&6;} + fi # Extract the first word of "ld", so it can be a program name with args. set dummy ld; ac_word=$2 @@ -10878,47 +17041,245 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$BUILD_LD" - car="${tmp%% *}" - tmp="$BUILD_LD EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_LD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of BUILD_LD, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_LD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_LD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving BUILD_LD (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving BUILD_LD (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - BUILD_LD="$car ${cdr% *}" - else - BUILD_LD="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + BUILD_LD="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BUILD_LD to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting BUILD_LD to \"$new_complete\"" >&6;} + fi fi @@ -11102,16 +17463,874 @@ if test "x$TOOLS_DIR" != x; then PATH=$TOOLS_DIR:$PATH fi + +### Locate C compiler (CC) + # gcc is almost always present, but on Windows we # prefer cl.exe and on Solaris we prefer CC. # Thus test for them in this order. +if test "x$OPENJDK_TARGET_OS" = xmacosx; then + # Do not probe for cc on MacOSX. + COMPILER_CHECK_LIST="cl gcc" +else + COMPILER_CHECK_LIST="cl cc gcc" +fi + + + COMPILER_NAME=C + + # Do a first initial attempt at searching the list of compiler names. + # AC_PATH_PROGS can't be run multiple times with the same variable, + # so create a new name for this run. + for ac_prog in $COMPILER_CHECK_LIST +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_POTENTIAL_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $POTENTIAL_CC in + [\\/]* | ?:[\\/]*) + ac_cv_path_POTENTIAL_CC="$POTENTIAL_CC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_POTENTIAL_CC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +POTENTIAL_CC=$ac_cv_path_POTENTIAL_CC +if test -n "$POTENTIAL_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POTENTIAL_CC" >&5 +$as_echo "$POTENTIAL_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$POTENTIAL_CC" && break +done + + CC=$POTENTIAL_CC + + if test "x$$CC" = x; then + + # Print a helpful message on how to acquire the necessary build dependency. + # devkit is the help tag: freetyp2, cups, pulse, alsa etc + MISSING_DEPENDENCY=devkit + PKGHANDLER_COMMAND= + + case $PKGHANDLER in + apt-get) + apt_help $MISSING_DEPENDENCY ;; + yum) + yum_help $MISSING_DEPENDENCY ;; + port) + port_help $MISSING_DEPENDENCY ;; + pkgutil) + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; + * ) + break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then + HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." + fi + + as_fn_error $? "Could not find a $COMPILER_NAME compiler. $HELP_MSG" "$LINENO" 5 + fi + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of CC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving CC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + CC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting CC to \"$new_complete\"" >&6;} + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CC" >&5 +$as_echo_n "checking resolved symbolic links for CC... " >&6; } + TEST_COMPILER="$CC" + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + TEST_COMPILER=`$READLINK -f $TEST_COMPILER` + else + STARTDIR=$PWD + COUNTER=0 + DIR=`$DIRNAME $TEST_COMPILER` + FILE=`$BASENAME $TEST_COMPILER` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $DIR/$FILE | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $DIR + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + DIR=`$THEPWDCMD` + FILE=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + TEST_COMPILER=$DIR/$FILE + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 +$as_echo "$TEST_COMPILER" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if CC is disguised ccache" >&5 +$as_echo_n "checking if CC is disguised ccache... " >&6; } + + COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` + if test "x$COMPILER_BASENAME" = "xccache"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, trying to find proper $COMPILER_NAME compiler" >&5 +$as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; } + # We /usr/lib/ccache in the path, so cc is a symlink to /usr/bin/ccache. + # We want to control ccache invocation ourselves, so ignore this cc and try + # searching again. + + # Remove the path to the fake ccache cc from the PATH + RETRY_COMPILER_SAVED_PATH="$PATH" + COMPILER_DIRNAME=`$DIRNAME $CC` + PATH="`$ECHO $PATH | $SED -e "s,$COMPILER_DIRNAME,,g" -e "s,::,:,g" -e "s,^:,,g"`" + + # Try again looking for our compiler + if test -n "$ac_tool_prefix"; then + for ac_prog in $COMPILER_CHECK_LIST + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PROPER_COMPILER_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PROPER_COMPILER_CC"; then + ac_cv_prog_PROPER_COMPILER_CC="$PROPER_COMPILER_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PROPER_COMPILER_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PROPER_COMPILER_CC=$ac_cv_prog_PROPER_COMPILER_CC +if test -n "$PROPER_COMPILER_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CC" >&5 +$as_echo "$PROPER_COMPILER_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PROPER_COMPILER_CC" && break + done +fi +if test -z "$PROPER_COMPILER_CC"; then + ac_ct_PROPER_COMPILER_CC=$PROPER_COMPILER_CC + for ac_prog in $COMPILER_CHECK_LIST +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_PROPER_COMPILER_CC"; then + ac_cv_prog_ac_ct_PROPER_COMPILER_CC="$ac_ct_PROPER_COMPILER_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_PROPER_COMPILER_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_PROPER_COMPILER_CC=$ac_cv_prog_ac_ct_PROPER_COMPILER_CC +if test -n "$ac_ct_PROPER_COMPILER_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PROPER_COMPILER_CC" >&5 +$as_echo "$ac_ct_PROPER_COMPILER_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_PROPER_COMPILER_CC" && break +done + + if test "x$ac_ct_PROPER_COMPILER_CC" = x; then + PROPER_COMPILER_CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PROPER_COMPILER_CC=$ac_ct_PROPER_COMPILER_CC + fi +fi + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving PROPER_COMPILER_CC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving PROPER_COMPILER_CC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + PROPER_COMPILER_CC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting PROPER_COMPILER_CC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting PROPER_COMPILER_CC to \"$new_complete\"" >&6;} + fi + + PATH="$RETRY_COMPILER_SAVED_PATH" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for resolved symbolic links for CC" >&5 +$as_echo_n "checking for resolved symbolic links for CC... " >&6; } + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + PROPER_COMPILER_CC=`$READLINK -f $PROPER_COMPILER_CC` + else + STARTDIR=$PWD + COUNTER=0 + DIR=`$DIRNAME $PROPER_COMPILER_CC` + FILE=`$BASENAME $PROPER_COMPILER_CC` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $DIR/$FILE | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $DIR + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + DIR=`$THEPWDCMD` + FILE=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + PROPER_COMPILER_CC=$DIR/$FILE + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CC" >&5 +$as_echo "$PROPER_COMPILER_CC" >&6; } + CC="$PROPER_COMPILER_CC" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, keeping CC" >&5 +$as_echo "no, keeping CC" >&6; } + CC="$TEST_COMPILER" + fi + + COMPILER=$CC + COMPILER_NAME=$COMPILER_NAME + + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + # Make sure we use the Sun Studio compiler and not gcc on Solaris, which won't work + COMPILER_VERSION_TEST=`$COMPILER -V 2>&1 | $HEAD -n 1` + $ECHO $COMPILER_VERSION_TEST | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + if test $? -ne 0; then + GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&5 +$as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&6;} + as_fn_error $? "Sun Studio compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + else + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/p"` + COMPILER_VENDOR="Sun Studio" + fi + elif test "x$OPENJDK_TARGET_OS" = xwindows; then + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 + COMPILER_VERSION_TEST=`$COMPILER 2>&1 | $HEAD -n 1` + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*Version \([1-9][0-9.]*\) .*/\1/p"` + COMPILER_VENDOR="Microsoft CL.EXE" + COMPILER_CPU_TEST=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* for \(.*\)$/\1/p"` + if test "x$OPENJDK_TARGET_CPU" = "xx86"; then + if test "x$COMPILER_CPU_TEST" != "x80x86"; then + as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." "$LINENO" 5 + fi + elif test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then + if test "x$COMPILER_CPU_TEST" != "xx64"; then + as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." "$LINENO" 5 + fi + fi + else + COMPILER_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + # Check that this is likely to be GCC. + $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&6;} + as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + + # First line typically looks something like: + # gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* \([1-9][0-9.]*\)/\1/p"` + COMPILER_VENDOR=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^\(.*\) [1-9][0-9.]*/\1/p"` + fi + # This sets CC_VERSION or CXX_VERSION. (This comment is a grep marker) + CC_VERSION="$COMPILER_VERSION" + # This sets CC_VENDOR or CXX_VENDOR. (This comment is a grep marker) + CC_VENDOR="$COMPILER_VENDOR" + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&5 +$as_echo "$as_me: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&6;} + + +# Now that we have resolved CC ourself, let autoconf have it's go at it ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then - for ac_prog in cl cc gcc + for ac_prog in $CC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 @@ -11155,7 +18374,7 @@ fi fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl cc gcc + for ac_prog in $CC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -11703,7 +18922,69 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test "x$CC" = x; then + +### Locate C++ compiler (CXX) + +if test "x$OPENJDK_TARGET_OS" = xmacosx; then + # Do not probe for CC on MacOSX. + COMPILER_CHECK_LIST="cl g++" +else + COMPILER_CHECK_LIST="cl CC g++" +fi + + COMPILER_NAME=C++ + + # Do a first initial attempt at searching the list of compiler names. + # AC_PATH_PROGS can't be run multiple times with the same variable, + # so create a new name for this run. + for ac_prog in $COMPILER_CHECK_LIST +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_POTENTIAL_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $POTENTIAL_CXX in + [\\/]* | ?:[\\/]*) + ac_cv_path_POTENTIAL_CXX="$POTENTIAL_CXX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_POTENTIAL_CXX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +POTENTIAL_CXX=$ac_cv_path_POTENTIAL_CXX +if test -n "$POTENTIAL_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POTENTIAL_CXX" >&5 +$as_echo "$POTENTIAL_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$POTENTIAL_CXX" && break +done + + CXX=$POTENTIAL_CXX + + if test "x$$CXX" = x; then # Print a helpful message on how to acquire the necessary build dependency. # devkit is the help tag: freetyp2, cups, pulse, alsa etc @@ -11729,56 +19010,775 @@ if test "x$CC" = x; then HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - as_fn_error $? "Could not find a compiler. $HELP_MSG" "$LINENO" 5 -fi -if test "x$CC" = xcc && test "x$OPENJDK_BUILD_OS" = xmacosx; then - # Do not use cc on MacOSX use gcc instead. - CC="gcc" -fi + as_fn_error $? "Could not find a $COMPILER_NAME compiler. $HELP_MSG" "$LINENO" 5 + fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$CC" - car="${tmp%% *}" - tmp="$CC EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of CXX, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CXX (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving CXX (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + fi fi - car="$tmp" + fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + CXX="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CXX to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting CXX to \"$new_complete\"" >&6;} + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CXX" >&5 +$as_echo_n "checking resolved symbolic links for CXX... " >&6; } + TEST_COMPILER="$CXX" + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + TEST_COMPILER=`$READLINK -f $TEST_COMPILER` + else + STARTDIR=$PWD + COUNTER=0 + DIR=`$DIRNAME $TEST_COMPILER` + FILE=`$BASENAME $TEST_COMPILER` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $DIR/$FILE | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $DIR + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + DIR=`$THEPWDCMD` + FILE=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + TEST_COMPILER=$DIR/$FILE + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 +$as_echo "$TEST_COMPILER" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if CXX is disguised ccache" >&5 +$as_echo_n "checking if CXX is disguised ccache... " >&6; } + + COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` + if test "x$COMPILER_BASENAME" = "xccache"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, trying to find proper $COMPILER_NAME compiler" >&5 +$as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; } + # We /usr/lib/ccache in the path, so cc is a symlink to /usr/bin/ccache. + # We want to control ccache invocation ourselves, so ignore this cc and try + # searching again. + + # Remove the path to the fake ccache cc from the PATH + RETRY_COMPILER_SAVED_PATH="$PATH" + COMPILER_DIRNAME=`$DIRNAME $CXX` + PATH="`$ECHO $PATH | $SED -e "s,$COMPILER_DIRNAME,,g" -e "s,::,:,g" -e "s,^:,,g"`" + + # Try again looking for our compiler + if test -n "$ac_tool_prefix"; then + for ac_prog in $COMPILER_CHECK_LIST + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PROPER_COMPILER_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PROPER_COMPILER_CXX"; then + ac_cv_prog_PROPER_COMPILER_CXX="$PROPER_COMPILER_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PROPER_COMPILER_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PROPER_COMPILER_CXX=$ac_cv_prog_PROPER_COMPILER_CXX +if test -n "$PROPER_COMPILER_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CXX" >&5 +$as_echo "$PROPER_COMPILER_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PROPER_COMPILER_CXX" && break + done +fi +if test -z "$PROPER_COMPILER_CXX"; then + ac_ct_PROPER_COMPILER_CXX=$PROPER_COMPILER_CXX + for ac_prog in $COMPILER_CHECK_LIST +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_PROPER_COMPILER_CXX"; then + ac_cv_prog_ac_ct_PROPER_COMPILER_CXX="$ac_ct_PROPER_COMPILER_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_PROPER_COMPILER_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_PROPER_COMPILER_CXX=$ac_cv_prog_ac_ct_PROPER_COMPILER_CXX +if test -n "$ac_ct_PROPER_COMPILER_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PROPER_COMPILER_CXX" >&5 +$as_echo "$ac_ct_PROPER_COMPILER_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_PROPER_COMPILER_CXX" && break +done + + if test "x$ac_ct_PROPER_COMPILER_CXX" = x; then + PROPER_COMPILER_CXX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PROPER_COMPILER_CXX=$ac_ct_PROPER_COMPILER_CXX + fi +fi + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 fi - if test "x$cdr" != xEOL; then - CC="$car ${cdr% *}" + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving PROPER_COMPILER_CXX (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving PROPER_COMPILER_CXX (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + PROPER_COMPILER_CXX="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting PROPER_COMPILER_CXX to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting PROPER_COMPILER_CXX to \"$new_complete\"" >&6;} + fi + + PATH="$RETRY_COMPILER_SAVED_PATH" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for resolved symbolic links for CXX" >&5 +$as_echo_n "checking for resolved symbolic links for CXX... " >&6; } + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + PROPER_COMPILER_CXX=`$READLINK -f $PROPER_COMPILER_CXX` + else + STARTDIR=$PWD + COUNTER=0 + DIR=`$DIRNAME $PROPER_COMPILER_CXX` + FILE=`$BASENAME $PROPER_COMPILER_CXX` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $DIR/$FILE | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $DIR + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + DIR=`$THEPWDCMD` + FILE=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + PROPER_COMPILER_CXX=$DIR/$FILE + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CXX" >&5 +$as_echo "$PROPER_COMPILER_CXX" >&6; } + CXX="$PROPER_COMPILER_CXX" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, keeping CXX" >&5 +$as_echo "no, keeping CXX" >&6; } + CXX="$TEST_COMPILER" + fi + + COMPILER=$CXX + COMPILER_NAME=$COMPILER_NAME + + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + # Make sure we use the Sun Studio compiler and not gcc on Solaris, which won't work + COMPILER_VERSION_TEST=`$COMPILER -V 2>&1 | $HEAD -n 1` + $ECHO $COMPILER_VERSION_TEST | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + if test $? -ne 0; then + GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&5 +$as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&6;} + as_fn_error $? "Sun Studio compiler is required. Try setting --with-tools-dir." "$LINENO" 5 else - CC="$car" + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/p"` + COMPILER_VENDOR="Sun Studio" + fi + elif test "x$OPENJDK_TARGET_OS" = xwindows; then + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 + COMPILER_VERSION_TEST=`$COMPILER 2>&1 | $HEAD -n 1` + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*Version \([1-9][0-9.]*\) .*/\1/p"` + COMPILER_VENDOR="Microsoft CL.EXE" + COMPILER_CPU_TEST=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* for \(.*\)$/\1/p"` + if test "x$OPENJDK_TARGET_CPU" = "xx86"; then + if test "x$COMPILER_CPU_TEST" != "x80x86"; then + as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." "$LINENO" 5 + fi + elif test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then + if test "x$COMPILER_CPU_TEST" != "xx64"; then + as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." "$LINENO" 5 + fi + fi + else + COMPILER_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + # Check that this is likely to be GCC. + $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&6;} + as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5 fi + # First line typically looks something like: + # gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* \([1-9][0-9.]*\)/\1/p"` + COMPILER_VENDOR=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^\(.*\) [1-9][0-9.]*/\1/p"` + fi + # This sets CC_VERSION or CXX_VERSION. (This comment is a grep marker) + CXX_VERSION="$COMPILER_VERSION" + # This sets CC_VENDOR or CXX_VENDOR. (This comment is a grep marker) + CXX_VENDOR="$COMPILER_VENDOR" + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&5 +$as_echo "$as_me: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&6;} + + +# Now that we have resolved CXX ourself, let autoconf have it's go at it ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -11789,7 +19789,7 @@ if test -z "$CXX"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then - for ac_prog in cl CC g++ + for ac_prog in $CXX do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 @@ -11833,7 +19833,7 @@ fi fi if test -z "$CXX"; then ac_ct_CXX=$CXX - for ac_prog in cl CC g++ + for ac_prog in $CXX do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -12036,85 +20036,10 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test "x$CXX" = xCC && test "x$OPENJDK_BUILD_OS" = xmacosx; then - # The found CC, even though it seems to be a g++ derivate, cannot compile - # c++ code. Override. - CXX="g++" -fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$CXX" - car="${tmp%% *}" - tmp="$CXX EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then +### Locate other tools - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - CXX="$car ${cdr% *}" - else - CXX="$car" - fi - - -if test "x$CXX" = x || test "x$CC" = x; then - - # Print a helpful message on how to acquire the necessary build dependency. - # devkit is the help tag: freetyp2, cups, pulse, alsa etc - MISSING_DEPENDENCY=devkit - PKGHANDLER_COMMAND= - - case $PKGHANDLER in - apt-get) - apt_help $MISSING_DEPENDENCY ;; - yum) - yum_help $MISSING_DEPENDENCY ;; - port) - port_help $MISSING_DEPENDENCY ;; - pkgutil) - pkgutil_help $MISSING_DEPENDENCY ;; - pkgadd) - pkgadd_help $MISSING_DEPENDENCY ;; - * ) - break ;; - esac - - if test "x$PKGHANDLER_COMMAND" != x; then - HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." - fi - - as_fn_error $? "Could not find the needed compilers! $HELP_MSG " "$LINENO" 5 -fi - -if test "x$OPENJDK_BUILD_OS" != xwindows; then +if test "x$OPENJDK_TARGET_OS" != xwindows; then ac_ext=m ac_cpp='$OBJCPP $CPPFLAGS' ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -12367,47 +20292,245 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$OBJC" - car="${tmp%% *}" - tmp="$OBJC EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of OBJC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving OBJC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving OBJC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - OBJC="$car ${cdr% *}" - else - OBJC="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + OBJC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OBJC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting OBJC to \"$new_complete\"" >&6;} + fi else OBJC= @@ -12431,7 +20554,7 @@ LDEXECXX="$CXX" # Linking C++ executables. -if test "x$OPENJDK_BUILD_OS" != xwindows; then +if test "x$OPENJDK_TARGET_OS" != xwindows; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 @@ -12525,59 +20648,263 @@ else fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$AR" - car="${tmp%% *}" - tmp="$AR EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$AR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of AR, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$AR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$AR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving AR (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving AR (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - AR="$car ${cdr% *}" - else - AR="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + AR="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting AR to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting AR to \"$new_complete\"" >&6;} + fi fi -if test "x$OPENJDK_BUILD_OS" = xmacosx; then +if test "x$OPENJDK_TARGET_OS" = xmacosx; then ARFLAGS="-r" else ARFLAGS="" fi +# For hotspot, we need these in Windows mixed path; other platforms keep them the same +HOTSPOT_CXX="$CXX" +HOTSPOT_LD="$LD" + + + COMPILER_NAME=gcc COMPILER_TYPE=CC -if test "x$OPENJDK_BUILD_OS" = xwindows; then : +if test "x$OPENJDK_TARGET_OS" = xwindows; then : # For now, assume that we are always compiling using cl.exe. CC_OUT_OPTION=-Fo @@ -12643,25 +20970,245 @@ fi # Since we must ignore the first found link, WINLD will contain # the full path to the link.exe program. - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$WINLD" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$WINLD"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINLD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINLD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 fi - WINLD="$tmp" + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of WINLD, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINLD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINLD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINLD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving WINLD (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving WINLD (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINLD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + WINLD="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting WINLD to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting WINLD to \"$new_complete\"" >&6;} + fi printf "Windows linker was found at $WINLD\n" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the found link.exe is actually the Visual Studio linker" >&5 @@ -12735,25 +21282,245 @@ fi - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$MT" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$MT"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$MT" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MT, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 fi - MT="$tmp" + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of MT, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$MT" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MT, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$MT" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving MT (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving MT (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MT, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + MT="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MT to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting MT to \"$new_complete\"" >&6;} + fi # The resource compiler # Extract the first word of "rc", so it can be a program name with args. @@ -12811,28 +21578,297 @@ fi - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$RC" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$RC"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$RC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of RC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 fi - RC="$tmp" + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of RC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$RC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi - RC_FLAGS="-nologo /l 0x409 /r" + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of RC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$RC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving RC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving RC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of RC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + RC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting RC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting RC to \"$new_complete\"" >&6;} + fi + + + # For hotspot, we need these in Windows mixed path, + # so rewrite them all. Need added .exe suffix. + HOTSPOT_CXX="$CXX.exe" + HOTSPOT_LD="$LD.exe" + HOTSPOT_MT="$MT.exe" + HOTSPOT_RC="$RC.exe" + + unix_path="$HOTSPOT_CXX" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + HOTSPOT_CXX="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + HOTSPOT_CXX="$windows_path" + fi + + + unix_path="$HOTSPOT_LD" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + HOTSPOT_LD="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + HOTSPOT_LD="$windows_path" + fi + + + unix_path="$HOTSPOT_MT" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + HOTSPOT_MT="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + HOTSPOT_MT="$windows_path" + fi + + + unix_path="$HOTSPOT_RC" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + HOTSPOT_RC="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + HOTSPOT_RC="$windows_path" + fi + + + + + RC_FLAGS="-nologo -l 0x409 -r" if test "x$VARIANT" = xOPT; then : RC_FLAGS="$RC_FLAGS -d NDEBUG" @@ -12891,25 +21927,245 @@ fi - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$WINAR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$WINAR"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINAR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINAR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 fi - WINAR="$tmp" + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of WINAR, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINAR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINAR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINAR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving WINAR (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving WINAR (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINAR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + WINAR="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting WINAR to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting WINAR to \"$new_complete\"" >&6;} + fi AR="$WINAR" ARFLAGS="-nologo -NODEFAULTLIB:MSVCRT" @@ -12952,25 +22208,245 @@ fi - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$DUMPBIN" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$DUMPBIN"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$DUMPBIN" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 fi - DUMPBIN="$tmp" + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of DUMPBIN, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$DUMPBIN" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$DUMPBIN" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving DUMPBIN (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving DUMPBIN (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + DUMPBIN="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting DUMPBIN to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting DUMPBIN to \"$new_complete\"" >&6;} + fi COMPILER_TYPE=CL @@ -13118,47 +22594,245 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$CPP" - car="${tmp%% *}" - tmp="$CPP EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$CPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of CPP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$CPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CPP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving CPP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - CPP="$car ${cdr% *}" - else - CPP="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + CPP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CPP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting CPP to \"$new_complete\"" >&6;} + fi ac_ext=cpp @@ -13295,47 +22969,245 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$CXXCPP" - car="${tmp%% *}" - tmp="$CXXCPP EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXXCPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXXCPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of CXXCPP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXXCPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXXCPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXXCPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CXXCPP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving CXXCPP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXXCPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - CXXCPP="$car ${cdr% *}" - else - CXXCPP="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + CXXCPP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CXXCPP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting CXXCPP to \"$new_complete\"" >&6;} + fi if test "x$COMPILE_TYPE" != "xcross"; then @@ -13359,7 +23231,7 @@ if test "x$OPENJDK_BUILD_OS" = xsolaris; then fi # Find the right assembler. -if test "x$OPENJDK_BUILD_OS" = xsolaris; then +if test "x$OPENJDK_TARGET_OS" = xsolaris; then # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -13401,54 +23273,252 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$AS" - car="${tmp%% *}" - tmp="$AS EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$AS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of AS, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$AS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$AS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving AS (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving AS (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - AS="$car ${cdr% *}" - else - AS="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + AS="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting AS to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting AS to \"$new_complete\"" >&6;} + fi else AS="$CC -c" fi -if test "x$OPENJDK_BUILD_OS" = xsolaris; then +if test "x$OPENJDK_TARGET_OS" = xsolaris; then for ac_prog in gnm nm do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -13495,47 +23565,245 @@ fi done - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$NM" - car="${tmp%% *}" - tmp="$NM EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving NM (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving NM (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - NM="$car ${cdr% *}" - else - NM="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + NM="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting NM to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting NM to \"$new_complete\"" >&6;} + fi # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 @@ -13578,47 +23846,245 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$STRIP" - car="${tmp%% *}" - tmp="$STRIP EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - STRIP="$car ${cdr% *}" - else - STRIP="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + STRIP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting STRIP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting STRIP to \"$new_complete\"" >&6;} + fi # Extract the first word of "mcs", so it can be a program name with args. set dummy mcs; ac_word=$2 @@ -13661,49 +24127,247 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MCS" - car="${tmp%% *}" - tmp="$MCS EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$MCS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MCS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of MCS, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$MCS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MCS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$MCS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving MCS (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving MCS (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MCS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MCS="$car ${cdr% *}" - else - MCS="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi -elif test "x$OPENJDK_BUILD_OS" != xwindows; then + if test "x$complete" != "x$new_complete"; then + MCS="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MCS to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting MCS to \"$new_complete\"" >&6;} + fi + +elif test "x$OPENJDK_TARGET_OS" != xwindows; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. set dummy ${ac_tool_prefix}nm; ac_word=$2 @@ -13797,47 +24461,245 @@ else fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$NM" - car="${tmp%% *}" - tmp="$NM EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving NM (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving NM (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - NM="$car ${cdr% *}" - else - NM="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + NM="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting NM to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting NM to \"$new_complete\"" >&6;} + fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. @@ -13932,78 +24794,615 @@ else fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$STRIP" - car="${tmp%% *}" - tmp="$STRIP EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - STRIP="$car ${cdr% *}" - else - STRIP="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + STRIP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting STRIP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting STRIP to \"$new_complete\"" >&6;} + fi + +fi + +# objcopy is used for moving debug symbols to separate files when +# full debug symbols are enabled. +if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux; then + if test -n "$ac_tool_prefix"; then + for ac_prog in gobjcopy objcopy + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OBJCOPY+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJCOPY"; then + ac_cv_prog_OBJCOPY="$OBJCOPY" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJCOPY="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJCOPY=$ac_cv_prog_OBJCOPY +if test -n "$OBJCOPY"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCOPY" >&5 +$as_echo "$OBJCOPY" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$OBJCOPY" && break + done +fi +if test -z "$OBJCOPY"; then + ac_ct_OBJCOPY=$OBJCOPY + for ac_prog in gobjcopy objcopy +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OBJCOPY+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJCOPY"; then + ac_cv_prog_ac_ct_OBJCOPY="$ac_ct_OBJCOPY" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJCOPY="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJCOPY=$ac_cv_prog_ac_ct_OBJCOPY +if test -n "$ac_ct_OBJCOPY"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJCOPY" >&5 +$as_echo "$ac_ct_OBJCOPY" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_OBJCOPY" && break +done + + if test "x$ac_ct_OBJCOPY" = x; then + OBJCOPY="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJCOPY=$ac_ct_OBJCOPY + fi +fi + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJCOPY" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of OBJCOPY, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJCOPY" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJCOPY" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving OBJCOPY (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving OBJCOPY (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + OBJCOPY="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OBJCOPY to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting OBJCOPY to \"$new_complete\"" >&6;} + fi fi -### -# -# Check for objcopy -# -# but search for gobjcopy first... -# since I on solaris found a broken objcopy...buhh -# if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gobjcopy", so it can be a program name with args. -set dummy ${ac_tool_prefix}gobjcopy; ac_word=$2 + for ac_prog in gobjdump objdump + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_OBJCOPY+set}" = set; then : +if test "${ac_cv_prog_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $OBJCOPY in - [\\/]* | ?:[\\/]*) - ac_cv_path_OBJCOPY="$OBJCOPY" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_OBJCOPY="$as_dir/$ac_word$ac_exec_ext" + ac_cv_prog_OBJDUMP="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -14011,42 +25410,43 @@ done done IFS=$as_save_IFS - ;; -esac fi -OBJCOPY=$ac_cv_path_OBJCOPY -if test -n "$OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCOPY" >&5 -$as_echo "$OBJCOPY" >&6; } +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi + test -n "$OBJDUMP" && break + done fi -if test -z "$ac_cv_path_OBJCOPY"; then - ac_pt_OBJCOPY=$OBJCOPY - # Extract the first word of "gobjcopy", so it can be a program name with args. -set dummy gobjcopy; ac_word=$2 +if test -z "$OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + for ac_prog in gobjdump objdump +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_OBJCOPY+set}" = set; then : +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $ac_pt_OBJCOPY in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_OBJCOPY="$ac_pt_OBJCOPY" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_OBJCOPY="$as_dir/$ac_word$ac_exec_ext" + ac_cv_prog_ac_ct_OBJDUMP="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -14054,20 +25454,23 @@ done done IFS=$as_save_IFS - ;; -esac fi -ac_pt_OBJCOPY=$ac_cv_path_ac_pt_OBJCOPY -if test -n "$ac_pt_OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_OBJCOPY" >&5 -$as_echo "$ac_pt_OBJCOPY" >&6; } +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - if test "x$ac_pt_OBJCOPY" = x; then - OBJCOPY="" + + test -n "$ac_ct_OBJDUMP" && break +done + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="" else case $cross_compiling:$ac_tool_warned in yes:) @@ -14075,110 +25478,252 @@ yes:) $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - OBJCOPY=$ac_pt_OBJCOPY + OBJDUMP=$ac_ct_OBJDUMP fi -else - OBJCOPY="$ac_cv_path_OBJCOPY" fi -if test "x$OBJCOPY" = x; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objcopy", so it can be a program name with args. -set dummy ${ac_tool_prefix}objcopy; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_OBJCOPY+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $OBJCOPY in - [\\/]* | ?:[\\/]*) - ac_cv_path_OBJCOPY="$OBJCOPY" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_OBJCOPY="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 +if test "x$OBJDUMP" != x; then + # Only used for compare.sh; we can live without it. BASIC_FIXUP_EXECUTABLE bails if argument is missing. + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJDUMP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + fi fi -done - done -IFS=$as_save_IFS - ;; -esac -fi -OBJCOPY=$ac_cv_path_OBJCOPY -if test -n "$OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCOPY" >&5 -$as_echo "$OBJCOPY" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_OBJCOPY"; then - ac_pt_OBJCOPY=$OBJCOPY - # Extract the first word of "objcopy", so it can be a program name with args. -set dummy objcopy; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_OBJCOPY+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_OBJCOPY in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_OBJCOPY="$ac_pt_OBJCOPY" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_OBJCOPY="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_OBJCOPY=$ac_cv_path_ac_pt_OBJCOPY -if test -n "$ac_pt_OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_OBJCOPY" >&5 -$as_echo "$ac_pt_OBJCOPY" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_OBJCOPY" = x; then - OBJCOPY="" + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of OBJDUMP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + fi else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJCOPY=$ac_pt_OBJCOPY + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJDUMP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJDUMP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving OBJDUMP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving OBJDUMP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + OBJDUMP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OBJDUMP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting OBJDUMP to \"$new_complete\"" >&6;} fi -else - OBJCOPY="$ac_cv_path_OBJCOPY" -fi fi @@ -14224,47 +25769,245 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$LIPO" - car="${tmp%% *}" - tmp="$LIPO EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$LIPO" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of LIPO, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of LIPO, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$LIPO" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of LIPO, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$LIPO" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving LIPO (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving LIPO (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of LIPO, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - LIPO="$car ${cdr% *}" - else - LIPO="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + LIPO="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting LIPO to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting LIPO to \"$new_complete\"" >&6;} + fi fi @@ -14800,7 +26543,7 @@ if test "x$GCC" = xyes; then POST_STRIP_CMD="$STRIP -g" # Linking is different on MacOSX - if test "x$OPENJDK_BUILD_OS" = xmacosx; then + if test "x$OPENJDK_TARGET_OS" = xmacosx; then # Might change in the future to clang. COMPILER_NAME=gcc SHARED_LIBRARY='lib$1.dylib' @@ -14814,7 +26557,7 @@ if test "x$GCC" = xyes; then POST_STRIP_CMD="$STRIP -S" fi else - if test "x$OPENJDK_BUILD_OS" = xsolaris; then + if test "x$OPENJDK_TARGET_OS" = xsolaris; then # If it is not gcc, then assume it is the Oracle Solaris Studio Compiler COMPILER_NAME=ossc PICFLAG="-KPIC" @@ -14838,7 +26581,7 @@ else POST_STRIP_CMD="$STRIP -x" POST_MCS_CMD="$MCS -d -a \"JDK $FULL_VERSION\"" fi - if test "x$OPENJDK_BUILD_OS" = xwindows; then + if test "x$OPENJDK_TARGET_OS" = xwindows; then # If it is not gcc, then assume it is the MS Visual Studio compiler COMPILER_NAME=cl PICFLAG="" @@ -14986,6 +26729,11 @@ case $COMPILER_TYPE in # Can cause undefined external on Solaris 8 X86 on __sincos, removing for now #CC_HIGHEST="$CC_HIGHEST -xlibmopt" + if test "x$OPENJDK_TARGET_CPU" = xsparc; then + CFLAGS_JDK="${CFLAGS_JDK} -xmemalign=4s" + CXXFLAGS_JDK="${CXXFLAGS_JDK} -xmemalign=4s" + fi + case $OPENJDK_TARGET_CPU_ARCH in x86) C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xregs=no%frameptr" @@ -15002,8 +26750,6 @@ case $COMPILER_TYPE in fi ;; sparc) - CFLAGS_JDK="${CFLAGS_JDK} -xmemalign=4s" - CXXFLAGS_JDK="${CXXFLAGS_JDK} -xmemalign=4s" CFLAGS_JDKLIB_EXTRA="${CFLAGS_JDKLIB_EXTRA} -xregs=no%appl" CXXFLAGS_JDKLIB_EXTRA="${CXXFLAGS_JDKLIB_EXTRA} -xregs=no%appl" C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra" @@ -15132,7 +26878,7 @@ case $COMPILER_NAME in CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS" case $OPENJDK_TARGET_CPU_ARCH in x86 ) - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -Di386" + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB" CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE" ;; esac @@ -15232,7 +26978,7 @@ CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK" # libraries will link to whatever is in memory. Yuck. # # Thus we offer the compiler to find libjvm.so first in server then in client. It works. Ugh. -if test "x$COMPILER_TYPE" = xCL; then +if test "x$COMPILER_NAME" = xcl; then LDFLAGS_JDK="$LDFLAGS_JDK -nologo -opt:ref -incremental:no" if test "x$OPENJDK_TARGET_CPU" = xx86; then LDFLAGS_JDK="$LDFLAGS_JDK -safeseh" @@ -15248,19 +26994,23 @@ if test "x$COMPILER_TYPE" = xCL; then fi LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE" else - # If this is a --hash-style=gnu system, use --hash-style=both, why? - HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` - if test -n "$HAS_GNU_HASH"; then - # And since we now know that the linker is gnu, then add -z defs, to forbid - # undefined symbols in object files. - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both -Xlinker -z -Xlinker defs" - if test "x$DEBUG_LEVEL" == "xrelease"; then - # When building release libraries, tell the linker optimize them. - # Should this be supplied to the OSS linker as well? - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + if test "x$COMPILER_NAME" = xgcc; then + # If this is a --hash-style=gnu system, use --hash-style=both, why? + HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` + if test -n "$HAS_GNU_HASH"; then + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both " + fi + if test "x$OPENJDK_TARGET_OS" = xlinux; then + # And since we now know that the linker is gnu, then add -z defs, to forbid + # undefined symbols in object files. + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs" + if test "x$DEBUG_LEVEL" = "xrelease"; then + # When building release libraries, tell the linker optimize them. + # Should this be supplied to the OSS linker as well? + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + fi fi fi - LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/server \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/client \ @@ -15307,53 +27057,6 @@ esac -# After we have toolchain, we can compile the uncygdrive helper - -# When using cygwin, we need a wrapper binary that renames -# /cygdrive/c/ arguments into c:/ arguments and peeks into -# @files and rewrites these too! This wrapper binary is -# called uncygdrive.exe. -UNCYGDRIVE= -if test "x$OPENJDK_BUILD_OS" = xwindows; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if uncygdrive can be created" >&5 -$as_echo_n "checking if uncygdrive can be created... " >&6; } - UNCYGDRIVE_SRC=`$CYGPATH -m $SRC_ROOT/common/src/uncygdrive.c` - rm -f $OUTPUT_ROOT/uncygdrive* - UNCYGDRIVE=`$CYGPATH -m $OUTPUT_ROOT/uncygdrive.exe` - cd $OUTPUT_ROOT - $CC $UNCYGDRIVE_SRC /Fe$UNCYGDRIVE > $OUTPUT_ROOT/uncygdrive1.log 2>&1 - cd $CURDIR - - if test ! -x $OUTPUT_ROOT/uncygdrive.exe; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - cat $OUTPUT_ROOT/uncygdrive1.log - as_fn_error $? "Could not create $OUTPUT_ROOT/uncygdrive.exe" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNCYGDRIVE" >&5 -$as_echo "$UNCYGDRIVE" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if uncygdrive.exe works" >&5 -$as_echo_n "checking if uncygdrive.exe works... " >&6; } - cd $OUTPUT_ROOT - $UNCYGDRIVE $CC $SRC_ROOT/common/src/uncygdrive.c /Fe$OUTPUT_ROOT/uncygdrive2.exe > $OUTPUT_ROOT/uncygdrive2.log 2>&1 - cd $CURDIR - if test ! -x $OUTPUT_ROOT/uncygdrive2.exe; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - cat $OUTPUT_ROOT/uncygdrive2.log - as_fn_error $? "Uncygdrive did not work!" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - rm -f $OUTPUT_ROOT/uncygdrive?.??? $OUTPUT_ROOT/uncygdrive.obj - # The path to uncygdrive to use should be Unix-style - UNCYGDRIVE="$OUTPUT_ROOT/uncygdrive.exe" -fi - - - - - # Setup debug symbols (need objcopy from the toolchain for that) # @@ -15384,7 +27087,7 @@ fi if test "x$ENABLE_DEBUG_SYMBOLS" = "xdefault"; then # Default is on if objcopy is found, otherwise off - if test "x$OBJCOPY" != x; then + if test "x$OBJCOPY" != x || test "x$OPENJDK_TARGET_OS" = xwindows; then ENABLE_DEBUG_SYMBOLS=yes else ENABLE_DEBUG_SYMBOLS=no @@ -15536,7 +27239,6 @@ fi - ############################################################################### # # Check for X Windows @@ -16308,10 +28010,15 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu OLD_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" + +# Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10 for ac_header in X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " # include + # include + +" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 @@ -16323,6 +28030,7 @@ fi done + CFLAGS="$OLD_CFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' @@ -16382,28 +28090,20 @@ if test "${with_cups_include+set}" = set; then : fi -# Check whether --with-cups-lib was given. -if test "${with_cups_lib+set}" = set; then : - withval=$with_cups_lib; -fi - - if test "x$CUPS_NOT_NEEDED" = xyes; then - if test "x${with_cups}" != x || test "x${with_cups_include}" != x || test "x${with_cups_lib}" != x; then + if test "x${with_cups}" != x || test "x${with_cups_include}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cups not used, so --with-cups is ignored" >&5 $as_echo "$as_me: WARNING: cups not used, so --with-cups is ignored" >&2;} fi CUPS_CFLAGS= - CUPS_LIBS= else CUPS_FOUND=no - if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno || test "x${with_cups_lib}" = xno; then + if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno; then as_fn_error $? "It is not possible to disable the use of cups. Remove the --without-cups option." "$LINENO" 5 fi if test "x${with_cups}" != x; then - CUPS_LIBS="-L${with_cups}/lib -lcups" CUPS_CFLAGS="-I${with_cups}/include" CUPS_FOUND=yes fi @@ -16411,10 +28111,6 @@ else CUPS_CFLAGS="-I${with_cups_include}" CUPS_FOUND=yes fi - if test "x${with_cups_lib}" != x; then - CUPS_LIBS="-L${with_cups_lib} -lcups" - CUPS_FOUND=yes - fi if test "x$CUPS_FOUND" = xno; then @@ -16572,7 +28268,6 @@ if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : _ACEOF CUPS_FOUND=yes CUPS_CFLAGS= - CUPS_LIBS="-lcups" DEFAULT_CUPS=yes fi @@ -16582,18 +28277,16 @@ done if test "x$CUPS_FOUND" = xno; then # Getting nervous now? Lets poke around for standard Solaris third-party # package installation locations. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cups headers and libs" >&5 -$as_echo_n "checking for cups headers and libs... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cups headers" >&5 +$as_echo_n "checking for cups headers... " >&6; } if test -s /opt/sfw/cups/include/cups/cups.h; then # An SFW package seems to be installed! CUPS_FOUND=yes CUPS_CFLAGS="-I/opt/sfw/cups/include" - CUPS_LIBS="-L/opt/sfw/cups/lib -lcups" elif test -s /opt/csw/include/cups/cups.h; then # A CSW package seems to be installed! CUPS_FOUND=yes CUPS_CFLAGS="-I/opt/csw/include" - CUPS_LIBS="-L/opt/csw/lib -lcups" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_FOUND" >&5 $as_echo "$CUPS_FOUND" >&6; } @@ -16633,7 +28326,6 @@ fi - ############################################################################### # # The ubiquitous freetype2 library is used to render fonts. @@ -16661,32 +28353,138 @@ else if test "x$with_freetype" != x; then - # Fail with message the path to freetype if var with_freetype contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$with_freetype" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - with_freetype=`$CYGPATH -s -m -a "$with_freetype"` - # Now it's case insensitive; let's make it lowercase to improve readability - with_freetype=`$ECHO "$with_freetype" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - with_freetype=`$CYGPATH -u "$with_freetype"` - else - as_fn_error $? "You cannot have spaces in the path to freetype! \"$with_freetype\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$with_freetype" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of with_freetype, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of with_freetype, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of with_freetype" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + with_freetype="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting with_freetype to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting with_freetype to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$with_freetype" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + with_freetype="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting with_freetype to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting with_freetype to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$with_freetype" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of with_freetype, which resolves as \"$path\", is not found." "$LINENO" 5 fi + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of with_freetype, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of with_freetype, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + FREETYPE2_LIBS="-L$with_freetype/lib -lfreetype" + FREETYPE2_LIB_PATH="$with_freetype/lib" + if test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$OPENJDK_TARGET_CPU" = xx86_64 && test -d "$with_freetype/lib/amd64"; then + FREETYPE2_LIBS="-L$with_freetype/lib/amd64 -lfreetype" + FREETYPE2_LIB_PATH="$with_freetype/lib/amd64" + fi if test "x$OPENJDK_TARGET_OS" = xwindows; then FREETYPE2_LIBS="$with_freetype/lib/freetype.lib" fi - FREETYPE2_LIB_PATH="$with_freetype/lib" FREETYPE2_CFLAGS="-I$with_freetype/include" if test -s $with_freetype/include/ft2build.h && test -d $with_freetype/include/freetype2/freetype; then FREETYPE2_CFLAGS="-I$with_freetype/include/freetype2 -I$with_freetype/include" fi - FREETYPE2_FOUND=yes + FREETYPE2_FOUND=yes if test "x$FREETYPE2_FOUND" = xyes; then # Verify that the directories exist if ! test -d "$with_freetype/lib" || ! test -d "$with_freetype/include"; then @@ -16695,7 +28493,7 @@ else # List the contents of the lib. FREETYPELIB=`ls $with_freetype/lib/libfreetype.so $with_freetype/lib/freetype.dll 2> /dev/null` if test "x$FREETYPELIB" = x; then - as_fn_error $? "Could not find libfreetype.se nor freetype.dll in $with_freetype/lib" "$LINENO" 5 + as_fn_error $? "Could not find libfreetype.so nor freetype.dll in $with_freetype/lib" "$LINENO" 5 fi # Check one h-file if ! test -s "$with_freetype/include/ft2build.h"; then @@ -16851,6 +28649,145 @@ $as_echo "$as_me: Downloading build dependency freetype2 from $with_builddeps_se USING_SYSTEM_FT_LIB=true fi + if test "x$FREETYPE2_FOUND" = xno && test "x$OPENJDK_TARGET_OS" = xwindows; then + FREETYPELOCATION="$PROGRAMFILES/GnuWin32" + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$FREETYPELOCATION" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of FREETYPELOCATION" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-stile (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + FREETYPELOCATION="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FREETYPELOCATION to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting FREETYPELOCATION to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$FREETYPELOCATION" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + FREETYPELOCATION="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FREETYPELOCATION to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting FREETYPELOCATION to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a posix platform. Hooray! :) + path="$FREETYPELOCATION" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of FREETYPELOCATION, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype in some standard windows locations" >&5 +$as_echo_n "checking for freetype in some standard windows locations... " >&6; } + if test -s "$FREETYPELOCATION/include/ft2build.h" && test -d "$FREETYPELOCATION/include/freetype2/freetype"; then + FREETYPE2_CFLAGS="-I$FREETYPELOCATION/include/freetype2 -I$FREETYPELOCATION/include" + FREETYPE2_LIBS="$FREETYPELOCATION/lib/freetype.lib" + FREETYPE2_LIB_PATH="$FREETYPELOCATION/lib" + if ! test -s "$FREETYPE2_LIBS"; then + as_fn_error $? "Could not find $FREETYPE2_LIBS" "$LINENO" 5 + fi + if ! test -s "$FREETYPE2_LIB_PATH/freetype.dll"; then + as_fn_error $? "Could not find $FREETYPE2_LIB_PATH/freetype.dll" "$LINENO" 5 + fi + USING_SYSTEM_FT_LIB=true + FREETYPE2_FOUND=yes + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE2_FOUND" >&5 +$as_echo "$FREETYPE2_FOUND" >&6; } + fi if test "x$FREETYPE2_FOUND" = xno; then pkg_failed=no @@ -16919,7 +28856,13 @@ else $as_echo "yes" >&6; } FREETYPE2_FOUND=yes fi + # On solaris, pkg_check adds -lz to freetype libs, which isn't necessary for us. + FREETYPE2_LIBS=`$ECHO $FREETYPE2_LIBS | $SED 's/-lz//g'` USING_SYSTEM_FT_LIB=true + # 64-bit libs for Solaris x86 are installed in the amd64 subdirectory, change lib to lib/amd64 + if test "x$FREETYPE2_FOUND" = xyes && test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + FREETYPE2_LIBS=`$ECHO $FREETYPE2_LIBS | $SED 's?/lib?/lib/amd64?g'` + fi fi if test "x$FREETYPE2_FOUND" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype in some standard locations" >&5 @@ -16993,6 +28936,60 @@ $as_echo "$FREETYPE2_FOUND" >&6; } as_fn_error $? "Could not find freetype2! $HELP_MSG " "$LINENO" 5 fi + + if test "x$OPENJDK_TARGET_OS" != xwindows; then + # AC_CHECK_LIB does not support use of cl.exe + PREV_LDFLAGS="$LDFLAGS" + LDFLAGS="$FREETYPE2_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT_Init_FreeType in -lfreetype" >&5 +$as_echo_n "checking for FT_Init_FreeType in -lfreetype... " >&6; } +if test "${ac_cv_lib_freetype_FT_Init_FreeType+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char FT_Init_FreeType (); +int +main () +{ +return FT_Init_FreeType (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_freetype_FT_Init_FreeType=yes +else + ac_cv_lib_freetype_FT_Init_FreeType=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freetype_FT_Init_FreeType" >&5 +$as_echo "$ac_cv_lib_freetype_FT_Init_FreeType" >&6; } +if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBFREETYPE 1 +_ACEOF + + LIBS="-lfreetype $LIBS" + +else + as_fn_error $? "Could not find freetype2! $HELP_MSG " "$LINENO" 5 +fi + + LDFLAGS="$PREV_LDFLAGS" + fi fi @@ -17795,16 +29792,19 @@ $as_echo_n "checking how to link with libstdc++... " >&6; } if test "x$enable_static_link_stdc__" = xyes; then LIBCXX="$LIBCXX $STATIC_STDCXX_FLAGS" LDCXX="$CC" + STATIC_CXX_SETTING="STATIC_CXX=true" { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } else LIBCXX="$LIBCXX -lstdc++" LDCXX="$CXX" + STATIC_CXX_SETTING="STATIC_CXX=false" { $as_echo "$as_me:${as_lineno-$LINENO}: result: dynamic" >&5 $as_echo "dynamic" >&6; } fi fi + # libCrun is the c++ runtime-library with SunStudio (roughly the equivalent of gcc's libstdc++.so) if test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$LIBCXX" = x; then LIBCXX="/usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libCrun.so.1" @@ -17819,6 +29819,66 @@ fi +# After we have toolchain and the paths to all libraries (needed by msys), we can compile the fixpath helper + +# When using cygwin or msys, we need a wrapper binary that renames +# /cygdrive/c/ arguments into c:/ arguments and peeks into +# @files and rewrites these too! This wrapper binary is +# called fixpath. +FIXPATH= +if test "x$OPENJDK_BUILD_OS" = xwindows; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fixpath can be created" >&5 +$as_echo_n "checking if fixpath can be created... " >&6; } + FIXPATH_SRC="$SRC_ROOT/common/src/fixpath.c" + FIXPATH_BIN="$OUTPUT_ROOT/fixpath.exe" + if test "x$OPENJDK_BUILD_OS_ENV" = xwindows.cygwin; then + FIXPATH_SRC=`$CYGPATH -m $FIXPATH_SRC` + FIXPATH_BIN=`$CYGPATH -m $FIXPATH_BIN` + # Important to keep the .exe suffix on Cygwin for Hotspot makefiles + FIXPATH="$OUTPUT_ROOT/fixpath.exe -c" + elif test "x$OPENJDK_BUILD_OS_ENV" = xwindows.msys; then + FIXPATH_SRC=`cmd //c echo $FIXPATH_SRC` + FIXPATH_BIN=`cmd //c echo $FIXPATH_BIN` + + # Take all collected prefixes and turn them into a -m/c/foo@/c/bar@... command line + # @ was chosen as separator to minimize risk of other tools messing around with it + all_unique_prefixes=`echo "${all_fixpath_prefixes[@]}" | tr ' ' '\n' | grep '^/./' | sort | uniq` + fixpath_argument_list=`echo $all_unique_prefixes | tr ' ' '@'` + + FIXPATH="$OUTPUT_ROOT/fixpath -m$fixpath_argument_list" + fi + rm -f $OUTPUT_ROOT/fixpath* + cd $OUTPUT_ROOT + $CC $FIXPATH_SRC -Fe$FIXPATH_BIN > $OUTPUT_ROOT/fixpath1.log 2>&1 + cd $CURDIR + + if test ! -x $OUTPUT_ROOT/fixpath.exe; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + cat $OUTPUT_ROOT/fixpath1.log + as_fn_error $? "Could not create $OUTPUT_ROOT/fixpath.exe" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fixpath.exe works" >&5 +$as_echo_n "checking if fixpath.exe works... " >&6; } + cd $OUTPUT_ROOT + $FIXPATH $CC $SRC_ROOT/common/src/fixpath.c -Fe$OUTPUT_ROOT/fixpath2.exe > $OUTPUT_ROOT/fixpath2.log 2>&1 + cd $CURDIR + if test ! -x $OUTPUT_ROOT/fixpath2.exe; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + cat $OUTPUT_ROOT/fixpath2.log + as_fn_error $? "fixpath did not work!" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + rm -f $OUTPUT_ROOT/fixpath?.??? $OUTPUT_ROOT/fixpath.obj +fi + + + + ############################################################################### # # We need to do some final tweaking, when everything else is done. @@ -17873,6 +29933,10 @@ $as_echo_n "checking for number of cores... " >&6; } # Looks like a MacOSX system NUM_CORES=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Cores' | awk '{print $5}'` FOUND_CORES=yes + elif test -n "$NUMBER_OF_PROCESSORS"; then + # On windows, look in the env + NUM_CORES=$NUMBER_OF_PROCESSORS + FOUND_CORES=yes fi # For c/c++ code we run twice as many concurrent build @@ -17883,8 +29947,10 @@ $as_echo_n "checking for number of cores... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NUM_CORES" >&5 $as_echo "$NUM_CORES" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect number of cores, defaulting to 1!" >&5 -$as_echo "could not detect number of cores, defaulting to 1!" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect number of cores, defaulting to 1" >&5 +$as_echo "could not detect number of cores, defaulting to 1" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This will disable all parallelism from build!" >&5 +$as_echo "$as_me: WARNING: This will disable all parallelism from build!" >&2;} fi @@ -17926,9 +29992,10 @@ $as_echo_n "checking for memory size... " >&6; } MEMORY_SIZE=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Memory' | awk '{print $2}'` MEMORY_SIZE=`expr $MEMORY_SIZE \* 1024` FOUND_MEM=yes - elif test "x$build_os" = xwindows; then + elif test "x$OPENJDK_BUILD_OS" = xwindows; then # Windows, but without cygwin - MEMORY_SIZE=`systeminfo | grep 'Total Physical Memory:' | awk '{ print $4 }' | sed 's/,//'` + MEMORY_SIZE=`wmic computersystem get totalphysicalmemory -value | grep = | cut -d "=" -f 2-` + MEMORY_SIZE=`expr $MEMORY_SIZE / 1024 / 1024` FOUND_MEM=yes fi @@ -17936,8 +30003,10 @@ $as_echo_n "checking for memory size... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MEMORY_SIZE MB" >&5 $as_echo "$MEMORY_SIZE MB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect memory size defaulting to 1024 MB!" >&5 -$as_echo "could not detect memory size defaulting to 1024 MB!" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect memory size, defaulting to 1024 MB" >&5 +$as_echo "could not detect memory size, defaulting to 1024 MB" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This might seriously impact build performance!" >&5 +$as_echo "$as_me: WARNING: This might seriously impact build performance!" >&2;} fi else @@ -18366,11 +30435,26 @@ $as_echo_n "checking if build directory is on local disk... " >&6; } # df -l lists only local disks; if the given directory is not found then # a non-zero exit code is given - if $DF -l $OUTPUT_ROOT > /dev/null 2>&1; then - OUTPUT_DIR_IS_LOCAL="yes" - else - OUTPUT_DIR_IS_LOCAL="no" - fi + if test "x$DF" = x; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + # msys does not have df; use Windows "net use" instead. + IS_NETWORK_DISK=`net use | grep \`pwd -W | cut -d ":" -f 1 | tr a-z A-Z\`:` + if test "x$IS_NETWORK_DISK" = x; then + OUTPUT_DIR_IS_LOCAL="yes" + else + OUTPUT_DIR_IS_LOCAL="no" + fi + else + # No df here, say it's local + OUTPUT_DIR_IS_LOCAL="yes" + fi + else + if $DF -l $OUTPUT_ROOT > /dev/null 2>&1; then + OUTPUT_DIR_IS_LOCAL="yes" + else + OUTPUT_DIR_IS_LOCAL="no" + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OUTPUT_DIR_IS_LOCAL" >&5 $as_echo "$OUTPUT_DIR_IS_LOCAL" >&6; } @@ -18909,7 +30993,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by openjdk $as_me jdk8, which was +This file was extended by OpenJDK $as_me jdk8, which was generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18965,13 +31049,14 @@ $config_files Configuration headers: $config_headers -Report bugs to ." +Report bugs to . +OpenJDK home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -openjdk config.status jdk8 +OpenJDK config.status jdk8 configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" @@ -19718,7 +31803,15 @@ printf "* Debug level: $DEBUG_LEVEL\n" printf "* JDK variant: $JDK_VARIANT\n" printf "* JVM variants: $with_jvm_variants\n" printf "* OpenJDK target: OS: $OPENJDK_TARGET_OS, CPU architecture: $OPENJDK_TARGET_CPU_ARCH, address length: $OPENJDK_TARGET_CPU_BITS\n" -printf "* Boot JDK: $BOOT_JDK\n" + +printf "\n" +printf "Tools summary:\n" +if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + printf "* Environment: $WINDOWS_ENV_VENDOR version $WINDOWS_ENV_VERSION (root at $WINDOWS_ENV_ROOT_PATH)\n" +fi +printf "* Boot JDK: $BOOT_JDK_VERSION (at $BOOT_JDK)\n" +printf "* C Compiler: $CC_VENDOR version $CC_VERSION (at $CC)\n" +printf "* C++ Compiler: $CXX_VENDOR version $CXX_VERSION (at $CXX)\n" printf "\n" printf "Build performance summary:\n" diff --git a/common/autoconf/help.m4 b/common/autoconf/help.m4 index 01b48172dae..12ff371dd20 100644 --- a/common/autoconf/help.m4 +++ b/common/autoconf/help.m4 @@ -55,6 +55,19 @@ AC_DEFUN([HELP_MSG_MISSING_DEPENDENCY], fi ]) +cygwin_help() { + case $1 in + unzip) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P unzip" ;; + zip) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P zip" ;; + make) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P make" ;; + * ) + break ;; + esac +} + apt_help() { case $1 in devkit) @@ -149,7 +162,15 @@ printf "* Debug level: $DEBUG_LEVEL\n" printf "* JDK variant: $JDK_VARIANT\n" printf "* JVM variants: $with_jvm_variants\n" printf "* OpenJDK target: OS: $OPENJDK_TARGET_OS, CPU architecture: $OPENJDK_TARGET_CPU_ARCH, address length: $OPENJDK_TARGET_CPU_BITS\n" -printf "* Boot JDK: $BOOT_JDK\n" + +printf "\n" +printf "Tools summary:\n" +if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + printf "* Environment: $WINDOWS_ENV_VENDOR version $WINDOWS_ENV_VERSION (root at $WINDOWS_ENV_ROOT_PATH)\n" +fi +printf "* Boot JDK: $BOOT_JDK_VERSION (at $BOOT_JDK)\n" +printf "* C Compiler: $CC_VENDOR version $CC_VERSION (at $CC)\n" +printf "* C++ Compiler: $CXX_VENDOR version $CXX_VERSION (at $CXX)\n" printf "\n" printf "Build performance summary:\n" diff --git a/common/autoconf/hotspot-spec.gmk.in b/common/autoconf/hotspot-spec.gmk.in index b4e9d5c95e7..68cc8e4eea7 100644 --- a/common/autoconf/hotspot-spec.gmk.in +++ b/common/autoconf/hotspot-spec.gmk.in @@ -48,8 +48,8 @@ ALT_CUPS_HEADERS_PATH:=$(patsubst -I%,%,$(filter -I%,@CUPS_CFLAGS@)) # The HOSTCC/HOSTCXX is Hotspot terminology for the BUILD_CC/BUILD_CXX, i.e. the # compiler that produces code that can be run on the build platform. -HOSTCC:=@UNCYGDRIVE@ @BUILD_CC@ -HOSTCXX:=@UNCYGDRIVE@ @BUILD_CXX@ +HOSTCC:=@FIXPATH@ @BUILD_CC@ +HOSTCXX:=@FIXPATH@ @BUILD_CXX@ #################################################### # @@ -78,13 +78,23 @@ ARCH=$(OPENJDK_TARGET_CPU_LEGACY) ALT_OUTPUTDIR=$(HOTSPOT_OUTPUTDIR) ALT_EXPORT_PATH=$(HOTSPOT_DIST) -HOTSPOT_MAKE_ARGS:=@HOTSPOT_MAKE_ARGS@ +HOTSPOT_MAKE_ARGS:=@HOTSPOT_MAKE_ARGS@ @STATIC_CXX_SETTING@ # This is used from the libjvm build for C/C++ code. HOTSPOT_BUILD_JOBS:=@CONCURRENT_BUILD_JOBS@ # Control wether Hotspot runs Queens test after building TEST_IN_BUILD=@TEST_IN_BUILD@ +# For hotspot, override compiler/tools definition to not include FIXPATH prefix. +# Hotspot has its own handling on the Windows path situation. +CXX:=@CCACHE@ @HOTSPOT_CXX@ +LD:=@HOTSPOT_LD@ +MT:=@HOTSPOT_MT@ +RC:=@HOTSPOT_RC@ EXTRA_CFLAGS=@LEGACY_EXTRA_CFLAGS@ EXTRA_CXXFLAGS=@LEGACY_EXTRA_CXXFLAGS@ EXTRA_LDFLAGS=@LEGACY_EXTRA_LDFLAGS@ + +# Sneak this in via the spec.gmk file, since we don't want to mess around too much with the Hotspot make files. +# This is needed to get the LOG setting to work properly. +include $(SRC_ROOT)/common/makefiles/MakeBase.gmk diff --git a/common/autoconf/jdk-options.m4 b/common/autoconf/jdk-options.m4 index 92d97e21cf2..16fb7dc5589 100644 --- a/common/autoconf/jdk-options.m4 +++ b/common/autoconf/jdk-options.m4 @@ -64,7 +64,7 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JVM_VARIANTS], # ie normal interpreter and C1, only the serial GC, kernel jvmti etc # zero: no machine code interpreter, no compiler # zeroshark: zero interpreter and shark/llvm compiler backend -AC_MSG_CHECKING([which variants of the JVM that should be built]) +AC_MSG_CHECKING([which variants of the JVM to build]) AC_ARG_WITH([jvm-variants], [AS_HELP_STRING([--with-jvm-variants], [JVM variants (separated by commas) to build (server, client, kernel, zero, zeroshark) @<:@server@:>@])]) @@ -241,40 +241,39 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_OPTIONS], # Should we build only OpenJDK even if closed sources are present? # AC_ARG_ENABLE([openjdk-only], [AS_HELP_STRING([--enable-openjdk-only], - [build OpenJDK regardless of the presence of closed repositories @<:@disabled@:>@])],,) + [supress building closed source even if present @<:@disabled@:>@])],,[enable_openjdk_only="no"]) -if test "x$enable_openjdk_only" = "xyes"; then - OPENJDK=true -elif test "x$enable_openjdk_only" = "xno"; then - OPENJDK=false -elif test -d "$SRC_ROOT/jdk/src/closed"; then - OPENJDK=false +AC_MSG_CHECKING([for presence of closed sources]) +if test -d "$SRC_ROOT/jdk/src/closed"; then + CLOSED_SOURCE_PRESENT=yes else + CLOSED_SOURCE_PRESENT=no +fi +AC_MSG_RESULT([$CLOSED_SOURCE_PRESENT]) + +AC_MSG_CHECKING([if closed source is supressed (openjdk-only)]) +SUPRESS_CLOSED_SOURCE="$enable_openjdk_only" +AC_MSG_RESULT([$SUPRESS_CLOSED_SOURCE]) + +if test "x$CLOSED_SOURCE_PRESENT" = xno; then + OPENJDK=true + if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then + AC_MSG_WARN([No closed source present, --enable-openjdk-only makes no sense]) + fi +else + if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then OPENJDK=true + else + OPENJDK=false + fi fi if test "x$OPENJDK" = "xtrue"; then - SET_OPENJDK=OPENJDK=true + SET_OPENJDK="OPENJDK=true" fi AC_SUBST(SET_OPENJDK) -############################################################################### -# -# JIGSAW or not. The JIGSAW variable is used during the intermediate -# stage when we are building both the old style JDK and the new style modularized JDK. -# When the modularized JDK is finalized, this option will go away. -# -AC_ARG_ENABLE([jigsaw], [AS_HELP_STRING([--enable-jigsaw], - [build Jigsaw images (not yet available) @<:@disabled@:>@])],,) - -if test "x$enable_jigsaw" = "xyes"; then - JIGSAW=true -else - JIGSAW=false -fi -AC_SUBST(JIGSAW) - ############################################################################### # # Should we build a JDK/JVM with headful support (ie a graphical ui)? @@ -282,7 +281,7 @@ AC_SUBST(JIGSAW) # AC_MSG_CHECKING([headful support]) AC_ARG_ENABLE([headful], [AS_HELP_STRING([--disable-headful], - [build headful support (graphical UI support) @<:@enabled@:>@])], + [disable building headful support (graphical UI support) @<:@enabled@:>@])], [SUPPORT_HEADFUL=${enable_headful}], [SUPPORT_HEADFUL=yes]) SUPPORT_HEADLESS=yes @@ -305,25 +304,9 @@ AC_SUBST(SUPPORT_HEADLESS) AC_SUBST(SUPPORT_HEADFUL) AC_SUBST(BUILD_HEADLESS) -############################################################################### -# -# Should we compile nimbus swing L&F? We can probably remove this option -# since nimbus is officially part of javax now. -# -AC_MSG_CHECKING([whether to build nimbus L&F]) -AC_ARG_ENABLE([nimbus], [AS_HELP_STRING([--disable-nimbus], - [disable Nimbus L&F @<:@enabled@:>@])], - [ENABLE_NIMBUS="${enableval}"], [ENABLE_NIMBUS='yes']) -AC_MSG_RESULT([$ENABLE_NIMBUS]) -DISABLE_NIMBUS= -if test "x$ENABLE_NIMBUS" = xno; then - DISABLE_NIMBUS=true -fi -AC_SUBST(DISABLE_NIMBUS) - # Control wether Hotspot runs Queens test after build. AC_ARG_ENABLE([hotspot-test-in-build], [AS_HELP_STRING([--enable-hotspot-test-in-build], - [enable running of Queens test after Hotspot build (not yet available) @<:@disabled@:>@])],, + [run the Queens test after Hotspot build @<:@disabled@:>@])],, [enable_hotspot_test_in_build=no]) if test "x$enable_hotspot_test_in_build" = "xyes"; then TEST_IN_BUILD=true @@ -356,38 +339,6 @@ AC_SUBST(CACERTS_FILE) COMPRESS_JARS=false AC_SUBST(COMPRESS_JARS) - -############################################################################### -# -# Should we compile JFR -# default no, except for on closed-jdk -# -ENABLE_JFR=no - -# Is the JFR source present - -# -# For closed default is yes -# -if test "x${OPENJDK}" != "xtrue"; then - ENABLE_JFR=yes -fi - -AC_MSG_CHECKING([whether to build jfr]) -AC_ARG_ENABLE([jfr], [AS_HELP_STRING([--enable-jfr], - [enable jfr (default is no)])] - [ENABLE_JFR="${enableval}"]) -AC_MSG_RESULT([${ENABLE_JFR}]) - -if test "x$ENABLE_JFR" = "xyes"; then - ENABLE_JFR=true -elif test "x$ENABLE_JFR" = "xno"; then - ENABLE_JFR=false -else - AC_MSG_ERROR([Invalid argument to --enable-jfr]) -fi - -AC_SUBST(ENABLE_JFR) ]) AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_VERSION_NUMBERS], @@ -409,6 +360,8 @@ AC_SUBST(PRODUCT_NAME) AC_SUBST(PRODUCT_SUFFIX) AC_SUBST(JDK_RC_PLATFORM_NAME) AC_SUBST(COMPANY_NAME) +AC_SUBST(MACOSX_BUNDLE_NAME_BASE) +AC_SUBST(MACOSX_BUNDLE_ID_BASE) COPYRIGHT_YEAR=`date +'%Y'` AC_SUBST(COPYRIGHT_YEAR) @@ -437,7 +390,7 @@ else BUILD_DATE=`date '+%Y_%m_%d_%H_%M'` # Avoid [:alnum:] since it depends on the locale. CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyz0123456789'` - USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` + USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FULL_VERSION="${RELEASE}-${USER_RELEASE_SUFFIX}-${JDK_BUILD_NUMBER}" fi AC_SUBST(FULL_VERSION) @@ -473,7 +426,7 @@ if test "x$OPENJDK_TARGET_OS" = xmacosx; then fi AC_ARG_ENABLE([debug-symbols], - [AS_HELP_STRING([--disable-debug-symbols],[disable generation of debug symbols (@<:@enabled@:>@)])], + [AS_HELP_STRING([--disable-debug-symbols],[disable generation of debug symbols @<:@enabled@:>@])], [ENABLE_DEBUG_SYMBOLS=${enable_debug_symbols}], ) @@ -487,7 +440,7 @@ fi if test "x$ENABLE_DEBUG_SYMBOLS" = "xdefault"; then # Default is on if objcopy is found, otherwise off - if test "x$OBJCOPY" != x; then + if test "x$OBJCOPY" != x || test "x$OPENJDK_TARGET_OS" = xwindows; then ENABLE_DEBUG_SYMBOLS=yes else ENABLE_DEBUG_SYMBOLS=no @@ -502,7 +455,7 @@ AC_MSG_RESULT([$ENABLE_DEBUG_SYMBOLS]) ZIP_DEBUGINFO_FILES=yes AC_ARG_ENABLE([zip-debug-info], - [AS_HELP_STRING([--disable-zip-debug-info],[don't zip debug-info files (@<:@enabled@:@)])], + [AS_HELP_STRING([--disable-zip-debug-info],[disable zipping of debug-info files @<:@enabled@:>@])], [ZIP_DEBUGINFO_FILES=${enable_zip_debug_info}], ) @@ -528,5 +481,5 @@ AC_SUBST(CXXFLAGS_DEBUG_SYMBOLS) # for a degree of customization of the build targets and the rules/recipes # to create them AC_ARG_WITH([custom-make-dir], [AS_HELP_STRING([--with-custom-make-dir], - [directory containing custom build/make files])], [CUSTOM_MAKE_DIR=$with_custom_make_dir]) + [use this directory for custom build/make files])], [CUSTOM_MAKE_DIR=$with_custom_make_dir]) AC_SUBST(CUSTOM_MAKE_DIR) diff --git a/common/autoconf/libraries.m4 b/common/autoconf/libraries.m4 index 8c09744c555..32a62ba3883 100644 --- a/common/autoconf/libraries.m4 +++ b/common/autoconf/libraries.m4 @@ -172,9 +172,15 @@ fi AC_LANG_PUSH(C) OLD_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" + +# Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10 AC_CHECK_HEADERS([X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h], - [X11_A_OK=yes], - [X11_A_OK=no]) + [X11_A_OK=yes], + [X11_A_OK=no], + [ # include + # include + ]) + CFLAGS="$OLD_CFLAGS" AC_LANG_POP(C) @@ -196,27 +202,23 @@ AC_DEFUN_ONCE([LIB_SETUP_CUPS], # AC_ARG_WITH(cups, [AS_HELP_STRING([--with-cups], [specify prefix directory for the cups package - (expecting the libraries under PATH/lib and the headers under PATH/include)])]) + (expecting the headers under PATH/include)])]) AC_ARG_WITH(cups-include, [AS_HELP_STRING([--with-cups-include], [specify directory for the cups include files])]) -AC_ARG_WITH(cups-lib, [AS_HELP_STRING([--with-cups-lib], - [specify directory for the cups library])]) if test "x$CUPS_NOT_NEEDED" = xyes; then - if test "x${with_cups}" != x || test "x${with_cups_include}" != x || test "x${with_cups_lib}" != x; then + if test "x${with_cups}" != x || test "x${with_cups_include}" != x; then AC_MSG_WARN([cups not used, so --with-cups is ignored]) fi CUPS_CFLAGS= - CUPS_LIBS= else CUPS_FOUND=no - if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno || test "x${with_cups_lib}" = xno; then + if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno; then AC_MSG_ERROR([It is not possible to disable the use of cups. Remove the --without-cups option.]) fi if test "x${with_cups}" != x; then - CUPS_LIBS="-L${with_cups}/lib -lcups" CUPS_CFLAGS="-I${with_cups}/include" CUPS_FOUND=yes fi @@ -224,10 +226,6 @@ else CUPS_CFLAGS="-I${with_cups_include}" CUPS_FOUND=yes fi - if test "x${with_cups_lib}" != x; then - CUPS_LIBS="-L${with_cups_lib} -lcups" - CUPS_FOUND=yes - fi if test "x$CUPS_FOUND" = xno; then BDEPS_CHECK_MODULE(CUPS, cups, xxx, [CUPS_FOUND=yes]) fi @@ -236,23 +234,20 @@ else AC_CHECK_HEADERS([cups/cups.h cups/ppd.h], [CUPS_FOUND=yes CUPS_CFLAGS= - CUPS_LIBS="-lcups" DEFAULT_CUPS=yes]) fi if test "x$CUPS_FOUND" = xno; then # Getting nervous now? Lets poke around for standard Solaris third-party # package installation locations. - AC_MSG_CHECKING([for cups headers and libs]) + AC_MSG_CHECKING([for cups headers]) if test -s /opt/sfw/cups/include/cups/cups.h; then # An SFW package seems to be installed! CUPS_FOUND=yes CUPS_CFLAGS="-I/opt/sfw/cups/include" - CUPS_LIBS="-L/opt/sfw/cups/lib -lcups" elif test -s /opt/csw/include/cups/cups.h; then # A CSW package seems to be installed! CUPS_FOUND=yes CUPS_CFLAGS="-I/opt/csw/include" - CUPS_LIBS="-L/opt/csw/lib -lcups" fi AC_MSG_RESULT([$CUPS_FOUND]) fi @@ -263,7 +258,6 @@ else fi AC_SUBST(CUPS_CFLAGS) -AC_SUBST(CUPS_LIBS) ]) @@ -292,17 +286,21 @@ else FREETYPE2_FOUND=no if test "x$with_freetype" != x; then - SPACESAFE(with_freetype,[the path to freetype]) + BASIC_FIXUP_PATH(with_freetype) FREETYPE2_LIBS="-L$with_freetype/lib -lfreetype" + FREETYPE2_LIB_PATH="$with_freetype/lib" + if test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$OPENJDK_TARGET_CPU" = xx86_64 && test -d "$with_freetype/lib/amd64"; then + FREETYPE2_LIBS="-L$with_freetype/lib/amd64 -lfreetype" + FREETYPE2_LIB_PATH="$with_freetype/lib/amd64" + fi if test "x$OPENJDK_TARGET_OS" = xwindows; then FREETYPE2_LIBS="$with_freetype/lib/freetype.lib" fi - FREETYPE2_LIB_PATH="$with_freetype/lib" FREETYPE2_CFLAGS="-I$with_freetype/include" if test -s $with_freetype/include/ft2build.h && test -d $with_freetype/include/freetype2/freetype; then FREETYPE2_CFLAGS="-I$with_freetype/include/freetype2 -I$with_freetype/include" fi - FREETYPE2_FOUND=yes + FREETYPE2_FOUND=yes if test "x$FREETYPE2_FOUND" = xyes; then # Verify that the directories exist if ! test -d "$with_freetype/lib" || ! test -d "$with_freetype/include"; then @@ -311,7 +309,7 @@ else # List the contents of the lib. FREETYPELIB=`ls $with_freetype/lib/libfreetype.so $with_freetype/lib/freetype.dll 2> /dev/null` if test "x$FREETYPELIB" = x; then - AC_MSG_ERROR([Could not find libfreetype.se nor freetype.dll in $with_freetype/lib]) + AC_MSG_ERROR([Could not find libfreetype.so nor freetype.dll in $with_freetype/lib]) fi # Check one h-file if ! test -s "$with_freetype/include/ft2build.h"; then @@ -323,9 +321,34 @@ else BDEPS_CHECK_MODULE(FREETYPE2, freetype2, xxx, [FREETYPE2_FOUND=yes], [FREETYPE2_FOUND=no]) USING_SYSTEM_FT_LIB=true fi + if test "x$FREETYPE2_FOUND" = xno && test "x$OPENJDK_TARGET_OS" = xwindows; then + FREETYPELOCATION="$PROGRAMFILES/GnuWin32" + BASIC_FIXUP_PATH(FREETYPELOCATION) + AC_MSG_CHECKING([for freetype in some standard windows locations]) + if test -s "$FREETYPELOCATION/include/ft2build.h" && test -d "$FREETYPELOCATION/include/freetype2/freetype"; then + FREETYPE2_CFLAGS="-I$FREETYPELOCATION/include/freetype2 -I$FREETYPELOCATION/include" + FREETYPE2_LIBS="$FREETYPELOCATION/lib/freetype.lib" + FREETYPE2_LIB_PATH="$FREETYPELOCATION/lib" + if ! test -s "$FREETYPE2_LIBS"; then + AC_MSG_ERROR([Could not find $FREETYPE2_LIBS]) + fi + if ! test -s "$FREETYPE2_LIB_PATH/freetype.dll"; then + AC_MSG_ERROR([Could not find $FREETYPE2_LIB_PATH/freetype.dll]) + fi + USING_SYSTEM_FT_LIB=true + FREETYPE2_FOUND=yes + fi + AC_MSG_RESULT([$FREETYPE2_FOUND]) + fi if test "x$FREETYPE2_FOUND" = xno; then PKG_CHECK_MODULES(FREETYPE2, freetype2, [FREETYPE2_FOUND=yes], [FREETYPE2_FOUND=no]) + # On solaris, pkg_check adds -lz to freetype libs, which isn't necessary for us. + FREETYPE2_LIBS=`$ECHO $FREETYPE2_LIBS | $SED 's/-lz//g'` USING_SYSTEM_FT_LIB=true + # 64-bit libs for Solaris x86 are installed in the amd64 subdirectory, change lib to lib/amd64 + if test "x$FREETYPE2_FOUND" = xyes && test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + FREETYPE2_LIBS=`$ECHO $FREETYPE2_LIBS | $SED 's?/lib?/lib/amd64?g'` + fi fi if test "x$FREETYPE2_FOUND" = xno; then AC_MSG_CHECKING([for freetype in some standard locations]) @@ -364,7 +387,15 @@ else if test "x$FREETYPE2_FOUND" = xno; then HELP_MSG_MISSING_DEPENDENCY([freetype2]) AC_MSG_ERROR([Could not find freetype2! $HELP_MSG ]) - fi + fi + + if test "x$OPENJDK_TARGET_OS" != xwindows; then + # AC_CHECK_LIB does not support use of cl.exe + PREV_LDFLAGS="$LDFLAGS" + LDFLAGS="$FREETYPE2_LIBS" + AC_CHECK_LIB(freetype, FT_Init_FreeType, [], AC_MSG_ERROR([Could not find freetype2! $HELP_MSG ])) + LDFLAGS="$PREV_LDFLAGS" + fi fi AC_SUBST(USING_SYSTEM_FT_LIB) @@ -621,13 +652,16 @@ if test "x$OPENJDK_TARGET_OS" = xlinux; then if test "x$enable_static_link_stdc__" = xyes; then LIBCXX="$LIBCXX $STATIC_STDCXX_FLAGS" LDCXX="$CC" + STATIC_CXX_SETTING="STATIC_CXX=true" AC_MSG_RESULT([static]) else LIBCXX="$LIBCXX -lstdc++" LDCXX="$CXX" + STATIC_CXX_SETTING="STATIC_CXX=false" AC_MSG_RESULT([dynamic]) fi fi +AC_SUBST(STATIC_CXX_SETTING) # libCrun is the c++ runtime-library with SunStudio (roughly the equivalent of gcc's libstdc++.so) if test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$LIBCXX" = x; then diff --git a/common/autoconf/platform.m4 b/common/autoconf/platform.m4 index afa32ade726..2977606ba79 100644 --- a/common/autoconf/platform.m4 +++ b/common/autoconf/platform.m4 @@ -87,22 +87,32 @@ AC_DEFUN([PLATFORM_EXTRACT_VARS_FROM_OS], *linux*) VAR_OS=linux VAR_OS_API=posix + VAR_OS_ENV=linux ;; *solaris*) VAR_OS=solaris VAR_OS_API=posix + VAR_OS_ENV=solaris ;; *darwin*) VAR_OS=macosx VAR_OS_API=posix + VAR_OS_ENV=macosx ;; *bsd*) VAR_OS=bsd VAR_OS_API=posix + VAR_OS_ENV=bsd ;; - *cygwin*|*windows*) + *cygwin*) VAR_OS=windows VAR_OS_API=winapi + VAR_OS_ENV=windows.cygwin + ;; + *mingw*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.msys ;; *) AC_MSG_ERROR([unsupported operating system $1]) @@ -127,12 +137,34 @@ AC_DEFUN([PLATFORM_EXTRACT_TARGET_AND_BUILD], AC_SUBST(OPENJDK_TARGET_AUTOCONF_NAME) AC_SUBST(OPENJDK_BUILD_AUTOCONF_NAME) + # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. + PLATFORM_EXTRACT_VARS_FROM_OS($build_os) + PLATFORM_EXTRACT_VARS_FROM_CPU($build_cpu) + # ..and setup our own variables. (Do this explicitely to facilitate searching) + OPENJDK_BUILD_OS="$VAR_OS" + OPENJDK_BUILD_OS_API="$VAR_OS_API" + OPENJDK_BUILD_OS_ENV="$VAR_OS_ENV" + OPENJDK_BUILD_CPU="$VAR_CPU" + OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH" + OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS" + OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN" + AC_SUBST(OPENJDK_BUILD_OS) + AC_SUBST(OPENJDK_BUILD_OS_API) + AC_SUBST(OPENJDK_BUILD_CPU) + AC_SUBST(OPENJDK_BUILD_CPU_ARCH) + AC_SUBST(OPENJDK_BUILD_CPU_BITS) + AC_SUBST(OPENJDK_BUILD_CPU_ENDIAN) + + AC_MSG_CHECKING([openjdk-build os-cpu]) + AC_MSG_RESULT([$OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU]) + # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. PLATFORM_EXTRACT_VARS_FROM_OS($host_os) PLATFORM_EXTRACT_VARS_FROM_CPU($host_cpu) # ... and setup our own variables. (Do this explicitely to facilitate searching) OPENJDK_TARGET_OS="$VAR_OS" OPENJDK_TARGET_OS_API="$VAR_OS_API" + OPENJDK_TARGET_OS_ENV="$VAR_OS_ENV" OPENJDK_TARGET_CPU="$VAR_CPU" OPENJDK_TARGET_CPU_ARCH="$VAR_CPU_ARCH" OPENJDK_TARGET_CPU_BITS="$VAR_CPU_BITS" @@ -144,22 +176,8 @@ AC_DEFUN([PLATFORM_EXTRACT_TARGET_AND_BUILD], AC_SUBST(OPENJDK_TARGET_CPU_BITS) AC_SUBST(OPENJDK_TARGET_CPU_ENDIAN) - # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. - PLATFORM_EXTRACT_VARS_FROM_OS($build_os) - PLATFORM_EXTRACT_VARS_FROM_CPU($build_cpu) - # ..and setup our own variables. (Do this explicitely to facilitate searching) - OPENJDK_BUILD_OS="$VAR_OS" - OPENJDK_BUILD_OS_API="$VAR_OS_API" - OPENJDK_BUILD_CPU="$VAR_CPU" - OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH" - OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS" - OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN" - AC_SUBST(OPENJDK_BUILD_OS) - AC_SUBST(OPENJDK_BUILD_OS_API) - AC_SUBST(OPENJDK_BUILD_CPU) - AC_SUBST(OPENJDK_BUILD_CPU_ARCH) - AC_SUBST(OPENJDK_BUILD_CPU_BITS) - AC_SUBST(OPENJDK_BUILD_CPU_ENDIAN) + AC_MSG_CHECKING([openjdk-target os-cpu]) + AC_MSG_RESULT([$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU]) ]) # Check if a reduced build (32-bit on 64-bit platforms) is requested, and modify behaviour @@ -208,7 +226,7 @@ AC_DEFUN([PLATFORM_SETUP_TARGET_CPU_BITS], fi AC_SUBST(COMPILE_TYPE) -AC_MSG_CHECKING([for compilation type]) +AC_MSG_CHECKING([compilation type]) AC_MSG_RESULT([$COMPILE_TYPE]) ]) @@ -299,7 +317,11 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS], if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then A_LP64="LP64:=" - ADD_LP64="-D_LP64=1" + # -D_LP64=1 is only set on linux and mac. Setting on windows causes diff in + # unpack200.exe + if test "x$OPENJDK_TARGET_OS" = xlinux || test "x$OPENJDK_TARGET_OS" = xmacosx; then + ADD_LP64="-D_LP64=1" + fi fi AC_SUBST(LP64,$A_LP64) diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in index 21502341237..c4e795ed59c 100644 --- a/common/autoconf/spec.gmk.in +++ b/common/autoconf/spec.gmk.in @@ -41,7 +41,9 @@ SQUOTE:=' #' DQUOTE:=" #" -define NEWLINE:= +define NEWLINE + + endef # A self-referential reference to this file. @@ -50,11 +52,7 @@ SPEC:=@SPEC@ # Specify where the spec file is. MAKE_ARGS="SPEC=$(SPEC)" -# TODO The logic for finding and setting MAKE is currently not working -# well on windows. Disable it TEMPORARILY there for now. -ifneq (@OPENJDK_TARGET_OS@,windows) - MAKE:=@MAKE@ -endif +MAKE:=@MAKE@ # Pass along the verbosity setting. ifeq (,$(findstring VERBOSE=,$(MAKE))) @@ -77,6 +75,7 @@ CONF_NAME:=@CONF_NAME@ # The built jdk will run in this target system. OPENJDK_TARGET_OS:=@OPENJDK_TARGET_OS@ OPENJDK_TARGET_OS_API:=@OPENJDK_TARGET_OS_API@ +OPENJDK_TARGET_OS_ENV:=@OPENJDK_TARGET_OS_ENV@ OPENJDK_TARGET_CPU:=@OPENJDK_TARGET_CPU@ OPENJDK_TARGET_CPU_ARCH:=@OPENJDK_TARGET_CPU_ARCH@ @@ -109,16 +108,21 @@ REQUIRED_OS_NAME:=@REQUIRED_OS_NAME@ REQUIRED_OS_VERSION:=@REQUIRED_OS_VERSION@ @SET_OPENJDK@ -JIGSAW:=@JIGSAW@ LIBM:=-lm LIBDL:=@LIBDL@ # colon or semicolon PATH_SEP:=@PATH_SEP@ -# Set special env variables, to be passed to external tools. -# Used for cygwin setups. -@SETUPDEVENV@ +ifeq ($(OPENJDK_TARGET_OS), windows) + # On Windows, the Visual Studio toolchain needs the LIB and INCLUDE + # environment variables (in Windows path style), and the PATH needs to + # be adjusted to include Visual Studio tools (but this needs to be in + # cygwin/msys style). + export PATH:=@VS_PATH@ + export INCLUDE:=@VS_INCLUDE@ + export LIB:=@VS_LIB@ +endif # The sys root where standard headers and libraries are found. # Usually not needed since the configure script should have @@ -131,7 +135,6 @@ ADD_SRC_ROOT:=@ADD_SRC_ROOT@ OVERRIDE_SRC_ROOT:=@OVERRIDE_SRC_ROOT@ TOPDIR:=@SRC_ROOT@ OUTPUT_ROOT:=@OUTPUT_ROOT@ -JDK_MAKE_SHARED_DIR:=@JDK_TOPDIR@/makefiles/common/shared JDK_TOPDIR:=@JDK_TOPDIR@ LANGTOOLS_TOPDIR:=@LANGTOOLS_TOPDIR@ CORBA_TOPDIR:=@CORBA_TOPDIR@ @@ -155,6 +158,8 @@ PRODUCT_NAME:=@PRODUCT_NAME@ PRODUCT_SUFFIX:=@PRODUCT_SUFFIX@ JDK_RC_PLATFORM_NAME:=@JDK_RC_PLATFORM_NAME@ COMPANY_NAME:=@COMPANY_NAME@ +MACOSX_BUNDLE_NAME_BASE=@MACOSX_BUNDLE_NAME_BASE@ +MACOSX_BUNDLE_ID_BASE=@MACOSX_BUNDLE_ID_BASE@ # Different version strings generated from the above information. JDK_VERSION:=@JDK_VERSION@ @@ -289,7 +294,7 @@ C_FLAG_DEPS:=@C_FLAG_DEPS@ CXX_FLAG_DEPS:=@CXX_FLAG_DEPS@ # Tools that potentially need to be cross compilation aware. -CC:=@UNCYGDRIVE@ @CCACHE@ @CC@ +CC:=@FIXPATH@ @CCACHE@ @CC@ # CFLAGS used to compile the jdk native libraries (C-code) CFLAGS_JDKLIB:=@CFLAGS_JDKLIB@ @@ -299,17 +304,17 @@ CXXFLAGS_JDKLIB:=@CXXFLAGS_JDKLIB@ CFLAGS_JDKEXE:=@CFLAGS_JDKEXE@ CXXFLAGS_JDKEXE:=@CXXFLAGS_JDKEXE@ -CXX:=@UNCYGDRIVE@ @CCACHE@ @CXX@ +CXX:=@FIXPATH@ @CCACHE@ @CXX@ #CXXFLAGS:=@CXXFLAGS@ OBJC:=@CCACHE@ @OBJC@ #OBJCFLAGS:=@OBJCFLAGS@ -CPP:=@UNCYGDRIVE@ @CPP@ +CPP:=@FIXPATH@ @CPP@ #CPPFLAGS:=@CPPFLAGS@ # The linker can be gcc or ld on posix systems, or link.exe on windows systems. -LD:=@UNCYGDRIVE@ @LD@ +LD:=@FIXPATH@ @LD@ # LDFLAGS used to link the jdk native libraries (C-code) LDFLAGS_JDKLIB:=@LDFLAGS_JDKLIB@ @@ -317,7 +322,7 @@ LDFLAGS_JDKLIB_SUFFIX:=@LDFLAGS_JDKLIB_SUFFIX@ # On some platforms the linker cannot be used to create executables, thus # the need for a separate LDEXE command. -LDEXE:=@UNCYGDRIVE@ @LDEXE@ +LDEXE:=@FIXPATH@ @LDEXE@ # LDFLAGS used to link the jdk native launchers (C-code) LDFLAGS_JDKEXE:=@LDFLAGS_JDKEXE@ @@ -327,22 +332,22 @@ LDFLAGS_JDKEXE_SUFFIX:=@LDFLAGS_JDKEXE_SUFFIX@ LDFLAGS_CXX_JDK:=@LDFLAGS_CXX_JDK@ # Sometimes a different linker is needed for c++ libs -LDCXX:=@UNCYGDRIVE@ @LDCXX@ +LDCXX:=@FIXPATH@ @LDCXX@ # The flags for linking libstdc++ linker. LIBCXX:=@LIBCXX@ # Sometimes a different linker is needed for c++ executables -LDEXECXX:=@UNCYGDRIVE@ @LDEXECXX@ +LDEXECXX:=@FIXPATH@ @LDEXECXX@ # BUILD_CC/BUILD_LD is a compiler/linker that generates code that is runnable on the # build platform. -BUILD_CC:=@UNCYGDRIVE@ @BUILD_CC@ -BUILD_LD:=@UNCYGDRIVE@ @BUILD_LD@ +BUILD_CC:=@FIXPATH@ @BUILD_CC@ +BUILD_LD:=@FIXPATH@ @BUILD_LD@ -AS:=@UNCYGDRIVE@ @AS@ +AS:=@FIXPATH@ @AS@ # AR is used to create a static library (is ar in posix, lib.exe in windows) -AR:=@UNCYGDRIVE@ @AR@ +AR:=@FIXPATH@ @AR@ ARFLAGS:=@ARFLAGS@ NM:=@NM@ @@ -400,20 +405,20 @@ POST_MCS_CMD:=@POST_MCS_CMD@ JAVA_FLAGS:=@BOOT_JDK_JVMARGS@ -JAVA=@UNCYGDRIVE@ $(BOOT_JDK)/bin/java $(JAVA_FLAGS) +JAVA=@FIXPATH@ $(BOOT_JDK)/bin/java $(JAVA_FLAGS) -JAVAC=@UNCYGDRIVE@ $(BOOT_JDK)/bin/javac +JAVAC=@FIXPATH@ $(BOOT_JDK)/bin/javac # Hotspot sets this variable before reading the SPEC when compiling sa-jdi.jar. Avoid # overriding that value by using ?=. JAVAC_FLAGS?=@JAVAC_FLAGS@ -JAVAH=@UNCYGDRIVE@ $(BOOT_JDK)/bin/javah +JAVAH=@FIXPATH@ $(BOOT_JDK)/bin/javah -JAR=@UNCYGDRIVE@ $(BOOT_JDK)/bin/jar +JAR=@FIXPATH@ $(BOOT_JDK)/bin/jar -RMIC=@UNCYGDRIVE@ $(BOOT_JDK)/bin/rmic +RMIC=@FIXPATH@ $(BOOT_JDK)/bin/rmic -NATIVE2ASCII=@UNCYGDRIVE@ $(BOOT_JDK)/bin/native2ascii +NATIVE2ASCII=@FIXPATH@ $(BOOT_JDK)/bin/native2ascii # Base flags for RC # Guarding this against resetting value. Legacy make files include spec multiple @@ -424,21 +429,20 @@ endif # A specific java binary with specific options can be used to run # the long running background sjavac servers and other long running tasks. -SJAVAC_SERVER_JAVA:=@UNCYGDRIVE@ @SJAVAC_SERVER_JAVA@ +SJAVAC_SERVER_JAVA:=@FIXPATH@ @SJAVAC_SERVER_JAVA@ # Tools adhering to a minimal and common standard of posix compliance. AWK:=@AWK@ BASENAME:=@BASENAME@ +BASH:=@BASH@ CAT:=@CAT@ CCACHE:=@CCACHE@ # CD is going away, but remains to cater for legacy makefiles. CD:=cd CHMOD:=@CHMOD@ CP:=@CP@ -CPIO:=@CPIO@ CUT:=@CUT@ DATE:=@DATE@ -DF:=@DF@ DIFF:=@DIFF@ FIND:=@FIND@ FIND_DELETE:=@FIND_DELETE@ @@ -461,6 +465,7 @@ SORT:=@SORT@ TAR:=@TAR@ TAIL:=@TAIL@ TEE:=@TEE@ +TIME:=@TIME@ TR:=@TR@ TOUCH:=@TOUCH@ WC:=@WC@ @@ -468,9 +473,9 @@ XARGS:=@XARGS@ ZIPEXE:=@ZIP@ ZIP:=@ZIP@ UNZIP:=@UNZIP@ -MT:=@UNCYGDRIVE@ @MT@ -RC:=@UNCYGDRIVE@ @RC@ -DUMPBIN:=@UNCYGDRIVE@ @DUMPBIN@ +MT:=@FIXPATH@ @MT@ +RC:=@FIXPATH@ @RC@ +DUMPBIN:=@FIXPATH@ @DUMPBIN@ CYGPATH:=@CYGPATH@ LDD:=@LDD@ OTOOL:=@OTOOL@ @@ -479,8 +484,9 @@ EXPR:=@EXPR@ FILE:=@FILE@ HG:=@HG@ OBJCOPY:=@OBJCOPY@ +SETFILE:=@SETFILE@ -UNCYGDRIVE:=@UNCYGDRIVE@ +FIXPATH:=@FIXPATH@ # Where the build output is stored for your convenience. BUILD_LOG:=@BUILD_LOG@ @@ -488,14 +494,12 @@ BUILD_LOG_PREVIOUS:=@BUILD_LOG_PREVIOUS@ BUILD_LOG_WRAPPER:=@BUILD_LOG_WRAPPER@ # Build setup -DISABLE_NIMBUS:=@DISABLE_NIMBUS@ ENABLE_JFR=@ENABLE_JFR@ USE_EXTERNAL_LIBJPEG:=@USE_EXTERNAL_LIBJPEG@ USE_EXTERNAL_LIBGIF:=@USE_EXTERNAL_LIBGIF@ USE_EXTERNAL_LIBZ:=@USE_EXTERNAL_LIBZ@ LIBZIP_CAN_USE_MMAP:=@LIBZIP_CAN_USE_MMAP@ -CHECK_FOR_VCINSTALLDIR=@CHECK_FOR_VCINSTALLDIR@ -MSVCRNN_DLL:=@MSVCR100DLL@ +MSVCR_DLL:=@MSVCR_DLL@ # ADD_SRCS takes a single argument with source roots diff --git a/common/autoconf/toolchain.m4 b/common/autoconf/toolchain.m4 index 45c376fb074..90f9f2e3df1 100644 --- a/common/autoconf/toolchain.m4 +++ b/common/autoconf/toolchain.m4 @@ -23,111 +23,67 @@ # questions. # -AC_DEFUN_ONCE([TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV], +# $1 = compiler to test (CC or CXX) +# $2 = human readable name of compiler (C or C++) +AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION], [ + COMPILER=[$]$1 + COMPILER_NAME=$2 -# Check if the VS env variables were setup prior to running configure. -# If not, then find vcvarsall.bat and run it automatically, and integrate -# the set env variables into the spec file. -SETUPDEVENV="# No special vars" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # Store path to cygwin link.exe to help excluding it when searching for - # VS linker. - AC_PATH_PROG(CYGWIN_LINK, link) - AC_MSG_CHECKING([if the first found link.exe is actually the Cygwin link tool]) - "$CYGWIN_LINK" --version > /dev/null - if test $? -eq 0 ; then - AC_MSG_RESULT([yes]) + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + # Make sure we use the Sun Studio compiler and not gcc on Solaris, which won't work + COMPILER_VERSION_TEST=`$COMPILER -V 2>&1 | $HEAD -n 1` + $ECHO $COMPILER_VERSION_TEST | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + if test $? -ne 0; then + GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + + AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler.]) + AC_MSG_NOTICE([The result from running with -V was: "$COMPILER_VERSION_TEST" and with --version: "$GCC_VERSION_TEST"]) + AC_MSG_ERROR([Sun Studio compiler is required. Try setting --with-tools-dir.]) else - AC_MSG_RESULT([no]) - # This might be the VS linker. Don't exclude it later on. - CYGWIN_LINK="" + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*@<:@ ,\t@:>@$COMPILER_NAME@<:@ ,\t@:>@\(@<:@1-9@:>@\.@<:@0-9@:>@@<:@0-9@:>@*\).*/\1/p"` + COMPILER_VENDOR="Sun Studio" + fi + elif test "x$OPENJDK_TARGET_OS" = xwindows; then + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 + COMPILER_VERSION_TEST=`$COMPILER 2>&1 | $HEAD -n 1` + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*Version \(@<:@1-9@:>@@<:@0-9.@:>@*\) .*/\1/p"` + COMPILER_VENDOR="Microsoft CL.EXE" + COMPILER_CPU_TEST=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* for \(.*\)$/\1/p"` + if test "x$OPENJDK_TARGET_CPU" = "xx86"; then + if test "x$COMPILER_CPU_TEST" != "x80x86"; then + AC_MSG_ERROR([Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for "$COMPILER_CPU_TEST"; expected "80x86".]) + fi + elif test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then + if test "x$COMPILER_CPU_TEST" != "xx64"; then + AC_MSG_ERROR([Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for "$COMPILER_CPU_TEST"; expected "x64".]) + fi + fi + else + COMPILER_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + # Check that this is likely to be GCC. + $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null + if test $? -ne 0; then + AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler.]) + AC_MSG_NOTICE([The result from running with --version was: "$COMPILER_VERSION_TEST"]) + AC_MSG_ERROR([GCC compiler is required. Try setting --with-tools-dir.]) fi - # If vcvarsall.bat has been run, then VCINSTALLDIR is set. - if test "x$VCINSTALLDIR" != x; then - # No further setup is needed. The build will happen from this kind - # of shell. - SETUPDEVENV="# This spec file expects that you are running bash from within a VS command prompt." - # Make sure to remind you, if you forget to run make from a cygwin bash shell - # that is spawned "bash -l" from a VS command prompt. - CHECK_FOR_VCINSTALLDIR=yes - AC_MSG_CHECKING([if you are running from within a VS command prompt]) - AC_MSG_RESULT([yes]) - else - # Ah, we have not yet run vcvarsall.bat/vsvars32.bat/vsvars64.bat. Lets do that. First find it. - if test "x$VS100COMNTOOLS" != x; then - VARSBAT=`find "$VS100COMNTOOLS/../.." -name vcvarsall.bat` - SEARCH_ROOT="$VS100COMNTOOLS" - else - VARSBAT=`find "$PROGRAMFILES" -name vcvarsall.bat` - SEARCH_ROOT="$PROGRAMFILES" - fi - VCPATH=`dirname "$VARSBAT"` - VCPATH=`cygpath -w "$VCPATH"` - if test "x$VARSBAT" = x || test ! -d "$VCPATH"; then - AC_MSG_CHECKING([if we can find the VS installation]) - AC_MSG_RESULT([no]) - AC_MSG_ERROR([Tried to find a VS installation using both $SEARCH_ROOT but failed. Please run "c:\\cygwin\\bin\\bash.exe -l" from a VS command prompt and then run configure/make from there.]) - fi - case "$OPENJDK_TARGET_CPU" in - x86) - VARSBAT_ARCH=x86 - ;; - x86_64) - VARSBAT_ARCH=amd64 - ;; - esac - # Lets extract the variables that are set by vcvarsall.bat/vsvars32.bat/vsvars64.bat - cd $OUTPUT_ROOT - bash $SRC_ROOT/common/bin/extractvcvars.sh "$VARSBAT" "$VARSBAT_ARCH" - cd $CURDIR - if test ! -s $OUTPUT_ROOT/localdevenv.sh || test ! -s $OUTPUT_ROOT/localdevenv.gmk; then - AC_MSG_CHECKING([if we can extract the needed env variables]) - AC_MSG_RESULT([no]) - AC_MSG_ERROR([Could not succesfully extract the env variables needed for the VS setup. Please run "c:\\cygwin\\bin\\bash.exe -l" from a VS command prompt and then run configure/make from there.]) - fi - # Now set all paths and other env variables. This will allow the rest of - # the configure script to find and run the compiler in the proper way. - . $OUTPUT_ROOT/localdevenv.sh - AC_MSG_CHECKING([if we can find the VS installation]) - if test "x$VCINSTALLDIR" != x; then - AC_MSG_RESULT([$VCINSTALLDIR]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([Could not find VS installation. Please install. If you are sure you have installed VS, then please run "c:\\cygwin\\bin\\bash.exe -l" from a VS command prompt and then run configure/make from there.]) - fi - CHECK_FOR_VCINSTALLDIR=no - SETUPDEVENV="include $OUTPUT_ROOT/localdevenv.gmk" + # First line typically looks something like: + # gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* \(@<:@1-9@:>@@<:@0-9.@:>@*\)/\1/p"` + COMPILER_VENDOR=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^\(.*\) @<:@1-9@:>@@<:@0-9.@:>@*/\1/p"` + fi + # This sets CC_VERSION or CXX_VERSION. (This comment is a grep marker) + $1_VERSION="$COMPILER_VERSION" + # This sets CC_VENDOR or CXX_VENDOR. (This comment is a grep marker) + $1_VENDOR="$COMPILER_VENDOR" - AC_MSG_CHECKING([for msvcr100.dll]) - AC_ARG_WITH(msvcr100dll, [AS_HELP_STRING([--with-msvcr100dll], - [copy this msvcr100.dll into the built JDK])]) - if test "x$with_msvcr100dll" != x; then - MSVCR100DLL="$with_msvcr100dll" - else - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | grep x64 | head --lines 1` - else - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | grep x86 | grep -v ia64 | grep -v x64 | head --lines 1` - if test "x$MSVCR100DLL" = x; then - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | head --lines 1` - fi - fi - fi - if test "x$MSVCR100DLL" = x; then - AC_MSG_RESULT([no]) - AC_MSG_ERROR([Could not find msvcr100.dll !]) - fi - AC_MSG_RESULT([$MSVCR100DLL]) - SPACESAFE(MSVCR100DLL,[the path to msvcr100.dll]) - fi -fi -AC_SUBST(SETUPDEVENV) -AC_SUBST(CHECK_FOR_VCINSTALLDIR) -AC_SUBST(MSVCR100DLL) + AC_MSG_NOTICE([Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)]) ]) + AC_DEFUN_ONCE([TOOLCHAIN_SETUP_SYSROOT_AND_OUT_OPTIONS], [ ############################################################################### @@ -151,8 +107,67 @@ AC_SUBST(LD_OUT_OPTION) AC_SUBST(AR_OUT_OPTION) ]) -AC_DEFUN_ONCE([TOOLCHAIN_SETUP_PATHS], +# $1 = compiler to test (CC or CXX) +# $2 = human readable name of compiler (C or C++) +# $3 = list of compiler names to search for +AC_DEFUN([TOOLCHAIN_FIND_COMPILER], [ + COMPILER_NAME=$2 + + # Do a first initial attempt at searching the list of compiler names. + # AC_PATH_PROGS can't be run multiple times with the same variable, + # so create a new name for this run. + AC_PATH_PROGS(POTENTIAL_$1, $3) + $1=$POTENTIAL_$1 + + if test "x$[$]$1" = x; then + HELP_MSG_MISSING_DEPENDENCY([devkit]) + AC_MSG_ERROR([Could not find a $COMPILER_NAME compiler. $HELP_MSG]) + fi + BASIC_FIXUP_EXECUTABLE($1) + AC_MSG_CHECKING([resolved symbolic links for $1]) + TEST_COMPILER="[$]$1" + BASIC_REMOVE_SYMBOLIC_LINKS(TEST_COMPILER) + AC_MSG_RESULT([$TEST_COMPILER]) + AC_MSG_CHECKING([if $1 is disguised ccache]) + + COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` + if test "x$COMPILER_BASENAME" = "xccache"; then + AC_MSG_RESULT([yes, trying to find proper $COMPILER_NAME compiler]) + # We /usr/lib/ccache in the path, so cc is a symlink to /usr/bin/ccache. + # We want to control ccache invocation ourselves, so ignore this cc and try + # searching again. + + # Remove the path to the fake ccache cc from the PATH + RETRY_COMPILER_SAVED_PATH="$PATH" + COMPILER_DIRNAME=`$DIRNAME [$]$1` + PATH="`$ECHO $PATH | $SED -e "s,$COMPILER_DIRNAME,,g" -e "s,::,:,g" -e "s,^:,,g"`" + + # Try again looking for our compiler + AC_CHECK_TOOLS(PROPER_COMPILER_$1, $3) + BASIC_FIXUP_EXECUTABLE(PROPER_COMPILER_$1) + PATH="$RETRY_COMPILER_SAVED_PATH" + + AC_MSG_CHECKING([for resolved symbolic links for $1]) + BASIC_REMOVE_SYMBOLIC_LINKS(PROPER_COMPILER_$1) + AC_MSG_RESULT([$PROPER_COMPILER_$1]) + $1="$PROPER_COMPILER_$1" + else + AC_MSG_RESULT([no, keeping $1]) + $1="$TEST_COMPILER" + fi + TOOLCHAIN_CHECK_COMPILER_VERSION([$1], [$COMPILER_NAME]) +]) + + +AC_DEFUN([TOOLCHAIN_SETUP_PATHS], +[ +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV +fi + +AC_SUBST(MSVCR_DLL) + # If --build AND --host is set, then the configure script will find any # cross compilation tools in the PATH. Cross compilation tools # follows the cross compilation standard where they are prefixed with ${host}. @@ -171,11 +186,11 @@ if test "x$COMPILE_TYPE" = "xcross"; then # Otherwise, we'll set the BUILD_tools to the native tools, but that'll have # to wait until they are properly discovered. AC_PATH_PROGS(BUILD_CC, [cl cc gcc]) - SET_FULL_PATH(BUILD_CC) + BASIC_FIXUP_EXECUTABLE(BUILD_CC) AC_PATH_PROGS(BUILD_CXX, [cl CC g++]) - SET_FULL_PATH(BUILD_CXX) + BASIC_FIXUP_EXECUTABLE(BUILD_CXX) AC_PATH_PROG(BUILD_LD, ld) - SET_FULL_PATH(BUILD_LD) + BASIC_FIXUP_EXECUTABLE(BUILD_LD) fi AC_SUBST(BUILD_CC) AC_SUBST(BUILD_CXX) @@ -218,36 +233,40 @@ if test "x$TOOLS_DIR" != x; then PATH=$TOOLS_DIR:$PATH fi + +### Locate C compiler (CC) + # gcc is almost always present, but on Windows we # prefer cl.exe and on Solaris we prefer CC. # Thus test for them in this order. -AC_PROG_CC([cl cc gcc]) -if test "x$CC" = x; then - HELP_MSG_MISSING_DEPENDENCY([devkit]) - AC_MSG_ERROR([Could not find a compiler. $HELP_MSG]) -fi -if test "x$CC" = xcc && test "x$OPENJDK_BUILD_OS" = xmacosx; then - # Do not use cc on MacOSX use gcc instead. - CC="gcc" -fi -SET_FULL_PATH(CC) - -AC_PROG_CXX([cl CC g++]) -if test "x$CXX" = xCC && test "x$OPENJDK_BUILD_OS" = xmacosx; then - # The found CC, even though it seems to be a g++ derivate, cannot compile - # c++ code. Override. - CXX="g++" -fi -SET_FULL_PATH(CXX) - -if test "x$CXX" = x || test "x$CC" = x; then - HELP_MSG_MISSING_DEPENDENCY([devkit]) - AC_MSG_ERROR([Could not find the needed compilers! $HELP_MSG ]) +if test "x$OPENJDK_TARGET_OS" = xmacosx; then + # Do not probe for cc on MacOSX. + COMPILER_CHECK_LIST="cl gcc" +else + COMPILER_CHECK_LIST="cl cc gcc" fi -if test "x$OPENJDK_BUILD_OS" != xwindows; then +TOOLCHAIN_FIND_COMPILER([CC],[C],[$COMPILER_CHECK_LIST]) +# Now that we have resolved CC ourself, let autoconf have it's go at it +AC_PROG_CC([$CC]) + +### Locate C++ compiler (CXX) + +if test "x$OPENJDK_TARGET_OS" = xmacosx; then + # Do not probe for CC on MacOSX. + COMPILER_CHECK_LIST="cl g++" +else + COMPILER_CHECK_LIST="cl CC g++" +fi +TOOLCHAIN_FIND_COMPILER([CXX],[C++],[$COMPILER_CHECK_LIST]) +# Now that we have resolved CXX ourself, let autoconf have it's go at it +AC_PROG_CXX([$CXX]) + +### Locate other tools + +if test "x$OPENJDK_TARGET_OS" != xwindows; then AC_PROG_OBJC - SET_FULL_PATH(OBJC) + BASIC_FIXUP_EXECUTABLE(OBJC) else OBJC= fi @@ -270,20 +289,26 @@ AC_SUBST(LDCXX) # Linking C++ executables. AC_SUBST(LDEXECXX) -if test "x$OPENJDK_BUILD_OS" != xwindows; then +if test "x$OPENJDK_TARGET_OS" != xwindows; then AC_CHECK_TOOL(AR, ar) - SET_FULL_PATH(AR) + BASIC_FIXUP_EXECUTABLE(AR) fi -if test "x$OPENJDK_BUILD_OS" = xmacosx; then +if test "x$OPENJDK_TARGET_OS" = xmacosx; then ARFLAGS="-r" else ARFLAGS="" fi AC_SUBST(ARFLAGS) +# For hotspot, we need these in Windows mixed path; other platforms keep them the same +HOTSPOT_CXX="$CXX" +HOTSPOT_LD="$LD" +AC_SUBST(HOTSPOT_CXX) +AC_SUBST(HOTSPOT_LD) + COMPILER_NAME=gcc COMPILER_TYPE=CC -AS_IF([test "x$OPENJDK_BUILD_OS" = xwindows], [ +AS_IF([test "x$OPENJDK_TARGET_OS" = xwindows], [ # For now, assume that we are always compiling using cl.exe. CC_OUT_OPTION=-Fo EXE_OUT_OPTION=-out: @@ -294,7 +319,7 @@ AS_IF([test "x$OPENJDK_BUILD_OS" = xwindows], [ AC_CHECK_PROG([WINLD], [link],[link],,, [$CYGWIN_LINK]) # Since we must ignore the first found link, WINLD will contain # the full path to the link.exe program. - SET_FULL_PATH_SPACESAFE([WINLD]) + BASIC_FIXUP_EXECUTABLE(WINLD) printf "Windows linker was found at $WINLD\n" AC_MSG_CHECKING([if the found link.exe is actually the Visual Studio linker]) "$WINLD" --version > /dev/null @@ -310,12 +335,25 @@ AS_IF([test "x$OPENJDK_BUILD_OS" = xwindows], [ LDEXECXX="$WINLD" AC_CHECK_PROG([MT], [mt], [mt],,, [/usr/bin/mt]) - SET_FULL_PATH_SPACESAFE([MT]) + BASIC_FIXUP_EXECUTABLE(MT) # The resource compiler AC_CHECK_PROG([RC], [rc], [rc],,, [/usr/bin/rc]) - SET_FULL_PATH_SPACESAFE([RC]) + BASIC_FIXUP_EXECUTABLE(RC) - RC_FLAGS="-nologo /l 0x409 /r" + # For hotspot, we need these in Windows mixed path, + # so rewrite them all. Need added .exe suffix. + HOTSPOT_CXX="$CXX.exe" + HOTSPOT_LD="$LD.exe" + HOTSPOT_MT="$MT.exe" + HOTSPOT_RC="$RC.exe" + BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_CXX) + BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_LD) + BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_MT) + BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_RC) + AC_SUBST(HOTSPOT_MT) + AC_SUBST(HOTSPOT_RC) + + RC_FLAGS="-nologo -l 0x409 -r" AS_IF([test "x$VARIANT" = xOPT], [ RC_FLAGS="$RC_FLAGS -d NDEBUG" ]) @@ -333,12 +371,12 @@ AS_IF([test "x$OPENJDK_BUILD_OS" = xwindows], [ # lib.exe is used to create static libraries. AC_CHECK_PROG([WINAR], [lib],[lib],,,) - SET_FULL_PATH_SPACESAFE([WINAR]) + BASIC_FIXUP_EXECUTABLE(WINAR) AR="$WINAR" ARFLAGS="-nologo -NODEFAULTLIB:MSVCRT" AC_CHECK_PROG([DUMPBIN], [dumpbin], [dumpbin],,,) - SET_FULL_PATH_SPACESAFE([DUMPBIN]) + BASIC_FIXUP_EXECUTABLE(DUMPBIN) COMPILER_TYPE=CL CCXXFLAGS="$CCXXFLAGS -nologo" @@ -347,10 +385,10 @@ AC_SUBST(RC_FLAGS) AC_SUBST(COMPILER_TYPE) AC_PROG_CPP -SET_FULL_PATH(CPP) +BASIC_FIXUP_EXECUTABLE(CPP) AC_PROG_CXXCPP -SET_FULL_PATH(CXXCPP) +BASIC_FIXUP_EXECUTABLE(CXXCPP) if test "x$COMPILE_TYPE" != "xcross"; then # If we are not cross compiling, use the same compilers for @@ -373,43 +411,44 @@ if test "x$OPENJDK_BUILD_OS" = xsolaris; then fi # Find the right assembler. -if test "x$OPENJDK_BUILD_OS" = xsolaris; then +if test "x$OPENJDK_TARGET_OS" = xsolaris; then AC_PATH_PROG(AS, as) - SET_FULL_PATH(AS) + BASIC_FIXUP_EXECUTABLE(AS) else AS="$CC -c" fi AC_SUBST(AS) -if test "x$OPENJDK_BUILD_OS" = xsolaris; then +if test "x$OPENJDK_TARGET_OS" = xsolaris; then AC_PATH_PROGS(NM, [gnm nm]) - SET_FULL_PATH(NM) + BASIC_FIXUP_EXECUTABLE(NM) AC_PATH_PROG(STRIP, strip) - SET_FULL_PATH(STRIP) + BASIC_FIXUP_EXECUTABLE(STRIP) AC_PATH_PROG(MCS, mcs) - SET_FULL_PATH(MCS) -elif test "x$OPENJDK_BUILD_OS" != xwindows; then + BASIC_FIXUP_EXECUTABLE(MCS) +elif test "x$OPENJDK_TARGET_OS" != xwindows; then AC_CHECK_TOOL(NM, nm) - SET_FULL_PATH(NM) + BASIC_FIXUP_EXECUTABLE(NM) AC_CHECK_TOOL(STRIP, strip) - SET_FULL_PATH(STRIP) + BASIC_FIXUP_EXECUTABLE(STRIP) fi -### -# -# Check for objcopy -# -# but search for gobjcopy first... -# since I on solaris found a broken objcopy...buhh -# -AC_PATH_TOOL(OBJCOPY, gobjcopy) -if test "x$OBJCOPY" = x; then - AC_PATH_TOOL(OBJCOPY, objcopy) +# objcopy is used for moving debug symbols to separate files when +# full debug symbols are enabled. +if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux; then + AC_CHECK_TOOLS(OBJCOPY, [gobjcopy objcopy]) + BASIC_FIXUP_EXECUTABLE(OBJCOPY) +fi + +AC_CHECK_TOOLS(OBJDUMP, [gobjdump objdump]) +if test "x$OBJDUMP" != x; then + # Only used for compare.sh; we can live without it. BASIC_FIXUP_EXECUTABLE bails if argument is missing. + BASIC_FIXUP_EXECUTABLE(OBJDUMP) fi if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then AC_PATH_PROG(LIPO, lipo) - SET_FULL_PATH(LIPO) + BASIC_FIXUP_EXECUTABLE(LIPO) fi # Restore old path without tools dir @@ -449,7 +488,7 @@ if test "x$GCC" = xyes; then POST_STRIP_CMD="$STRIP -g" # Linking is different on MacOSX - if test "x$OPENJDK_BUILD_OS" = xmacosx; then + if test "x$OPENJDK_TARGET_OS" = xmacosx; then # Might change in the future to clang. COMPILER_NAME=gcc SHARED_LIBRARY='lib[$]1.dylib' @@ -463,7 +502,7 @@ if test "x$GCC" = xyes; then POST_STRIP_CMD="$STRIP -S" fi else - if test "x$OPENJDK_BUILD_OS" = xsolaris; then + if test "x$OPENJDK_TARGET_OS" = xsolaris; then # If it is not gcc, then assume it is the Oracle Solaris Studio Compiler COMPILER_NAME=ossc PICFLAG="-KPIC" @@ -487,7 +526,7 @@ else POST_STRIP_CMD="$STRIP -x" POST_MCS_CMD="$MCS -d -a \"JDK $FULL_VERSION\"" fi - if test "x$OPENJDK_BUILD_OS" = xwindows; then + if test "x$OPENJDK_TARGET_OS" = xwindows; then # If it is not gcc, then assume it is the MS Visual Studio compiler COMPILER_NAME=cl PICFLAG="" @@ -626,6 +665,11 @@ case $COMPILER_TYPE in # Can cause undefined external on Solaris 8 X86 on __sincos, removing for now #CC_HIGHEST="$CC_HIGHEST -xlibmopt" + if test "x$OPENJDK_TARGET_CPU" = xsparc; then + CFLAGS_JDK="${CFLAGS_JDK} -xmemalign=4s" + CXXFLAGS_JDK="${CXXFLAGS_JDK} -xmemalign=4s" + fi + case $OPENJDK_TARGET_CPU_ARCH in x86) C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xregs=no%frameptr" @@ -642,8 +686,6 @@ case $COMPILER_TYPE in fi ;; sparc) - CFLAGS_JDK="${CFLAGS_JDK} -xmemalign=4s" - CXXFLAGS_JDK="${CXXFLAGS_JDK} -xmemalign=4s" CFLAGS_JDKLIB_EXTRA="${CFLAGS_JDKLIB_EXTRA} -xregs=no%appl" CXXFLAGS_JDKLIB_EXTRA="${CXXFLAGS_JDKLIB_EXTRA} -xregs=no%appl" C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra" @@ -759,7 +801,7 @@ case $COMPILER_NAME in CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS" case $OPENJDK_TARGET_CPU_ARCH in x86 ) - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -Di386" + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB" CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE" ;; esac @@ -859,7 +901,7 @@ CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK" # libraries will link to whatever is in memory. Yuck. # # Thus we offer the compiler to find libjvm.so first in server then in client. It works. Ugh. -if test "x$COMPILER_TYPE" = xCL; then +if test "x$COMPILER_NAME" = xcl; then LDFLAGS_JDK="$LDFLAGS_JDK -nologo -opt:ref -incremental:no" if test "x$OPENJDK_TARGET_CPU" = xx86; then LDFLAGS_JDK="$LDFLAGS_JDK -safeseh" @@ -875,19 +917,23 @@ if test "x$COMPILER_TYPE" = xCL; then fi LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE" else - # If this is a --hash-style=gnu system, use --hash-style=both, why? - HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` - if test -n "$HAS_GNU_HASH"; then - # And since we now know that the linker is gnu, then add -z defs, to forbid - # undefined symbols in object files. - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both -Xlinker -z -Xlinker defs" - if test "x$DEBUG_LEVEL" == "xrelease"; then - # When building release libraries, tell the linker optimize them. - # Should this be supplied to the OSS linker as well? - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + if test "x$COMPILER_NAME" = xgcc; then + # If this is a --hash-style=gnu system, use --hash-style=both, why? + HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` + if test -n "$HAS_GNU_HASH"; then + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both " + fi + if test "x$OPENJDK_TARGET_OS" = xlinux; then + # And since we now know that the linker is gnu, then add -z defs, to forbid + # undefined symbols in object files. + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs" + if test "x$DEBUG_LEVEL" = "xrelease"; then + # When building release libraries, tell the linker optimize them. + # Should this be supplied to the OSS linker as well? + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + fi fi fi - LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/server \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/client \ diff --git a/common/autoconf/toolchain_windows.m4 b/common/autoconf/toolchain_windows.m4 new file mode 100644 index 00000000000..f034ded638c --- /dev/null +++ b/common/autoconf/toolchain_windows.m4 @@ -0,0 +1,258 @@ +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +AC_DEFUN([TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT], +[ + if test "x$VS_ENV_CMD" = x; then + VS100BASE="$1" + METHOD="$2" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(VS100BASE) + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + AC_MSG_NOTICE([Found Visual Studio installation at $VS100BASE using $METHOD]) + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + AC_MSG_NOTICE([Found Visual Studio installation at $VS100BASE using $METHOD]) + AC_MSG_NOTICE([Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring]) + fi + fi + fi +]) + +AC_DEFUN([TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT], +[ + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="$1" + METHOD="$2" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(WIN_SDK_BASE) + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + AC_MSG_NOTICE([Found Windows SDK installation at $WIN_SDK_BASE using $METHOD]) + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + AC_MSG_NOTICE([Found Windows SDK installation at $WIN_SDK_BASE using $METHOD]) + AC_MSG_NOTICE([Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring]) + fi + fi + fi +]) + +AC_DEFUN([TOOLCHAIN_FIND_VISUAL_STUDIO_BAT_FILE], +[ + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILE="vc/bin/vcvars32.bat" + else + VCVARSFILE="vc/bin/amd64/vcvars64.bat" + fi + + VS_ENV_CMD="" + VS_ENV_ARGS="" + if test "x$with_toolsdir" != x; then + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([$with_toolsdir/../..], [--with-tools-dir]) + fi + + if test "x$with_toolsdir" != x && test "x$VS_ENV_CMD" = x; then + # Having specified an argument which is incorrect will produce an instant failure; + # we should not go on looking + AC_MSG_NOTICE([The path given by --with-tools-dir does not contain a valid Visual Studio installation]) + AC_MSG_NOTICE([Please point to the VC/bin directory within the Visual Studio installation]) + AC_MSG_ERROR([Cannot locate a valid Visual Studio installation]) + fi + + if test "x$ProgramW6432" != x; then + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([$ProgramW6432/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + fi + if test "x$PROGRAMW6432" != x; then + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([$PROGRAMW6432/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + fi + if test "x$PROGRAMFILES" != x; then + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([$PROGRAMFILES/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + fi + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([C:/Program Files/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + + if test "x$VS100COMNTOOLS" != x; then + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([$VS100COMNTOOLS/../..], [VS100COMNTOOLS variable]) + fi + if test "x$PROGRAMFILES" != x; then + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([$PROGRAMFILES/Microsoft Visual Studio 10.0], [well-known name]) + fi + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([C:/Program Files/Microsoft Visual Studio 10.0], [well-known name]) + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([C:/Program Files (x86)/Microsoft Visual Studio 10.0], [well-known name]) +]) + +# Check if the VS env variables were setup prior to running configure. +# If not, then find vcvarsall.bat and run it automatically, and integrate +# the set env variables into the spec file. +AC_DEFUN([TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV], +[ + # Store path to cygwin link.exe to help excluding it when searching for + # VS linker. This must be done before changing the PATH when looking for VS. + AC_PATH_PROG(CYGWIN_LINK, link) + if test "x$CYGWIN_LINK" != x; then + AC_MSG_CHECKING([if the first found link.exe is actually the Cygwin link tool]) + "$CYGWIN_LINK" --version > /dev/null + if test $? -eq 0 ; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + # This might be the VS linker. Don't exclude it later on. + CYGWIN_LINK="" + fi + fi + + # First-hand choice is to locate and run the vsvars bat file. + TOOLCHAIN_FIND_VISUAL_STUDIO_BAT_FILE + if test "x$VS_ENV_CMD" != x; then + # We have found a Visual Studio environment on disk, let's extract variables from the vsvars bat file. + BASIC_FIXUP_EXECUTABLE(VS_ENV_CMD) + + # Lets extract the variables that are set by vcvarsall.bat/vsvars32.bat/vsvars64.bat + AC_MSG_NOTICE([Trying to extract Visual Studio environment variables]) + cd $OUTPUT_ROOT + # FIXME: The code betweeen ---- was inlined from a separate script and is not properly adapted + # to autoconf standards. + + #---- + + # Cannot use the VS10 setup script directly (since it only updates the DOS subshell environment) + # but calculate the difference in Cygwin environment before/after running it and then + # apply the diff. + + if test "x$OPENJDK_BUILD_OS_ENV" = xwindows.cygwin; then + _vs10varsall=`cygpath -a -m -s "$VS_ENV_CMD"` + _dosvs10varsall=`cygpath -a -w -s $_vs10varsall` + _dosbash=`cygpath -a -w -s \`which bash\`.*` + else + _dosvs10varsall=`cmd //c echo $VS_ENV_CMD` + _dosbash=`cmd //c echo \`which bash\`` + fi + + # generate the set of exported vars before/after the vs10 setup + $ECHO "@echo off" > localdevenvtmp.bat + $ECHO "$_dosbash -c \"export -p\" > localdevenvtmp.export0" >> localdevenvtmp.bat + $ECHO "call $_dosvs10varsall $VS_ENV_ARGS" >> localdevenvtmp.bat + $ECHO "$_dosbash -c \"export -p\" > localdevenvtmp.export1" >> localdevenvtmp.bat + + # Now execute the newly created bat file. + # The | cat is to stop SetEnv.Cmd to mess with system colors on msys + cmd /c localdevenvtmp.bat | cat + + # apply the diff (less some non-vs10 vars named by "!") + $SORT localdevenvtmp.export0 | $GREP -v "!" > localdevenvtmp.export0.sort + $SORT localdevenvtmp.export1 | $GREP -v "!" > localdevenvtmp.export1.sort + $COMM -1 -3 localdevenvtmp.export0.sort localdevenvtmp.export1.sort > localdevenv.sh + + # cleanup + $RM localdevenvtmp* + #---- + cd $CURDIR + if test ! -s $OUTPUT_ROOT/localdevenv.sh; then + AC_MSG_RESULT([no]) + AC_MSG_NOTICE([Could not succesfully extract the envionment variables needed for the VS setup.]) + AC_MSG_NOTICE([Try setting --with-tools-dir to the VC/bin directory within the VS installation]) + AC_MSG_NOTICE([or run "bash.exe -l" from a VS command prompt and then run configure from there.]) + AC_MSG_ERROR([Cannot continue]) + fi + + # Now set all paths and other env variables. This will allow the rest of + # the configure script to find and run the compiler in the proper way. + AC_MSG_NOTICE([Setting extracted environment variables]) + . $OUTPUT_ROOT/localdevenv.sh + else + # We did not find a vsvars bat file, let's hope we are run from a VS command prompt. + AC_MSG_NOTICE([Cannot locate a valid Visual Studio installation, checking current environment]) + fi + + # At this point, we should have corrent variables in the environment, or we can't continue. + AC_MSG_CHECKING([for Visual Studio variables]) + + if test "x$VCINSTALLDIR" != x || test "x$WindowsSDKDir" != x || test "x$WINDOWSSDKDIR" != x; then + if test "x$INCLUDE" = x || test "x$LIB" = x; then + AC_MSG_RESULT([present but broken]) + AC_MSG_ERROR([Your VC command prompt seems broken, INCLUDE and/or LIB is missing.]) + else + AC_MSG_RESULT([ok]) + VS_INCLUDE="$INCLUDE" + VS_LIB="$LIB" + VS_PATH="$PATH" + AC_SUBST(VS_INCLUDE) + AC_SUBST(VS_LIB) + AC_SUBST(VS_PATH) + fi + else + AC_MSG_RESULT([not found]) + + if test "x$VS_ENV_CMD" = x; then + AC_MSG_NOTICE([Cannot locate a valid Visual Studio or Windows SDK installation on disk,]) + AC_MSG_NOTICE([nor is this script run from a Visual Studio command prompt.]) + else + AC_MSG_NOTICE([Running the extraction script failed.]) + fi + AC_MSG_NOTICE([Try setting --with-tools-dir to the VC/bin directory within the VS installation]) + AC_MSG_NOTICE([or run "bash.exe -l" from a VS command prompt and then run configure from there.]) + AC_MSG_ERROR([Cannot continue]) + fi + + AC_MSG_CHECKING([for msvcr100.dll]) + AC_ARG_WITH(msvcr-dll, [AS_HELP_STRING([--with-msvcr-dll], + [copy this msvcr100.dll into the built JDK (Windows only) @<:@probed@:>@])]) + if test "x$with_msvcr_dll" != x; then + MSVCR_DLL="$with_msvcr_dll" + else + if test "x$VCINSTALLDIR" != x; then + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | grep x64 | head --lines 1` + else + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | grep x86 | grep -v ia64 | grep -v x64 | head --lines 1` + if test "x$MSVCR_DLL" = x; then + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | head --lines 1` + fi + fi + if test "x$MSVCR_DLL" != x; then + AC_MSG_NOTICE([msvcr100.dll found in VCINSTALLDIR: $VCINSTALLDIR]) + else + AC_MSG_NOTICE([Warning: msvcr100.dll not found in VCINSTALLDIR: $VCINSTALLDIR]) + fi + fi + if test "x$MSVCR_DLL" = x; then + if test -f "$SYSTEMROOT/system32/msvcr100.dll"; then + AC_MSG_NOTICE([msvcr100.dll found in $SYSTEMROOT/system32]) + MSVCR_DLL="$SYSTEMROOT/system32/msvcr100.dll" + fi + fi + fi + if test "x$MSVCR_DLL" = x; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([Could not find msvcr100.dll !]) + fi + AC_MSG_RESULT([$MSVCR_DLL]) + BASIC_FIXUP_PATH(MSVCR_DLL) +]) diff --git a/common/autoconf/version.numbers b/common/autoconf/version.numbers index fc558c22818..f174ed4228f 100644 --- a/common/autoconf/version.numbers +++ b/common/autoconf/version.numbers @@ -34,3 +34,7 @@ PRODUCT_NAME=OpenJDK PRODUCT_SUFFIX="Runtime Environment" JDK_RC_PLATFORM_NAME=Platform COMPANY_NAME=N/A + +# Might need better names for these +MACOSX_BUNDLE_NAME_BASE="OpenJDK" +MACOSX_BUNDLE_ID_BASE="net.java.openjdk" diff --git a/common/bin/compare.sh b/common/bin/compare.sh new file mode 100644 index 00000000000..ef3e80fca4d --- /dev/null +++ b/common/bin/compare.sh @@ -0,0 +1,1220 @@ +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This script is processed by configure before it's usable. It is run from +# the root of the build directory. + + +########################################################################################## + +# Check that we are run via the wrapper generated by configure +if [ -z "$SRC_ROOT" ]; then + echo "Error: You must run this script using build/[conf]/compare.sh" + exit 1 +fi + +if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then + FULLDUMP_CMD="$OTOOL -v -V -h -X -t -d" + LDD_CMD="$OTOOL -L" + DIS_CMD="$OTOOL -v -t" + STAT_PRINT_SIZE="-f %z" +elif [ "$OPENJDK_TARGET_OS" = "windows" ]; then + FULLDUMP_CMD="$DUMPBIN -all" + LDD_CMD="$DUMPBIN -dependants | $GREP .dll" + DIS_CMD="$DUMPBIN -disasm:nobytes" + STAT_PRINT_SIZE="-c %s" +else + FULLDUMP_CMD="$READELF -a" + LDD_CMD="$LDD" + DIS_CMD="$OBJDUMP -d" + STAT_PRINT_SIZE="-c %s" +fi + +UNARCHIVE="$UNZIP -q" + +COMPARE_EXCEPTIONS_INCLUDE="$SRC_ROOT/common/bin/compare_exceptions.sh.incl" +if [ ! -e "$COMPARE_EXCEPTIONS_INCLUDE" ]; then + echo "Error: Cannot locate the exceptions file, it should have been here: $COMPARE_EXCEPTIONS_INCLUDE" + exit 1 +fi +# Include exception definitions +. "$COMPARE_EXCEPTIONS_INCLUDE" + +########################################################################################## +# Compare text files and ignore specific differences: +# +# * Timestamps in Java sources generated by idl2java +# * Sorting order and cleanup style in .properties files + +diff_text() { + OTHER_FILE=$1 + THIS_FILE=$2 + + SUFFIX="${THIS_FILE##*.}" + + TMP=1 + + if [[ "$THIS_FILE" = *"META-INF/MANIFEST.MF" ]]; then + TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \ + $GREP '^[<>]' | \ + $SED -e '/[<>] Ant-Version: Apache Ant .*/d' \ + -e '/[<>] Created-By: .* (Oracle Corporation).*/d') + fi + if test "x$SUFFIX" = "xjava"; then + TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \ + $GREP '^[<>]' | \ + $SED -e '/[<>] \* from.*\.idl/d' \ + -e '/[<>] \*.*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \ + -e '/[<>] \*.*[0-9]\{4\} [0-9][0-9]*:[0-9]\{2\}:[0-9]\{2\}.*/d' \ + -e '/\/\/ Generated from input file.*/d' \ + -e '/\/\/ This file was generated AUTOMATICALLY from a template file.*/d' \ + -e '/\/\/ java GenerateCharacter.*/d') + fi + # Ignore date strings in class files. + # On Macosx the system sources for generated java classes produce different output on + # consequtive invokations seemingly randomly. + # For example a method parameter randomly named "thePoint" or "aPoint". Ignore this. + if test "x$SUFFIX" = "xclass"; then + # To improve performance when large diffs are found, do a rough filtering of classes + # elibeble for these exceptions + if $GREP -R -e '[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}' -e thePoint -e aPoint -e setItemsPtr ${THIS_FILE} > /dev/null; then + $JAVAP -c -constants -l -p ${OTHER_FILE} > ${OTHER_FILE}.javap + $JAVAP -c -constants -l -p ${THIS_FILE} > ${THIS_FILE}.javap + TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \ + $GREP '^[<>]' | \ + $SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \ + -e '/[<>].*Point Lcom\/apple\/jobjc\/foundation\/NSPoint;/d' \ + -e '/[<>].*public com\.apple\.jobjc\.Pointer].*public void setItemsPtr(com\.apple\.jobjc\.Pointer $OTHER_FILE.cleaned + TMP=$(LANG=C $DIFF $OTHER_FILE.cleaned $THIS_FILE) + fi + if test -n "$TMP"; then + echo Files $OTHER_FILE and $THIS_FILE differ + return 1 + fi + + return 0 +} + +########################################################################################## +# Compare directory structure + +compare_dirs() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + mkdir -p $WORK_DIR + + (cd $OTHER_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_other) + (cd $THIS_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_this) + + $DIFF $WORK_DIR/dirs_other $WORK_DIR/dirs_other > $WORK_DIR/dirs_diff + + echo -n Directory structure... + if [ -s $WORK_DIR/dirs_diff ]; then + echo Differences found. + REGRESSIONS=true + # Differences in directories found. + ONLY_OTHER=$($GREP '<' $WORK_DIR/dirs_diff) + if [ "$ONLY_OTHER" ]; then + echo Only in $OTHER + $GREP '<' $WORK_DIR/dirs_diff | $SED 's|< ./| |g' + fi + ONLY_THIS=$($GREP '>' $WORK_DIR/dirs_diff) + if [ "$ONLY_THIS" ]; then + echo Only in $THIS + $GREP '>' $WORK_DIR/dirs_diff | $SED 's|> ./| |g' + fi + else + echo Identical! + fi +} + + +########################################################################################## +# Compare file structure + +compare_files() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + $MKDIR -p $WORK_DIR + + (cd $OTHER_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_other) + (cd $THIS_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_this) + + $DIFF $WORK_DIR/files_other $WORK_DIR/files_this > $WORK_DIR/files_diff + + echo -n File names... + if [ -s $WORK_DIR/files_diff ]; then + echo Differences found. + REGRESSIONS=true + # Differences in files found. + ONLY_OTHER=$($GREP '<' $WORK_DIR/files_diff) + if [ "$ONLY_OTHER" ]; then + echo Only in $OTHER + $GREP '<' $WORK_DIR/files_diff | $SED 's|< ./| |g' + fi + ONLY_THIS=$($GREP '>' $WORK_DIR/files_diff) + if [ "$ONLY_THIS" ]; then + echo Only in $THIS + $GREP '>' $WORK_DIR/files_diff | $SED 's|> ./| |g' + fi + else + echo Identical! + fi +} + + +########################################################################################## +# Compare permissions + +compare_permissions() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + mkdir -p $WORK_DIR + + echo -n Permissions... + found="" + for f in `cd $OTHER_DIR && $FIND . -type f` + do + if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi + if [ ! -f ${THIS_DIR}/$f ]; then continue; fi + OP=`ls -l ${OTHER_DIR}/$f | awk '{printf("%.10s\n", $1);}'` + TP=`ls -l ${THIS_DIR}/$f | awk '{printf("%.10s\n", $1);}'` + if [ "$OP" != "$TP" ] + then + if [ -z "$found" ]; then echo ; found="yes"; fi + $PRINTF "\told: ${OP} new: ${TP}\t$f\n" + fi + done + if [ -z "$found" ]; then + echo "Identical!" + else + REGRESSIONS=true + fi +} + +########################################################################################## +# Compare file command output + +compare_file_types() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + $MKDIR -p $WORK_DIR + + echo -n File types... + found="" + for f in `cd $OTHER_DIR && $FIND . ! -type d` + do + if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi + if [ ! -f ${THIS_DIR}/$f ]; then continue; fi + OF=`cd ${OTHER_DIR} && $FILE -h $f` + TF=`cd ${THIS_DIR} && $FILE -h $f` + if [ "$f" = "./src.zip" ] || [[ "$f" = *"/Home/src.zip" ]] || [[ "$f" = *"/lib/JObjC.jar" ]] + then + if [ "`echo $OF | $GREP -ic zip`" -gt 0 -a "`echo $TF | $GREP -ic zip`" -gt 0 ] + then + # the way we produces zip-files make it so that directories are stored in old file + # but not in new (only files with full-path) + # this makes file-5.09 report them as different + continue; + fi + fi + + if [ "$OF" != "$TF" ] + then + if [ -z "$found" ]; then echo ; found="yes"; fi + $PRINTF "\tother: ${OF}\n\tthis : ${TF}\n" + fi + done + if [ -z "$found" ]; then + echo "Identical!" + else + REGRESSIONS=true + fi +} + +########################################################################################## +# Compare the rest of the files + +compare_general_files() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \ + ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \ + ! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \ + ! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \ + ! -name "*.lib" ! -name "*.war" \ + | $GREP -v "./bin/" | $SORT | $FILTER) + + echo General files... + for f in $GENERAL_FILES + do + if [ -e $OTHER_DIR/$f ]; then + if [ "$(basename $f)" = "release" ]; then + # Ignore differences in change numbers in release file. + OTHER_FILE=$WORK_DIR/$f.other + THIS_FILE=$WORK_DIR/$f.this + $MKDIR -p $(dirname $OTHER_FILE) + $MKDIR -p $(dirname $THIS_FILE) + $CAT $OTHER_DIR/$f | $SED 's/\:[0-9a-f]\{12,12\}/:CHANGE/g' > $OTHER_FILE + $CAT $THIS_DIR/$f | $SED 's/\:[0-9a-f]\{12,12\}/:CHANGE/g' > $THIS_FILE + else + OTHER_FILE=$OTHER_DIR/$f + THIS_FILE=$THIS_DIR/$f + fi + DIFF_OUT=$($DIFF $OTHER_FILE $THIS_FILE 2>&1) + if [ -n "$DIFF_OUT" ]; then + echo $f + REGRESSIONS=true + if [ "$SHOW_DIFFS" = "true" ]; then + echo "$DIFF_OUT" + fi + fi + fi + done + + +} + +########################################################################################## +# Compare zip file + +compare_zip_file() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + ZIP_FILE=$4 + + THIS_ZIP=$THIS_DIR/$ZIP_FILE + OTHER_ZIP=$OTHER_DIR/$ZIP_FILE + + THIS_SUFFIX="${THIS_ZIP##*.}" + OTHER_SUFFIX="${OTHER_ZIP##*.}" + if [ "$THIS_SUFFIX" != "$OTHER_SUFFIX" ]; then + echo The files do not have the same suffix type! + return 2 + fi + + TYPE="$THIS_SUFFIX" + + if $CMP $OTHER_ZIP $THIS_ZIP > /dev/null + then + return 0 + fi + # Not quite identical, the might still contain the same data. + # Unpack the jar/zip files in temp dirs + + THIS_UNZIPDIR=$WORK_DIR/$ZIP_FILE.this + OTHER_UNZIPDIR=$WORK_DIR/$ZIP_FILE.other + $RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR + $MKDIR -p $THIS_UNZIPDIR + $MKDIR -p $OTHER_UNZIPDIR + (cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP) + (cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP) + + CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff + # On solaris, there is no -q option. + if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then + LANG=C $DIFF -r $OTHER_UNZIPDIR $THIS_UNZIPDIR \ + | $GREP -v -e "^<" -e "^>" -e "^Common subdirectories:" \ + > $CONTENTS_DIFF_FILE + else + LANG=C $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE + fi + + ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE) + ONLY_THIS=$($GREP "^Only in $THIS_UNZIPDIR" $CONTENTS_DIFF_FILE) + + return_value=0 + + if [ -n "$ONLY_OTHER" ]; then + echo " Only OTHER $ZIP_FILE contains:" + echo "$ONLY_OTHER" | sed "s|Only in $OTHER_UNZIPDIR| |"g | sed 's|: |/|g' + return_value=1 + fi + + if [ -n "$ONLY_THIS" ]; then + echo " Only THIS $ZIP_FILE contains:" + echo "$ONLY_THIS" | sed "s|Only in $THIS_UNZIPDIR| |"g | sed 's|: |/|g' + return_value=1 + fi + + if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then + DIFFING_FILES=$($GREP -e "differ$" -e "^diff " $CONTENTS_DIFF_FILE \ + | $CUT -f 3 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g") + else + DIFFING_FILES=$($GREP -e "differ$" $CONTENTS_DIFF_FILE \ + | $CUT -f 2 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g") + fi + + $RM -f $WORK_DIR/$ZIP_FILE.diffs + for file in $DIFFING_FILES; do + if [[ "$ACCEPTED_JARZIP_CONTENTS" != *"$file"* ]]; then + diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs + fi + done + + if [ -s "$WORK_DIR/$ZIP_FILE.diffs" ]; then + return_value=1 + echo " Differing files in $ZIP_FILE" + $CAT $WORK_DIR/$ZIP_FILE.diffs | $GREP differ | cut -f 2 -d ' ' | \ + $SED "s|$OTHER_UNZIPDIR| |g" > $WORK_DIR/$ZIP_FILE.difflist + $CAT $WORK_DIR/$ZIP_FILE.difflist + + if [ -n "$SHOW_DIFFS" ]; then + for i in $(cat $WORK_DIR/$ZIP_FILE.difflist) ; do + if [ -f "${OTHER_UNZIPDIR}/$i.javap" ]; then + LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.javap ${THIS_UNZIPDIR}/$i.javap + elif [ -f "${OTHER_UNZIPDIR}/$i.cleaned" ]; then + LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.cleaned ${THIS_UNZIPDIR}/$i + else + LANG=C $DIFF ${OTHER_UNZIPDIR}/$i ${THIS_UNZIPDIR}/$i + fi + done + fi + fi + + return $return_value +} + + +########################################################################################## +# Compare all zip files + +compare_all_zip_files() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.zip" | $SORT | $FILTER ) + + if [ -n "$ZIPS" ]; then + echo Zip files... + + return_value=0 + for f in $ZIPS; do + if [ -f "$OTHER_DIR/$f" ]; then + compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f + if [ "$?" != "0" ]; then + return_value=1 + REGRESSIONS=true + fi + fi + done + fi + + return $return_value +} + +########################################################################################## +# Compare all jar files + +compare_all_jar_files() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + # TODO filter? + ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.jar" -o -name "*.war" | $SORT | $FILTER) + + if [ -n "$ZIPS" ]; then + echo Jar files... + + return_value=0 + for f in $ZIPS; do + if [ -f "$OTHER_DIR/$f" ]; then + compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f + if [ "$?" != "0" ]; then + return_value=1 + REGRESSIONS=true + fi + fi + done + fi + + return $return_value +} + +########################################################################################## +# Compare binary (executable/library) file + +compare_bin_file() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + BIN_FILE=$4 + + THIS_FILE=$THIS_DIR/$BIN_FILE + OTHER_FILE=$OTHER_DIR/$BIN_FILE + NAME=$(basename $BIN_FILE) + WORK_FILE_BASE=$WORK_DIR/$BIN_FILE + FILE_WORK_DIR=$(dirname $WORK_FILE_BASE) + + $MKDIR -p $FILE_WORK_DIR + + ORIG_THIS_FILE="$THIS_FILE" + ORIG_OTHER_FILE="$OTHER_FILE" + + if [[ "$STRIP_BEFORE_COMPARE" = *"$BIN_FILE"* ]]; then + THIS_STRIPPED_FILE=$FILE_WORK_DIR/this/$NAME + OTHER_STRIPPED_FILE=$FILE_WORK_DIR/other/$NAME + $MKDIR -p $FILE_WORK_DIR/this $FILE_WORK_DIR/other + $CP $THIS_FILE $THIS_STRIPPED_FILE + $CP $OTHER_FILE $OTHER_STRIPPED_FILE + $STRIP $THIS_STRIPPED_FILE + $STRIP $OTHER_STRIPPED_FILE + THIS_FILE="$THIS_STRIPPED_FILE" + OTHER_FILE="$OTHER_STRIPPED_FILE" + fi + + if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + unset _NT_SYMBOL_PATH + # On windows we need to unzip the debug symbols, if present + OTHER_FILE_BASE=${OTHER_FILE/.dll/} + OTHER_FILE_BASE=${OTHER_FILE_BASE/.exe/} + DIZ_NAME=$(basename $OTHER_FILE_BASE).diz + # java.exe and java.dll diz files will have the same name. Have to + # make sure java.exe gets the right one. This is only needed for + # OTHER since in the new build, all pdb files are left around. + if [ "$NAME" = "java.exe" ] && [ -f "$OTHER/tmp/java/java/obj64/java.diz" ]; then + OTHER_DIZ_FILE="$OTHER/tmp/java/java/obj64/java.diz" + elif [ -f "${OTHER_FILE_BASE}.diz" ]; then + OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz + else + # Some files, jli.dll, appears twice in the image but only one of + # thme has a diz file next to it. + OTHER_DIZ_FILE="$($FIND $OTHER_DIR -name $DIZ_NAME | $SED 1q)" + if [ ! -f "$OTHER_DIZ_FILE" ]; then + # As a last resort, look for diz file in the whole build output + # dir. + OTHER_DIZ_FILE="$($FIND $OTHER -name $DIZ_NAME | $SED 1q)" + fi + fi + if [ -n "$OTHER_DIZ_FILE" ]; then + $MKDIR -p $FILE_WORK_DIR/other + (cd $FILE_WORK_DIR/other ; $UNARCHIVE -o $OTHER_DIZ_FILE) + export _NT_SYMBOL_PATH="$FILE_WORK_DIR/other" + fi + THIS_FILE_BASE=${THIS_FILE/.dll/} + THIS_FILE_BASE=${THIS_FILE_BASE/.exe/} + if [ -f "${THIS_FILE/.dll/}.diz" ]; then + THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz + else + THIS_DIZ_FILE="$($FIND $THIS_DIR -name $DIZ_NAME | $SED 1q)" + if [ ! -f "$THIS_DIZ_FILE" ]; then + # As a last resort, look for diz file in the whole build output + # dir. + THIS_DIZ_FILE="$($FIND $THIS -name $DIZ_NAME | $SED 1q)" + fi + fi + if [ -n "$THIS_DIZ_FILE" ]; then + $MKDIR -p $FILE_WORK_DIR/this + (cd $FILE_WORK_DIR/this ; $UNARCHIVE -o $THIS_DIZ_FILE) + export _NT_SYMBOL_PATH="$_NT_SYMBOL_PATH;$FILE_WORK_DIR/this" + fi + fi + + if [ -z "$SKIP_BIN_DIFF" ]; then + if cmp $OTHER_FILE $THIS_FILE > /dev/null; then + # The files were bytewise identical. + if [ -n "$VERBOSE" ]; then + echo " : : : : : $BIN_FILE" + fi + return 0 + fi + BIN_MSG=" diff " + if [[ "$ACCEPTED_BIN_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_BIN=true + if [[ "$KNOWN_BIN_DIFF" != *"$BIN_FILE"* ]]; then + BIN_MSG="*$BIN_MSG*" + REGRESSIONS=true + else + BIN_MSG=" $BIN_MSG " + fi + else + BIN_MSG="($BIN_MSG)" + DIFF_BIN= + fi + fi + + if [ -n "$STAT" ]; then + THIS_SIZE=$($STAT $STAT_PRINT_SIZE "$THIS_FILE") + OTHER_SIZE=$($STAT $STAT_PRINT_SIZE "$OTHER_FILE") + else + THIS_SIZE=$(ls -l "$THIS_FILE" | awk '{ print $5 }') + OTHER_SIZE=$(ls -l "$OTHER_FILE" | awk '{ print $5 }') + fi + if [ $THIS_SIZE -ne $OTHER_SIZE ]; then + DIFF_SIZE_NUM=$($EXPR $THIS_SIZE - $OTHER_SIZE) + DIFF_SIZE_REL=$($EXPR $THIS_SIZE \* 100 / $OTHER_SIZE) + SIZE_MSG=$($PRINTF "%3d%% %4d" $DIFF_SIZE_REL $DIFF_SIZE_NUM) + if [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] && [ "$DIFF_SIZE_REL" -gt 98 ] && [ "$DIFF_SIZE_REL" -lt 102 ]; then + SIZE_MSG="($SIZE_MSG)" + DIFF_SIZE= + elif [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] && [ "$DIFF_SIZE_NUM" = 512 ]; then + # On windows, size of binaries increase in 512 increments. + SIZE_MSG="($SIZE_MSG)" + DIFF_SIZE= + else + if [[ "$ACCEPTED_SIZE_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_SIZE=true + if [[ "$KNOWN_SIZE_DIFF" != *"$BIN_FILE"* ]]; then + SIZE_MSG="*$SIZE_MSG*" + REGRESSIONS=true + else + SIZE_MSG=" $SIZE_MSG " + fi + else + SIZE_MSG="($SIZE_MSG)" + DIFF_SIZE= + fi + fi + else + SIZE_MSG=" " + DIFF_SIZE= + if [[ "$KNOWN_SIZE_DIFF $ACCEPTED_SIZE_DIFF" = *"$BIN_FILE"* ]]; then + SIZE_MSG=" ! " + fi + fi + + if [[ "$SORT_SYMBOLS" = *"$BIN_FILE"* ]]; then + SYM_SORT_CMD="sort" + else + SYM_SORT_CMD="cat" + fi + + # Check symbols + if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + # The output from dumpbin on windows differs depending on if the debug symbol + # files are still around at the location the binary is pointing too. Need + # to filter out that extra information. + $DUMPBIN -exports $OTHER_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other + $DUMPBIN -exports $THIS_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this + elif [ "$OPENJDK_TARGET_OS" = "solaris" ]; then + # Some symbols get seemingly random 15 character prefixes. Filter them out. + $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other + $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this + else + $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other + $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this + fi + + LANG=C $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff + if [ -s $WORK_FILE_BASE.symbols.diff ]; then + SYM_MSG=" diff " + if [[ "$ACCEPTED_SYM_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_SYM=true + if [[ "$KNOWN_SYM_DIFF" != *"$BIN_FILE"* ]]; then + SYM_MSG="*$SYM_MSG*" + REGRESSIONS=true + else + SYM_MSG=" $SYM_MSG " + fi + else + SYM_MSG="($SYM_MSG)" + DIFF_SYM= + fi + else + SYM_MSG=" " + DIFF_SYM= + if [[ "$KNOWN_SYM_DIFF $ACCEPTED_SYM_DIFF" = *"$BIN_FILE"* ]]; then + SYM_MSG=" ! " + fi + fi + + # Check dependencies + if [ -n "$LDD_CMD" ]; then + (cd $FILE_WORK_DIR && $CP $OTHER_FILE . && $LDD_CMD $NAME | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.other | $UNIQ > $WORK_FILE_BASE.deps.other.uniq) + (cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.this | $UNIQ > $WORK_FILE_BASE.deps.this.uniq) + (cd $FILE_WORK_DIR && $RM -f $NAME) + + LANG=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this > $WORK_FILE_BASE.deps.diff + LANG=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq > $WORK_FILE_BASE.deps.diff.uniq + + if [ -s $WORK_FILE_BASE.deps.diff ]; then + if [ -s $WORK_FILE_BASE.deps.diff.uniq ]; then + DEP_MSG=" diff " + else + DEP_MSG=" redun " + fi + if [[ "$ACCEPTED_DEP_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_DEP=true + if [[ "$KNOWN_DEP_DIFF" != *"$BIN_FILE"* ]]; then + DEP_MSG="*$DEP_MSG*" + REGRESSIONS=true + else + DEP_MSG=" $DEP_MSG " + fi + else + DEP_MSG="($DEP_MSG)" + DIFF_DEP= + fi + else + DEP_MSG=" " + DIFF_DEP= + if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then + DEP_MSG=" ! " + fi + fi + else + DEP_MSG=" - " + fi + + # Compare fulldump output + if [ -n "$FULLDUMP_CMD" ] && [ -z "$SKIP_FULLDUMP_DIFF" ]; then + $FULLDUMP_CMD $OTHER_FILE > $WORK_FILE_BASE.fulldump.other 2>&1 + $FULLDUMP_CMD $THIS_FILE > $WORK_FILE_BASE.fulldump.this 2>&1 + LANG=C $DIFF $WORK_FILE_BASE.fulldump.other $WORK_FILE_BASE.fulldump.this > $WORK_FILE_BASE.fulldump.diff + + if [ -s $WORK_FILE_BASE.fulldump.diff ]; then + ELF_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.fulldump.diff | awk '{print $5}') + ELF_MSG=$($PRINTF "%8d" $ELF_DIFF_SIZE) + if [[ "$ACCEPTED_ELF_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_ELF=true + if [[ "$KNOWN_ELF_DIFF" != *"$BIN_FILE"* ]]; then + ELF_MSG="*$ELF_MSG*" + REGRESSIONS=true + else + ELF_MSG=" $ELF_MSG " + fi + else + ELF_MSG="($ELF_MSG)" + DIFF_ELF= + fi + else + ELF_MSG=" " + DIFF_ELF= + if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then + ELF_MSG=" ! " + fi + fi + fi + + # Compare disassemble output + if [ -n "$DIS_CMD" ] && [ -z "$SKIP_DIS_DIFF" ]; then + if [ -z "$DIS_DIFF_FILTER" ]; then + DIS_DIFF_FILTER="$CAT" + fi + $DIS_CMD $OTHER_FILE | $GREP -v $NAME | $DIS_DIFF_FILTER > $WORK_FILE_BASE.dis.other 2>&1 + $DIS_CMD $THIS_FILE | $GREP -v $NAME | $DIS_DIFF_FILTER > $WORK_FILE_BASE.dis.this 2>&1 + + LANG=C $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff + + if [ -s $WORK_FILE_BASE.dis.diff ]; then + DIS_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.dis.diff | awk '{print $5}') + DIS_MSG=$($PRINTF "%8d" $DIS_DIFF_SIZE) + if [[ "$ACCEPTED_DIS_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_DIS=true + if [[ "$KNOWN_DIS_DIFF" != *"$BIN_FILE"* ]]; then + DIS_MSG="*$DIS_MSG*" + REGRESSIONS=true + else + DIS_MSG=" $DIS_MSG " + fi + else + DIS_MSG="($DIS_MSG)" + DIFF_DIS= + fi + else + DIS_MSG=" " + DIFF_DIS= + if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then + DIS_MSG=" ! " + fi + fi + fi + + + if [ -n "$DIFF_BIN$DIFF_SIZE$DIFF_SYM$DIFF_DEP$DIFF_ELF$DIFF_DIS" ] || [ -n "$VERBOSE" ]; then + if [ -n "$BIN_MSG" ]; then echo -n "$BIN_MSG:"; fi + if [ -n "$SIZE_MSG" ]; then echo -n "$SIZE_MSG:"; fi + if [ -n "$SYM_MSG" ]; then echo -n "$SYM_MSG:"; fi + if [ -n "$DEP_MSG" ]; then echo -n "$DEP_MSG:"; fi + if [ -n "$ELF_MSG" ]; then echo -n "$ELF_MSG:"; fi + if [ -n "$DIS_MSG" ]; then echo -n "$DIS_MSG:"; fi + echo " $BIN_FILE" + if [ "$SHOW_DIFFS" = "true" ]; then + if [ -s "$WORK_FILE_BASE.symbols.diff" ]; then + echo "Symbols diff:" + $CAT $WORK_FILE_BASE.symbols.diff + fi + if [ -s "$WORK_FILE_BASE.deps.diff" ]; then + echo "Deps diff:" + $CAT $WORK_FILE_BASE.deps.diff + fi + if [ -s "$WORK_FILE_BASE.fulldump.diff" ]; then + echo "Fulldump diff:" + $CAT $WORK_FILE_BASE.fulldump.diff + fi + if [ -s "$WORK_FILE_BASE.dis.diff" ]; then + echo "Disassembly diff:" + $CAT $WORK_FILE_BASE.dis.diff + fi + fi + return 1 + fi + return 0 +} + +########################################################################################## +# Print binary diff header + +print_binary_diff_header() { + if [ -z "$SKIP_BIN_DIFF" ]; then echo -n " Binary :"; fi + if [ -z "$SKIP_SIZE_DIFF" ]; then echo -n " Size :"; fi + if [ -z "$SKIP_SYM_DIFF" ]; then echo -n " Symbols :"; fi + if [ -z "$SKIP_DEP_DIFF" ]; then echo -n " Deps :"; fi + if [ -z "$SKIP_FULLDUMP_DIFF" ]; then echo -n " Fulldump :"; fi + if [ -z "$SKIP_DIS_DIFF" ]; then echo -n " Disass :"; fi + echo +} + +########################################################################################## +# Compare all libraries + +compare_all_libs() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + LIBS=$(cd $THIS_DIR && $FIND . -type f \( -name 'lib*.so' -o -name '*.dylib' -o -name '*.dll' \) | $SORT | $FILTER) + + if [ -n "$LIBS" ]; then + echo Libraries... + print_binary_diff_header + for l in $LIBS; do + if [ -f "$OTHER_DIR/$l" ]; then + compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $l + if [ "$?" != "0" ]; then + return_value=1 + fi + fi + done + fi + + return $return_value +} + +########################################################################################## +# Compare all executables + +compare_all_execs() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + EXECS=$(cd $THIS_DIR && $FIND . -type f -name '*.exe' | $SORT | $FILTER) + else + EXECS=$(cd $THIS_DIR && $FIND . -name db -prune -o -type f -perm -100 \! \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' -o -name '*.cgi' -o -name '*.jar' -o -name '*.diz' \) | $SORT | $FILTER) + fi + + if [ -n "$EXECS" ]; then + echo Executables... + print_binary_diff_header + for e in $EXECS; do + if [ -f "$OTHER_DIR/$e" ]; then + compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $e + if [ "$?" != "0" ]; then + return_value=1 + fi + fi + done + fi + + return $return_value +} + +########################################################################################## +# Initiate configuration + +COMPARE_ROOT=/tmp/cimages.$USER +$MKDIR -p $COMPARE_ROOT +if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + if [ "$(uname -o)" = "Cygwin" ]; then + COMPARE_ROOT=$(cygpath -msa $COMPARE_ROOT) + fi +fi + +THIS="$( cd "$( dirname "$0" )" && pwd )" +echo "$THIS" +THIS_SCRIPT="$0" + +if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ] || [ "$1" = "/h" ] || [ "$1" = "/?" ] || [ "$1" = "-help" ] || [ "$1" = "--help" ]; then + echo "bash ./compare.sh [OPTIONS] [FILTER]" + echo "" + echo "-all Compare all files in all known ways" + echo "-names Compare the file names and directory structure" + echo "-perms Compare the permission bits on all files and directories" + echo "-types Compare the output of the file command on all files" + echo "-general Compare the files not convered by the specialized comparisons" + echo "-zips Compare the contents of all zip files" + echo "-jars Compare the contents of all jar files" + echo "-libs Compare all native libraries" + echo "-execs Compare all executables" + echo "-v Verbose output, does not hide known differences" + echo "-vv More verbose output, shows diff output of all comparisons" + echo "-o [OTHER] Compare with build in other directory. Will default to the old build directory" + echo "" + echo "[FILTER] List filenames in the image to compare, works for jars, zips, libs and execs" + echo "Example:" + echo "bash ./common/bin/compareimages.sh CodePointIM.jar" + exit 10 +fi + +CMP_NAMES=false +CMP_PERMS=false +CMP_TYPES=false +CMP_GENERAL=false +CMP_ZIPS=false +CMP_JARS=false +CMP_LIBS=false +CMP_EXECS=false + +while [ -n "$1" ]; do + case "$1" in + -v) + VERBOSE=true + ;; + -vv) + VERBOSE=true + SHOW_DIFFS=true + ;; + -o) + OTHER="$2" + shift + ;; + -all) + CMP_NAMES=true + if [ "$OPENJDK_TARGET_OS" != "windows" ]; then + CMP_PERMS=true + fi + CMP_TYPES=true + CMP_GENERAL=true + CMP_ZIPS=true + CMP_JARS=true + CMP_LIBS=true + CMP_EXECS=true + ;; + -names) + CMP_NAMES=true + ;; + -perms) + CMP_PERMS=true + ;; + -types) + CMP_TYPES=true + ;; + -general) + CMP_GENERAL=true + ;; + -zips) + CMP_ZIPS=true + ;; + -jars) + CMP_JARS=true + ;; + -libs) + CMP_LIBS=true + ;; + -execs) + CMP_EXECS=true + ;; + *) + CMP_NAMES=false + CMP_PERMS=false + CMP_TYPES=false + CMP_ZIPS=true + CMP_JARS=true + CMP_LIBS=true + CMP_EXECS=true + + if [ -z "$FILTER" ]; then + FILTER="$GREP" + fi + FILTER="$FILTER -e $1" + ;; + esac + shift +done + +if [ "$CMP_NAMES" = "false" ] && [ "$CMP_TYPES" = "false" ] && [ "$CMP_PERMS" = "false" ] && [ "$CMP_GENERAL" = "false" ] && [ "$CMP_ZIPS" = "false" ] && [ "$CMP_JARS" = "false" ] && [ "$CMP_LIBS" = "false" ] && [ "$CMP_EXECS" = "false" ]; then + CMP_NAMES=true + CMP_PERMS=true + CMP_TYPES=true + CMP_GENERAL=true + CMP_ZIPS=true + CMP_JARS=true + CMP_LIBS=true + CMP_EXECS=true +fi + +if [ -z "$FILTER" ]; then + FILTER="$CAT" +fi + +if [ -z "$OTHER" ]; then + OTHER="$THIS/../$LEGACY_BUILD_DIR" + if [ -d "$OTHER" ]; then + OTHER="$( cd "$OTHER" && pwd )" + else + echo "Default old build directory does not exist:" + echo "$OTHER" + exit 1 + fi + echo "Comparing to default old build:" + echo "$OTHER" + echo +else + if [ ! -d "$OTHER" ]; then + echo "Other build directory does not exist:" + echo "$OTHER" + exit 1 + fi + OTHER="$( cd "$OTHER" && pwd )" + echo "Comparing to:" + echo "$OTHER" + echo +fi + + +# Figure out the layout of the this build. Which kinds of images have been produced +if [ -d "$THIS/deploy/j2sdk-image" ]; then + THIS_J2SDK="$THIS/deploy/j2sdk-image" + THIS_J2RE="$THIS/deploy/j2re-image" +elif [ -d "$THIS/images/j2sdk-image" ]; then + THIS_J2SDK="$THIS/images/j2sdk-image" + THIS_J2RE="$THIS/images/j2re-image" +fi +if [ -d "$THIS/images/j2sdk-overlay-image" ]; then + THIS_J2SDK_OVERLAY="$THIS/images/j2sdk-overlay-image" + THIS_J2RE_OVERLAY="$THIS/images/j2re-overlay-image" +fi + +if [ -d "$THIS/images/j2sdk-bundle" ]; then + THIS_J2SDK_BUNDLE="$THIS/images/j2sdk-bundle" + THIS_J2RE_BUNDLE="$THIS/images/j2re-bundle" +fi + +# Figure out the layout of the other build (old or new, normal or overlay image) +if [ -d "$OTHER/j2sdk-image" ]; then + if [ -f "$OTHER/j2sdk-image/LICENSE" ]; then + OTHER_J2SDK="$OTHER/j2sdk-image" + OTHER_J2RE="$OTHER/j2re-image" + else + OTHER_J2SDK_OVERLAY="$OTHER/j2sdk-image" + OTHER_J2RE_OVERLAY="$OTHER/j2re-image" + fi + +fi + +if [ -d "$OTHER/j2sdk-bundle" ]; then + OTHER_J2SDK_BUNDLE="$OTHER/j2sdk-bundle" + OTHER_J2RE_BUNDLE="$OTHER/j2re-bundle" +elif [ -d "$OTHER/images/j2sdk-bundle" ]; then + OTHER_J2SDK_BUNDLE="$OTHER/images/j2sdk-bundle" + OTHER_J2RE_BUNDLE="$OTHER/images/j2re-bundle" +fi + +if [ -z "$THIS_J2SDK" ] || [ -z "$THIS_J2RE" ]; then + if [ -z "$THIS_J2SDK_OVERLAY" ]; then + echo "Cannot locate images for this build. Are you sure you have run 'make images'?" + exit 1 + fi +fi + +if [ -z "$OTHER_J2SDK" ] && [ -n "$OTHER_J2SDK_OVERLAY" ] && [ -z "$THIS_J2SDK_OVERLAY" ]; then + echo "OTHER build only has an overlay image while this build does not. Nothing to compare!" + exit 1 +fi + +if [ -z "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo "WARNING! OTHER build has bundles built while this build does not." + echo "Skipping bundle compare!" +fi + +########################################################################################## +# Do the work + +if [ "$CMP_NAMES" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + echo -n "J2SDK " + compare_dirs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_dirs $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + + echo -n "J2SDK " + compare_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "J2SDK Overlay " + compare_dirs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_dirs $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + + echo -n "J2SDK Overlay " + compare_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + fi + if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo -n "J2SDK Bundle " + compare_dirs $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_dirs $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + + echo -n "J2SDK Bundle " + compare_files $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_files $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + fi +fi + +if [ "$CMP_PERMS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + echo -n "J2SDK " + compare_permissions $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_permissions $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "J2SDK Overlay " + compare_permissions $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_permissions $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + fi + if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo -n "J2SDK Bundle " + compare_permissions $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_permissions $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + fi +fi + +if [ "$CMP_TYPES" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + echo -n "J2SDK " + compare_file_types $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_file_types $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "J2SDK Overlay " + compare_file_types $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_file_types $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + fi + if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo -n "J2SDK Bundle " + compare_file_types $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_file_types $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + fi +fi + +if [ "$CMP_GENERAL" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + echo -n "J2SDK " + compare_general_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_general_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "J2SDK Overlay " + compare_general_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_general_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + fi + if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo -n "J2SDK Bundle " + compare_general_files $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_general_files $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + fi +fi + +if [ "$CMP_ZIPS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + compare_all_zip_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + fi +fi + +if [ "$CMP_JARS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + compare_all_jar_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + fi +fi + +if [ "$CMP_LIBS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + compare_all_libs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "Bundle " + compare_all_libs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + fi +fi + +if [ "$CMP_EXECS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + compare_all_execs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "Overlay " + compare_all_execs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + fi +fi + +echo + +if [ -n "$REGRESSIONS" ]; then + echo "REGRESSIONS FOUND!" + echo + exit 1 +else + echo "No regressions found" + echo + exit 0 +fi diff --git a/common/bin/compare_exceptions.sh.incl b/common/bin/compare_exceptions.sh.incl new file mode 100644 index 00000000000..3e2946d17ea --- /dev/null +++ b/common/bin/compare_exceptions.sh.incl @@ -0,0 +1,935 @@ +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This script is not to be run as stand-alone, it should be included from +# compare.sh. + +########################################################################################## +# Check that we are run via inclusion from compare.sh and not as stand-alone. +if [ -z "$COMPARE_EXCEPTIONS_INCLUDE" ]; then + echo "Error: This script should not be run as stand-alone. It is included by compare.sh" + exit 1 +fi + +########################################################################################## +# Diff exceptions + +if [ "$OPENJDK_TARGET_OS" = "linux" ] && [ "$OPENJDK_TARGET_CPU" = "x86" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +" + +ACCEPTED_BIN_DIFF=" +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/i386/client/libjvm.so +./jre/lib/i386/libattach.so +./jre/lib/i386/libdt_socket.so +./jre/lib/i386/libhprof.so +./jre/lib/i386/libinstrument.so +./jre/lib/i386/libjava_crw_demo.so +./jre/lib/i386/libjsdt.so +./jre/lib/i386/libmanagement.so +./jre/lib/i386/libnpt.so +./jre/lib/i386/libverify.so +./jre/lib/i386/server/libjvm.so +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +" + +fi + +if [ "$OPENJDK_TARGET_OS" = "linux" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +" + +ACCEPTED_BIN_DIFF=" +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/amd64/libattach.so +./jre/lib/amd64/libdt_socket.so +./jre/lib/amd64/libhprof.so +./jre/lib/amd64/libinstrument.so +./jre/lib/amd64/libjava_crw_demo.so +./jre/lib/amd64/libjsdt.so +./jre/lib/amd64/libjsig.so +./jre/lib/amd64/libmanagement.so +./jre/lib/amd64/libnpt.so +./jre/lib/amd64/libsaproc.so +./jre/lib/amd64/libverify.so +./jre/lib/amd64/server/libjsig.so +./jre/lib/amd64/server/libjvm.so +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +" + +fi + +if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jni/Poller/lib/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/i386/jexec +" + +SORT_SYMBOLS=" +./jre/lib/i386/client/libjvm.so +./jre/lib/i386/libsaproc.so +./jre/lib/i386/server/libjvm.so +" + +SKIP_BIN_DIFF="true" + +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jni/Poller/lib/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/i386/client/libjvm.so +./jre/lib/i386/jli/libjli.so +./jre/lib/i386/libJdbcOdbc.so +./jre/lib/i386/libattach.so +./jre/lib/i386/libawt.so +./jre/lib/i386/libawt_headless.so +./jre/lib/i386/libawt_xawt.so +./jre/lib/i386/libdcpr.so +./jre/lib/i386/libdt_socket.so +./jre/lib/i386/libfontmanager.so +./jre/lib/i386/libhprof.so +./jre/lib/i386/libinstrument.so +./jre/lib/i386/libj2gss.so +./jre/lib/i386/libj2pcsc.so +./jre/lib/i386/libj2pkcs11.so +./jre/lib/i386/libj2ucrypto.so +./jre/lib/i386/libjaas_unix.so +./jre/lib/i386/libjava.so +./jre/lib/i386/libjava_crw_demo.so +./jre/lib/i386/libjawt.so +./jre/lib/i386/libjdwp.so +./jre/lib/i386/libjfr.so +./jre/lib/i386/libjpeg.so +./jre/lib/i386/libjsdt.so +./jre/lib/i386/libjsound.so +./jre/lib/i386/libkcms.so +./jre/lib/i386/liblcms.so +./jre/lib/i386/libmanagement.so +./jre/lib/i386/libmlib_image.so +./jre/lib/i386/libnet.so +./jre/lib/i386/libnio.so +./jre/lib/i386/libnpt.so +./jre/lib/i386/libsctp.so +./jre/lib/i386/libsplashscreen.so +./jre/lib/i386/libsunec.so +./jre/lib/i386/libsunwjdga.so +./jre/lib/i386/libt2k.so +./jre/lib/i386/libunpack.so +./jre/lib/i386/libverify.so +./jre/lib/i386/libzip.so +./jre/lib/i386/server/libjvm.so +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/unpack200 +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +./jre/bin/unpack200 +./jre/lib/i386/jexec +" + +SKIP_FULLDUMP_DIFF="true" + +# Filter random C++ symbol strings. +DIS_DIFF_FILTER="$SED -e s/\.[a-zA-Z0-9_\$]\{15,15\}//g" + +fi + +if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jni/Poller/lib/amd64/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/amd64/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/amd64/libgctest.so +./demo/jvmti/heapTracker/lib/amd64/libheapTracker.so +./demo/jvmti/heapViewer/lib/amd64/libheapViewer.so +./demo/jvmti/hprof/lib/amd64/libhprof.so +./demo/jvmti/minst/lib/amd64/libminst.so +./demo/jvmti/mtrace/lib/amd64/libmtrace.so +./demo/jvmti/versionCheck/lib/amd64/libversionCheck.so +./demo/jvmti/waiters/lib/amd64/libwaiters.so +" + +SORT_SYMBOLS=" +./jre/lib/amd64/server/libjvm.so +./jre/lib/amd64/libsaproc.so +" + +SKIP_BIN_DIFF="true" + +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jni/Poller/lib/amd64/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/amd64/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/amd64/libgctest.so +./demo/jvmti/heapTracker/lib/amd64/libheapTracker.so +./demo/jvmti/heapViewer/lib/amd64/libheapViewer.so +./demo/jvmti/hprof/lib/amd64/libhprof.so +./demo/jvmti/minst/lib/amd64/libminst.so +./demo/jvmti/mtrace/lib/amd64/libmtrace.so +./demo/jvmti/versionCheck/lib/amd64/libversionCheck.so +./demo/jvmti/waiters/lib/amd64/libwaiters.so +./jre/lib/amd64/jli/libjli.so +./jre/lib/amd64/libJdbcOdbc.so +./jre/lib/amd64/libattach.so +./jre/lib/amd64/libawt.so +./jre/lib/amd64/libawt_headless.so +./jre/lib/amd64/libawt_xawt.so +./jre/lib/amd64/libdcpr.so +./jre/lib/amd64/libdt_socket.so +./jre/lib/amd64/libfontmanager.so +./jre/lib/amd64/libhprof.so +./jre/lib/amd64/libinstrument.so +./jre/lib/amd64/libj2gss.so +./jre/lib/amd64/libj2pcsc.so +./jre/lib/amd64/libj2pkcs11.so +./jre/lib/amd64/libj2ucrypto.so +./jre/lib/amd64/libjaas_unix.so +./jre/lib/amd64/libjava.so +./jre/lib/amd64/libjava_crw_demo.so +./jre/lib/amd64/libjawt.so +./jre/lib/amd64/libjdwp.so +./jre/lib/amd64/libjfr.so +./jre/lib/amd64/libjpeg.so +./jre/lib/amd64/libjsdt.so +./jre/lib/amd64/libjsound.so +./jre/lib/amd64/libkcms.so +./jre/lib/amd64/liblcms.so +./jre/lib/amd64/libmanagement.so +./jre/lib/amd64/libmlib_image.so +./jre/lib/amd64/libnet.so +./jre/lib/amd64/libnio.so +./jre/lib/amd64/libnpt.so +./jre/lib/amd64/libsctp.so +./jre/lib/amd64/libsplashscreen.so +./jre/lib/amd64/libsunec.so +./jre/lib/amd64/libsunwjdga.so +./jre/lib/amd64/libt2k.so +./jre/lib/amd64/libunpack.so +./jre/lib/amd64/libverify.so +./jre/lib/amd64/libzip.so +./jre/lib/amd64/server/64/libjvm_db.so +./jre/lib/amd64/server/64/libjvm_dtrace.so +./bin/amd64/appletviewer +./bin/amd64/extcheck +./bin/amd64/idlj +./bin/amd64/jar +./bin/amd64/jarsigner +./bin/amd64/java +./bin/amd64/javac +./bin/amd64/javadoc +./bin/amd64/javah +./bin/amd64/javap +./bin/amd64/jcmd +./bin/amd64/jconsole +./bin/amd64/jdb +./bin/amd64/jhat +./bin/amd64/jinfo +./bin/amd64/jmap +./bin/amd64/jps +./bin/amd64/jrunscript +./bin/amd64/jsadebugd +./bin/amd64/jstack +./bin/amd64/jstat +./bin/amd64/jstatd +./bin/amd64/keytool +./bin/amd64/native2ascii +./bin/amd64/orbd +./bin/amd64/pack200 +./bin/amd64/policytool +./bin/amd64/rmic +./bin/amd64/rmid +./bin/amd64/rmiregistry +./bin/amd64/schemagen +./bin/amd64/serialver +./bin/amd64/servertool +./bin/amd64/tnameserv +./bin/amd64/unpack200 +./bin/amd64/wsgen +./bin/amd64/wsimport +./bin/amd64/xjc +./jre/bin/amd64/java +./jre/bin/amd64/keytool +./jre/bin/amd64/orbd +./jre/bin/amd64/pack200 +./jre/bin/amd64/policytool +./jre/bin/amd64/rmid +./jre/bin/amd64/rmiregistry +./jre/bin/amd64/servertool +./jre/bin/amd64/tnameserv +./jre/bin/amd64/unpack200 +./jre/lib/amd64/jexec +" + +SKIP_FULLDUMP_DIFF="true" + +# Filter random C++ symbol strings. +DIS_DIFF_FILTER="$SED -e s/\.[a-zA-Z0-9_\$]\{15,15\}//g" + +fi + +if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "sparc" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jni/Poller/lib/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/sparc/jexec +" + +SORT_SYMBOLS=" +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/sparc/client/64/libjvm_db.so +./jre/lib/sparc/client/64/libjvm_dtrace.so +./jre/lib/sparc/client/libjsig.so +./jre/lib/sparc/client/libjvm.so +./jre/lib/sparc/client/libjvm_db.so +./jre/lib/sparc/client/libjvm_dtrace.so +./jre/lib/sparc/libjsig.so +./jre/lib/sparc/libsaproc.so +./jre/lib/sparc/server/64/libjvm_db.so +./jre/lib/sparc/server/64/libjvm_dtrace.so +./jre/lib/sparc/server/libjsig.so +./jre/lib/sparc/server/libjvm.so +./jre/lib/sparc/server/libjvm_db.so +./jre/lib/sparc/server/libjvm_dtrace.so +" + +SKIP_BIN_DIFF="true" + +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jni/Poller/lib/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/sparc/client/libjvm.so +./jre/lib/sparc/jli/libjli.so +./jre/lib/sparc/libJdbcOdbc.so +./jre/lib/sparc/libattach.so +./jre/lib/sparc/libawt.so +./jre/lib/sparc/libawt_headless.so +./jre/lib/sparc/libawt_xawt.so +./jre/lib/sparc/libdcpr.so +./jre/lib/sparc/libdt_socket.so +./jre/lib/sparc/libfontmanager.so +./jre/lib/sparc/libhprof.so +./jre/lib/sparc/libinstrument.so +./jre/lib/sparc/libj2gss.so +./jre/lib/sparc/libj2pcsc.so +./jre/lib/sparc/libj2pkcs11.so +./jre/lib/sparc/libj2ucrypto.so +./jre/lib/sparc/libjaas_unix.so +./jre/lib/sparc/libjava.so +./jre/lib/sparc/libjava_crw_demo.so +./jre/lib/sparc/libjawt.so +./jre/lib/sparc/libjdwp.so +./jre/lib/sparc/libjfr.so +./jre/lib/sparc/libjpeg.so +./jre/lib/sparc/libjsdt.so +./jre/lib/sparc/libjsound.so +./jre/lib/sparc/libkcms.so +./jre/lib/sparc/liblcms.so +./jre/lib/sparc/libmanagement.so +./jre/lib/sparc/libmlib_image.so +./jre/lib/sparc/libmlib_image_v.so +./jre/lib/sparc/libnet.so +./jre/lib/sparc/libnio.so +./jre/lib/sparc/libnpt.so +./jre/lib/sparc/libsctp.so +./jre/lib/sparc/libsplashscreen.so +./jre/lib/sparc/libsunec.so +./jre/lib/sparc/libsunwjdga.so +./jre/lib/sparc/libt2k.so +./jre/lib/sparc/libunpack.so +./jre/lib/sparc/libverify.so +./jre/lib/sparc/libzip.so +./jre/lib/sparc/server/libjvm.so +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/unpack200 +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +./jre/bin/unpack200 +./jre/lib/sparc/jexec +" + +# Filter random C++ symbol strings. +# Some numbers differ randomly. +DIS_DIFF_FILTER="$SED -e s/\$[a-zA-Z0-9_\$]\{15,15\}//g -e s/\([0-9a-f][0-9a-f].[0-9a-f][0-9a-f].[0-9a-f][0-9a-f].\)[0-9a-f][0-9a-f]/\1/g -e s/\(%g1,.0x\)[0-9a-f]*\(,.%g1\)/\1\2/g -e s/\(!.\)[0-9a-f]*\(.\2/g" + +# Some xor instructions end up with different args in the lib but not in the object files. +ACCEPTED_DIS_DIFF=" +./demo/jvmti/waiters/lib/libwaiters.so +" + +SKIP_FULLDUMP_DIFF="true" + +fi + +if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "sparcv9" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jni/Poller/lib/sparcv9/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/sparcv9/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/sparcv9/libgctest.so +./demo/jvmti/heapTracker/lib/sparcv9/libheapTracker.so +./demo/jvmti/heapViewer/lib/sparcv9/libheapViewer.so +./demo/jvmti/hprof/lib/sparcv9/libhprof.so +./demo/jvmti/minst/lib/sparcv9/libminst.so +./demo/jvmti/mtrace/lib/sparcv9/libmtrace.so +./demo/jvmti/versionCheck/lib/sparcv9/libversionCheck.so +./demo/jvmti/waiters/lib/sparcv9/libwaiters.so +" + +SORT_SYMBOLS=" +./demo/jvmti/waiters/lib/sparcv9/libwaiters.so +./jre/lib/sparcv9/libjsig.so +./jre/lib/sparcv9/libsaproc.so +./jre/lib/sparcv9/server/libjvm.so +./jre/lib/sparcv9/server/libjvm_dtrace.so +" + +SKIP_BIN_DIFF="true" + +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jni/Poller/lib/sparcv9/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/sparcv9/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/sparcv9/libgctest.so +./demo/jvmti/heapTracker/lib/sparcv9/libheapTracker.so +./demo/jvmti/heapViewer/lib/sparcv9/libheapViewer.so +./demo/jvmti/hprof/lib/sparcv9/libhprof.so +./demo/jvmti/minst/lib/sparcv9/libminst.so +./demo/jvmti/mtrace/lib/sparcv9/libmtrace.so +./demo/jvmti/versionCheck/lib/sparcv9/libversionCheck.so +./demo/jvmti/waiters/lib/sparcv9/libwaiters.so +./jre/lib/sparcv9/client/libjvm.so +./jre/lib/sparcv9/jli/libjli.so +./jre/lib/sparcv9/libJdbcOdbc.so +./jre/lib/sparcv9/libattach.so +./jre/lib/sparcv9/libawt.so +./jre/lib/sparcv9/libawt_headless.so +./jre/lib/sparcv9/libawt_xawt.so +./jre/lib/sparcv9/libdcpr.so +./jre/lib/sparcv9/libdt_socket.so +./jre/lib/sparcv9/libfontmanager.so +./jre/lib/sparcv9/libhprof.so +./jre/lib/sparcv9/libinstrument.so +./jre/lib/sparcv9/libj2gss.so +./jre/lib/sparcv9/libj2pcsc.so +./jre/lib/sparcv9/libj2pkcs11.so +./jre/lib/sparcv9/libj2ucrypto.so +./jre/lib/sparcv9/libjaas_unix.so +./jre/lib/sparcv9/libjava.so +./jre/lib/sparcv9/libjava_crw_demo.so +./jre/lib/sparcv9/libjawt.so +./jre/lib/sparcv9/libjdwp.so +./jre/lib/sparcv9/libjfr.so +./jre/lib/sparcv9/libjpeg.so +./jre/lib/sparcv9/libjsdt.so +./jre/lib/sparcv9/libjsound.so +./jre/lib/sparcv9/libkcms.so +./jre/lib/sparcv9/liblcms.so +./jre/lib/sparcv9/libmanagement.so +./jre/lib/sparcv9/libmlib_image.so +./jre/lib/sparcv9/libmlib_image_v.so +./jre/lib/sparcv9/libnet.so +./jre/lib/sparcv9/libnio.so +./jre/lib/sparcv9/libnpt.so +./jre/lib/sparcv9/libsctp.so +./jre/lib/sparcv9/libsplashscreen.so +./jre/lib/sparcv9/libsunec.so +./jre/lib/sparcv9/libsunwjdga.so +./jre/lib/sparcv9/libt2k.so +./jre/lib/sparcv9/libunpack.so +./jre/lib/sparcv9/libverify.so +./jre/lib/sparcv9/libzip.so +./jre/lib/sparcv9/server/libjvm.so +./bin/sparcv9/appletviewer +./bin/sparcv9/extcheck +./bin/sparcv9/idlj +./bin/sparcv9/jar +./bin/sparcv9/jarsigner +./bin/sparcv9/java +./bin/sparcv9/javac +./bin/sparcv9/javadoc +./bin/sparcv9/javah +./bin/sparcv9/javap +./bin/sparcv9/jcmd +./bin/sparcv9/jconsole +./bin/sparcv9/jdb +./bin/sparcv9/jhat +./bin/sparcv9/jinfo +./bin/sparcv9/jmap +./bin/sparcv9/jps +./bin/sparcv9/jrunscript +./bin/sparcv9/jsadebugd +./bin/sparcv9/jstack +./bin/sparcv9/jstat +./bin/sparcv9/jstatd +./bin/sparcv9/keytool +./bin/sparcv9/native2ascii +./bin/sparcv9/orbd +./bin/sparcv9/pack200 +./bin/sparcv9/policytool +./bin/sparcv9/rmic +./bin/sparcv9/rmid +./bin/sparcv9/rmiregistry +./bin/sparcv9/schemagen +./bin/sparcv9/serialver +./bin/sparcv9/servertool +./bin/sparcv9/tnameserv +./bin/sparcv9/unpack200 +./bin/sparcv9/wsgen +./bin/sparcv9/wsimport +./bin/sparcv9/xjc +./jre/bin/sparcv9/java +./jre/bin/sparcv9/keytool +./jre/bin/sparcv9/orbd +./jre/bin/sparcv9/pack200 +./jre/bin/sparcv9/policytool +./jre/bin/sparcv9/rmid +./jre/bin/sparcv9/rmiregistry +./jre/bin/sparcv9/servertool +./jre/bin/sparcv9/tnameserv +./jre/bin/sparcv9/unpack200 +" + +# Filter random C++ symbol strings. +# Some numbers differ randomly. +DIS_DIFF_FILTER="$SED -e s/\$[a-zA-Z0-9_\$]\{15,15\}//g -e s/[0-9a-f][0-9a-f].[0-9a-f][0-9a-f].[0-9a-f][0-9a-f].[0-9a-f][0-9a-f]//g -e s/\(%g1,.0x\)[0-9a-f]*\(,.%g1\)/\1\2/g -e s/\(!.\)[0-9a-f]*\(.\2/g" + +# Some xor instructions end up with different args in the lib but not in the object files. +ACCEPTED_DIS_DIFF=" +./demo/jvmti/waiters/lib/sparcv9/libwaiters.so +" + +SKIP_FULLDUMP_DIFF="true" + +fi + + +if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + +# Probably should add all libs here +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jvmti/gctest/lib/gctest.dll +./demo/jvmti/heapTracker/lib/heapTracker.dll +./demo/jvmti/minst/lib/minst.dll +./jre/bin/attach.dll +./jre/bin/java_crw_demo.dll +./jre/bin/jsoundds.dll +./bin/appletviewer.exe +./bin/extcheck.exe +./bin/idlj.exe +./bin/jar.exe +./bin/jarsigner.exe +./bin/java-rmi.exe +./bin/java.exe +./bin/javac.exe +./bin/javadoc.exe +./bin/javah.exe +./bin/javap.exe +./bin/javaw.exe +./bin/jcmd.exe +./bin/jconsole.exe +./bin/jdb.exe +./bin/jhat.exe +./bin/jinfo.exe +./bin/jmap.exe +./bin/jps.exe +./bin/jrunscript.exe +./bin/jsadebugd.exe +./bin/jstack.exe +./bin/jstat.exe +./bin/jstatd.exe +./bin/keytool.exe +./bin/kinit.exe +./bin/klist.exe +./bin/ktab.exe +./bin/native2ascii.exe +./bin/orbd.exe +./bin/pack200.exe +./bin/policytool.exe +./bin/rmic.exe +./bin/rmid.exe +./bin/rmiregistry.exe +./bin/schemagen.exe +./bin/serialver.exe +./bin/servertool.exe +./bin/tnameserv.exe +./bin/unpack200.exe +./bin/wsgen.exe +./bin/wsimport.exe +./bin/xjc.exe +./jre/bin/java-rmi.exe +./jre/bin/java.exe +./jre/bin/javaw.exe +./jre/bin/keytool.exe +./jre/bin/kinit.exe +./jre/bin/klist.exe +./jre/bin/ktab.exe +./jre/bin/orbd.exe +./jre/bin/pack200.exe +./jre/bin/policytool.exe +./jre/bin/rmid.exe +./jre/bin/rmiregistry.exe +./jre/bin/servertool.exe +./jre/bin/tnameserv.exe +./jre/bin/unpack200.exe +" + +# On windows, there are unavoidable allignment issues making +# a perfect disasm diff impossible. Filter out the following: +# * Random parts of C++ symbols (this is a bit greedy, but does the trick) +# @XXXXX +# * Hexadecimal addresses that are sometimes alligned differently. +# * Dates in version strings XXXX_XX_XX. +DIS_DIFF_FILTER="$SED -e s/[@?][A-Z0-9_]\{1,25\}//g -e s/^.\{2,2\}[0-9A-F]\{16,16\}.\{2,2\}//g -e s/[0-9A-F]\{4,16\}h//g -e s/_[0-9]\{4,4\}_[0-9][0-9]_[0-9][0-9]//g" + +SKIP_BIN_DIFF="true" +SKIP_FULLDUMP_DIFF="true" + +fi + + +if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then +ACCEPTED_JARZIP_CONTENTS=" +/META-INF/INDEX.LIST +" + +KNOWN_BIN_DIFF=" +./jre/lib/libJObjC.dylib +" + +ACCEPTED_BIN_DIFF=" +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +./jre/lib/libsaproc.dylib +./jre/lib/server/libjvm.dylib +" + +KNOWN_SIZE_DIFF=" +./jre/lib/libJObjC.dylib +" + +SORT_SYMBOLS=" +./jre/lib/libJObjC.dylib +" + +KNOWN_SYM_DIFF=" +./jre/lib/libJObjC.dylib +" + +KNOWN_ELF_DIFF=" +./jre/lib/libJObjC.dylib +" + +KNOWN_DIS_DIFF=" +./jre/lib/libJObjC.dylib +" + +fi diff --git a/common/bin/compareimage.sh b/common/bin/compareimage.sh deleted file mode 100644 index 0e5d1f031dd..00000000000 --- a/common/bin/compareimage.sh +++ /dev/null @@ -1,335 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# MANUAL -# -# ./common/bin/compareimages.sh old_jdk_image new_jdk_image -# -# Compare the directory structure. -# Compare the filenames in the directories. -# Compare the contents of the zip archives -# Compare the contents of the jar archives -# Compare the native libraries -# Compare the native executables -# Compare the remaining files -# -# ./common/bin/compareimages.sh old_jdk_image new_jdk_image [zips jars libs execs other] -# -# Compare only the selected subset of the images. -# -# ./common/bin/compareimages.sh old_jdk_image new_jdk_image CodePointIM.jar -# -# Compare only the CodePointIM.jar file -# Can be used to compare zips, libraries and executables. -# - -if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then - echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image" - echo "" - echo "Compare the directory structure." - echo "Compare the filenames in the directories." - echo "Compare the contents of the zip archives" - echo "Compare the contents of the jar archives" - echo "Compare the native libraries" - echo "Compare the native executables" - echo "Compare the remaining files" - echo "" - echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image [zips jars libs execs other]" - echo "" - echo "Compare only the selected subset of the images." - echo "" - echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image CodePointIM.jar" - echo "" - echo "Compare only the CodePointIM.jar file" - echo "Can be used to compare zips, libraries and executables." - exit 10 -fi - -OLD="$1" -NEW="$2" -CMD="$3" - -DIFF_RESULT=0 - -CMP_ZIPS=false -CMP_JARS=false -CMP_LIBS=false -CMP_EXECS=false -CMP_OTHER=false - -FILTER="cat" - -if [ -n "$CMD" ]; then - case "$CMD" in - zips) - CMP_ZIPS=true - ;; - jars) - CMP_JARS=true - ;; - libs) - CMP_LIBS=true - ;; - execs) - CMP_EXECS=true - ;; - other) - CMP_OTHER=true - ;; - *) - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true - CMP_OTHER=true - FILTER="grep $3" - ;; - esac -else - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true - CMP_OTHER=true -fi - -DIFFJARZIP="/bin/bash `dirname $0`/diffjarzip.sh" -DIFFLIB="/bin/bash `dirname $0`/difflib.sh" -DIFFEXEC="/bin/bash `dirname $0`/diffexec.sh" -export COMPARE_ROOT=/tmp/cimages.$USER -mkdir -p $COMPARE_ROOT - -# Load the correct exception list. -case "`uname -s`" in - Linux) - . `dirname $0`/exception_list_linux - ;; -esac - -echo -echo Comparing $OLD to $NEW -echo - -(cd $OLD && find . -type d | sort > $COMPARE_ROOT/from_dirs) -(cd $NEW && find . -type d | sort > $COMPARE_ROOT/to_dirs) - -echo -n Directory structure... -if diff $COMPARE_ROOT/from_dirs $COMPARE_ROOT/to_dirs > /dev/null; then - echo Identical! -else - echo Differences found. - DIFF_RESULT=1 - # Differences in directories found. - ONLY_OLD=$(diff $COMPARE_ROOT/from_dirs $COMPARE_ROOT/to_dirs | grep '<') - if [ "$ONLY_OLD" ]; then - echo Only in $OLD - echo $ONLY_OLD | sed 's|< ./|\t|g' | sed 's/ /\n/g' - fi - # Differences in directories found. - ONLY_NEW=$(diff $COMPARE_ROOT/from_dirs $COMPARE_ROOT/to_dirs | grep '>') - if [ "$ONLY_NEW" ]; then - echo Only in $NEW - echo $ONLY_NEW | sed 's|> ./|\t|g' | sed 's/ /\n/g' - fi -fi - -(cd $OLD && find . -type f | sort > $COMPARE_ROOT/from_files) -(cd $NEW && find . -type f | sort > $COMPARE_ROOT/to_files) - -echo -n File names... -if diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files > /dev/null; then - echo Identical! -else - echo Differences found. - DIFF_RESULT=1 - # Differences in directories found. - ONLY_OLD=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '<') - if [ "$ONLY_OLD" ]; then - echo Only in $OLD - echo "$ONLY_OLD" | sed 's|< ./| |g' - fi - # Differences in directories found. - ONLY_NEW=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '>') - if [ "$ONLY_NEW" ]; then - echo Only in $NEW - echo "$ONLY_NEW" | sed 's|> ./| |g' - fi -fi - -echo -n Permissions... -found="" -for f in `cd $OLD && find . -type f` -do - if [ ! -f ${OLD}/$f ]; then continue; fi - if [ ! -f ${NEW}/$f ]; then continue; fi - OP=`ls -l ${OLD}/$f | awk '{printf("%.10s\n", $1);}'` - NP=`ls -l ${NEW}/$f | awk '{printf("%.10s\n", $1);}'` - if [ "$OP" != "$NP" ] - then - if [ -z "$found" ]; then echo ; found="yes"; fi - printf "\told: ${OP} new: ${NP}\t$f\n" - fi - - OF=`cd ${OLD} && file $f` - NF=`cd ${NEW} && file $f` - if [ "$f" = "./src.zip" ] - then - if [ "`echo $OF | grep -ic zip`" -gt 0 -a "`echo $NF | grep -ic zip`" -gt 0 ] - then - # the way we produces zip-files make it so that directories are stored in old file - # but not in new (only files with full-path) - # this makes file-5.09 report them as different - continue; - fi - fi - - if [ "$OF" != "$NF" ] - then - if [ -z "$found" ]; then echo ; found="yes"; fi - printf "\tFILE: old: ${OF} new: ${NF}\t$f\n" - fi -done -if [ -z "$found" ]; then echo ; found="yes"; fi - -GENERAL_FILES=$(cd $OLD && find . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \ - ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \ - ! -name "ct.sym" ! -name "*.diz" \ - | grep -v "./bin/" | sort | $FILTER) -echo General files... -for f in $GENERAL_FILES -do - if [ -e $NEW/$f ]; then - DIFF_OUT=$(diff $OLD/$f $NEW/$f 2>&1) - if [ -n "$DIFF_OUT" ]; then - echo $f - echo "$DIFF_OUT" - fi - fi -done - - -if [ "x$CMP_ZIPS" == "xtrue" ]; then - ZIPS=$(cd $OLD && find . -type f -name "*.zip" | sort | $FILTER) - - if [ -n "$ZIPS" ]; then - echo Zip files... - - for f in $ZIPS - do - $DIFFJARZIP $OLD/$f $NEW/$f $OLD $NEW - if [ "$?" != "0" ]; then - DIFF_RESULT=1 - fi - done - fi -fi - -if [ "x$CMP_JARS" == "xtrue" ]; then - JARS=$(cd $OLD && find . -type f -name "*.jar" -o -name "ct.sym" | sort | $FILTER) - - if [ -n "$JARS" ]; then - echo Jar files... - - for f in $JARS - do - DIFFJAR_OUTPUT=`$DIFFJARZIP $OLD/$f $NEW/$f $OLD $NEW` - DIFFJAR_RESULT=$? - if [ "$DIFFJAR_RESULT" != "0" ]; then - for diff in $LIST_DIFF_JAR; do - DIFFJAR_OUTPUT=`echo "$DIFFJAR_OUTPUT" | grep -v "$diff"` - done - if [ "`echo "$DIFFJAR_OUTPUT" | grep -v "Differing files in"`" != "" ]; then - DIFF_RESULT=1 - echo "$DIFFJAR_OUTPUT" - fi - fi - done - fi -fi - -if [ "x$FILTER" != "xcat" ]; then - VIEW=view -else - VIEW= -fi - -if [ "x$CMP_LIBS" == "xtrue" ]; then - LIBS=$(cd $OLD && find . -name 'lib*.so' -o -name '*.dylib' -o -name '*.dll' | sort | $FILTER) - - if [ -n "$LIBS" ]; then - echo Libraries... - for f in $LIBS - do - DIFFLIB_OUTPUT=`$DIFFLIB $OLD/$f $NEW/$f $OLD $NEW $VIEW` - DIFFLIB_RESULT=$? - if [ "$DIFFLIB_RESULT" = "0" ]; then - : - #echo "OK: $DIFFLIB_OUTPUT" - elif [ "$DIFFLIB_RESULT" = "2" ] && [[ "$LIST_DIFF_SIZE $LIST_DIFF_BYTE" == *"${f:2}"* ]]; then - : - #echo "OK: $DIFFLIB_OUTPUT" - elif [ "$DIFFLIB_RESULT" = "1" ] && [[ "$LIST_DIFF_BYTE" == *"${f:2}"* ]]; then - : - #echo "OK: $DIFFLIB_OUTPUT" - else - echo "$DIFFLIB_OUTPUT" - DIFF_RESULT=1 - fi - done - fi -fi - -if [ "x$CMP_EXECS" == "xtrue" ]; then - if [ $OSTYPE == "cygwin" ]; then - EXECS=$(cd $OLD && find . -type f -name '*.exe' | sort | $FILTER) - else - EXECS=$(cd $OLD && find . -type f -perm -100 \! \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' \) | sort | $FILTER) - fi - - - if [ -n "$EXECS" ]; then - echo Executables... - - for f in $EXECS - do - DIFFEXEC_OUTPUT=`$DIFFEXEC $OLD/$f $NEW/$f $OLD $NEW $VIEW` - DIFFEXEC_RESULT=$? - if [ "$DIFFEXEC_RESULT" = "0" ]; then - : - #echo "OK: $DIFFEXEC_OUTPUT" - elif [ "$DIFFEXEC_RESULT" = "2" ] && [[ "$LIST_DIFF_SIZE $LIST_DIFF_BYTE" == *"${f:2}"* ]]; then - : - #echo "OK: $DIFFEXEC_OUTPUT" - elif [ "$DIFFEXEC_RESULT" = "1" ] && [[ "$LIST_DIFF_BYTE" == *"${f:2}"* ]]; then - : - #echo "OK: $DIFFEXEC_OUTPUT" - else - echo "$DIFFEXEC_OUTPUT" - DIFF_RESULT=1 - fi - done - fi -fi - -exit $DIFF_RESULT diff --git a/common/bin/diffexec.sh b/common/bin/diffexec.sh deleted file mode 100644 index 85f7b67c69f..00000000000 --- a/common/bin/diffexec.sh +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -if [ $# -lt 2 ] -then - echo "Diff two executables. Return codes:" - echo "0 - no diff" - echo "1 - Identical symbols AND size, BUT not bytewise identical" - echo "2 - Identical symbols BUT NEW size" - echo "3 - Differences, content BUT SAME size" - echo "4 - Differences, content AND size" - echo "10 - Could not perform diff" - echo "Use 'quiet' to disable any output." - echo "Syntax: $0 file1 file2 [quiet]" - exit 10 -fi - -if [ ! -f $1 ] -then - echo $1 does not exist - exit 10 -fi - -if [ ! -f $2 ] -then - echo $2 does not exist - exit 10 -fi - -if [ "`uname`" == "SunOS" ]; then - if [ -f "`which nm`" ]; then - NM=nm - elif [ -f "`which gnm`" ]; then - NM=gnm - else - echo "No nm command found" - exit 10 - fi - LDD=ldd -elif [ $OSTYPE == "cygwin" ]; then - NM="$VS100COMNTOOLS/../../VC/bin/amd64/dumpbin.exe" - NM_ARGS=/exports - LDD= -elif [ "`uname`" == "Darwin" ]; then - NM=nm - LDD="otool -L" -else - NM=nm - LDD=ldd -fi - -# Should the differences be viewed? -VIEW= -# You can do export DIFF=meld to view -# any differences using meld instead. -if [ -n "$DIFF" ]; then - DIFF="$DIFF" -else - DIFF=diff -fi -OLD=$(cd $(dirname $1) && pwd)/$(basename $1) -NEW=$(cd $(dirname $2) && pwd)/$(basename $2) - -OLD_SIZE=$(ls -l "$OLD" | awk '{ print $5 }') -NEW_SIZE=$(ls -l "$NEW" | awk '{ print $5 }') - -if [ $# -gt 3 ] -then - ROOT1=$(cd $3 && pwd) - ROOT2=$(cd $4 && pwd) - OLD_NAME=$(echo $OLD | sed "s|$ROOT1/||") - NEW_NAME=$(echo $NEW | sed "s|$ROOT2/||") - if [ "x$5" == "xview" ]; then VIEW=view; fi -else - ROOT1=$(dirname $OLD)/ - ROOT2=$(dirname $NEW)/ - OLD_NAME=$OLD - NEW_NAME=$NEW - if [ "x$3" == "xview" ]; then VIEW=view; fi -fi - -if cmp $OLD $NEW > /dev/null -then - # The files were bytewise identical. - echo Identical: $OLD_NAME - exit 0 -fi - -OLD_SYMBOLS=$COMPARE_ROOT/$OLD_NAME.old -NEW_SYMBOLS=$COMPARE_ROOT/$NEW_NAME.new - -mkdir -p $(dirname $OLD_SYMBOLS) -mkdir -p $(dirname $NEW_SYMBOLS) - -if [ $OSTYPE == "cygwin" ]; then - "$NM" $NM_ARGS $OLD | grep " = " > $OLD_SYMBOLS - "$NM" $NM_ARGS $NEW | grep " = " > $NEW_SYMBOLS - "$NM" $NM_ARGS $OLD > $OLD_SYMBOLS.full - "$NM" $NM_ARGS $NEW > $NEW_SYMBOLS.full -else - # Strip the addresses, just compare the ordering of the symbols. - $NM $OLD | cut -f 2- -d ' ' > $OLD_SYMBOLS - $NM $NEW | cut -f 2- -d ' ' > $NEW_SYMBOLS - # But store the full information for easy diff access. - $NM $OLD > $OLD_SYMBOLS.full - $NM $NEW > $NEW_SYMBOLS.full -fi - -DIFFS=$(LANG=C diff $OLD_SYMBOLS $NEW_SYMBOLS) - -if [ "${LDD}" ] -then - NAME=`basename $OLD` - TMP=$COMPARE_ROOT/ldd/ldd.${NAME} - rm -rf "${TMP}" - mkdir -p "${TMP}" - - (cd "${TMP}" && cp $OLD . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.old | uniq > dep.uniq.old) - (cd "${TMP}" && cp $NEW . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.new | uniq > dep.uniq.new) - (cd "${TMP}" && rm -f ${NAME}) - - DIFFS_DEP=$(LANG=C diff "${TMP}/dep.old" "${TMP}/dep.new") - DIFFS_UNIQ_DEP=$(LANG=C diff "${TMP}/dep.uniq.old" "${TMP}/dep.uniq.new") - - DEP_MSG= - if [ -z "${DIFFS_UNIQ_DEP}" -a -z "${DIFFS_DEP}" ]; then - DEP_MSG="Identical dependencies" - elif [ -z "${DIFFS_UNIQ_DEP}" ]; then - DEP_MSG="Redundant duplicate dependencies added" - RES=1 - else - DEP_MSG="DIFFERENT dependencies" - RES=1 - fi -fi - -RESULT=0 - -if [ -n "$DIFFS" ]; then - if [ $OLD_SIZE -ne $NEW_SIZE ] - then - echo Differences, content AND size : $DEP_MSG : $OLD_NAME - RESULT=4 - else - echo Differences, content BUT SAME size: $DEP_MSG : $OLD_NAME - RESULT=3 - fi - if [ "x$VIEW" == "xview" ]; then - LANG=C $DIFF $OLD_SYMBOLS $NEW_SYMBOLS - fi -else - if [ $OLD_SIZE -ne $NEW_SIZE ] - then - echo Identical symbols BUT NEW size : $DEP_MSG : $OLD_NAME - RESULT=2 - else - echo Identical symbols AND size, BUT not bytewise identical: $DEP_MSG : $OLD_NAME - RESULT=1 - fi -fi - -exit $RESULT - - - diff --git a/common/bin/diffjarzip.sh b/common/bin/diffjarzip.sh deleted file mode 100644 index 6ad0a42c2f6..00000000000 --- a/common/bin/diffjarzip.sh +++ /dev/null @@ -1,155 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# Simple tool to diff two jar or zip files. It unpacks the jar/zip files and -# reports if files differs and if files are new or missing. -# Assumes gnu diff. - -# There are a few source files that have DOS line endings in the -# jaxp/jaxws source drops, when the sources were added to the repository -# the source files were converted to UNIX line endings. -# For now we ignore these differences. -DIFF_FLAGS="--strip-trailing-cr" -#set -x - -if [ $# -lt 2 ] -then - echo "Diff two jar/zip files. Return codes: 0 - no diff, 1 - diff, 2 - couldn't perform diff" - echo "Syntax: $0 old_archive new_archive [old_root new_root]" - exit 2 -fi - -if [ ! -f $1 ] -then - echo $1 does not exist - exit 2 -fi - -if [ ! -f $2 ] -then - echo $2 does not exist - exit 2 -fi - -IGNORES="cat" -OLD=$(cd $(dirname $1) && pwd)/$(basename $1) -NEW=$(cd $(dirname $2) && pwd)/$(basename $2) - -if [ $# -gt 3 ] -then - ROOT1=$(cd $3 && pwd) - ROOT2=$(cd $4 && pwd) - OLD_NAME=$(echo $OLD | sed "s|$ROOT1/||") - NEW_NAME=$(echo $NEW | sed "s|$ROOT2/||") - if [ $# == 5 ]; then IGNORES="$5"; fi -else - ROOT1=$(dirname $OLD)/ - ROOT2=$(dirname $NEW)/ - OLD_NAME=$OLD - NEW_NAME=$NEW - if [ $# == 3 ]; then IGNORES="$3"; fi -fi - -if [ "`uname`" == "SunOS" ]; then - if [ -f "`which gdiff`" ]; then - DIFF=gdiff - else - DIFF=diff - fi -else - DIFF=diff -fi - -OLD_SUFFIX="${OLD##*.}" -NEW_SUFFIX="${NEW##*.}" -if [ "$OLD_SUFFIX" != "$NEW_SUFFIX" ]; then - echo The files do not have the same suffix type! - exit 2 -fi - -if [ "$OLD_SUFFIX" != "zip" ] && [ "$OLD_SUFFIX" != "jar" ] && [ "$OLD_SUFFIX" != "sym" ]; then - echo The files have to be zip, jar or sym! They are $OLD_SUFFIX - exit 2 -fi - -UNARCHIVE="unzip -q" - -TYPE="$OLD_SUFFIX" - -if cmp $OLD $NEW > /dev/null -then - # The files were bytewise identical. - exit 0 -fi - -# Not quite identical, the might still contain the same data. -# Unpack the jar/zip files in temp dirs -if test "x$COMPARE_ROOT" == "x"; then - COMPARE_ROOT=/tmp/compare_root.$$ - REMOVE_COMPARE_ROOT=true -fi -OLD_TEMPDIR=$COMPARE_ROOT/$OLD_NAME.old -NEW_TEMPDIR=$COMPARE_ROOT/$NEW_NAME.new -mkdir -p $OLD_TEMPDIR -mkdir -p $NEW_TEMPDIR -(cd $OLD_TEMPDIR && rm -rf * ; $UNARCHIVE $OLD) -(cd $NEW_TEMPDIR && rm -rf * ; $UNARCHIVE $NEW) - -ONLY1=$(LANG=C $DIFF -rq $OLD_TEMPDIR $NEW_TEMPDIR | grep "^Only in $OLD_TEMPDIR") - -if [ -n "$ONLY1" ]; then - echo " Only the OLD $OLD_NAME contains:" - LANG=C $DIFF -rq $DIFF_FLAGS $OLD_TEMPDIR $NEW_TEMPDIR | grep "^Only in $OLD_TEMPDIR" \ - | sed "s|Only in $OLD_TEMPDIR| |"g | sed 's|: |/|g' -fi - -ONLY2=$(LANG=C $DIFF -rq $OLD_TEMPDIR $NEW_TEMPDIR | grep "^Only in $NEW_TEMPDIR") - -if [ -n "$ONLY2" ]; then - echo " Only the NEW $NEW_NAME contains:" - LANG=C $DIFF -rq $DIFF_FLAGS $OLD_TEMPDIR $NEW_TEMPDIR | grep "^Only in $NEW_TEMPDIR" \ - | sed "s|Only in $NEW_TEMPDIR| |"g | sed 's|: |/|g' -fi - -DIFFTEXT="/bin/bash `dirname $0`/difftext.sh" - -LANG=C $DIFF -rq $DIFF_FLAGS $OLD_TEMPDIR $NEW_TEMPDIR | grep differ | cut -f 2,4 -d ' ' | \ - awk "{ print \"$DIFFTEXT \"\$1\" \"\$2 }" > $COMPARE_ROOT/diffing - -/bin/bash $COMPARE_ROOT/diffing > $COMPARE_ROOT/diffs - -if [ -s "$COMPARE_ROOT/diffs" ]; then - echo " Differing files in $OLD_NAME" - cat $COMPARE_ROOT/diffs | grep differ | $IGNORES | cut -f 2 -d ' ' | \ - sed "s|$OLD_TEMPDIR| |g" -fi - -# Clean up - -if [ "x$REMOVE_COMPARE_ROOT" == xtrue ]; then - rm -rf $REMOVE_COMPARE_ROOT -fi - -exit 1 - diff --git a/common/bin/difflib.sh b/common/bin/difflib.sh deleted file mode 100644 index dc5eed14877..00000000000 --- a/common/bin/difflib.sh +++ /dev/null @@ -1,207 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# Simple tool to diff two shared libraries. -# Criterias: two shared libraries are considered equal if: -# the file sizes are the same AND the symbols outputs from the nm command are equal - -if [ $# -lt 2 ] -then - echo "Diff two shared libs. Return codes:" - echo "0 - no diff" - echo "1 - Identical symbols AND size, BUT not bytewise identical" - echo "2 - Identical symbols BUT NEW size" - echo "3 - Differences, content BUT SAME size" - echo "4 - Differences, content AND size" - echo "10 - Could not perform diff" - echo "Use 'quiet' to disable any output." - echo "Syntax: $0 file1 file2 [quiet]" - exit 10 -fi - -if [ ! -f $1 ] -then - echo $1 does not exist - exit 10 -fi - -if [ ! -f $2 ] -then - echo $2 does not exist - exit 10 -fi - -if [ "`uname`" == "SunOS" ]; then - if [ -f "`which gnm`" ]; then - NM=gnm -# Jonas 2012-05-29: solaris native nm produces radically different output than gnm -# so if using that...we need different filter than "cut -f 2-" -# - elif [ -f "`which nm`" ]; then - NM=nm - else - echo "No nm command found" - exit 10 - fi - LDD=ldd -elif [ $OSTYPE == "cygwin" ]; then - NM="$VS100COMNTOOLS/../../VC/bin/amd64/dumpbin.exe" - NM_ARGS=/exports - LDD= -elif [ "`uname`" == "Darwin" ]; then - NM=nm - LDD="otool -L" -else - NM=nm - LDD=ldd -fi - -# Should the differences be viewed? -VIEW= -# You can do export DIFF=meld to view -# any differences using meld instead. -if [ -n "$DIFF" ]; then - DIFF="$DIFF" -else - DIFF=diff -fi -OLD=$(cd $(dirname $1) && pwd)/$(basename $1) -NEW=$(cd $(dirname $2) && pwd)/$(basename $2) - -OLD_SIZE=$(ls -l "$OLD" | awk '{ print $5 }') -NEW_SIZE=$(ls -l "$NEW" | awk '{ print $5 }') - -if [ $# -gt 3 ] -then - ROOT1=$(cd $3 && pwd) - ROOT2=$(cd $4 && pwd) - OLD_NAME=$(echo $OLD | sed "s|$ROOT1/||") - NEW_NAME=$(echo $NEW | sed "s|$ROOT2/||") - if [ "x$5" == "xview" ]; then VIEW=view; fi -else - ROOT1=$(dirname $OLD)/ - ROOT2=$(dirname $NEW)/ - OLD_NAME=$OLD - NEW_NAME=$NEW - if [ "x$3" == "xview" ]; then VIEW=view; fi -fi - -OLD_SUFFIX="${OLD##*.}" -NEW_SUFFIX="${NEW##*.}" -if [ "$OLD_SUFFIX" != "$NEW_SUFFIX" ]; then - echo The files do not have the same suffix type! - exit 10 -fi - -if [ "$OLD_SUFFIX" != "so" ] && [ "$OLD_SUFFIX" != "dylib" ] && [ "$OLD_SUFFIX" != "dll" ]; then - echo The files have to be .so, .dylib or .dll! They are $OLD_SUFFIX - exit 10 -fi - -TYPE="$OLD_SUFFIX" - -if cmp $OLD $NEW > /dev/null -then - # The files were bytewise identical. - echo Identical: $OLD_NAME - exit 0 -fi - -OLD_SYMBOLS=$COMPARE_ROOT/nm.$OLD_NAME.old -NEW_SYMBOLS=$COMPARE_ROOT/nm.$NEW_NAME.new - -mkdir -p $(dirname $OLD_SYMBOLS) -mkdir -p $(dirname $NEW_SYMBOLS) - -if [ $OSTYPE == "cygwin" ]; then - "$NM" $NM_ARGS $OLD | grep " = " > $OLD_SYMBOLS - "$NM" $NM_ARGS $NEW | grep " = " > $NEW_SYMBOLS - "$NM" $NM_ARGS $OLD > $OLD_SYMBOLS.full - "$NM" $NM_ARGS $NEW > $NEW_SYMBOLS.full -else - # Strip the addresses, just compare the ordering of the symbols. - $NM $OLD | cut -f 2- -d ' ' > $OLD_SYMBOLS - $NM $NEW | cut -f 2- -d ' ' > $NEW_SYMBOLS - # But store the full information for easy diff access. - $NM $OLD > $OLD_SYMBOLS.full - $NM $NEW > $NEW_SYMBOLS.full -fi - -DIFFS=$(LANG=C diff $OLD_SYMBOLS $NEW_SYMBOLS) - -RESULT=0 - -if [ "${LDD}" ] -then - NAME=`basename $OLD` - TMP=$COMPARE_ROOT/ldd/ldd.${NAME} - rm -rf "${TMP}" - mkdir -p "${TMP}" - - (cd "${TMP}" && cp $OLD . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.old | uniq > dep.uniq.old) - (cd "${TMP}" && cp $NEW . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.new | uniq > dep.uniq.new) - (cd "${TMP}" && rm -f ${NAME}) - - DIFFS_DEP=$(LANG=C diff "${TMP}/dep.old" "${TMP}/dep.new") - DIFFS_UNIQ_DEP=$(LANG=C diff "${TMP}/dep.uniq.old" "${TMP}/dep.uniq.new") - - DEP_MSG= - if [ -z "${DIFFS_UNIQ_DEP}" -a -z "${DIFFS_DEP}" ]; then - DEP_MSG="Identical dependencies" - elif [ -z "${DIFFS_UNIQ_DEP}" ]; then - DEP_MSG="Redundant duplicate dependencies added" - RES=1 - else - DEP_MSG="DIFFERENT dependencies" - RES=1 - fi -fi - -if [ -n "$DIFFS" ]; then - if [ $OLD_SIZE -ne $NEW_SIZE ] - then - echo Differences, content AND size : $DEP_MSG : $OLD_NAME - RESULT=4 - else - echo Differences, content BUT SAME size: $DEP_MSG : $OLD_NAME - RESULT=3 - fi - if [ "x$VIEW" == "xview" ]; then - LANG=C $DIFF $OLD_SYMBOLS $NEW_SYMBOLS - fi -else - if [ $OLD_SIZE -ne $NEW_SIZE ] - then - echo Identical symbols BUT NEW size : $DEP_MSG : $OLD_NAME - RESULT=2 - else - echo Identical symbols AND size, BUT not bytewise identical: $DEP_MSG : $OLD_NAME - RESULT=1 - fi -fi - -exit $RESULT - - - diff --git a/common/bin/difftext.sh b/common/bin/difftext.sh deleted file mode 100644 index ae903731f59..00000000000 --- a/common/bin/difftext.sh +++ /dev/null @@ -1,157 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# The difftext.sh knows how to compare text files and -# ignore some specific differences. -# When difftext.sh is called, we already know that the -# files differ. But if the tests below trigger, then -# we ignore differences caused by: -# -# Timestamps in Java sources generated by idl2java -# Sorting order and cleanup style in .properties files. - -OLD="$1" -NEW="$2" -SUF="${OLD##*.}" -TMP=1 -if test "x$SUF" == "xjava"; then - TMP=$(LANG=C diff $OLD $NEW | \ - grep '^[<>]' | \ - sed '/[<>] \* from.*\.idl/d' | \ - sed '/[<>] \*.*201[12].*/d' | \ - sed '/\/\/ Generated from input file.*/d' | \ - sed '/\/\/ This file was generated AUTOMATICALLY from a template file.*/d' | \ - sed '/\/\/ java GenerateCharacter.*/d') -fi -if test "x$SUF" == "xproperties"; then - cat $OLD | sed -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' -e 's/#.*/#/g' \ --e 's/\\u0020/\x20/g' \ --e 's/\\u003A/\x3A/g' \ --e 's/\\u006B/\x6B/g' \ --e 's/\\u0075/\x75/g' \ --e 's/\\u00A0/\xA0/g' \ --e 's/\\u00A3/\xA3/g' \ --e 's/\\u00B0/\xB0/g' \ --e 's/\\u00B7/\xB7/g' \ --e 's/\\u00BA/\xBA/g' \ --e 's/\\u00BF/\xBF/g' \ --e 's/\\u00C0/\xC0/g' \ --e 's/\\u00C1/\xC1/g' \ --e 's/\\u00C2/\xC2/g' \ --e 's/\\u00C4/\xC4/g' \ --e 's/\\u00C5/\xC5/g' \ --e 's/\\u00C8/\xC8/g' \ --e 's/\\u00C9/\xC9/g' \ --e 's/\\u00CA/\xCA/g' \ --e 's/\\u00CD/\xCD/g' \ --e 's/\\u00CE/\xCE/g' \ --e 's/\\u00D3/\xD3/g' \ --e 's/\\u00D4/\xD4/g' \ --e 's/\\u00D6/\xD6/g' \ --e 's/\\u00DA/\xDA/g' \ --e 's/\\u00DC/\xDC/g' \ --e 's/\\u00DD/\xDD/g' \ --e 's/\\u00DF/\xDF/g' \ --e 's/\\u00E0/\xE0/g' \ --e 's/\\u00E1/\xE1/g' \ --e 's/\\u00E2/\xE2/g' \ --e 's/\\u00E3/\xE3/g' \ --e 's/\\u00E4/\xE4/g' \ --e 's/\\u00E5/\xE5/g' \ --e 's/\\u00E6/\xE6/g' \ --e 's/\\u00E7/\xE7/g' \ --e 's/\\u00E8/\xE8/g' \ --e 's/\\u00E9/\xE9/g' \ --e 's/\\u00EA/\xEA/g' \ --e 's/\\u00EB/\xEB/g' \ --e 's/\\u00EC/\xEC/g' \ --e 's/\\u00ED/\xED/g' \ --e 's/\\u00EE/\xEE/g' \ --e 's/\\u00EF/\xEF/g' \ --e 's/\\u00F1/\xF1/g' \ --e 's/\\u00F2/\xF2/g' \ --e 's/\\u00F3/\xF3/g' \ --e 's/\\u00F4/\xF4/g' \ --e 's/\\u00F5/\xF5/g' \ --e 's/\\u00F6/\xF6/g' \ --e 's/\\u00F9/\xF9/g' \ --e 's/\\u00FA/\xFA/g' \ --e 's/\\u00FC/\xFC/g' \ --e 's/\\u0020/\x20/g' \ --e 's/\\u003f/\x3f/g' \ --e 's/\\u006f/\x6f/g' \ --e 's/\\u0075/\x75/g' \ --e 's/\\u00a0/\xa0/g' \ --e 's/\\u00a3/\xa3/g' \ --e 's/\\u00b0/\xb0/g' \ --e 's/\\u00ba/\xba/g' \ --e 's/\\u00bf/\xbf/g' \ --e 's/\\u00c1/\xc1/g' \ --e 's/\\u00c4/\xc4/g' \ --e 's/\\u00c5/\xc5/g' \ --e 's/\\u00c8/\xc8/g' \ --e 's/\\u00c9/\xc9/g' \ --e 's/\\u00ca/\xca/g' \ --e 's/\\u00cd/\xcd/g' \ --e 's/\\u00d6/\xd6/g' \ --e 's/\\u00dc/\xdc/g' \ --e 's/\\u00dd/\xdd/g' \ --e 's/\\u00df/\xdf/g' \ --e 's/\\u00e0/\xe0/g' \ --e 's/\\u00e1/\xe1/g' \ --e 's/\\u00e2/\xe2/g' \ --e 's/\\u00e3/\xe3/g' \ --e 's/\\u00e4/\xe4/g' \ --e 's/\\u00e5/\xe5/g' \ --e 's/\\u00e7/\xe7/g' \ --e 's/\\u00e8/\xe8/g' \ --e 's/\\u00e9/\xe9/g' \ --e 's/\\u00ea/\xea/g' \ --e 's/\\u00eb/\xeb/g' \ --e 's/\\u00ec/\xec/g' \ --e 's/\\u00ed/\xed/g' \ --e 's/\\u00ee/\xee/g' \ --e 's/\\u00ef/\xef/g' \ --e 's/\\u00f0/\xf0/g' \ --e 's/\\u00f1/\xf1/g' \ --e 's/\\u00f2/\xf2/g' \ --e 's/\\u00f3/\xf3/g' \ --e 's/\\u00f4/\xf4/g' \ --e 's/\\u00f5/\xf5/g' \ --e 's/\\u00f6/\xf6/g' \ --e 's/\\u00f7/\xf7/g' \ --e 's/\\u00f8/\xf8/g' \ --e 's/\\u00f9/\xf9/g' \ --e 's/\\u00fa/\xfa/g' \ --e 's/\\u00fc/\xfc/g' \ --e 's/\\u00ff/\xff/g' \ - | sed -e '/^#/d' -e '/^$/d' \ - -e :a -e '/\\$/N; s/\\\n//; ta' \ - -e 's/^[ \t]*//;s/[ \t]*$//' \ - -e 's/\\=/=/' | LANG=C sort > $OLD.cleaned - TMP=$(LANG=C diff $OLD.cleaned $NEW) -fi -if test -n "$TMP"; then - echo Files $OLD and $NEW differ -fi diff --git a/common/bin/exception_list_linux b/common/bin/exception_list_linux deleted file mode 100644 index 4dcf2724cbf..00000000000 --- a/common/bin/exception_list_linux +++ /dev/null @@ -1,114 +0,0 @@ -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# List of files inside jar archives that are ok if they differ. -LIST_DIFF_JAR=" -/sun/misc/Version.class -/sun/tools/jconsole/Version.class -/com/sun/tools/javac/resources/version.class -/com/sun/tools/javah/resources/version.class -/com/sun/tools/javap/resources/version.class -" - -# List of binaries that only need to match symbols -LIST_DIFF_SIZE=" -jre/lib/amd64/libfontmanager.so -jre/lib/amd64/libjdwp.so -jre/lib/amd64/libt2k.so -bin/unpack200 -jre/bin/unpack200 -jre/lib/amd64/libjsig.debuginfo -jre/lib/amd64/libsaproc.debuginfo -jre/lib/amd64/server/libjvm.debuginfo -" - -# List of binares that need to match both symbols and size -LIST_DIFF_BYTE=" -jre/lib/amd64/libdt_socket.so -jre/lib/amd64/libattach.so -jre/lib/amd64/libjaas_unix.so -jre/lib/amd64/libjawt.so -jre/lib/amd64/libjpeg.so -jre/lib/amd64/libjsdt.so -jre/lib/amd64/libjsig.so -jre/lib/amd64/libsaproc.so -jre/lib/amd64/libsctp.so -jre/lib/amd64/libsunec.so -jre/lib/amd64/libunpack.so -jre/lib/amd64/libverify.so -jre/lib/amd64/libzip.so -jre/lib/amd64/server/libjsig.so -jre/lib/amd64/server/libjvm.so -jre/lib/amd64/liblcms.so -demo/jvmti/heapTracker/lib/libheapTracker.so -demo/jvmti/hprof/lib/libhprof.so -demo/jvmti/minst/lib/libminst.so -demo/jvmti/mtrace/lib/libmtrace.so -demo/jvmti/waiters/lib/libwaiters.so -bin/appletviewer -bin/extcheck -bin/idlj -bin/jar -bin/jarsigner -bin/java -bin/javac -bin/javadoc -bin/javah -bin/javap -bin/jcmd -bin/jconsole -bin/jdb -bin/jhat -bin/jinfo -bin/jmap -bin/jps -bin/jrunscript -bin/jsadebugd -bin/jstack -bin/jstat -bin/jstatd -bin/keytool -bin/native2ascii -bin/orbd -bin/pack200 -bin/policytool -bin/rmic -bin/rmid -bin/rmiregistry -bin/schemagen -bin/serialver -bin/servertool -bin/tnameserv -bin/wsgen -bin/wsimport -bin/xjc -jre/bin/java -jre/bin/keytool -jre/bin/orbd -jre/bin/pack200 -jre/bin/policytool -jre/bin/rmid -jre/bin/rmiregistry -jre/bin/servertool -jre/bin/tnameserv -" diff --git a/common/bin/extractvcvars.sh b/common/bin/extractvcvars.sh deleted file mode 100644 index 32e7d6993bd..00000000000 --- a/common/bin/extractvcvars.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# Must be bash, but that is ok since we are running from cygwin. -# The first argument is the vcvarsall.bat file to run. -# The second argument is the arch arg to give to vcvars. -VCVARSALL="$1" -ARCH_ARG="$2" - -# Cannot use the VS10 setup script directly (since it only updates the DOS subshell environment) -# but calculate the difference in Cygwin environment before/after running it and then -# apply the diff. -_vs10varsall=`cygpath -a -m -s "$VCVARSALL"` -_dosvs10varsall=`cygpath -a -w -s $_vs10varsall` -_dosbash=`cygpath -a -w -s \`which bash\`.*` - -# generate the set of exported vars before/after the vs10 setup -echo "@echo off" > localdevenvtmp.bat -echo "$_dosbash -c \"export -p\" > localdevenvtmp.export0" >> localdevenvtmp.bat -echo "call $_dosvs10varsall $ARCH_ARG" >> localdevenvtmp.bat -echo "$_dosbash -c \"export -p\" > localdevenvtmp.export1" >> localdevenvtmp.bat -cmd /c localdevenvtmp.bat - -# apply the diff (less some non-vs10 vars named by "!") -sort localdevenvtmp.export0 |grep -v "!" > localdevenvtmp.export0.sort -sort localdevenvtmp.export1 |grep -v "!" > localdevenvtmp.export1.sort -comm -1 -3 localdevenvtmp.export0.sort localdevenvtmp.export1.sort > localdevenv.sh -cat localdevenv.sh | sed 's/declare -x /export /g' | sed 's/="/:="/g' | sed 's/\\\\/\\/g' | sed 's/"//g' | \ - sed 's/#/\$\(HASH\)/g' > localdevenv.gmk - -# cleanup -rm -f localdevenvtmp* diff --git a/common/bin/hide_important_warnings_from_javac.sh b/common/bin/hide_important_warnings_from_javac.sh index 412c71aa3ba..04336350a74 100644 --- a/common/bin/hide_important_warnings_from_javac.sh +++ b/common/bin/hide_important_warnings_from_javac.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/common/bin/logger.sh b/common/bin/logger.sh index 70c3dab047c..46ab48ae47b 100644 --- a/common/bin/logger.sh +++ b/common/bin/logger.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/common/bin/shell-tracer.sh b/common/bin/shell-tracer.sh new file mode 100644 index 00000000000..27a964c977e --- /dev/null +++ b/common/bin/shell-tracer.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# Usage: sh shell-tracer.sh +# +# This shell script is supposed to be set as a replacement for SHELL in make, +# causing it to be called whenever make wants to execute shell commands. +# The is suitable for passing on to the old shell, +# typically beginning with -c. +# +# This script will make sure the shell command line is executed with +# OLD_SHELL -x, and it will also store a simple log of the the time it takes to +# execute the command in the OUTPUT_FILE, using the "time" utility as pointed +# to by TIME_CMD. If TIME_CMD is "-", no timestamp will be stored. + +TIME_CMD="$1" +OUTPUT_FILE="$2" +OLD_SHELL="$3" +shift +shift +shift +if [ "$TIME_CMD" != "-" ]; then +"$TIME_CMD" -f "[TIME:%E] $*" -a -o "$OUTPUT_FILE" "$OLD_SHELL" -x "$@" +else +"$OLD_SHELL" -x "$@" +fi diff --git a/common/makefiles/HotspotWrapper.gmk b/common/makefiles/HotspotWrapper.gmk index 48f1c3854d9..8a1ae6447e6 100644 --- a/common/makefiles/HotspotWrapper.gmk +++ b/common/makefiles/HotspotWrapper.gmk @@ -36,9 +36,12 @@ include MakeBase.gmk default: all # Get all files except .hg in the hotspot directory. -HOTSPOT_FILES := $(shell $(FIND) $(HOTSPOT_TOPDIR) -name ".hg" -prune -o -print) +HOTSPOT_FILES := $(shell $(FIND) -L $(HOTSPOT_TOPDIR) -name ".hg" -prune -o -print) +# The old build creates hotspot output dir before calling hotspot and +# not doing it breaks builds on msys. $(HOTSPOT_OUTPUTDIR)/_hotspot.timestamp: $(HOTSPOT_FILES) + @$(MKDIR) -p $(HOTSPOT_OUTPUTDIR) @($(CD) $(HOTSPOT_TOPDIR)/make && $(MAKE) -j1 $(HOTSPOT_MAKE_ARGS) SPEC=$(HOTSPOT_SPEC) BASE_SPEC=$(BASE_SPEC)) $(TOUCH) $@ diff --git a/common/makefiles/IdlCompilation.gmk b/common/makefiles/IdlCompilation.gmk index 799c7d6fbf9..11f661a4622 100644 --- a/common/makefiles/IdlCompilation.gmk +++ b/common/makefiles/IdlCompilation.gmk @@ -59,7 +59,7 @@ define add_idl_package $(MKDIR) -p $3/$$($4_TMPDIR) $(RM) -rf $3/$$($4_TMPDIR) $(MKDIR) -p $(dir $5) - $(ECHO) Compiling IDL $(patsubst $2/%,%,$4) + $(ECHO) $(LOG_INFO) Compiling IDL $(patsubst $2/%,%,$4) $8 -td $3/$$($4_TMPDIR) \ -i $2/org/omg/CORBA \ -i $2/org/omg/PortableInterceptor \ @@ -79,15 +79,9 @@ define SetupIdlCompilation # param 1 is for example BUILD_IDLS # param 2,3,4,5,6,7,8 are named args. # IDLJ,SRC,BIN,INCLUDES,EXCLUDES,OLDIMPLBASES,DELETES -$(if $2,$1_$(strip $2)) -$(if $3,$1_$(strip $3)) -$(if $4,$1_$(strip $4)) -$(if $5,$1_$(strip $5)) -$(if $6,$1_$(strip $6)) -$(if $7,$1_$(strip $7)) -$(if $8,$1_$(strip $8)) -$(if $9,$1_$(strip $9)) -$(if $(10),$(error Internal makefile error: Too many arguments to SetupIdlCompilation, please update IdlCompilation.gmk)) +$(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) +$(call LogSetupMacroEntry,SetupIdlCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) +$(if $(16),$(error Internal makefile error: Too many arguments to SetupIdlCompilation, please update IdlCompilation.gmk)) # Remove any relative addressing in the paths. $1_SRC := $$(abspath $$($1_SRC)) diff --git a/common/makefiles/JavaCompilation.gmk b/common/makefiles/JavaCompilation.gmk index 1e8593f9d54..8dd8899fbf5 100644 --- a/common/makefiles/JavaCompilation.gmk +++ b/common/makefiles/JavaCompilation.gmk @@ -50,27 +50,17 @@ define SetupJavaCompiler # FLAGS:=Flags to be supplied to javac # SERVER_DIR:=Use a javac server (-XDserver) and store the server related files here # SERVER_JVM:=Use this JVM for the server. Defaults to the JVM above. - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$(error Internal makefile error: Too many arguments to SetupJavaCompiler, please update JavaCompilation.gmk)) + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupJavaCompiler($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(16),$(error Internal makefile error: Too many arguments to SetupJavaCompiler, please update JavaCompilation.gmk)) - ifeq ($$(ENABLE_SJAVAC),yes) - # The port file contains the tcp/ip on which the server listens - # and the cookie necessary to talk to the server. - $1_JAVAC_PORTFILE:=$$($1_SERVER_DIR)/server.port - # You can use a different JVM to run the background javac server. - ifeq ($$($1_SERVER_JVM),) - # It defaults to the same JVM that is used to start the javac command. - $1_SERVER_JVM:=$$($1_JVM) - endif - # Set the $1_REMOTE to spawn a background javac server. - $1_REMOTE:=-XDserver:portfile=$$($1_JAVAC_PORTFILE),poolsize=$(SJAVAC_SERVER_CORES),id=$1,javac=$$(subst $$(SPACE),%20,$$(subst $$(COMMA),%2C,$$(strip $$($1_SERVER_JVM) $$($1_JAVAC)))) + # The port file contains the tcp/ip on which the server listens + # and the cookie necessary to talk to the server. + $1_SJAVAC_PORTFILE:=$$($1_SERVER_DIR)/server.port + # You can use a different JVM to run the background javac server. + ifeq ($$($1_SERVER_JVM),) + # It defaults to the same JVM that is used to start the javac command. + $1_SERVER_JVM:=$$($1_JVM) endif endef @@ -92,19 +82,11 @@ define SetupArchive # added to the archive. # EXTRA_MANIFEST_ATTR:=Extra attribute to add to manifest. # CHECK_COMPRESS_JAR Check the COMPRESS_JAR variable - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$1_$(strip $(10))) - $(if $(11),$1_$(strip $(11))) - $(if $(12),$1_$(strip $(12))) - $(if $(13),$1_$(strip $(13))) - $(if $(14),$1_$(strip $(14))) - $(if $(15),$1_$(strip $(15))) + + # NOTE: $2 is dependencies, not a named argument! + $(foreach i,3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupArchive($1),,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(findstring $(LOG),debug trace), $(info *[2] = $(strip $2))) $(if $(16),$(error Internal makefile error: Too many arguments to SetupArchive, please update JavaCompilation.gmk)) $1_JARMAIN:=$(strip $$($1_JARMAIN)) @@ -125,16 +107,28 @@ define SetupArchive ifneq (,$$($1_INCLUDES)) $1_GREP_INCLUDE_PATTERNS:=$$(foreach src,$$($1_SRCS),\ $$(addprefix $$(src)/,$$($1_INCLUDES))) - $$(eval $$(call ListPathsSafelyNow,$1_GREP_INCLUDE_PATTERNS,\n, \ + # If there are a lot of include patterns, output to file to shorten command lines + ifeq ($$(word 20,$$($1_GREP_INCLUDE_PATTERNS)),) + $1_GREP_INCLUDES:=| $(GREP) $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_INCLUDE_PATTERNS)) + else + $$(shell $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_include) + $$(eval $$(call ListPathsSafelyNow,$1_GREP_INCLUDE_PATTERNS,\n, \ >> $$($1_BIN)/_the.$$($1_JARNAME)_include)) - $1_GREP_INCLUDES:=| $(GREP) -f $$($1_BIN)/_the.$$($1_JARNAME)_include + $1_GREP_INCLUDES:=| $(GREP) -f $$($1_BIN)/_the.$$($1_JARNAME)_include + endif endif ifneq (,$$($1_EXCLUDES)$$($1_EXCLUDE_FILES)) $1_GREP_EXCLUDE_PATTERNS:=$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,\ $$($1_EXCLUDES) $$($1_EXCLUDE_FILES))) - $$(eval $$(call ListPathsSafelyNow,$1_GREP_EXCLUDE_PATTERNS,\n, \ + # If there are a lot of include patterns, output to file to shorten command lines + ifeq ($$(word 20,$$($1_GREP_EXCLUDE_PATTERNS)),) + $1_GREP_EXCLUDES:=| $(GREP) -v $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_EXCLUDE_PATTERNS)) + else + $$(shell $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_exclude) + $$(eval $$(call ListPathsSafelyNow,$1_GREP_EXCLUDE_PATTERNS,\n, \ >> $$($1_BIN)/_the.$$($1_JARNAME)_exclude)) - $1_GREP_EXCLUDES:=| $(GREP) -v -f $$($1_BIN)/_the.$$($1_JARNAME)_exclude + $1_GREP_EXCLUDES:=| $(GREP) -v -f $$($1_BIN)/_the.$$($1_JARNAME)_exclude + endif endif # Check if this jar needs to have its index generated. @@ -149,11 +143,13 @@ define SetupArchive ifneq (,$2) $1_DEPS:=$2 else - $1_DEPS:=$$(foreach src,$$($1_SRCS),$$(shell ($(FIND) $$(src) -type f \ - -a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) \ - $$($1_GREP_EXCLUDES) && $(ECHO) $$(addprefix $$(src)/,$$($1_EXTRA_FILES))))) + # The subst of \ is needed because $ has to be escaped with \ in EXTRA_FILES for the command + # lines, but not here for use in make dependencies. + $1_DEPS:=$$(shell $(FIND) $$($1_SRCS) -type f -a \( $$($1_FIND_PATTERNS) \) \ + $$($1_GREP_INCLUDES) $$($1_GREP_EXCLUDES)) \ + $$(subst \,,$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,$$($1_EXTRA_FILES)))) ifeq (,$$($1_SKIP_METAINF)) - $1_DEPS+=$$(foreach src,$$($1_SRCS),$$(shell $(FIND) $$(src)/META-INF -type f 2> /dev/null)) + $1_DEPS+=$$(shell $(FIND) $$(addsuffix /META-INF,$$($1_SRCS)) -type f 2> /dev/null)) endif endif @@ -161,34 +157,39 @@ define SetupArchive # The capture contents macro finds all files (matching the patterns, typically # .class and .prp) that are newer than the jar-file, ie the new content to be put into the jar. - $1_CAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS),(($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) -a -newer $$@ $$($1_GREP_INCLUDES) $$($1_GREP_EXCLUDES) && $(ECHO) $$($1_EXTRA_FILES)) | $(SED) 's|$$(src)/||g' > $$(src)/_the.$$($1_JARNAME)_contents) && ) + $1_CAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS),\ + (($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) -a -newer $$@ $$($1_GREP_INCLUDES) \ + $$($1_GREP_EXCLUDES) | $(SED) 's|$$(src)/||g' &&\ + $(ECHO) $$(subst $$(src)/,,$$($1_EXTRA_FILES))) > \ + $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) # The capture metainf macro finds all files below the META-INF directory that are newer than the jar-file. ifeq (,$$($1_SKIP_METAINF)) - $1_CAPTURE_METAINF =$$(foreach src,$$($1_SRCS),($(FIND) $$(src)/META-INF -type f -a -newer $$@ 2> /dev/null | $(SED) 's|$$(src)/||g' >> $$(src)/_the.$$($1_JARNAME)_contents ) && ) + $1_CAPTURE_METAINF =$$(foreach src,$$($1_SRCS),($(FIND) $$(src)/META-INF -type f -a -newer $$@ 2> /dev/null | $(SED) 's|$$(src)/||g' >> $$(src)/_the.$$($1_JARNAME)_contents ) $$(NEWLINE)) endif # The capture deletes macro finds all deleted files and concatenates them. The resulting file # tells us what to remove from the jar-file. - $1_CAPTURE_DELETES=$$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name _the.package.deleted -newer $$@ -exec $(SED) 's|$$(src)||g' \{\} >> $$($1_DELETES_FILE) \;) &&) + $1_CAPTURE_DELETES=$$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name _the.package.deleted -newer $$@ -exec $(SED) 's|$$(src)||g' \{\} >> $$($1_DELETES_FILE) \;) $$(NEWLINE)) # The update contents macro updates the jar file with the previously capture contents. $1_UPDATE_CONTENTS=$$(foreach src,$$($1_SRCS),\ (cd $$(src) && \ if [ -s _the.$$($1_JARNAME)_contents ]; then \ $(ECHO) " updating" `$(WC) -l _the.$$($1_JARNAME)_contents | $(AWK) '{ print $$$$1 }'` files && \ $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @_the.$$($1_JARNAME)_contents; \ - fi) &&) + fi) $$(NEWLINE)) # The s-variants of the above macros are used when the jar is created from scratch. $1_SCAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS),\ (($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) \ - $$($1_GREP_EXCLUDES) && $(ECHO) $$($1_EXTRA_FILES)) | $(SED) 's|$$(src)/||g' > \ - $$(src)/_the.$$($1_JARNAME)_contents) && ) + $$($1_GREP_EXCLUDES) | $(SED) 's|$$(src)/||g' &&\ + $$(subst $$(src)/,,$(ECHO) $$($1_EXTRA_FILES))) > \ + $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) ifeq (,$$($1_SKIP_METAINF)) $1_SCAPTURE_METAINF=$$(foreach src,$$($1_SRCS),\ ($(FIND) $$(src)/META-INF -type f 2> /dev/null | $(SED) 's|$$(src)/||g' >> \ - $$(src)/_the.$$($1_JARNAME)_contents) && ) + $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) endif $1_SUPDATE_CONTENTS=$$(foreach src,$$($1_SRCS),\ - (cd $$(src) && $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @$$(src)/_the.$$($1_JARNAME)_contents) &&) + (cd $$(src) && $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @$$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) # Use a slightly shorter name for logging, but with enough path to identify this jar. $1_NAME:=$$(subst $$(OUTPUT_ROOT)/,,$$($1_JAR)) @@ -208,38 +209,32 @@ define SetupArchive # Here is the rule that creates/updates the jar file. $$($1_JAR) : $$($1_DEPS) $(MKDIR) -p $$($1_BIN) - if [ -n "$$($1_MANIFEST)" ]; then \ + $$(if $$($1_MANIFEST),\ $(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \ - -e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" $$($1_MANIFEST) > $$($1_MANIFEST_FILE); \ - else \ - $(RM) $$($1_MANIFEST_FILE) && $(TOUCH) $$($1_MANIFEST_FILE); \ - fi - if [ -n "$$(strip $$($1_JARMAIN))" ]; then \ - $(ECHO) "Main-Class: $$(strip $$($1_JARMAIN))" >> $$($1_MANIFEST_FILE); \ - fi - if [ -n "$$($1_EXTRA_MANIFEST_ATTR)" ]; then \ - $(PRINTF) "$$($1_EXTRA_MANIFEST_ATTR)\n" >> $$($1_MANIFEST_FILE); \ - fi - +if [ -s $$@ ]; then \ - $(ECHO) Modifying $$($1_NAME) && \ + -e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" $$($1_MANIFEST) > $$($1_MANIFEST_FILE) \ + ,\ + $(RM) $$($1_MANIFEST_FILE) && $(TOUCH) $$($1_MANIFEST_FILE)) + $$(if $$($1_JARMAIN),$(ECHO) "Main-Class: $$(strip $$($1_JARMAIN))" >> $$($1_MANIFEST_FILE)) + $$(if $$($1_EXTRA_MANIFEST_ATTR),$(PRINTF) "$$($1_EXTRA_MANIFEST_ATTR)\n" >> $$($1_MANIFEST_FILE)) + $$(if $$(wildcard $$@),\ + $(ECHO) Modifying $$($1_NAME) $$(NEWLINE)\ $$($1_CAPTURE_CONTENTS) \ $$($1_CAPTURE_METAINF) \ - $(RM) $$($1_DELETES_FILE) && \ + $(RM) $$($1_DELETES_FILE) $$(NEWLINE)\ $$($1_CAPTURE_DELETES) \ - $(CAT) $$($1_DELETES_FILE) > $$($1_DELETESS_FILE) && \ + $(CAT) $$($1_DELETES_FILE) > $$($1_DELETESS_FILE) $$(NEWLINE)\ if [ -s $$($1_DELETESS_FILE) ]; then \ $(ECHO) " deleting" `$(WC) -l $$($1_DELETESS_FILE) | $(AWK) '{ print $$$$1 }'` files && \ $(ZIP) -q -d $$@ `$(CAT) $$($1_DELETESS_FILE)` ; \ - fi && \ - $$($1_UPDATE_CONTENTS) true && \ - $$($1_JARINDEX) && true ; \ - else \ - $(ECHO) Creating $$($1_NAME) && $(JAR) $$($1_JAR_CREATE_OPTIONS) $$@ $$($1_MANIFEST_FILE) && \ + fi $$(NEWLINE) \ + $$($1_UPDATE_CONTENTS) true $$(NEWLINE) \ + $$($1_JARINDEX) && true \ + ,\ + $(ECHO) Creating $$($1_NAME) && $(JAR) $$($1_JAR_CREATE_OPTIONS) $$@ $$($1_MANIFEST_FILE) $$(NEWLINE) \ $$($1_SCAPTURE_CONTENTS) \ $$($1_SCAPTURE_METAINF) \ $$($1_SUPDATE_CONTENTS) \ - $$($1_JARINDEX) && true ; \ - fi; + $$($1_JARINDEX) && true ) endef @@ -247,15 +242,9 @@ define SetupZipArchive # param 1 is for example ZIP_MYSOURCE # param 2,3,4,5,6,7,8,9 are named args. # SRC,ZIP,INCLUDES,EXCLUDES,EXCLUDE_FILES,SUFFIXES,EXTRA_DEPS - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$(error Internal makefile error: Too many arguments to SetupZipArchive, please update JavaCompilation.gmk)) + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupZipArchive($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(16),$(error Internal makefile error: Too many arguments to SetupZipArchive, please update JavaCompilation.gmk)) # Find all files in the source tree. $1_SUFFIX_FILTER := $$(patsubst %,-o -name $(DQUOTE)*%$(DQUOTE),$$($1_SUFFIXES)) @@ -274,7 +263,7 @@ define SetupZipArchive ifneq ($$($1_EXCLUDES),) $1_SRC_EXCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES)))) $1_ZIP_EXCLUDES := $$(addprefix -x$(SPACE)$(DQUOTE),$$(addsuffix /*$(DQUOTE),$$($1_EXCLUDES))) - $1_ALL_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRC)) + $1_ALL_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_ALL_SRCS)) endif # Use a slightly shorter name for logging, but with enough path to identify this zip. @@ -288,7 +277,7 @@ define SetupZipArchive $$($1_ZIP) : $$($1_ALL_SRCS) $$($1_EXTRA_DEPS) $(MKDIR) -p $$(@D) $(ECHO) Updating $$($1_NAME) - $$(foreach i,$$($1_SRC),(cd $$i && $(ZIP) -qru $$@ . $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* $$(addprefix -x$(SPACE),$$(patsubst $$i/%,%,$$($1_EXCLUDE_FILES)))) ;) true + $$(foreach i,$$($1_SRC),(cd $$i && $(ZIP) -qru $$@ . $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* $$(addprefix -x$(SPACE),$$(patsubst $$i/%,%,$$($1_EXCLUDE_FILES))))$$(NEWLINE)) true $(TOUCH) $$@ endef @@ -324,7 +313,7 @@ define add_file_to_copy_and_clean $$($1_BIN)$$($2_TARGET) : $2 $(MKDIR) -p $$(@D) $(CAT) $$< | $(SED) -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' -e 's/#.*/#/g' \ - | $(SED) -f "$(SRC_ROOT)/common/bin/unicode2x.sed" \ + | $(SED) -f "$(SRC_ROOT)/common/makefiles/support/unicode2x.sed" \ | $(SED) -e '/^#/d' -e '/^$$$$/d' \ -e :a -e '/\\$$$$/N; s/\\\n//; ta' \ -e 's/^[ \t]*//;s/[ \t]*$$$$//' \ @@ -364,36 +353,27 @@ define SetupJavaCompilation # Its only here until we cleanup some nasty source code pasta in the jdk. # HEADERS:=path to directory where all generated c-headers are written. # DEPENDS:=Extra dependecy - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$1_$(strip $(10))) - $(if $(11),$1_$(strip $(11))) - $(if $(12),$1_$(strip $(12))) - $(if $(13),$1_$(strip $(13))) - $(if $(14),$1_$(strip $(14))) - $(if $(15),$(error Internal makefile error: Too many arguments to SetupJavaCompilation, please update JavaCompilation.gmk)) + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupJavaCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(16),$(error Internal makefile error: Too many arguments to SetupJavaCompilation, please update JavaCompilation.gmk)) # Extract the info from the java compiler setup. - $1_REMOTE := $$($$($1_SETUP)_REMOTE) $1_JVM := $$($$($1_SETUP)_JVM) $1_JAVAC := $$($$($1_SETUP)_JAVAC) $1_FLAGS := $$($$($1_SETUP)_FLAGS) $(JAVAC_FLAGS) $$($1_ADD_JAVAC_FLAGS) ifeq ($$($1_JAVAC),) $$(error The Java compilation $1 refers to a non-existant java compiler setup $$($1_SETUP)) endif + $1_SJAVAC_PORTFILE := $$($$($1_SETUP)_SJAVAC_PORTFILE) + $1_SERVER_JVM := $$($$($1_SETUP)_SERVER_JVM) # Handle addons and overrides. $1_SRC:=$$(call ADD_SRCS,$$($1_SRC)) # Make sure the dirs exist. - $$(shell $(MKDIR) -p $$($1_SRC) $$($1_BIN)) + $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupJavaCompilation $1 contains missing directory $$d))) + $$(eval $$(call MakeDir,$$($1_BIN))) # Find all files in the source trees. - $1_ALL_SRCS := $$(filter-out $(OVR_SRCS),$$(foreach i,$$($1_SRC),$$(shell $(FIND) $$i -type f))) + $1_ALL_SRCS := $$(filter-out $(OVR_SRCS),$$(shell $(FIND) $$($1_SRC) -type f)) # Extract the java files. ifneq ($$($1_EXCLUDE_FILES),) $1_EXCLUDE_FILES_PATTERN:=$$(addprefix %,$$($1_EXCLUDE_FILES)) @@ -428,7 +408,7 @@ define SetupJavaCompilation # Rewrite list of patterns into a find statement. $1_COPY_PATTERN:=$(FALSE_FIND_PATTERN) $$(patsubst %,$(SPACE)-o$(SPACE)-name$(SPACE)$(DQUOTE)*%$(DQUOTE),$$($1_COPY)) # Search for all files to be copied. - $1_ALL_COPIES := $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i \( $$($1_COPY_PATTERN) \) -a -type f)) + $1_ALL_COPIES := $$(filter $$(addprefix %,$$($1_COPY)),$$($1_ALL_SRCS)) # Copy these explicitly $1_ALL_COPIES += $$($1_COPY_FILES) # Copy must also respect filters. @@ -442,7 +422,7 @@ define SetupJavaCompilation $1_ALL_COPIES := $$(filter-out $$($1_EXCLUDE_FILES_PATTERN),$$($1_ALL_COPIES)) endif # All files below META-INF are always copied. - $1_ALL_COPIES += $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i/META-INF -type f 2> /dev/null)) + $1_ALL_COPIES += $$(filter $$(addsuffix /META-INF%,$$($1_SRC)),$$($1_ALL_SRCS)) ifneq (,$$($1_ALL_COPIES)) # Yep, there are files to be copied! $1_ALL_COPY_TARGETS:= @@ -456,7 +436,7 @@ define SetupJavaCompilation # Rewrite list of patterns into a find statement. $1_CLEAN_PATTERN:=$(FALSE_FIND_PATTERN) $$(patsubst %,$(SPACE)-o$(SPACE)-name$(SPACE)$(DQUOTE)*%$(DQUOTE),$$($1_CLEAN)) # Search for all files to be copied. - $1_ALL_CLEANS := $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i \( $$($1_CLEAN_PATTERN) \) -a -type f)) + $1_ALL_CLEANS := $$(filter $$(addprefix %,$$($1_CLEAN)),$$($1_ALL_SRCS)) # Copy and clean must also respect filters. ifneq (,$$($1_INCLUDES)) $1_ALL_CLEANS := $$(filter $$($1_SRC_INCLUDES),$$($1_ALL_CLEANS)) @@ -482,30 +462,59 @@ define SetupJavaCompilation $$(eval $$(call replace_space_with_pathsep,$1_SRCROOTSC,$$($1_SRC))) endif - ifneq (,$$($1_HEADERS)) - $1_HEADERS_ARG := -h $$($1_HEADERS) - endif - # Create a sed expression to remove the source roots and to replace / with . # and remove .java at the end. $1_REWRITE_INTO_CLASSES:=$$(foreach i,$$($1_SRC),-e 's|$$i/||g') -e 's|/|.|g' -e 's|.java$$$$||g' ifeq ($$($1_DISABLE_SJAVAC)x$$(ENABLE_SJAVAC),xyes) + ifneq (,$$($1_HEADERS)) + $1_HEADERS_ARG := -h $$($1_HEADERS) + endif + # Using sjavac to compile. $1 := $$($1_ALL_COPY_TARGETS) $$($1_ALL_COPY_CLEAN_TARGETS) $$($1_BIN)/javac_state + # Create SJAVAC variable, + # expects $1_JAVAC to be "bootclasspathprepend -jar ...javac.jar" + # and it is rewritten into "bootclasspathprepend com.sun.tools.sjavac.Main" + $1_SJAVAC:=$$(word 1,$$($1_JAVAC)) -cp $$(word 3,$$($1_JAVAC)) com.sun.tools.sjavac.Main + + # Set the $1_REMOTE to spawn a background javac server. + $1_REMOTE:=--server:portfile=$$($1_SJAVAC_PORTFILE),poolsize=$(SJAVAC_SERVER_CORES),id=$1,sjavac=$$(subst $$(SPACE),%20,$$(subst $$(COMMA),%2C,$$(strip $$($1_SERVER_JVM) $$($1_SJAVAC)))) + $$($1_BIN)/javac_state: $$($1_SRCS) $$($1_DEPENDS) $(MKDIR) -p $$(@D) $$(call ListPathsSafely,$1_SRCS,\n, >> $$($1_BIN)/_the.batch.tmp) $(ECHO) Compiling $1 - $$($1_JVM) $$(word 1,$$($1_JAVAC)) com.sun.tools.sjavac.Main \ - $$($1_REMOTE) $$($1_SJAVAC_ARGS) --permit-unidentified-artifacts -mfl $$($1_BIN)/_the.batch.tmp \ + $$($1_JVM) $$($1_SJAVAC) \ + $$($1_REMOTE) $$($1_SJAVAC_ARGS) \ + --permit-unidentified-artifacts \ + --permit-sources-without-package \ + --compare-found-sources $$($1_BIN)/_the.batch.tmp \ $$($1_FLAGS) \ -implicit:none -d $$($1_BIN) $$($1_HEADERS_ARG) else # Using plain javac to batch compile everything. $1 := $$($1_ALL_COPY_TARGETS) $$($1_ALL_COPY_CLEAN_TARGETS) $$($1_BIN)/_the.batch + # When buliding in batch, put headers in a temp dir to filter out those that actually + # changed before copying them to the real header dir. + ifneq (,$$($1_HEADERS)) + $1_HEADERS_ARG := -h $$($1_HEADERS).tmp + + $$($1_HEADERS)/_the.headers: $$($1_BIN)/_the.batch + $(MKDIR) -p $$(@D) + for f in `ls $$($1_HEADERS).tmp`; do \ + if [ ! -f "$$($1_HEADERS)/$$$$f" ] || [ "`$(DIFF) $$($1_HEADERS)/$$$$f $$($1_HEADERS).tmp/$$$$f`" != "" ]; then \ + $(CP) -f $$($1_HEADERS).tmp/$$$$f $$($1_HEADERS)/$$$$f; \ + fi; \ + done + $(RM) -r $$($1_HEADERS).tmp + $(TOUCH) $$@ + + $1 += $$($1_HEADERS)/_the.headers + endif + # When not using sjavac, pass along all sources to javac using an @file. $$($1_BIN)/_the.batch: $$($1_SRCS) $$($1_DEPENDS) $(MKDIR) -p $$(@D) @@ -516,6 +525,7 @@ define SetupJavaCompilation -implicit:none -sourcepath "$$($1_SRCROOTSC)" \ -d $$($1_BIN) $$($1_HEADERS_ARG) @$$($1_BIN)/_the.batch.tmp && \ $(MV) $$($1_BIN)/_the.batch.tmp $$($1_BIN)/_the.batch) + endif # Check if a jar file was specified, then setup the rules for the jar. diff --git a/common/makefiles/Main.gmk b/common/makefiles/Main.gmk new file mode 100644 index 00000000000..b9322aba81a --- /dev/null +++ b/common/makefiles/Main.gmk @@ -0,0 +1,208 @@ +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +### This is the main part of the Makefile, for the normal case with SPEC specifying a single existing spec.gmk file. + +# Now load the spec +include $(SPEC) + +# Load the vital tools for all the makefiles. +include $(SRC_ROOT)/common/makefiles/MakeBase.gmk + +# Include the corresponding custom file, if present. +-include $(CUSTOM_MAKE_DIR)/Main.gmk + +### Clean up from previous run + +# Remove any build.log from a previous run, if they exist +ifneq (,$(BUILD_LOG)) + ifneq (,$(BUILD_LOG_PREVIOUS)) + # Rotate old log + $(shell $(RM) $(BUILD_LOG_PREVIOUS) 2> /dev/null) + $(shell $(MV) $(BUILD_LOG) $(BUILD_LOG_PREVIOUS) 2> /dev/null) + else + $(shell $(RM) $(BUILD_LOG) 2> /dev/null) + endif + $(shell $(RM) $(OUTPUT_ROOT)/build-trace-time.log 2> /dev/null) +endif +# Remove any javac server logs and port files. This +# prevents a new make run to reuse the previous servers. +ifneq (,$(SJAVAC_SERVER_DIR)) + $(shell $(MKDIR) -p $(SJAVAC_SERVER_DIR) && $(RM) -rf $(SJAVAC_SERVER_DIR)/*) +endif + +# Reset the build timers. +$(eval $(call ResetAllTimers)) + +# Setup number of jobs to use. -jN is unfortunately not available for us to parse from the command line, +# hence this workaround. +ifeq ($(JOBS),) + JOBS=$(NUM_CORES) +endif +MAKE_ARGS:=$(MAKE_ARGS) -j$(JOBS) + +### Main targets + +all: jdk + +start-make: + @$(call AtMakeStart) + +langtools: langtools-only +langtools-only: start-make + @$(call TargetEnter) + @($(CD) $(LANGTOOLS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildLangtools.gmk) + @$(call TargetExit) + +corba: langtools corba-only +corba-only: start-make + @$(call TargetEnter) + @($(CD) $(CORBA_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildCorba.gmk) + @$(call TargetExit) + +jaxp: langtools jaxp-only +jaxp-only: start-make + @$(call TargetEnter) + @($(CD) $(JAXP_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJaxp.gmk) + @$(call TargetExit) + +jaxws: langtools jaxp jaxws-only +jaxws-only: start-make + @$(call TargetEnter) + @($(CD) $(JAXWS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJaxws.gmk) + @$(call TargetExit) + +hotspot: hotspot-only +hotspot-only: start-make + @$(call TargetEnter) + @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f HotspotWrapper.gmk) + @$(call TargetExit) + +jdk: langtools hotspot corba jaxp jaxws jdk-only +jdk-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk $(JDK_TARGET)) + @$(call TargetExit) + +demos: jdk demos-only +demos-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk demos) + @$(call TargetExit) + +images: source-tips demos images-only +images-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk images) + @$(call TargetExit) + +overlay-images: source-tips demos overlay-images-only +overlay-images-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk overlay-images) + @$(call TargetExit) + +bundles: images bundles-only +bundles-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk bundles) + @$(call TargetExit) + +install: images install-only +install-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk install) + @$(call TargetExit) + +docs: jdk docs-only +docs-only: start-make + @$(call TargetEnter) + @($(CD) $(SRC_ROOT)/common/makefiles/javadoc && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs) + @$(call TargetExit) + +bootcycle-images: + @$(ECHO) Boot cycle build step 1: Building the JDK image normally + @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(SPEC) images) + @$(ECHO) Boot cycle build step 2: Building a new JDK image using previously built image + @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(dir $(SPEC))bootcycle-spec.gmk images) + +test: start-make + @$(call TargetEnter) + @($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) MAKEFLAGS= -j1 PRODUCT_HOME=$(OUTPUT_ROOT)/jdk JPRT_JAVA_HOME=$(OUTPUT_ROOT)/jdk ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true + @$(call TargetExit) + +# Stores the tips for each repository. This file is be used when constructing the jdk image and can be +# used to track the exact sources used to build that image. +source-tips: $(OUTPUT_ROOT)/source_tips +$(OUTPUT_ROOT)/source_tips: FRC + @$(MKDIR) -p $(@D) + @$(RM) $@ + @$(if $(HG),$(call GetSourceTips),$(ECHO) "hg not installed" > $@) + + +# Remove everything, except the output from configure. +clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images clean-overlay-images clean-bootcycle-build + @($(CD) $(OUTPUT_ROOT) && $(RM) -r tmp source_tips build.log* build-trace*.log*) + @$(ECHO) Cleaned all build artifacts. + +# Remove everything, including configure configuration. +# If the output directory was created by configure and now becomes empty, remove it as well. +# FIXME: tmp should not be here, fix ResetTimers instead. And remove spec.sh! +dist-clean: clean + @($(CD) $(OUTPUT_ROOT) && $(RM) -r *spec.gmk config.* configure-arguments Makefile compare.sh spec.sh tmp) + @$(if $(filter $(CONF_NAME),$(notdir $(OUTPUT_ROOT))), \ + if test "x`$(LS) $(OUTPUT_ROOT)`" != x; then \ + $(ECHO) "Warning: Not removing non-empty configuration directory for '$(CONF_NAME)'" ;\ + else \ + ($(CD) $(SRC_ROOT) && $(ECHO) "Removing configuration directory for '$(CONF_NAME)'" && $(RM) -r $(OUTPUT_ROOT)) \ + fi \ + ) + @$(ECHO) Cleaned everything, you will have to re-run configure. + +clean-langtools: + $(call CleanComponent,langtools) +clean-corba: + $(call CleanComponent,corba) +clean-jaxp: + $(call CleanComponent,jaxp) +clean-jaxws: + $(call CleanComponent,jaxws) +clean-hotspot: + $(call CleanComponent,hotspot) +clean-jdk: + $(call CleanComponent,jdk) +clean-images: + $(call CleanComponent,images) +clean-overlay-images: + $(call CleanComponent,overlay-images) +clean-bootcycle-build: + $(call CleanComponent,bootcycle-build) + +.PHONY: langtools corba jaxp jaxws hotspot jdk images overlay-images install +.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only overlay-images-only install-only +.PHONY: all test clean dist-clean bootcycle-images start-make +.PHONY: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images clean-overlay-images clean-bootcycle-build + +FRC: # Force target diff --git a/common/makefiles/MakeBase.gmk b/common/makefiles/MakeBase.gmk index e9caaa89f87..c139a7785cb 100644 --- a/common/makefiles/MakeBase.gmk +++ b/common/makefiles/MakeBase.gmk @@ -33,129 +33,13 @@ ifndef _MAKEBASE_GMK _MAKEBASE_GMK := 1 -ifeq (,$(findstring 3.81,$(MAKE_VERSION))) - ifeq (,$(findstring 3.82,$(MAKE_VERSION))) - $(error This version of GNU Make is too low ($(MAKE_VERSION)). Please upgrade to 3.81 or newer.) - endif -endif - -ifneq (,$(CYGPATH)) - # Cygwin styff, if needed but most is going to be - # done in configure! - ifeq (yes,$(CHECK_FOR_VCINSTALLDIR)) - ifeq (,$(VCINSTALLDIR)) - $(info Could not find compiler paths!) - $(info You probably configured the build from within a) - $(info VS command prompt, but you are not using such a) - $(info prompt right now.) - $(info If you instead run configure from a plain cygwin shell, it) - $(info will attempt to setup VS for you! Please try that.) - $(error Giving up for now.) - endif - endif -endif - -# The build times report is turned off by setting REPORT_BUILD_TIMES to nothing. -# This is necessary for the target clean which will erase the -# directories where the buildtimes are stored. -REPORT_BUILD_TIMES=1 -# Store the build times in this directory. -BUILDTIMESDIR=$(OUTPUT_ROOT)/tmp/buildtimes - -# Record starting time for build of a sub repository. -define RecordStartTime -$(MKDIR) -p $(BUILDTIMESDIR) -$(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_start_$1 -$(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_start_$1_human_readable -endef - -# Indicate that we started to build a sub repository and record starting time. -define MakeStart -$(call RecordStartTime,$1) -$(BUILD_LOG_WRAPPER) $(PRINTF) "\n\n%s\n%s\n##### %-60.60s #####\n%s\n\n" \ -"########################################################################" \ -"########################################################################" \ -"Entering $1 for target(s) $2" \ -"########################################################################" -endef - -# Record ending time and calculate the difference and store it in a -# easy to read format. Handles builds that cross midnight. Expects -# that a build will never take 24 hours or more. -define RecordEndTime -$(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_end_$1 -$(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_end_$1_human_readable -$(ECHO) `$(CAT) $(BUILDTIMESDIR)/build_time_start_$1` `$(CAT) $(BUILDTIMESDIR)/build_time_end_$1` $1 | \ - $(NAWK) '{ F=$$7; T=$$14; if (F > T) { T+=3600*24 }; D=T-F; H=int(D/3600); \ - M=int((D-H*3600)/60); S=D-H*3600-M*60; printf("%02d:%02d:%02d %s\n",H,M,S,$$15); }' \ - > $(BUILDTIMESDIR)/build_time_diff_$1 -endef - -# Check if the current target is the final target, as specified by -# the user on the command line. If so, call PrintEndMessage. -define CheckIfFinished -$(if $(filter $@,$(MAKECMDGOALS)),$(call PrintEndMessage)) -# If no taget is given, "all" is default. Check for that, too. -# At most one of the tests can be true. -$(if $(MAKECMDGOALS),,$(if $(filter $@,all),$(call PrintEndMessage))) -endef - -# Indicate that we are done. -# Record ending time and print out the total time it took to build. -define MakeFinish -$(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,$1),) -$(BUILD_LOG_WRAPPER) $(PRINTF) "%s\n##### %-60.60s #####\n%s\n##### %-60.60s #####\n%s\n\n" \ -"########################################################################" \ -"Leaving $1 for target(s) $2" \ -"########################################################################" \ -$(if $(REPORT_BUILD_TIMES),"Build time `$(CAT) $(BUILDTIMESDIR)/build_time_diff_$1` for target(s) $2","") \ -"########################################################################" -$(call CheckIfFinished) -endef - -# Find all build_time_* files and print their contents in a list sorted -# on the name of the sub repository. -define ReportBuildTimes -$(BUILD_LOG_WRAPPER) $(PRINTF) -- "-- Build times ----------\nTarget %s\nStart %s\nEnd %s\n%s\n%s\n-------------------------\n" \ -"$1" \ -"`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \ -"`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \ -"`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | $(XARGS) $(CAT) | $(SORT) -k 2`" \ -"`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`" -endef - -define ResetTimers -$$(shell $(MKDIR) -p $(BUILDTIMESDIR) && $(RM) $(BUILDTIMESDIR)/build_time_*) -endef - -define StartTimer - $(call RecordStartTime,TOTAL) -endef - -define StopTimer - $(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,TOTAL) && $(call ReportBuildTimes,$1),) -endef - -# Hook to be called as the very first thing when running a normal build -define AtRootMakeStart - $(if $(findstring --jobserver,$(MAKEFLAGS)), $(error make -j is not supported, use make JOBS=n)) - $(call PrintStartMessage) - $(call StartTimer) -endef - -# Hook to be called as the very last thing for targets that are "top level" targets -define AtRootMakeEnd - $(call StopTimer) - $(call CheckIfFinished) -endef - # If the variable that you want to send to stdout for piping into a file or otherwise, # is potentially long, for example the a list of file paths, eg a list of all package directories. # Then you need to use ListPathsSafely, which optimistically splits the output into several shell # calls as well as use compression on recurrent file paths segments, to get around the potential # command line length problem that exists in cygwin and other shells. -compress_pre:=$(strip $(shell cat $(SRC_ROOT)/common/makefiles/compress.pre)) -compress_post:=$(strip $(shell cat $(SRC_ROOT)/common/makefiles/compress.post)) +compress_pre:=$(strip $(shell $(CAT) $(SRC_ROOT)/common/makefiles/support/ListPathsSafely-pre-compress.incl)) +compress_post:=$(strip $(shell $(CAT) $(SRC_ROOT)/common/makefiles/support/ListPathsSafely-post-compress.incl)) compress_paths=$(compress_pre)\ $(subst $(SRC_ROOT),X97,\ $(subst $(OUTPUT_ROOT),X98,\ @@ -163,7 +47,7 @@ $(subst X,X00,\ $(subst $(SPACE),\n,$(strip $1)))))\ $(compress_post) -decompress_paths=sed -f $(SRC_ROOT)/common/makefiles/uncompress.sed -e 's|X99|\\n|g' \ +decompress_paths=$(SED) -f $(SRC_ROOT)/common/makefiles/support/ListPathsSafely-uncompress.sed -e 's|X99|\\n|g' \ -e 's|X98|$(OUTPUT_ROOT)|g' -e 's|X97|$(SRC_ROOT)|g' \ -e 's|X00|X|g' | tr '\n' '$2' @@ -384,14 +268,67 @@ $(ECHO) $1/$(HGTIP_FILENAME) endef define SetupLogging - ifneq ($(findstring $(LOG),debug trace),) + ifeq ($$(LOG), trace) # Shell redefinition trick inspired by http://www.cmcrossroads.com/ask-mr-make/6535-tracing-rule-execution-in-gnu-make + # For each target executed, will print + # Building (from ) ( newer) + # but with a limit of 20 on , to avoid cluttering logs too much (and causing a crash on Cygwin). OLD_SHELL:=$$(SHELL) - SHELL = $$(warning Building $$@$$(if $$<, (from $$<))$(if $$?, ($$? newer)))$$(OLD_SHELL) -x + WRAPPER_SHELL:=$$(OLD_SHELL) $$(SRC_ROOT)/common/bin/shell-tracer.sh $$(if $$(TIME),$$(TIME),-) $$(OUTPUT_ROOT)/build-trace-time.log $$(OLD_SHELL) + SHELL=$$(warning $$(if $$@,Building $$@,Running shell command) $$(if $$<, (from $$<))$$(if $$?, ($$(wordlist 1, 20, $$?) $$(if $$(wordlist 21, 22, $$?), ... [in total $$(words $$?) files]) newer)))$$(WRAPPER_SHELL) + endif + # Never remove warning messages; this is just for completeness + LOG_WARN= + ifneq ($$(findstring $$(LOG),info debug trace),) + LOG_INFO= + else + LOG_INFO=> /dev/null + endif + ifneq ($$(findstring $$(LOG),debug trace),) + LOG_DEBUG= + else + LOG_DEBUG=> /dev/null + endif + ifneq ($$(findstring $$(LOG),trace),) + LOG_TRACE= + else + LOG_TRACE=> /dev/null endif endef # Make sure logging is setup for everyone that includes MakeBase.gmk. $(eval $(call SetupLogging)) +# This is to be called by all SetupFoo macros +define LogSetupMacroEntry + $(if $(26),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk)) + $(if $(findstring $(LOG),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25,$(if $($i),$(NEWLINE) $(strip [$i] $($i)))))) +endef + +# Make directory without forking mkdir if not needed +define MakeDir + ifneq ($$(wildcard $1 $2 $3 $4 $5 $6 $7 $8 $9),$$(strip $1 $2 $3 $4 $5 $6 $7 $8 $9)) + $$(shell $(MKDIR) -p $1 $2 $3 $4 $5 $6 $7 $8 $9) + endif +endef + +ifeq ($(OPENJDK_TARGET_OS),solaris) +# On Solaris, if the target is a symlink and exists, cp won't overwrite. +define install-file + $(MKDIR) -p $(@D) + $(RM) '$@' + $(CP) -f -r -P '$<' '$(@D)' +endef +else ifeq ($(OPENJDK_TARGET_OS),macosx) +define install-file + $(MKDIR) -p $(@D) + $(CP) -fpRP '$<' '$@' +endef +else +define install-file + $(MKDIR) -p $(@D) + $(CP) -fP '$<' '$@' +endef +endif + endif # _MAKEBASE_GMK diff --git a/common/makefiles/MakeHelpers.gmk b/common/makefiles/MakeHelpers.gmk index ef84463be97..99103116311 100644 --- a/common/makefiles/MakeHelpers.gmk +++ b/common/makefiles/MakeHelpers.gmk @@ -45,13 +45,130 @@ MAKE_ARGS=$(foreach var,$(subst =command,,$(filter %=command,$(foreach var,$(.VA list_alt_overrides_with_origins=$(filter ALT_%=environment ALT_%=command,$(foreach var,$(.VARIABLES),$(var)=$(firstword $(origin $(var))))) list_alt_overrides=$(subst =command,,$(subst =environment,,$(list_alt_overrides_with_origins))) +# Store the build times in this directory. +BUILDTIMESDIR=$(OUTPUT_ROOT)/tmp/buildtimes + +# Global targets are possible to run either with or without a SPEC. The prototypical +# global target is "help". +global_targets=help configure + ############################## # Functions ############################## -define fatal-error +define CheckEnvironment + # Find all environment or command line variables that begin with ALT. + $(if $(list_alt_overrides), + @$(PRINTF) "\nWARNING: You have the following ALT_ variables set:\n" + @$(PRINTF) "$(foreach var,$(list_alt_overrides),$(var)=$$$(var))\n" + @$(PRINTF) "ALT_ variables are deprecated and will be ignored. Please clean your environment.\n\n" + ) +endef + +### Functions for timers + +# Record starting time for build of a sub repository. +define RecordStartTime + $(MKDIR) -p $(BUILDTIMESDIR) + $(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_start_$1 + $(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_start_$1_human_readable +endef + +# Record ending time and calculate the difference and store it in a +# easy to read format. Handles builds that cross midnight. Expects +# that a build will never take 24 hours or more. +define RecordEndTime + $(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_end_$1 + $(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_end_$1_human_readable + $(ECHO) `$(CAT) $(BUILDTIMESDIR)/build_time_start_$1` `$(CAT) $(BUILDTIMESDIR)/build_time_end_$1` $1 | \ + $(NAWK) '{ F=$$7; T=$$14; if (F > T) { T+=3600*24 }; D=T-F; H=int(D/3600); \ + M=int((D-H*3600)/60); S=D-H*3600-M*60; printf("%02d:%02d:%02d %s\n",H,M,S,$$15); }' \ + > $(BUILDTIMESDIR)/build_time_diff_$1 +endef + +# Find all build_time_* files and print their contents in a list sorted +# on the name of the sub repository. +define ReportBuildTimes + $(BUILD_LOG_WRAPPER) $(PRINTF) -- "----- Build times -------\nStart %s\nEnd %s\n%s\n%s\n-------------------------\n" \ + "`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \ + "`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \ + "`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | $(XARGS) $(CAT) | $(SORT) -k 2`" \ + "`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`" +endef + +define ResetAllTimers + $$(shell $(MKDIR) -p $(BUILDTIMESDIR) && $(RM) $(BUILDTIMESDIR)/build_time_*) +endef + +define StartGlobalTimer + $(call RecordStartTime,TOTAL) +endef + +define StopGlobalTimer + $(call RecordEndTime,TOTAL) +endef + +### Functions for managing makefile structure (start/end of makefile and individual targets) + +# Do not indent this function, this will add whitespace at the start which the caller won't handle +define GetRealTarget +$(strip $(if $(MAKECMDGOALS),$(MAKECMDGOALS),all)) +endef + +# Do not indent this function, this will add whitespace at the start which the caller won't handle +define LastGoal +$(strip $(lastword $(call GetRealTarget))) +endef + +# Check if the current target is the final target, as specified by +# the user on the command line. If so, call AtRootMakeEnd. +define CheckIfMakeAtEnd + # Check if the current target is the last goal + $(if $(filter $@,$(call LastGoal)),$(call AtMakeEnd)) + # If the target is 'foo-only', check if our goal was stated as 'foo' + $(if $(filter $(patsubst %-only,%,$@),$(call LastGoal)),$(call AtMakeEnd)) + # If no goal is given, 'all' is default, but the last target executed for all is 'jdk-only'. Check for that, too. + # At most one of the tests can be true. + $(if $(subst all,,$(call LastGoal)),,$(if $(filter $@,jdk-only),$(call AtMakeEnd))) +endef + +# Hook to be called when starting to execute a top-level target +define TargetEnter + $(BUILD_LOG_WRAPPER) $(PRINTF) "## Starting $(patsubst %-only,%,$@)\n" + $(call RecordStartTime,$(patsubst %-only,%,$@)) +endef + +# Hook to be called when finish executing a top-level target +define TargetExit + $(call RecordEndTime,$(patsubst %-only,%,$@)) + $(BUILD_LOG_WRAPPER) $(PRINTF) "## Finished $(patsubst %-only,%,$@) (build time %s)\n\n" \ + "`$(CAT) $(BUILDTIMESDIR)/build_time_diff_$(patsubst %-only,%,$@) | $(CUT) -f 1 -d " "`" + $(call CheckIfMakeAtEnd) +endef + +# Hook to be called as the very first thing when running a normal build +define AtMakeStart + $(if $(findstring --jobserver,$(MAKEFLAGS)),$(error make -j is not supported, use make JOBS=n)) + $(call CheckEnvironment) + @$(PRINTF) $(LOG_INFO) "Running make as '$(MAKE) $(MFLAGS) $(MAKE_ARGS)'\n" + @$(PRINTF) "Building $(PRODUCT_NAME) for target '$(call GetRealTarget)' in configuration '$(CONF_NAME)'\n\n" + $(call StartGlobalTimer) +endef + +# Hook to be called as the very last thing for targets that are "top level" targets +define AtMakeEnd + $(if $(SJAVAC_SERVER_DIR),@$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) + $(call StopGlobalTimer) + $(call ReportBuildTimes) + @$(PRINTF) "Finished building $(PRODUCT_NAME) for target '$(call GetRealTarget)'\n" + $(call CheckEnvironment) +endef + +### Functions for parsing and setting up make options from command-line + +define FatalError # If the user specificed a "global" target (e.g. 'help'), do not exit but continue running - $$(if $$(findstring help,$$(MAKECMDGOALS)),,$$(error Cannot continue)) + $$(if $$(filter-out $(global_targets),$$(call GetRealTarget)),$$(error Cannot continue)) endef define ParseLogLevel @@ -80,14 +197,14 @@ define ParseLogLevel ifeq ($$(LOG),warn) VERBOSE=-s else ifeq ($$(LOG),info) - VERBOSE= + VERBOSE=-s else ifeq ($$(LOG),debug) VERBOSE= else ifeq ($$(LOG),trace) - VERBOSE=-d -p + VERBOSE= else $$(info Error: LOG must be one of: warn, info, debug or trace.) - $$(eval $$(call fatal-error)) + $$(eval $$(call FatalError)) endif else ifneq ($$(LOG),) @@ -95,108 +212,84 @@ define ParseLogLevel # but complain if this is the top-level make call. ifeq ($$(MAKELEVEL),0) $$(info Cannot use LOG=$$(LOG) and VERBOSE=$$(VERBOSE) at the same time. Choose one.) - $$(eval $$(call fatal-error)) + $$(eval $$(call FatalError)) endif endif endif endef -# TODO: Fix duplication in MakeBase.gmk -define SetupLogging - ifneq ($(findstring $(LOG),debug trace),) - # Shell redefinition trick inspired by http://www.cmcrossroads.com/ask-mr-make/6535-tracing-rule-execution-in-gnu-make - OLD_SHELL:=$$(SHELL) - SHELL = $$(warning Building $$@$$(if $$<, (from $$<))$(if $$?, ($$? newer)))$$(OLD_SHELL) -x - endif -endef - define ParseConfAndSpec - ifneq ($$(origin SPEC),undefined) - # We have been given a SPEC, check that it works out properly - ifeq ($$(wildcard $$(SPEC)),) - $$(info Cannot locate spec.gmk, given by SPEC=$$(SPEC)) - $$(eval $$(call fatal-error)) - endif - ifneq ($$(origin CONF),undefined) - # We also have a CONF argument. This is OK only if this is a repeated call by ourselves, - # but complain if this is the top-level make call. - ifeq ($$(MAKELEVEL),0) - $$(info Cannot use CONF=$$(CONF) and SPEC=$$(SPEC) at the same time. Choose one.) - $$(eval $$(call fatal-error)) + ifneq ($$(filter-out $(global_targets),$$(call GetRealTarget)),) + # If we only have global targets, no need to bother with SPEC or CONF + ifneq ($$(origin SPEC),undefined) + # We have been given a SPEC, check that it works out properly + ifeq ($$(wildcard $$(SPEC)),) + $$(info Cannot locate spec.gmk, given by SPEC=$$(SPEC)) + $$(eval $$(call FatalError)) endif - endif - # ... OK, we're satisfied, we'll use this SPEC later on - else - # Find all spec.gmk files in the build output directory - output_dir=$$(root_dir)/build - all_spec_files=$$(wildcard $$(output_dir)/*/spec.gmk) - ifeq ($$(all_spec_files),) - $$(info No configurations found for $$(root_dir)! Please run configure to create a configuration.) - $$(eval $$(call fatal-error)) - endif - # Extract the configuration names from the path - all_confs=$$(patsubst %/spec.gmk,%,$$(patsubst $$(output_dir)/%,%,$$(all_spec_files))) - - ifneq ($$(origin CONF),undefined) - # User have given a CONF= argument. - ifeq ($$(CONF),) - # If given CONF=, match all configurations - matching_confs=$$(strip $$(all_confs)) - else - # Otherwise select those that contain the given CONF string - matching_confs=$$(strip $$(foreach var,$$(all_confs),$$(if $$(findstring $$(CONF),$$(var)),$$(var)))) - endif - ifeq ($$(matching_confs),) - $$(info No configurations found matching CONF=$$(CONF)) - $$(info Available configurations:) - $$(foreach var,$$(all_confs),$$(info * $$(var))) - $$(eval $$(call fatal-error)) - else - ifeq ($$(words $$(matching_confs)),1) - $$(info Building '$$(matching_confs)' (matching CONF=$$(CONF))) - else - $$(info Building the following configurations (matching CONF=$$(CONF)):) - $$(foreach var,$$(matching_confs),$$(info * $$(var))) + ifneq ($$(origin CONF),undefined) + # We also have a CONF argument. This is OK only if this is a repeated call by ourselves, + # but complain if this is the top-level make call. + ifeq ($$(MAKELEVEL),0) + $$(info Cannot use CONF=$$(CONF) and SPEC=$$(SPEC) at the same time. Choose one.) + $$(eval $$(call FatalError)) endif endif - - # Create a SPEC definition. This will contain the path to one or more spec.gmk files. - SPEC=$$(addsuffix /spec.gmk,$$(addprefix $$(output_dir)/,$$(matching_confs))) + # ... OK, we're satisfied, we'll use this SPEC later on else - # No CONF or SPEC given, check the available configurations - ifneq ($$(words $$(all_spec_files)),1) - $$(info No CONF or SPEC given, but more than one spec.gmk found in $$(output_dir).) - $$(info Available configurations:) - $$(foreach var,$$(all_confs),$$(info * $$(var))) - $$(info Please retry building with CONF= or SPEC=) - $$(eval $$(call fatal-error)) + # Find all spec.gmk files in the build output directory + output_dir=$$(root_dir)/build + all_spec_files=$$(wildcard $$(output_dir)/*/spec.gmk) + ifeq ($$(all_spec_files),) + $$(info No configurations found for $$(root_dir)! Please run configure to create a configuration.) + $$(eval $$(call FatalError)) endif + # Extract the configuration names from the path + all_confs=$$(patsubst %/spec.gmk,%,$$(patsubst $$(output_dir)/%,%,$$(all_spec_files))) - # We found exactly one configuration, use it - SPEC=$$(strip $$(all_spec_files)) + ifneq ($$(origin CONF),undefined) + # User have given a CONF= argument. + ifeq ($$(CONF),) + # If given CONF=, match all configurations + matching_confs=$$(strip $$(all_confs)) + else + # Otherwise select those that contain the given CONF string + matching_confs=$$(strip $$(foreach var,$$(all_confs),$$(if $$(findstring $$(CONF),$$(var)),$$(var)))) + endif + ifeq ($$(matching_confs),) + $$(info No configurations found matching CONF=$$(CONF)) + $$(info Available configurations:) + $$(foreach var,$$(all_confs),$$(info * $$(var))) + $$(eval $$(call FatalError)) + else + ifeq ($$(words $$(matching_confs)),1) + $$(info Building '$$(matching_confs)' (matching CONF=$$(CONF))) + else + $$(info Building target '$(call GetRealTarget)' in the following configurations (matching CONF=$$(CONF)):) + $$(foreach var,$$(matching_confs),$$(info * $$(var))) + endif + endif + + # Create a SPEC definition. This will contain the path to one or more spec.gmk files. + SPEC=$$(addsuffix /spec.gmk,$$(addprefix $$(output_dir)/,$$(matching_confs))) + else + # No CONF or SPEC given, check the available configurations + ifneq ($$(words $$(all_spec_files)),1) + $$(info No CONF given, but more than one configuration found in $$(output_dir).) + $$(info Available configurations:) + $$(foreach var,$$(all_confs),$$(info * $$(var))) + $$(info Please retry building with CONF= (or SPEC=)) + $$(eval $$(call FatalError)) + endif + + # We found exactly one configuration, use it + SPEC=$$(strip $$(all_spec_files)) + endif endif endif endef -define CheckEnvironment - # Find all environment or command line variables that begin with ALT. - $(if $(list_alt_overrides), - @$(PRINTF) "\nWARNING: You have the following ALT_ variables set:\n" - @$(PRINTF) "$(foreach var,$(list_alt_overrides),$(var)=$$$(var))\n" - @$(PRINTF) "ALT_ variables are deprecated and will be ignored. Please clean your environment.\n\n" - ) -endef - -define PrintStartMessage - $(if $(VERBOSE),,@$(ECHO) Running make as $(MAKE) $(MFLAGS) $(MAKE_ARGS)) - $(call CheckEnvironment) - @$(ECHO) "Building OpenJDK for target $(if $(MAKECMDGOALS),'$(MAKECMDGOALS)','all') in configuration '$(CONF_NAME)'" -endef - -define PrintEndMessage - @$(ECHO) "Finished building OpenJDK for target '$@'" - $(call CheckEnvironment) -endef +### Convenience functions from Main.gmk # Cleans the component given as $1 define CleanComponent diff --git a/common/makefiles/Makefile b/common/makefiles/Makefile index 9672bb4848f..cd5a9bfae34 100644 --- a/common/makefiles/Makefile +++ b/common/makefiles/Makefile @@ -24,13 +24,24 @@ # # This must be the first rule -default: all +all: # Inclusion of this pseudo-target will cause make to execute this file # serially, regardless of -j. Recursively called makefiles will not be # affected, however. This is required for correct dependency management. .NOTPARALLEL: +# The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU make. +# /usr/ccs/bin/make lacks basically every other flow control mechanism. +TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU make/gmake, this is a requirement. Check your path. 1>&2 && exit 1 + +# Assume we have GNU make, but check version. +ifeq (,$(findstring 3.81,$(MAKE_VERSION))) + ifeq (,$(findstring 3.82,$(MAKE_VERSION))) + $(error This version of GNU Make is too low ($(MAKE_VERSION)). Check your path, or upgrade to 3.81 or newer.) + endif +endif + # Locate this Makefile ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) @@ -43,202 +54,32 @@ root_dir:=$(patsubst %/common/makefiles/Makefile,%,$(makefile_path)) include $(dir $(makefile_path))/MakeHelpers.gmk $(eval $(call ParseLogLevel)) -$(eval $(call SetupLogging)) $(eval $(call ParseConfAndSpec)) -ifneq ($(words $(SPEC)),1) -### We have multiple configurations to build, call make repeatedly -all clean dist-clean: -langtools corba jaxp jaxws hotspot jdk images overlay-images install: -langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only overlay-images-only install-only: -clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images: +# Now determine if we have zero, one or several configurations to build. +ifeq ($(SPEC),) + # Since we got past ParseConfAndSpec, we must be building a global target. Do nothing. +else + ifeq ($(words $(SPEC)),1) + # We are building a single configuration. This is the normal case. Execute the Main.gmk file. + include $(dir $(makefile_path))/Main.gmk + else + # We are building multiple configurations. + # First, find out the valid targets + # Run the makefile with an arbitraty SPEC using -p -q (quiet dry-run and dump rules) to find + # available PHONY targets. Use this list as valid targets to pass on to the repeated calls. + all_phony_targets=$(filter-out $(global_targets), $(strip $(shell \ + $(MAKE) -p -q -f $(makefile_path) SPEC=$(firstword $(SPEC)) | \ + grep ^.PHONY: | head -n 1 | cut -d " " -f 2-))) + +$(all_phony_targets): @$(foreach spec,$(SPEC),($(MAKE) -f $(makefile_path) SPEC=$(spec) $(VERBOSE) VERBOSE=$(VERBOSE) $@) &&) true -.PHONY: all clean dist-clean -.PHONY: langtools corba jaxp jaxws hotspot jdk images overlay-images install -.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only overlay-images-only install-only -.PHONY: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images - -else -### This is the main part of the Makefile, for the normal case with SPEC specifying a single existing spec.gmk file. - -# Now load the spec -include $(SPEC) - -# Load the vital tools for all the makefiles. -include $(SRC_ROOT)/common/makefiles/MakeBase.gmk - -### Clean up from previous run - -# Remove any build.log from a previous run, if they exist -ifneq (,$(BUILD_LOG)) - ifneq (,$(BUILD_LOG_PREVIOUS)) - # Rotate old log - $(shell $(RM) $(BUILD_LOG_PREVIOUS) 2> /dev/null) - $(shell $(MV) $(BUILD_LOG) $(BUILD_LOG_PREVIOUS) 2> /dev/null) - else - $(shell $(RM) $(BUILD_LOG) 2> /dev/null) endif endif -# Remove any javac server logs and port files. This -# prevents a new make run to reuse the previous servers. -ifneq (,$(SJAVAC_SERVER_DIR)) - $(shell $(MKDIR) -p $(SJAVAC_SERVER_DIR) && $(RM) -rf $(SJAVAC_SERVER_DIR)/*) -endif -# Clean out any notifications from the previous build. -$(shell $(FIND) $(OUTPUT_ROOT) -name "_the.*.notify" $(FIND_DELETE)) - -# Reset the build timers. -$(eval $(call ResetTimers)) - -# Setup number of jobs to use. -jN is unfortunately not available for us to parse from the command line, -# hence this workaround. -ifeq ($(JOBS),) - JOBS=$(NUM_CORES) -endif -MAKE_ARGS:=$(MAKE_ARGS) -j$(JOBS) - -### Main targets - -all: jdk - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) -.PHONY: all - -langtools: start-make langtools-only -langtools-only: - @$(call MakeStart,langtools,all) - @($(CD) $(LANGTOOLS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS)) - @$(call MakeFinish,langtools,all) - -corba: langtools corba-only -corba-only: - @$(call MakeStart,corba,all) - @($(CD) $(CORBA_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS)) - @$(call MakeFinish,corba,all) - -jaxp: langtools jaxp-only -jaxp-only: - @$(call MakeStart,jaxp,all) - @($(CD) $(JAXP_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS)) - @$(call MakeFinish,jaxp,all) - -jaxws: langtools jaxp jaxws-only -jaxws-only: - @$(call MakeStart,jaxws,all) - @($(CD) $(JAXWS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS)) - @$(call MakeFinish,jaxws,all) - -hotspot: langtools hotspot-only -hotspot-only: - @$(call MakeStart,hotspot,all) - @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f HotspotWrapper.gmk) - @$(call MakeFinish,hotspot,all) - -jdk: langtools corba jaxp jaxws hotspot jdk-only -jdk-only: - @$(call MakeStart,jdk,all) - @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) $(JDK_TARGET)) - @$(call MakeFinish,jdk,all) - -images: source-tips start-make jdk langtools corba jaxp jaxws hotspot images-only -images-only: - @$(call MakeStart,jdk-images,$@) - @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) images) - @$(call MakeFinish,jdk-images,$@) - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) - -overlay-images: source-tips start-make jdk langtools corba jaxp jaxws hotspot overlay-images-only -overlay-images-only: - @$(call MakeStart,jdk-overlay-images,$@) - @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) overlay-images) - @$(call MakeFinish,jdk-overlay-images,$@) - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) - -install: source-tips start-make jdk langtools corba jaxp jaxws hotspot install-only -install-only: - @$(call MakeStart,jdk-images,$@) - @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) install) - @$(call MakeFinish,jdk-images,$@) - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) - -docs: start-make jdk docs-only -docs-only: - @$(call MakeStart,docs,$@) - @($(CD) $(SRC_ROOT)/common/makefiles/javadoc && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs) - @$(call MakeFinish,docs,$@) - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) - - -.PHONY: langtools corba jaxp jaxws hotspot jdk images install -.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only install-only - -start-make: - @$(call AtRootMakeStart) -.PHONY: start-make - -bootcycle-images: - @$(ECHO) Boot cycle build step 1: Building the JDK image normally - @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(SPEC) images) - @$(ECHO) Boot cycle build step 2: Building a new JDK image using previously built image - @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(dir $(SPEC))bootcycle-spec.gmk images) - -test: start-make - @$(call MakeStart,test,$(if $(TEST),$(TEST),all)) - @($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) MAKEFLAGS= -j1 PRODUCT_HOME=$(OUTPUT_ROOT)/jdk JPRT_JAVA_HOME=$(OUTPUT_ROOT)/jdk ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true - @$(call MakeFinish,test,$(if $(TEST),$(TEST),all)) - @$(call AtRootMakeEnd) -.PHONY: test - - -# Stores the tips for each repository. This file is be used when constructing the jdk image and can be -# used to track the exact sources used to build that image. -source-tips: $(OUTPUT_ROOT)/source_tips -$(OUTPUT_ROOT)/source_tips: FRC - @$(MKDIR) -p $(@D) - @$(RM) $@ - @$(call GetSourceTips) - - -# Remove everything, except the output from configure. -clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images clean-bootcycle-build - @($(CD) $(OUTPUT_ROOT) && $(RM) -r tmp source_tips build.log*) - @$(ECHO) Cleaned everything except the build configuration. -.PHONY: clean - -# Remove everything, you have to rerun configure. -dist-clean: - @$(RM) -r $(OUTPUT_ROOT) - @$(ECHO) Cleaned everything, you will have to re-run configure. -.PHONY: dist-clean - -clean-langtools: - $(call CleanComponent,langtools) -clean-corba: - $(call CleanComponent,corba) -clean-jaxp: - $(call CleanComponent,jaxp) -clean-jaxws: - $(call CleanComponent,jaxws) -clean-hotspot: - $(call CleanComponent,hotspot) -clean-jdk: - $(call CleanComponent,jdk) -clean-images: - $(call CleanComponent,images) -clean-bootcycle-build: - $(call CleanComponent,bootcycle-build) - -.PHONY: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images - -endif # Here are "global" targets, i.e. targets that can be executed without specifying a single configuration. -# If you addd more global targets, please update the fatal-error macro. +# If you addd more global targets, please update the variable global_targets in MakeHelpers. help: $(info ) @@ -258,7 +99,7 @@ help: $(info . make test # Run tests, default is all tests (see TEST below)) $(info ) $(info Targets for specific components) - $(info (Component is any of langtools, corba, jaxp, jaxws, hotspot, jdk or images)) + $(info (Component is any of langtools, corba, jaxp, jaxws, hotspot, jdk, images or overlay-images)) $(info . make # Build and everything it depends on. ) $(info . make -only # Build only, without dependencies. This) $(info . # is faster but can result in incorrect build results!) @@ -272,7 +113,7 @@ help: $(info . make LOG= # Change the log level from warn to ) $(info . # Available log levels are:) $(info . # 'warn' (default), 'info', 'debug' and 'trace') - $(info . # To see executed command lines, use LOG=info) + $(info . # To see executed command lines, use LOG=debug) $(info ) $(info . make JOBS= # Run parallel make jobs) $(info . # Note that -jN does not work as expected!) @@ -280,5 +121,11 @@ help: $(info . make test TEST= # Only run the given test or tests, e.g.) $(info . # make test TEST="jdk_lang jdk_net") $(info ) -.PHONY: help -FRC: # Force target + +configure: + @$(SHELL) $(root_dir)/configure $(CONFIGURE_ARGS) + @echo ==================================================== + @echo "Note: This is a non-recommended way of running configure." + @echo "Instead, run 'sh configure' in the top-level directory" + +.PHONY: help configure diff --git a/common/makefiles/NativeCompilation.gmk b/common/makefiles/NativeCompilation.gmk index d93af0beb32..441dfafa502 100644 --- a/common/makefiles/NativeCompilation.gmk +++ b/common/makefiles/NativeCompilation.gmk @@ -32,10 +32,10 @@ ifeq (,$(_MAKEBASE_GMK)) endif ifeq ($(COMPILER_TYPE),CC) - COMPILING_MSG=echo Compiling $1 - LINKING_MSG=echo Linking $1 - LINKING_EXE_MSG=echo Linking executable $1 - ARCHIVING_MSG=echo Archiving $1 + COMPILING_MSG=echo $(LOG_INFO) "Compiling $(notdir $1) (for $(notdir $2))" + LINKING_MSG=echo $(LOG_INFO) "Linking $1" + LINKING_EXE_MSG=echo $(LOG_INFO) "Linking executable $1" + ARCHIVING_MSG=echo $(LOG_INFO) "Archiving $1" else COMPILING_MSG= LINKING_MSG= @@ -94,7 +94,7 @@ define add_native_source $$($1_$2_OBJ) : $2 ifeq ($(COMPILER_TYPE),CC) - $$(call COMPILING_MSG,$$(notdir $2)) + $$(call COMPILING_MSG,$2,$$($1_TARGET)) $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 endif ifeq ($(COMPILER_TYPE),CL) @@ -129,30 +129,8 @@ define SetupNativeCompilation # CC the compiler to use, default is $(CC) # LDEXE the linker to use for linking executables, default is $(LDEXE) # OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$1_$(strip $(10))) - $(if $(11),$1_$(strip $(11))) - $(if $(12),$1_$(strip $(12))) - $(if $(13),$1_$(strip $(13))) - $(if $(14),$1_$(strip $(14))) - $(if $(15),$1_$(strip $(15))) - $(if $(16),$1_$(strip $(16))) - $(if $(17),$1_$(strip $(17))) - $(if $(18),$1_$(strip $(18))) - $(if $(19),$1_$(strip $(19))) - $(if $(20),$1_$(strip $(20))) - $(if $(21),$1_$(strip $(21))) - $(if $(22),$1_$(strip $(22))) - $(if $(23),$1_$(strip $(23))) - $(if $(24),$1_$(strip $(24))) - $(if $(25),$1_$(strip $(25))) + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupNativeCompilation($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)) $(if $(26),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk)) ifneq (,$$($1_BIN)) @@ -236,9 +214,9 @@ define SetupNativeCompilation $$(error You have to specify LANG for native compilation $1) endif ifeq (C,$$($1_LANG)) - ifeq ($$($1_LDEXE),) + ifeq ($$($1_LDEXE),) $1_LDEXE:=$(LDEXE) - endif + endif $1_LD:=$(LD) else ifeq (C++,$$($1_LANG)) @@ -254,9 +232,11 @@ define SetupNativeCompilation endif # Make sure the dirs exist. - $$(shell $(MKDIR) -p $$($1_SRC) $$($1_OBJECT_DIR) $$($1_OUTPUT_DIR)) + $$(eval $$(call MakeDir,$$($1_OBJECT_DIR) $$($1_OUTPUT_DIR))) + $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d))) + # Find all files in the source trees. Sort to remove duplicates. - $1_ALL_SRCS := $$(sort $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i -type f))) + $1_ALL_SRCS := $$(sort $$(shell $(FIND) $$($1_SRC) -type f)) # Extract the C/C++ files. $1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES))) $1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES))) @@ -291,7 +271,9 @@ define SetupNativeCompilation # Are there too many object files on disk? Perhaps because some source file was removed? $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS))) # Clean out the superfluous object files. - $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS)) + ifneq ($$($1_SUPERFLUOUS_OBJS),) + $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS)) + endif # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CFLAGS. $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS)) @@ -358,11 +340,6 @@ define SetupNativeCompilation $$(error Unknown value for OPTIMIZATION: $$($1_OPTIMIZATION)) endif - # Now create a list of the packages that are about to compile. Used when sending source - # in a batch to the compiler. - $$(shell $(RM) $$($1_OBJECT_DIR)/_the.list_of_sources) - $$(eval $$(call ListPathsSafelyNow,$1_SRCS,\n, >> $$($1_OBJECT_DIR)/_the.list_of_sources)) - # Now call add_native_source for each source file we are going to compile. $$(foreach p,$$($1_SRCS),\ $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR),\ @@ -385,8 +362,6 @@ define SetupNativeCompilation endif # mapfile doesnt seem to be implemented on macosx (yet??) - ifneq ($(OPENJDK_TARGET_CPU),ppc) - ifneq ($(OPENJDK_TARGET_CPU),arm) ifneq ($(OPENJDK_TARGET_OS),macosx) ifneq ($(OPENJDK_TARGET_OS),windows) $1_REAL_MAPFILE:=$$($1_MAPFILE) @@ -401,8 +376,6 @@ define SetupNativeCompilation endif endif endif - endif - endif # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables # for LDFLAGS and LDFLAGS_SUFFIX @@ -445,9 +418,9 @@ define SetupNativeCompilation $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($1_TARGET) \ $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK) $(RM) $$@ - $(FIX_EMPTY_SEC_HDR_FLAGS) $$< + $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$< $(OBJCOPY) --only-keep-debug $$< $$@ - $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $$(@F) $$< + $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$< else # not solaris $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($1_TARGET) $(RM) $$@ @@ -523,9 +496,9 @@ define SetupNativeCompilation $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($1_TARGET) \ $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK) $(RM) $$@ - $(FIX_EMPTY_SEC_HDR_FLAGS) $$< + $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$< $(OBJCOPY) --only-keep-debug $$< $$@ - $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $$(@F) $$< + $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$< else # not solaris $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($1_TARGET) $(RM) $$@ @@ -564,7 +537,7 @@ define SetupNativeCompilation $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \ $$($1_EXTRA_LDFLAGS_SUFFIX) ifneq (,$$($1_GEN_MANIFEST)) - $(MT) -nologo /manifest $$($1_GEN_MANIFEST) /outputresource:$$@;#1 + $(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1 endif endif diff --git a/common/makefiles/RMICompilation.gmk b/common/makefiles/RMICompilation.gmk index 65ba9e621f9..fd332b4dbb5 100644 --- a/common/makefiles/RMICompilation.gmk +++ b/common/makefiles/RMICompilation.gmk @@ -34,16 +34,9 @@ define SetupRMICompilation # RUN_IIOP:=Set to run rmic with -iiop # RUN_IIOP_STDPKG:=Set to run rmic with -iiop -standardPackage # KEEP_GENERATED:=Set to keep generated sources around - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$(error Internal makefile error: Too many arguments to SetupRMICompilation, please update RMICompilation.gmk)) - + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupRMICompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(16),$(error Internal makefile error: Too many arguments to SetupRMICompilation, please update RMICompilation.gmk)) $1_DEP_FILE := $$($1_STUB_CLASSES_DIR)/$1_rmic @@ -86,12 +79,12 @@ define SetupRMICompilation $$($1_DEP_FILE): $$($1_CLASS_FILES) $(MKDIR) -p $$($1_STUB_CLASSES_DIR) if [ "x$$($1_ARGS)" != "x" ]; then \ - $(ECHO) Running rmic $$($1_ARGS) for $$($1_DOLLAR_SAFE_CLASSES) &&\ + $(ECHO) $(LOG_INFO) Running rmic $$($1_ARGS) for $$($1_DOLLAR_SAFE_CLASSES) &&\ $(RMIC) $$($1_ARGS) -classpath "$$($1_CLASSES_DIR)" \ -d $$($1_STUB_CLASSES_DIR) $$($1_DOLLAR_SAFE_CLASSES);\ fi; if [ "x$$($1_ARGS2)" != "x" ]; then \ - $(ECHO) Running rmic $$($1_ARGS2) for $$($1_DOLLAR_SAFE_CLASSES) &&\ + $(ECHO) $(LOG_INFO) Running rmic $$($1_ARGS2) for $$($1_DOLLAR_SAFE_CLASSES) &&\ $(RMIC) $$($1_ARGS2) -classpath "$$($1_CLASSES_DIR)" \ -d $$($1_STUB_CLASSES_DIR) $$($1_DOLLAR_SAFE_CLASSES);\ fi; diff --git a/common/makefiles/compress.post b/common/makefiles/support/ListPathsSafely-post-compress.incl similarity index 87% rename from common/makefiles/compress.post rename to common/makefiles/support/ListPathsSafely-post-compress.incl index 06b44c43461..d8ccf22445c 100644 --- a/common/makefiles/compress.post +++ b/common/makefiles/support/ListPathsSafely-post-compress.incl @@ -1 +1 @@ -)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) \ No newline at end of file +)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) diff --git a/common/makefiles/compress.pre b/common/makefiles/support/ListPathsSafely-pre-compress.incl similarity index 98% rename from common/makefiles/compress.pre rename to common/makefiles/support/ListPathsSafely-pre-compress.incl index ff41134e1e2..7230c6cc737 100644 --- a/common/makefiles/compress.pre +++ b/common/makefiles/support/ListPathsSafely-pre-compress.incl @@ -1 +1 @@ -$(subst com,X01,$(subst org,X02,$(subst sun,X03,$(subst java,X04,$(subst javax,X05,$(subst sun/io,X06,$(subst com/sun,X07,$(subst java/io,X08,$(subst org/omg,X09,$(subst org/w3c,X10,$(subst org/xml,X11,$(subst sun/awt,X12,$(subst sun/net,X13,$(subst sun/nio,X14,$(subst sun/rmi,X15,$(subst java/awt,X16,$(subst java/net,X17,$(subst java/nio,X18,$(subst java/rmi,X19,$(subst META-INF,X20,$(subst sun/font,X21,$(subst sun/misc,X22,$(subst sun/text,X23,$(subst sun/util,X24,$(subst java/lang,X25,$(subst java/math,X26,$(subst java/text,X27,$(subst java/util,X28,$(subst javax/jws,X29,$(subst javax/net,X30,$(subst javax/rmi,X31,$(subst javax/xml,X32,$(subst sun/corba,X33,$(subst sun/print,X34,$(subst sun/swing,X35,$(subst java/beans,X36,$(subst javax/lang,X37,$(subst sun/applet,X38,$(subst sun/java2d,X39,$(subst java/applet,X40,$(subst javax/print,X41,$(subst javax/sound,X42,$(subst javax/swing,X43,$(subst javax/tools,X44,$(subst jdk/classes,X45,$(subst org/relaxng,X46,$(subst sun/reflect,X47,$(subst javax/crypto,X48,$(subst javax/naming,X49,$(subst jaxp/classes,X50,$(subst sun/security,X51,$(subst corba/classes,X52,$(subst java/security,X53,$(subst javax/imageio,X54,$(subst jdk/btclasses,X55,$(subst javax/activity,X56,$(subst javax/security,X57,$(subst jdk/newclasses,X58,$(subst sun/instrument,X59,$(subst sun/management,X60,$(subst corba/btclasses,X61,$(subst jdk/democlasses,X62,$(subst javax/activation,X63,$(subst javax/annotation,X64,$(subst javax/management,X65,$(subst javax/transaction,X66,$(subst jaxws/jaf_classes,X67,$(subst langtools/classes,X68,$(subst META-INF/services,X69,$(subst jdk/newdemoclasses,X70,$(subst javax/accessibility,X71,$(subst jaxws/jaxws_classes,X72, \ No newline at end of file +$(subst com,X01,$(subst org,X02,$(subst sun,X03,$(subst java,X04,$(subst javax,X05,$(subst sun/io,X06,$(subst com/sun,X07,$(subst java/io,X08,$(subst org/omg,X09,$(subst org/w3c,X10,$(subst org/xml,X11,$(subst sun/awt,X12,$(subst sun/net,X13,$(subst sun/nio,X14,$(subst sun/rmi,X15,$(subst java/awt,X16,$(subst java/net,X17,$(subst java/nio,X18,$(subst java/rmi,X19,$(subst META-INF,X20,$(subst sun/font,X21,$(subst sun/misc,X22,$(subst sun/text,X23,$(subst sun/util,X24,$(subst java/lang,X25,$(subst java/math,X26,$(subst java/text,X27,$(subst java/util,X28,$(subst javax/jws,X29,$(subst javax/net,X30,$(subst javax/rmi,X31,$(subst javax/xml,X32,$(subst sun/corba,X33,$(subst sun/print,X34,$(subst sun/swing,X35,$(subst java/beans,X36,$(subst javax/lang,X37,$(subst sun/applet,X38,$(subst sun/java2d,X39,$(subst java/applet,X40,$(subst javax/print,X41,$(subst javax/sound,X42,$(subst javax/swing,X43,$(subst javax/tools,X44,$(subst jdk/classes,X45,$(subst org/relaxng,X46,$(subst sun/reflect,X47,$(subst javax/crypto,X48,$(subst javax/naming,X49,$(subst jaxp/classes,X50,$(subst sun/security,X51,$(subst corba/classes,X52,$(subst java/security,X53,$(subst javax/imageio,X54,$(subst jdk/btclasses,X55,$(subst javax/activity,X56,$(subst javax/security,X57,$(subst jdk/newclasses,X58,$(subst sun/instrument,X59,$(subst sun/management,X60,$(subst corba/btclasses,X61,$(subst jdk/democlasses,X62,$(subst javax/activation,X63,$(subst javax/annotation,X64,$(subst javax/management,X65,$(subst javax/transaction,X66,$(subst jaxws/jaf_classes,X67,$(subst langtools/classes,X68,$(subst META-INF/services,X69,$(subst jdk/newdemoclasses,X70,$(subst javax/accessibility,X71,$(subst jaxws/jaxws_classes,X72, diff --git a/common/makefiles/uncompress.sed b/common/makefiles/support/ListPathsSafely-uncompress.sed similarity index 100% rename from common/makefiles/uncompress.sed rename to common/makefiles/support/ListPathsSafely-uncompress.sed diff --git a/common/bin/unicode2x.sed b/common/makefiles/support/unicode2x.sed similarity index 100% rename from common/bin/unicode2x.sed rename to common/makefiles/support/unicode2x.sed diff --git a/common/src/uncygdrive.c b/common/src/fixpath.c similarity index 66% rename from common/src/uncygdrive.c rename to common/src/fixpath.c index 438e21434b9..835f6b7da6a 100644 --- a/common/src/uncygdrive.c +++ b/common/src/fixpath.c @@ -58,7 +58,7 @@ int is_cygdrive_here(int pos, char *in, int len) * Works in place since drive letter is always * shorter than /cygdrive/ */ -char *replace_cygdrive(char *in) +char *replace_cygdrive_cygwin(char *in) { int len = strlen(in); char *out = malloc(len+1); @@ -119,6 +119,61 @@ char *replace_substring(char *in, char *sub, char *rep) return out; } +char* msys_path_list; // @-separated list of paths prefix to look for +char* msys_path_list_end; // Points to last \0 in msys_path_list. + +void setup_msys_path_list(char* argument) +{ + char* p; + char* drive_letter_pos; + + msys_path_list = strdup(&argument[2]); + msys_path_list_end = &msys_path_list[strlen(msys_path_list)]; + + // Convert all at-sign (@) in path list to \0. + // @ was chosen as separator to minimize risk of other tools messing around with it + p = msys_path_list; + do { + if (p[1] == ':') { + // msys has mangled our path list, restore it from c:/... to /c/... + drive_letter_pos = p+1; + *drive_letter_pos = *p; + *p = '/'; + } + + // Look for an @ in the list + p = strchr(p, '@'); + if (p != NULL) { + *p = '\0'; + p++; + } + } while (p != NULL); +} + +char *replace_cygdrive_msys(char *in) +{ + char* str; + char* prefix; + char* p; + + str = strdup(in); + + // For each prefix in the path list, search for it and replace /c/... with c:/... + for (prefix = msys_path_list; prefix < msys_path_list_end && prefix != NULL; prefix += strlen(prefix)+1) { + p=str; + while ((p = strstr(p, prefix))) { + char* drive_letter = p+1; + *p = *drive_letter; + *drive_letter = ':'; + p++; + } + } + + return str; +} + +char*(*replace_cygdrive)(char *in) = NULL; + char *files_to_delete[1024]; int num_files_to_delete = 0; @@ -158,7 +213,7 @@ char *fix_at_file(char *in) atout = fopen(name, "w"); if (atout == NULL) { - fprintf(stderr, "Could open temporary file for writing! %s\n", name); + fprintf(stderr, "Could not open temporary file for writing! %s\n", name); exit(-1); } @@ -167,7 +222,13 @@ char *fix_at_file(char *in) append(&buffer, &buflen, &used, block, blocklen); } buffer[used] = 0; + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "fixpath input from @-file %s: %s\n", &in[1], buffer); + } fixed = replace_cygdrive(buffer); + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "fixpath converted to @-file %s is: %s\n", name, fixed); + } fwrite(fixed, strlen(fixed), 1, atout); fclose(atin); fclose(atout); @@ -194,12 +255,31 @@ int main(int argc, char **argv) int i; DWORD exitCode; - if (argc<2) { - fprintf(stderr, "Usage: uncygdrive.exe /cygdrive/c/WINDOWS/notepad.exe /cygdrive/c/x/test.txt"); + if (argc<3 || argv[1][0] != '-' || (argv[1][1] != 'c' && argv[1][1] != 'm')) { + fprintf(stderr, "Usage: fixpath -c|m /cygdrive/c/WINDOWS/notepad.exe /cygdrive/c/x/test.txt"); exit(0); } - line = replace_cygdrive(strstr(GetCommandLine(), argv[1])); + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "fixpath input line >%s<\n", strstr(GetCommandLine(), argv[1])); + } + + if (argv[1][1] == 'c' && argv[1][2] == '\0') { + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "using cygwin mode\n"); + } + replace_cygdrive = replace_cygdrive_cygwin; + } else if (argv[1][1] == 'm') { + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "using msys mode, with path list: %s\n", &argv[1][2]); + } + setup_msys_path_list(argv[1]); + replace_cygdrive = replace_cygdrive_msys; + } else { + fprintf(stderr, "Unknown mode: %s\n", argv[1]); + exit(-1); + } + line = replace_cygdrive(strstr(GetCommandLine(), argv[2])); for (i=1; i%s<\n", line); + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "fixpath converted line >%s<\n", line); } ZeroMemory(&si,sizeof(si)); @@ -238,9 +318,9 @@ int main(int argc, char **argv) WaitForSingleObject(pi.hProcess,INFINITE); GetExitCodeProcess(pi.hProcess,&exitCode); - if (getenv("DEBUG_UNCYGDRIVE") != NULL) { + if (getenv("DEBUG_FIXPATH") != NULL) { for (i=0; i Date: Fri, 26 Oct 2012 16:40:57 -0700 Subject: [PATCH 118/241] 8001229: refactor javac so that ct.sym is just used for javac, not all clients of JavacFileManager Reviewed-by: mcimadamore --- .../com/sun/tools/javac/file/JavacFileManager.java | 13 ++++++++++--- .../com/sun/tools/javah/JavahFileManager.java | 8 ++------ .../classes/com/sun/tools/javah/JavahTask.java | 2 +- .../com/sun/tools/javap/JavapFileManager.java | 8 ++------ 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java index 87bbfbcf2c8..e49e9e0234b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java @@ -90,7 +90,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil EnumSet.of(JavaFileObject.Kind.SOURCE, JavaFileObject.Kind.CLASS); protected boolean mmappedIO; - protected boolean ignoreSymbolFile; + protected boolean symbolFileEnabled; protected enum SortFiles implements Comparator { FORWARD { @@ -142,7 +142,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil zipFileIndexCache = ZipFileIndexCache.getSharedInstance(); mmappedIO = options.isSet("mmappedIO"); - ignoreSymbolFile = options.isSet("ignore.symbol.file"); + symbolFileEnabled = !options.isSet("ignore.symbol.file"); String sf = options.get("sortFiles"); if (sf != null) { @@ -150,6 +150,13 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil } } + /** + * Set whether or not to use ct.sym as an alternate to rt.jar. + */ + public void setSymbolFileEnabled(boolean b) { + symbolFileEnabled = b; + } + @Override public boolean isDefaultBootClassPath() { return locations.isDefaultBootClassPath(); @@ -466,7 +473,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil */ private Archive openArchive(File zipFileName, boolean useOptimizedZip) throws IOException { File origZipFileName = zipFileName; - if (!ignoreSymbolFile && locations.isDefaultBootClassPathRtJar(zipFileName)) { + if (symbolFileEnabled && locations.isDefaultBootClassPathRtJar(zipFileName)) { File file = zipFileName.getParentFile().getParentFile(); // ${java.home} if (new File(file.getName()).equals(new File("jre"))) file = file.getParentFile(); diff --git a/langtools/src/share/classes/com/sun/tools/javah/JavahFileManager.java b/langtools/src/share/classes/com/sun/tools/javah/JavahFileManager.java index 72160c59992..e27eff2fdc9 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/JavahFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javah/JavahFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ import com.sun.tools.javac.util.Context; class JavahFileManager extends JavacFileManager { private JavahFileManager(Context context, Charset charset) { super(context, true, charset); - setIgnoreSymbolFile(true); + setSymbolFileEnabled(false); } static JavahFileManager create(final DiagnosticListener dl, PrintWriter log) { @@ -56,8 +56,4 @@ class JavahFileManager extends JavacFileManager { return new JavahFileManager(javac_context, null); } - - void setIgnoreSymbolFile(boolean b) { - ignoreSymbolFile = b; - } } diff --git a/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java b/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java index 16c3be898aa..6b8abf9d6d1 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java +++ b/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java @@ -500,7 +500,7 @@ public class JavahTask implements NativeHeaderTool.NativeHeaderTask { g.setForce(force); if (fileManager instanceof JavahFileManager) - ((JavahFileManager) fileManager).setIgnoreSymbolFile(true); + ((JavahFileManager) fileManager).setSymbolFileEnabled(false); JavaCompiler c = ToolProvider.getSystemJavaCompiler(); List opts = new ArrayList(); diff --git a/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java b/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java index 8fa75792dae..cf491bf83fa 100644 --- a/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ import com.sun.tools.javac.util.Context; public class JavapFileManager extends JavacFileManager { private JavapFileManager(Context context, Charset charset) { super(context, true, charset); - setIgnoreSymbolFile(true); + setSymbolFileEnabled(false); } public static JavapFileManager create(final DiagnosticListener dl, PrintWriter log) { @@ -56,8 +56,4 @@ public class JavapFileManager extends JavacFileManager { return new JavapFileManager(javac_context, null); } - - void setIgnoreSymbolFile(boolean b) { - ignoreSymbolFile = b; - } } From 7c509b7652c8e2eec2c171fc78925cb4cd763e0c Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Fri, 26 Oct 2012 17:17:33 -0700 Subject: [PATCH 119/241] 8001714: add missing tests for 7199925 Reviewed-by: darcy --- .../ClassReaderDefault.java | 46 +++++++++++++++++++ .../repeatingAnnotations/SeparateCompile.java | 30 ++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 langtools/test/tools/javac/annotations/repeatingAnnotations/ClassReaderDefault.java create mode 100644 langtools/test/tools/javac/annotations/repeatingAnnotations/SeparateCompile.java diff --git a/langtools/test/tools/javac/annotations/repeatingAnnotations/ClassReaderDefault.java b/langtools/test/tools/javac/annotations/repeatingAnnotations/ClassReaderDefault.java new file mode 100644 index 00000000000..18d9d7c6a41 --- /dev/null +++ b/langtools/test/tools/javac/annotations/repeatingAnnotations/ClassReaderDefault.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * + * @bug 7199925 + * + * @clean ClassReaderDefault SeparateCompile + * @compile ClassReaderDefault.java + * @compile SeparateCompile.java + */ +import java.lang.annotation.ContainedBy; +import java.lang.annotation.ContainerFor; + +public class ClassReaderDefault { +} + +@ContainerFor(Foo.class) +@interface FooContainer { + Foo[] value(); + int f() default 0; +} + +@ContainedBy(FooContainer.class) +@interface Foo {} diff --git a/langtools/test/tools/javac/annotations/repeatingAnnotations/SeparateCompile.java b/langtools/test/tools/javac/annotations/repeatingAnnotations/SeparateCompile.java new file mode 100644 index 00000000000..66c5d0e3acd --- /dev/null +++ b/langtools/test/tools/javac/annotations/repeatingAnnotations/SeparateCompile.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * part of test for bug: 7199925 + * see: ClassReaderDefault.java + */ +@Foo @Foo +public class SeparateCompile { +} From bde4b842d8bdb544996e275cf48595d60e4319c2 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Fri, 26 Oct 2012 18:40:13 -0700 Subject: [PATCH 120/241] 8001717: TypeTags cleanup breaks GenStubs Reviewed-by: jjh --- langtools/make/tools/genstubs/GenStubs.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/langtools/make/tools/genstubs/GenStubs.java b/langtools/make/tools/genstubs/GenStubs.java index ff7cbbbf7df..5ff9f35789b 100644 --- a/langtools/make/tools/genstubs/GenStubs.java +++ b/langtools/make/tools/genstubs/GenStubs.java @@ -35,7 +35,7 @@ import com.sun.source.tree.CompilationUnitTree; import com.sun.source.util.JavacTask; import com.sun.tools.javac.api.JavacTool; import com.sun.tools.javac.code.Flags; -import com.sun.tools.javac.code.TypeTags; +import com.sun.tools.javac.code.TypeTag; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.tree.JCTree.JCFieldAccess; @@ -244,23 +244,23 @@ public class GenStubs { else { String t = tree.vartype.toString(); if (t.equals("boolean")) - tree.init = new JCLiteral(TypeTags.BOOLEAN, 0) { }; + tree.init = new JCLiteral(TypeTag.BOOLEAN, 0) { }; else if (t.equals("byte")) - tree.init = new JCLiteral(TypeTags.BYTE, 0) { }; + tree.init = new JCLiteral(TypeTag.BYTE, 0) { }; else if (t.equals("char")) - tree.init = new JCLiteral(TypeTags.CHAR, 0) { }; + tree.init = new JCLiteral(TypeTag.CHAR, 0) { }; else if (t.equals("double")) - tree.init = new JCLiteral(TypeTags.DOUBLE, 0.d) { }; + tree.init = new JCLiteral(TypeTag.DOUBLE, 0.d) { }; else if (t.equals("float")) - tree.init = new JCLiteral(TypeTags.FLOAT, 0.f) { }; + tree.init = new JCLiteral(TypeTag.FLOAT, 0.f) { }; else if (t.equals("int")) - tree.init = new JCLiteral(TypeTags.INT, 0) { }; + tree.init = new JCLiteral(TypeTag.INT, 0) { }; else if (t.equals("long")) - tree.init = new JCLiteral(TypeTags.LONG, 0) { }; + tree.init = new JCLiteral(TypeTag.LONG, 0) { }; else if (t.equals("short")) - tree.init = new JCLiteral(TypeTags.SHORT, 0) { }; + tree.init = new JCLiteral(TypeTag.SHORT, 0) { }; else - tree.init = new JCLiteral(TypeTags.BOT, null) { }; + tree.init = new JCLiteral(TypeTag.BOT, null) { }; } } result = tree; From a5b6cdf1aed6f272ddc1922b383bbc78be3bd931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20=C3=96hrstr=C3=B6m?= Date: Mon, 29 Oct 2012 14:10:49 +0100 Subject: [PATCH 121/241] 8000970: break out auxiliary classes that will prevent multi-core compilation of the JDK Reviewed-by: alanb, wetmore --- .../corba/se/impl/util/IdentityHashtable.java | 10 ----- .../se/impl/util/IdentityHashtableEntry.java | 43 +++++++++++++++++++ 2 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtableEntry.java diff --git a/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtable.java b/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtable.java index 1e65abe073b..c4ff3971fa4 100644 --- a/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtable.java +++ b/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtable.java @@ -42,16 +42,6 @@ import java.util.NoSuchElementException; * instead, it uses the System.identityHashcode() method and pointer comparison. * In addition, all synchronization has been removed. */ -/** - * IdentityHashtable collision list. - */ -class IdentityHashtableEntry { - int hash; - Object key; - Object value; - IdentityHashtableEntry next; -} - public final class IdentityHashtable extends Dictionary { /** * The hash table data. diff --git a/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtableEntry.java b/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtableEntry.java new file mode 100644 index 00000000000..cb4198de96e --- /dev/null +++ b/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtableEntry.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * Licensed Materials - Property of IBM + * RMI-IIOP v1.0 + * Copyright IBM Corp. 1998 1999 All Rights Reserved + * + */ + +package com.sun.corba.se.impl.util; + +/** + * IdentityHashtable collision list. + */ +class IdentityHashtableEntry { + int hash; + Object key; + Object value; + IdentityHashtableEntry next; +} From 7c26f7db5427969a8b49cc14f7b979b85e9621eb Mon Sep 17 00:00:00 2001 From: Robert Field Date: Mon, 29 Oct 2012 10:39:49 -0700 Subject: [PATCH 122/241] 8000694: Add generation of lambda implementation code: invokedynamic call, lambda method, adaptor methods Add lambda implementation code with calling/supporting code elsewhere in the compiler Reviewed-by: mcimadamore, jjg --- .../com/sun/tools/javac/code/Symtab.java | 5 + .../sun/tools/javac/comp/LambdaToMethod.java | 1398 +++++++++++++++++ .../com/sun/tools/javac/comp/TransTypes.java | 67 +- .../sun/tools/javac/main/JavaCompiler.java | 18 +- .../com/sun/tools/javac/util/Names.java | 8 + 5 files changed, 1481 insertions(+), 15 deletions(-) create mode 100644 langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java index dce902ce28c..3002a9dfc2d 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java @@ -127,6 +127,7 @@ public class Symtab { public final Type cloneableType; public final Type serializableType; public final Type methodHandleType; + public final Type methodHandleLookupType; public final Type methodTypeType; public final Type nativeHeaderType; public final Type throwableType; @@ -158,6 +159,7 @@ public class Symtab { public final Type systemType; public final Type autoCloseableType; public final Type trustMeType; + public final Type lambdaMetafactory; public final Type containedByType; public final Type containerForType; public final Type documentedType; @@ -456,6 +458,7 @@ public class Symtab { throwableType = enterClass("java.lang.Throwable"); serializableType = enterClass("java.io.Serializable"); methodHandleType = enterClass("java.lang.invoke.MethodHandle"); + methodHandleLookupType = enterClass("java.lang.invoke.MethodHandles$Lookup"); methodTypeType = enterClass("java.lang.invoke.MethodType"); errorType = enterClass("java.lang.Error"); illegalArgumentExceptionType = enterClass("java.lang.IllegalArgumentException"); @@ -503,10 +506,12 @@ public class Symtab { autoCloseableType.tsym); trustMeType = enterClass("java.lang.SafeVarargs"); nativeHeaderType = enterClass("javax.tools.annotation.GenerateNativeHeader"); + lambdaMetafactory = enterClass("java.lang.invoke.LambdaMetafactory"); synthesizeEmptyInterfaceIfMissing(autoCloseableType); synthesizeEmptyInterfaceIfMissing(cloneableType); synthesizeEmptyInterfaceIfMissing(serializableType); + synthesizeEmptyInterfaceIfMissing(lambdaMetafactory); synthesizeBoxTypeIfMissing(doubleType); synthesizeBoxTypeIfMissing(floatType); synthesizeBoxTypeIfMissing(voidType); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java new file mode 100644 index 00000000000..faf421af560 --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java @@ -0,0 +1,1398 @@ +/* + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.javac.comp; + +import com.sun.tools.javac.tree.*; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.JCTree.*; +import com.sun.tools.javac.tree.JCTree.JCMemberReference.ReferenceKind; +import com.sun.tools.javac.tree.TreeMaker; +import com.sun.tools.javac.tree.TreeScanner; +import com.sun.tools.javac.tree.TreeTranslator; +import com.sun.tools.javac.code.Flags; +import com.sun.tools.javac.code.Kinds; +import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Symbol.ClassSymbol; +import com.sun.tools.javac.code.Symbol.DynamicMethodSymbol; +import com.sun.tools.javac.code.Symbol.MethodSymbol; +import com.sun.tools.javac.code.Symbol.VarSymbol; +import com.sun.tools.javac.code.Symtab; +import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.code.Type.ClassType; +import com.sun.tools.javac.code.Type.MethodType; +import com.sun.tools.javac.code.Types; +import com.sun.tools.javac.comp.LambdaToMethod.LambdaAnalyzer.*; +import com.sun.tools.javac.jvm.*; +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.List; +import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; +import com.sun.source.tree.MemberReferenceTree.ReferenceMode; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import static com.sun.tools.javac.comp.LambdaToMethod.LambdaSymbolKind.*; +import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.code.Kinds.*; +import static com.sun.tools.javac.code.TypeTag.BOT; +import static com.sun.tools.javac.code.TypeTag.NONE; +import static com.sun.tools.javac.code.TypeTag.VOID; +import static com.sun.tools.javac.tree.JCTree.Tag.*; + +/** + * This pass desugars lambda expressions into static methods + * + *

    This is NOT part of any supported API. + * 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 LambdaToMethod extends TreeTranslator { + + private Names names; + private Symtab syms; + private Resolve rs; + private TreeMaker make; + private Types types; + private TransTypes transTypes; + private Env attrEnv; + + /** the analyzer scanner */ + private LambdaAnalyzer analyzer; + + /** map from lambda trees to translation contexts */ + private Map> contextMap; + + /** current translation context (visitor argument) */ + private TranslationContext context; + + /** list of translated methods + **/ + private ListBuffer translatedMethodList; + + // + private static final Context.Key unlambdaKey = + new Context.Key(); + + public static LambdaToMethod instance(Context context) { + LambdaToMethod instance = context.get(unlambdaKey); + if (instance == null) { + instance = new LambdaToMethod(context); + } + return instance; + } + + private LambdaToMethod(Context context) { + names = Names.instance(context); + syms = Symtab.instance(context); + rs = Resolve.instance(context); + make = TreeMaker.instance(context); + types = Types.instance(context); + transTypes = TransTypes.instance(context); + this.analyzer = makeAnalyzer(); + } + + private LambdaAnalyzer makeAnalyzer() { + return new LambdaAnalyzer(); + } + // + + // + @Override + public T translate(T tree) { + TranslationContext newContext = contextMap.get(tree); + return translate(tree, newContext != null ? newContext : context); + } + + public T translate(T tree, TranslationContext newContext) { + TranslationContext prevContext = context; + try { + context = newContext; + return super.translate(tree); + } + finally { + context = prevContext; + } + } + + public List translate(List trees, TranslationContext newContext) { + ListBuffer buf = ListBuffer.lb(); + for (T tree : trees) { + buf.append(translate(tree, newContext)); + } + return buf.toList(); + } + + public JCTree translateTopLevelClass(Env env, JCTree cdef, TreeMaker make) { + this.make = make; + this.attrEnv = env; + this.context = null; + this.contextMap = new HashMap>(); + return translate(cdef); + } + // + + // + /** + * Visit a class. + * Maintain the translatedMethodList across nested classes. + * Append the translatedMethodList to the class after it is translated. + * @param tree + */ + @Override + public void visitClassDef(JCClassDecl tree) { + if (tree.sym.owner.kind == PCK) { + //analyze class + analyzer.analyzeClass(tree); + } + ListBuffer prevTranslated = translatedMethodList; + try { + translatedMethodList = ListBuffer.lb(); + super.visitClassDef(tree); + //add all translated instance methods here + tree.defs = tree.defs.appendList(translatedMethodList.toList()); + for (JCTree lambda : translatedMethodList) { + tree.sym.members().enter(((JCMethodDecl)lambda).sym); + } + result = tree; + } finally { + translatedMethodList = prevTranslated; + } + } + + /** + * Translate a lambda into a method to be inserted into the class. + * Then replace the lambda site with an invokedynamic call of to lambda + * meta-factory, which will use the lambda method. + * @param tree + */ + @Override + public void visitLambda(JCLambda tree) { + LambdaTranslationContext localContext = (LambdaTranslationContext)context; + MethodSymbol sym = (MethodSymbol)localContext.translatedSym; + MethodType lambdaType = (MethodType) sym.type; + + //create the method declaration hoisting the lambda body + JCMethodDecl lambdaDecl = make.MethodDef(make.Modifiers(sym.flags_field), + sym.name, + make.QualIdent(lambdaType.getReturnType().tsym), + List.nil(), + localContext.syntheticParams, + lambdaType.getThrownTypes() == null ? + List.nil() : + make.Types(lambdaType.getThrownTypes()), + null, + null); + lambdaDecl.sym = sym; + lambdaDecl.type = lambdaType; + + //translate lambda body + //As the lambda body is translated, all references to lambda locals, + //captured variables, enclosing members are adjusted accordingly + //to refer to the static method parameters (rather than i.e. acessing to + //captured members directly). + lambdaDecl.body = translate(makeLambdaBody(tree, lambdaDecl)); + + //Add the method to the list of methods to be added to this class. + translatedMethodList = translatedMethodList.prepend(lambdaDecl); + + //now that we have generated a method for the lambda expression, + //we can translate the lambda into a method reference pointing to the newly + //created method. + // + //Note that we need to adjust the method handle so that it will match the + //signature of the SAM descriptor - this means that the method reference + //should be added the following synthetic arguments: + // + // * the "this" argument if it is an instance method + // * enclosing locals captured by the lambda expression + + ListBuffer syntheticInits = ListBuffer.lb(); + + if (!sym.isStatic()) { + syntheticInits.append(makeThis( + sym.owner.asType(), + localContext.owner.enclClass())); + } + + //add captured locals + for (Symbol fv : localContext.getSymbolMap(CAPTURED_VAR).keySet()) { + if (fv != localContext.self) { + JCTree captured_local = make.Ident(fv).setType(fv.type); + syntheticInits.append((JCExpression) captured_local); + } + } + + //then, determine the arguments to the indy call + List indy_args = translate(syntheticInits.toList(), localContext.prev); + + //build a sam instance using an indy call to the meta-factory + int refKind = referenceKind(sym); + + //convert to an invokedynamic call + result = makeMetaFactoryIndyCall(tree, tree.targetType, refKind, sym, indy_args); + } + + private JCIdent makeThis(Type type, Symbol owner) { + VarSymbol _this = new VarSymbol(PARAMETER | FINAL | SYNTHETIC, + names._this, + type, + owner); + return make.Ident(_this); + } + + /** + * Translate a method reference into an invokedynamic call to the + * meta-factory. + * @param tree + */ + @Override + public void visitReference(JCMemberReference tree) { + ReferenceTranslationContext localContext = (ReferenceTranslationContext)context; + + //first determine the method symbol to be used to generate the sam instance + //this is either the method reference symbol, or the bridged reference symbol + Symbol refSym = localContext.needsBridge() ? + localContext.bridgeSym : + tree.sym; + + //build the bridge method, if needed + if (localContext.needsBridge()) { + bridgeMemberReference(tree, localContext); + } + + //the qualifying expression is treated as a special captured arg + JCExpression init; + switch(tree.kind) { + + case IMPLICIT_INNER: /** Inner # new */ + case SUPER: /** super # instMethod */ + init = makeThis( + localContext.owner.owner.asType(), + localContext.owner); + break; + + case BOUND: /** Expr # instMethod */ + init = tree.getQualifierExpression(); + break; + + case STATIC_EVAL: /** Expr # staticMethod */ + case UNBOUND: /** Type # instMethod */ + case STATIC: /** Type # staticMethod */ + case TOPLEVEL: /** Top level # new */ + init = null; + break; + + default: + throw new InternalError("Should not have an invalid kind"); + } + + List indy_args = init==null? List.nil() : translate(List.of(init), localContext.prev); + + + //build a sam instance using an indy call to the meta-factory + result = makeMetaFactoryIndyCall(tree, tree.targetType, localContext.referenceKind(), refSym, indy_args); + + //if we had a static reference with non-static qualifier, add a let + //expression to force the evaluation of the qualifier expr + if (tree.hasKind(ReferenceKind.STATIC_EVAL)) { + VarSymbol rec = new VarSymbol(0, names.fromString("rec$"), tree.getQualifierExpression().type, localContext.owner); + JCVariableDecl recDef = make.VarDef(rec, tree.getQualifierExpression()); + result = make.LetExpr(recDef, result).setType(tree.type); + } + } + + /** + * Translate identifiers within a lambda to the mapped identifier + * @param tree + */ + @Override + public void visitIdent(JCIdent tree) { + if (context == null || !analyzer.lambdaIdentSymbolFilter(tree.sym)) { + super.visitIdent(tree); + } else { + LambdaTranslationContext lambdaContext = (LambdaTranslationContext) context; + if (lambdaContext.getSymbolMap(PARAM).containsKey(tree.sym)) { + Symbol translatedSym = lambdaContext.getSymbolMap(PARAM).get(tree.sym); + result = make.Ident(translatedSym).setType(tree.type); + } else if (lambdaContext.getSymbolMap(LOCAL_VAR).containsKey(tree.sym)) { + Symbol translatedSym = lambdaContext.getSymbolMap(LOCAL_VAR).get(tree.sym); + result = make.Ident(translatedSym).setType(tree.type); + } else if (lambdaContext.getSymbolMap(CAPTURED_VAR).containsKey(tree.sym)) { + Symbol translatedSym = lambdaContext.getSymbolMap(CAPTURED_VAR).get(tree.sym); + result = make.Ident(translatedSym).setType(tree.type); + } else { + if (tree.sym.owner.kind == Kinds.TYP) { + for (Map.Entry encl_entry : lambdaContext.getSymbolMap(CAPTURED_THIS).entrySet()) { + if (tree.sym.isMemberOf((ClassSymbol) encl_entry.getKey(), types)) { + JCExpression enclRef = make.Ident(encl_entry.getValue()); + result = tree.sym.name == names._this + ? enclRef.setType(tree.type) + : make.Select(enclRef, tree.sym).setType(tree.type); + result = tree; + return; + } + } + } + //access to untranslated symbols (i.e. compile-time constants, + //members defined inside the lambda body, etc.) ) + super.visitIdent(tree); + } + } + } + + @Override + public void visitVarDef(JCVariableDecl tree) { + LambdaTranslationContext lambdaContext = (LambdaTranslationContext)context; + if (context != null && lambdaContext.getSymbolMap(LOCAL_VAR).containsKey(tree.sym)) { + JCExpression init = translate(tree.init); + result = make.VarDef((VarSymbol)lambdaContext.getSymbolMap(LOCAL_VAR).get(tree.sym), init); + } else { + super.visitVarDef(tree); + } + } + + // + + // + + private JCBlock makeLambdaBody(JCLambda tree, JCMethodDecl lambdaMethodDecl) { + return tree.getBodyKind() == JCLambda.BodyKind.EXPRESSION ? + makeLambdaExpressionBody((JCExpression)tree.body, lambdaMethodDecl) : + makeLambdaStatementBody((JCBlock)tree.body, lambdaMethodDecl, tree.canCompleteNormally); + } + + private JCBlock makeLambdaExpressionBody(JCExpression expr, JCMethodDecl lambdaMethodDecl) { + Type restype = lambdaMethodDecl.type.getReturnType(); + boolean isLambda_void = expr.type.hasTag(VOID); + boolean isTarget_void = restype.hasTag(VOID); + boolean isTarget_Void = types.isSameType(restype, types.boxedClass(syms.voidType).type); + if (isTarget_void) { + //target is void: + // BODY; + JCStatement stat = make.Exec(expr); + return make.Block(0, List.of(stat)); + } else if (isLambda_void && isTarget_Void) { + //void to Void conversion: + // BODY; return null; + ListBuffer stats = ListBuffer.lb(); + stats.append(make.Exec(expr)); + stats.append(make.Return(make.Literal(BOT, null).setType(syms.botType))); + return make.Block(0, stats.toList()); + } else { + //non-void to non-void conversion: + // return (TYPE)BODY; + JCExpression retExpr = transTypes.coerce(attrEnv, expr, restype); + return make.Block(0, List.of(make.Return(retExpr))); + } + } + + private JCBlock makeLambdaStatementBody(JCBlock block, final JCMethodDecl lambdaMethodDecl, boolean completeNormally) { + final Type restype = lambdaMethodDecl.type.getReturnType(); + final boolean isTarget_void = restype.hasTag(VOID); + boolean isTarget_Void = types.isSameType(restype, types.boxedClass(syms.voidType).type); + + class LambdaBodyTranslator extends TreeTranslator { + + @Override + public void visitClassDef(JCClassDecl tree) { + //do NOT recurse on any inner classes + result = tree; + } + + @Override + public void visitLambda(JCLambda tree) { + //do NOT recurse on any nested lambdas + result = tree; + } + + @Override + public void visitReturn(JCReturn tree) { + boolean isLambda_void = tree.expr == null; + if (isTarget_void && !isLambda_void) { + //Void to void conversion: + // { TYPE $loc = RET-EXPR; return; } + VarSymbol loc = makeSyntheticVar(0, names.fromString("$loc"), tree.expr.type, lambdaMethodDecl.sym); + JCVariableDecl varDef = make.VarDef(loc, tree.expr); + result = make.Block(0, List.of(varDef, make.Return(null))); + } else if (!isTarget_void || !isLambda_void) { + //non-void to non-void conversion: + // return (TYPE)RET-EXPR; + tree.expr = transTypes.coerce(attrEnv, tree.expr, restype); + result = tree; + } else { + result = tree; + } + + } + } + + JCBlock trans_block = new LambdaBodyTranslator().translate(block); + if (completeNormally && isTarget_Void) { + //there's no return statement and the lambda (possibly inferred) + //return type is java.lang.Void; emit a synthetic return statement + trans_block.stats = trans_block.stats.append(make.Return(make.Literal(BOT, null).setType(syms.botType))); + } + return trans_block; + } + + /** + * Create new synthetic method with given flags, name, type, owner + */ + private MethodSymbol makeSyntheticMethod(long flags, Name name, Type type, Symbol owner) { + return new MethodSymbol(flags | SYNTHETIC, name, type, owner); + } + + /** + * Create new synthetic variable with given flags, name, type, owner + */ + private VarSymbol makeSyntheticVar(long flags, String name, Type type, Symbol owner) { + return makeSyntheticVar(flags, names.fromString(name), type, owner); + } + + /** + * Create new synthetic variable with given flags, name, type, owner + */ + private VarSymbol makeSyntheticVar(long flags, Name name, Type type, Symbol owner) { + return new VarSymbol(flags | SYNTHETIC, name, type, owner); + } + + /** + * Set varargsElement field on a given tree (must be either a new class tree + * or a method call tree) + */ + private void setVarargsIfNeeded(JCTree tree, Type varargsElement) { + if (varargsElement != null) { + switch (tree.getTag()) { + case APPLY: ((JCMethodInvocation)tree).varargsElement = varargsElement; break; + case NEWCLASS: ((JCNewClass)tree).varargsElement = varargsElement; break; + default: throw new AssertionError(); + } + } + } + + /** + * Convert method/constructor arguments by inserting appropriate cast + * as required by type-erasure - this is needed when bridging a lambda/method + * reference, as the bridged signature might require downcast to be compatible + * with the generated signature. + */ + private List convertArgs(Symbol meth, List args, Type varargsElement) { + Assert.check(meth.kind == Kinds.MTH); + List formals = types.erasure(meth.type).getParameterTypes(); + if (varargsElement != null) { + Assert.check((meth.flags() & VARARGS) != 0); + } + return transTypes.translateArgs(args, formals, varargsElement, attrEnv); + } + + // + + private MethodSymbol makeSamDescriptor(Type targetType) { + return (MethodSymbol)types.findDescriptorSymbol(targetType.tsym); + } + + private Type makeFunctionalDescriptorType(Type targetType, MethodSymbol samDescriptor, boolean erased) { + Type descType = types.memberType(targetType, samDescriptor); + return erased ? types.erasure(descType) : descType; + } + + private Type makeFunctionalDescriptorType(Type targetType, boolean erased) { + return makeFunctionalDescriptorType(targetType, makeSamDescriptor(targetType), erased); + } + + /** + * Generate an adapter method "bridge" for a method reference which cannot + * be used directly. + */ + private class MemberReferenceBridger { + + private final JCMemberReference tree; + private final ReferenceTranslationContext localContext; + private final ListBuffer args = ListBuffer.lb(); + private final ListBuffer params = ListBuffer.lb(); + + MemberReferenceBridger(JCMemberReference tree, ReferenceTranslationContext localContext) { + this.tree = tree; + this.localContext = localContext; + } + + /** + * Generate the bridge + */ + JCMethodDecl bridge() { + int prevPos = make.pos; + try { + make.at(tree); + Type samDesc = localContext.bridgedRefSig(); + List samPTypes = samDesc.getParameterTypes(); + + //an extra argument is prepended to the signature of the bridge in case + //the member reference is an instance method reference (in which case + //the receiver expression is passed to the bridge itself). + Type recType = null; + switch (tree.kind) { + case IMPLICIT_INNER: + recType = tree.sym.owner.type.getEnclosingType(); + break; + case BOUND: + recType = tree.getQualifierExpression().type; + break; + case UNBOUND: + recType = samPTypes.head; + samPTypes = samPTypes.tail; + break; + } + + //generate the parameter list for the bridged member reference - the + //bridge signature will match the signature of the target sam descriptor + + VarSymbol rcvr = (recType == null) + ? null + : addParameter("rec$", recType, false); + + List refPTypes = tree.sym.type.getParameterTypes(); + int refSize = refPTypes.size(); + int samSize = samPTypes.size(); + int last = localContext.needsVarArgsConversion() ? refSize - 1 : refSize; // Last parameter to copy from referenced method + + List l = refPTypes; + // Use parameter types of the referenced method, excluding final var args + for (int i = 0; l.nonEmpty() && i < last; ++i) { + addParameter("x$" + i, l.head, true); + l = l.tail; + } + // Flatten out the var args + for (int i = last; i < samSize; ++i) { + addParameter("xva$" + i, tree.varargsElement, true); + } + + //generate the bridge method declaration + JCMethodDecl bridgeDecl = make.MethodDef(make.Modifiers(localContext.bridgeSym.flags()), + localContext.bridgeSym.name, + make.QualIdent(samDesc.getReturnType().tsym), + List.nil(), + params.toList(), + tree.sym.type.getThrownTypes() == null + ? List.nil() + : make.Types(tree.sym.type.getThrownTypes()), + null, + null); + bridgeDecl.sym = (MethodSymbol) localContext.bridgeSym; + bridgeDecl.type = localContext.bridgeSym.type = types.createMethodTypeWithParameters(samDesc, TreeInfo.types(params.toList())); + + //bridge method body generation - this can be either a method call or a + //new instance creation expression, depending on the member reference kind + JCExpression bridgeExpr = (tree.getMode() == ReferenceMode.INVOKE) + ? bridgeExpressionInvoke(rcvr) + : bridgeExpressionNew(); + + //the body is either a return expression containing a method call, + //or the method call itself, depending on whether the return type of + //the bridge is non-void/void. + bridgeDecl.body = makeLambdaExpressionBody(bridgeExpr, bridgeDecl); + + return bridgeDecl; + } finally { + make.at(prevPos); + } + } + + /** + * determine the receiver of the bridged method call - the receiver can + * be either the synthetic receiver parameter or a type qualifier; the + * original qualifier expression is never used here, as it might refer + * to symbols not available in the static context of the bridge + */ + private JCExpression bridgeExpressionInvoke(VarSymbol rcvr) { + JCExpression qualifier = + tree.sym.isStatic() ? + make.Type(tree.sym.owner.type) : + (rcvr != null) ? + make.Ident(rcvr) : + tree.getQualifierExpression(); + + //create the qualifier expression + JCFieldAccess select = make.Select(qualifier, tree.sym.name); + select.sym = tree.sym; + select.type = tree.sym.erasure(types); + + //create the method call expression + JCExpression apply = make.Apply(List.nil(), select, + convertArgs(tree.sym, args.toList(), tree.varargsElement)).setType(tree.sym.erasure(types).getReturnType()); + + apply = transTypes.coerce(apply, localContext.generatedRefSig().getReturnType()); + setVarargsIfNeeded(apply, tree.varargsElement); + return apply; + } + + /** + * the enclosing expression is either 'null' (no enclosing type) or set + * to the first bridge synthetic parameter + */ + private JCExpression bridgeExpressionNew() { + JCExpression encl = null; + switch (tree.kind) { + case UNBOUND: + case IMPLICIT_INNER: + encl = make.Ident(params.first()); + } + + //create the instance creation expression + JCNewClass newClass = make.NewClass(encl, + List.nil(), + make.Type(tree.getQualifierExpression().type), + convertArgs(tree.sym, args.toList(), tree.varargsElement), + null); + newClass.constructor = tree.sym; + newClass.constructorType = tree.sym.erasure(types); + newClass.type = tree.getQualifierExpression().type; + setVarargsIfNeeded(newClass, tree.varargsElement); + return newClass; + } + + private VarSymbol addParameter(String name, Type p, boolean genArg) { + VarSymbol vsym = new VarSymbol(0, names.fromString(name), p, localContext.bridgeSym); + params.append(make.VarDef(vsym, null)); + if (genArg) { + args.append(make.Ident(vsym)); + } + return vsym; + } + } + + /** + * Bridges a member reference - this is needed when: + * * Var args in the referenced method need to be flattened away + * * super is used + */ + private void bridgeMemberReference(JCMemberReference tree, ReferenceTranslationContext localContext) { + JCMethodDecl bridgeDecl = (new MemberReferenceBridger(tree, localContext).bridge()); + translatedMethodList = translatedMethodList.prepend(bridgeDecl); + } + + /** + * Generate an indy method call to the meta factory + */ + private JCExpression makeMetaFactoryIndyCall(JCExpression tree, Type targetType, int refKind, Symbol refSym, List indy_args) { + //determine the static bsm args + Type mtype = makeFunctionalDescriptorType(targetType, true); + List staticArgs = List.of( + new Pool.MethodHandle(ClassFile.REF_invokeInterface, types.findDescriptorSymbol(targetType.tsym)), + new Pool.MethodHandle(refKind, refSym), + new MethodType(mtype.getParameterTypes(), + mtype.getReturnType(), + mtype.getThrownTypes(), + syms.methodClass)); + + //computed indy arg types + ListBuffer indy_args_types = ListBuffer.lb(); + for (JCExpression arg : indy_args) { + indy_args_types.append(arg.type); + } + + //finally, compute the type of the indy call + MethodType indyType = new MethodType(indy_args_types.toList(), + tree.type, + List.nil(), + syms.methodClass); + + return makeIndyCall(tree, syms.lambdaMetafactory, names.metaFactory, staticArgs, indyType, indy_args); + } + + /** + * Generate an indy method call with given name, type and static bootstrap + * arguments types + */ + private JCExpression makeIndyCall(DiagnosticPosition pos, Type site, Name bsmName, List staticArgs, MethodType indyType, List indyArgs) { + int prevPos = make.pos; + try { + make.at(pos); + List bsm_staticArgs = List.of(syms.methodHandleLookupType, + syms.stringType, + syms.methodTypeType).appendList(bsmStaticArgToTypes(staticArgs)); + + Symbol bsm = rs.resolveInternalMethod(pos, attrEnv, site, + bsmName, bsm_staticArgs, List.nil()); + + DynamicMethodSymbol dynSym = + new DynamicMethodSymbol(names.lambda, + syms.noSymbol, + bsm.isStatic() ? ClassFile.REF_invokeStatic : ClassFile.REF_invokeVirtual, + (MethodSymbol)bsm, + indyType, + staticArgs.toArray()); + + JCFieldAccess qualifier = make.Select(make.QualIdent(site.tsym), bsmName); + qualifier.sym = dynSym; + qualifier.type = indyType.getReturnType(); + + JCMethodInvocation proxyCall = make.Apply(List.nil(), qualifier, indyArgs); + proxyCall.type = indyType.getReturnType(); + return proxyCall; + } finally { + make.at(prevPos); + } + } + //where + private List bsmStaticArgToTypes(List args) { + ListBuffer argtypes = ListBuffer.lb(); + for (Object arg : args) { + argtypes.append(bsmStaticArgToType(arg)); + } + return argtypes.toList(); + } + + private Type bsmStaticArgToType(Object arg) { + Assert.checkNonNull(arg); + if (arg instanceof ClassSymbol) { + return syms.classType; + } else if (arg instanceof Integer) { + return syms.intType; + } else if (arg instanceof Long) { + return syms.longType; + } else if (arg instanceof Float) { + return syms.floatType; + } else if (arg instanceof Double) { + return syms.doubleType; + } else if (arg instanceof String) { + return syms.stringType; + } else if (arg instanceof Pool.MethodHandle) { + return syms.methodHandleType; + } else if (arg instanceof MethodType) { + return syms.methodTypeType; + } else { + Assert.error("bad static arg " + arg.getClass()); + return null; + } + } + + /** + * Get the opcode associated with this method reference + */ + private int referenceKind(Symbol refSym) { + if (refSym.isConstructor()) { + return ClassFile.REF_newInvokeSpecial; + } else { + if (refSym.isStatic()) { + return ClassFile.REF_invokeStatic; + } else if (refSym.enclClass().isInterface()) { + return ClassFile.REF_invokeInterface; + } else { + return ClassFile.REF_invokeVirtual; + } + } + } + // + + // \ + /** + * This visitor collects information about translation of a lambda expression. + * More specifically, it keeps track of the enclosing contexts and captured locals + * accessed by the lambda being translated (as well as other useful info). + */ + class LambdaAnalyzer extends TreeScanner { + + /** the frame stack - used to reconstruct translation info about enclosing scopes */ + private List frameStack; + + /** + * keep the count of lambda expression (used to generate unambiguous + * names) + */ + private int lambdaCount = 0; + + private void analyzeClass(JCClassDecl tree) { + frameStack = List.nil(); + scan(tree); + } + + @Override + public void visitBlock(JCBlock tree) { + List prevStack = frameStack; + try { + if (frameStack.nonEmpty() && frameStack.head.tree.hasTag(CLASSDEF)) { + frameStack = frameStack.prepend(new Frame(tree)); + } + super.visitBlock(tree); + } + finally { + frameStack = prevStack; + } + } + + @Override + public void visitClassDef(JCClassDecl tree) { + List prevStack = frameStack; + try { + if (frameStack.nonEmpty() && enclosingLambda() != null) { + tree.sym.owner = owner(); + LambdaTranslationContext lambdaContext = (LambdaTranslationContext)contextMap.get(enclosingLambda()); + Type encl = lambdaContext.enclosingType(); + if (encl.hasTag(NONE)) { + //if the translated lambda body occurs in a static context, + //any class declaration within it must be made static + tree.sym.flags_field |= STATIC; + ((ClassType)tree.sym.type).setEnclosingType(Type.noType); + } else { + //if the translated lambda body is in an instance context + //the enclosing type of any class declaration within it + //must be updated to point to the new enclosing type (if any) + ((ClassType)tree.sym.type).setEnclosingType(encl); + } + } + frameStack = frameStack.prepend(new Frame(tree)); + super.visitClassDef(tree); + } + finally { + frameStack = prevStack; + } + if (frameStack.nonEmpty() && enclosingLambda() != null) { + // Any class defined within a lambda is an implicit 'this' reference + // because its constructor will reference the enclosing class + ((LambdaTranslationContext) context()).addSymbol(tree.sym.type.getEnclosingType().tsym, CAPTURED_THIS); + } + } + + @Override + public void visitIdent(JCIdent tree) { + if (context() == null || !lambdaIdentSymbolFilter(tree.sym)) { + super.visitIdent(tree); + } else { + if (tree.sym.kind == VAR && + tree.sym.owner.kind == MTH && + tree.type.constValue() == null) { + TranslationContext localContext = context(); + while (localContext != null) { + if (localContext.tree.getTag() == LAMBDA) { + JCTree block = capturedDecl(localContext.depth, tree.sym); + if (block == null) break; + ((LambdaTranslationContext)localContext).addSymbol(tree.sym, CAPTURED_VAR); + } + localContext = localContext.prev; + } + } else if (tree.sym.owner.kind == TYP) { + TranslationContext localContext = context(); + while (localContext != null) { + if (localContext.tree.hasTag(LAMBDA)) { + JCTree block = capturedDecl(localContext.depth, tree.sym); + if (block == null) break; + switch (block.getTag()) { + case CLASSDEF: + JCClassDecl cdecl = (JCClassDecl)block; + ((LambdaTranslationContext)localContext).addSymbol(cdecl.sym, CAPTURED_THIS); + break; + default: + Assert.error("bad block kind"); + } + } + localContext = localContext.prev; + } + } + } + } + + @Override + public void visitLambda(JCLambda tree) { + List prevStack = frameStack; + try { + LambdaTranslationContext context = (LambdaTranslationContext)makeLambdaContext(tree); + frameStack = frameStack.prepend(new Frame(tree)); + for (JCVariableDecl param : tree.params) { + context.addSymbol(param.sym, PARAM); + frameStack.head.addLocal(param.sym); + } + contextMap.put(tree, context); + scan(tree.body); + context.complete(); + } + finally { + frameStack = prevStack; + } + } + + @Override + public void visitMethodDef(JCMethodDecl tree) { + List prevStack = frameStack; + try { + frameStack = frameStack.prepend(new Frame(tree)); + super.visitMethodDef(tree); + } + finally { + frameStack = prevStack; + } + } + + @Override + public void visitNewClass(JCNewClass tree) { + if (lambdaNewClassFilter(context(), tree)) { + ((LambdaTranslationContext) context()).addSymbol(tree.type.getEnclosingType().tsym, CAPTURED_THIS); + } + super.visitNewClass(tree); + } + + @Override + public void visitReference(JCMemberReference tree) { + scan(tree.getQualifierExpression()); + contextMap.put(tree, makeReferenceContext(tree)); + } + + @Override + public void visitSelect(JCFieldAccess tree) { + if (context() != null && lambdaSelectSymbolFilter(tree.sym)) { + TranslationContext localContext = context(); + while (localContext != null) { + if (localContext.tree.hasTag(LAMBDA)) { + JCClassDecl clazz = (JCClassDecl)capturedDecl(localContext.depth, tree.sym); + if (clazz == null) break; + ((LambdaTranslationContext)localContext).addSymbol(clazz.sym, CAPTURED_THIS); + } + localContext = localContext.prev; + } + scan(tree.selected); + } else { + super.visitSelect(tree); + } + } + + @Override + public void visitVarDef(JCVariableDecl tree) { + if (frameStack.head.tree.hasTag(LAMBDA)) { + ((LambdaTranslationContext)context()).addSymbol(tree.sym, LOCAL_VAR); + } + List prevStack = frameStack; + try { + if (tree.sym.owner.kind == MTH) { + frameStack.head.addLocal(tree.sym); + } + frameStack = frameStack.prepend(new Frame(tree)); + super.visitVarDef(tree); + } + finally { + frameStack = prevStack; + } + } + + private Name lambdaName() { + return names.lambda.append(names.fromString("$" + lambdaCount++)); + } + + /** + * Return a valid owner given the current declaration stack + * (required to skip synthetic lambda symbols) + */ + private Symbol owner() { + List frameStack2 = frameStack; + while (frameStack2.nonEmpty()) { + switch (frameStack2.head.tree.getTag()) { + case VARDEF: + if (((JCVariableDecl)frameStack2.head.tree).sym.isLocal()) { + frameStack2 = frameStack2.tail; + break; + } + JCClassDecl cdecl = (JCClassDecl)frameStack2.tail.head.tree; + return makeSyntheticMethod(((JCVariableDecl)frameStack2.head.tree).sym.flags() & STATIC, names.empty, null, cdecl.sym); + case BLOCK: + JCClassDecl cdecl2 = (JCClassDecl)frameStack2.tail.head.tree; + return makeSyntheticMethod(((JCBlock)frameStack2.head.tree).flags & STATIC | Flags.BLOCK, names.empty, null, cdecl2.sym); + case CLASSDEF: + return ((JCClassDecl)frameStack2.head.tree).sym; + case METHODDEF: + return ((JCMethodDecl)frameStack2.head.tree).sym; + case LAMBDA: + return ((LambdaTranslationContext)contextMap.get(frameStack2.head.tree)).translatedSym; + default: + frameStack2 = frameStack2.tail; + } + } + Assert.error(); + return null; + } + + private JCTree enclosingLambda() { + List frameStack2 = frameStack; + while (frameStack2.nonEmpty()) { + switch (frameStack2.head.tree.getTag()) { + case CLASSDEF: + case METHODDEF: + return null; + case LAMBDA: + return frameStack2.head.tree; + default: + frameStack2 = frameStack2.tail; + } + } + Assert.error(); + return null; + } + + /** + * Return the declaration corresponding to a symbol in the enclosing + * scope; the depth parameter is used to filter out symbols defined + * in nested scopes (which do not need to undergo capture). + */ + private JCTree capturedDecl(int depth, Symbol sym) { + int currentDepth = frameStack.size() - 1; + for (Frame block : frameStack) { + switch (block.tree.getTag()) { + case CLASSDEF: + ClassSymbol clazz = ((JCClassDecl)block.tree).sym; + if (sym.isMemberOf(clazz, types)) { + return currentDepth > depth ? null : block.tree; + } + break; + case VARDEF: + if (((JCVariableDecl)block.tree).sym == sym && + sym.owner.kind == MTH) { //only locals are captured + return currentDepth > depth ? null : block.tree; + } + break; + case BLOCK: + case METHODDEF: + case LAMBDA: + if (block.locals != null && block.locals.contains(sym)) { + return currentDepth > depth ? null : block.tree; + } + break; + default: + Assert.error("bad decl kind " + block.tree.getTag()); + } + currentDepth--; + } + return null; + } + + private TranslationContext context() { + for (Frame frame : frameStack) { + TranslationContext context = contextMap.get(frame.tree); + if (context != null) { + return context; + } + } + return null; + } + + /** + * This is used to filter out those identifiers that needs to be adjusted + * when translating away lambda expressions + */ + private boolean lambdaIdentSymbolFilter(Symbol sym) { + return (sym.kind == VAR || sym.kind == MTH) + && !sym.isStatic() + && sym.name != names.init; + } + + private boolean lambdaSelectSymbolFilter(Symbol sym) { + return (sym.kind == VAR || sym.kind == MTH) && + !sym.isStatic() && + (sym.name == names._this || + sym.name == names._super); + } + + /** + * This is used to filter out those new class expressions that need to + * be qualified with an enclosing tree + */ + private boolean lambdaNewClassFilter(TranslationContext context, JCNewClass tree) { + if (context != null + && tree.encl == null + && tree.def == null + && tree.type.getEnclosingType().hasTag(NONE)) { + Type encl = tree.type.getEnclosingType(); + Type current = context.owner.enclClass().type; + while (current.hasTag(NONE)) { + if (current.tsym.isSubClass(encl.tsym, types)) { + return true; + } + current = current.getEnclosingType(); + } + return false; + } else { + return false; + } + } + + private TranslationContext makeLambdaContext(JCLambda tree) { + return new LambdaTranslationContext(tree); + } + + private TranslationContext makeReferenceContext(JCMemberReference tree) { + return new ReferenceTranslationContext(tree); + } + + private class Frame { + final JCTree tree; + List locals; + + public Frame(JCTree tree) { + this.tree = tree; + } + + void addLocal(Symbol sym) { + if (locals == null) { + locals = List.nil(); + } + locals = locals.prepend(sym); + } + } + + /** + * This class is used to store important information regarding translation of + * lambda expression/method references (see subclasses). + */ + private abstract class TranslationContext { + + /** the underlying (untranslated) tree */ + T tree; + + /** points to the adjusted enclosing scope in which this lambda/mref expression occurs */ + Symbol owner; + + /** the depth of this lambda expression in the frame stack */ + int depth; + + /** the enclosing translation context (set for nested lambdas/mref) */ + TranslationContext prev; + + TranslationContext(T tree) { + this.tree = tree; + this.owner = owner(); + this.depth = frameStack.size() - 1; + this.prev = context(); + } + } + + /** + * This class retains all the useful information about a lambda expression; + * the contents of this class are filled by the LambdaAnalyzer visitor, + * and the used by the main translation routines in order to adjust references + * to captured locals/members, etc. + */ + private class LambdaTranslationContext extends TranslationContext { + + /** variable in the enclosing context to which this lambda is assigned */ + Symbol self; + + /** map from original to translated lambda parameters */ + Map lambdaParams = new LinkedHashMap(); + + /** map from original to translated lambda locals */ + Map lambdaLocals = new LinkedHashMap(); + + /** map from variables in enclosing scope to translated synthetic parameters */ + Map capturedLocals = new LinkedHashMap(); + + /** map from class symbols to translated synthetic parameters (for captured member access) */ + Map capturedThis = new LinkedHashMap(); + + /** the synthetic symbol for the method hoisting the translated lambda */ + Symbol translatedSym; + + List syntheticParams; + + LambdaTranslationContext(JCLambda tree) { + super(tree); + Frame frame = frameStack.head; + if (frame.tree.hasTag(VARDEF)) { + self = ((JCVariableDecl)frame.tree).sym; + } + this.translatedSym = makeSyntheticMethod(0, lambdaName(), null, owner.enclClass()); + } + + /** + * Translate a symbol of a given kind into something suitable for the + * synthetic lambda body + */ + Symbol translate(String name, Symbol sym, LambdaSymbolKind skind) { + if (skind == CAPTURED_THIS) { + return sym; // self represented + } else { + return makeSyntheticVar(FINAL, name, types.erasure(sym.type), translatedSym); + } + } + + void addSymbol(Symbol sym, LambdaSymbolKind skind) { + Map transMap = null; + String preferredName; + switch (skind) { + case CAPTURED_THIS: + transMap = capturedThis; + preferredName = "encl$" + capturedThis.size(); + break; + case CAPTURED_VAR: + transMap = capturedLocals; + preferredName = "cap$" + capturedLocals.size(); + break; + case LOCAL_VAR: + transMap = lambdaLocals; + preferredName = sym.name.toString(); + break; + case PARAM: + transMap = lambdaParams; + preferredName = sym.name.toString(); + break; + default: throw new AssertionError(); + } + if (!transMap.containsKey(sym)) { + transMap.put(sym, translate(preferredName, sym, skind)); + } + } + + Map getSymbolMap(LambdaSymbolKind... skinds) { + LinkedHashMap translationMap = new LinkedHashMap(); + for (LambdaSymbolKind skind : skinds) { + switch (skind) { + case CAPTURED_THIS: + translationMap.putAll(capturedThis); + break; + case CAPTURED_VAR: + translationMap.putAll(capturedLocals); + break; + case LOCAL_VAR: + translationMap.putAll(lambdaLocals); + break; + case PARAM: + translationMap.putAll(lambdaParams); + break; + default: throw new AssertionError(); + } + } + return translationMap; + } + + /** + * The translatedSym is not complete/accurate until the analysis is + * finished. Once the analysis is finished, the translatedSym is + * "completed" -- updated with type information, access modifiers, + * and full parameter list. + */ + void complete() { + if (syntheticParams != null) { + return; + } + boolean inInterface = translatedSym.owner.isInterface(); + boolean thisReferenced = !getSymbolMap(CAPTURED_THIS).isEmpty(); + boolean needInstance = thisReferenced || inInterface; + + // If instance access isn't needed, make it static + // Interface methods much be public default methods, otherwise make it private + translatedSym.flags_field = SYNTHETIC | (needInstance? 0 : STATIC) | (inInterface? PUBLIC | DEFAULT : PRIVATE); + + //compute synthetic params + ListBuffer params = ListBuffer.lb(); + + // The signature of the method is augmented with the following + // synthetic parameters: + // + // 1) reference to enclosing contexts captured by the lambda expression + // 2) enclosing locals captured by the lambda expression + for (Symbol thisSym : getSymbolMap(CAPTURED_VAR, PARAM).values()) { + params.append(make.VarDef((VarSymbol) thisSym, null)); + } + + syntheticParams = params.toList(); + + //prepend synthetic args to translated lambda method signature + translatedSym.type = (MethodType) types.createMethodTypeWithParameters( + (MethodType) generatedLambdaSig(), + TreeInfo.types(syntheticParams)); + } + + Type enclosingType() { + //local inner classes defined inside a lambda are always non-static + return owner.enclClass().type; + } + + Type generatedLambdaSig() { + return types.erasure(types.findDescriptorType(tree.targetType)); + } + } + + /** + * This class retains all the useful information about a method reference; + * the contents of this class are filled by the LambdaAnalyzer visitor, + * and the used by the main translation routines in order to adjust method + * references (i.e. in case a bridge is needed) + */ + private class ReferenceTranslationContext extends TranslationContext { + + final boolean isSuper; + final Symbol bridgeSym; + + ReferenceTranslationContext(JCMemberReference tree) { + super(tree); + this.isSuper = tree.hasKind(ReferenceKind.SUPER); + this.bridgeSym = needsBridge() + ? makeSyntheticMethod(isSuper ? 0 : STATIC, + lambdaName().append(names.fromString("$bridge")), null, + owner.enclClass()) + : null; + } + + /** + * Get the opcode associated with this method reference + */ + int referenceKind() { + return LambdaToMethod.this.referenceKind(needsBridge() ? bridgeSym : tree.sym); + } + + boolean needsVarArgsConversion() { + return tree.varargsElement != null; + } + + /** + * @return Is this an array operation like clone() + */ + boolean isArrayOp() { + return tree.sym.owner == syms.arrayClass; + } + + /** + * Does this reference needs a bridge (i.e. var args need to be + * expanded or "super" is used) + */ + final boolean needsBridge() { + return isSuper || needsVarArgsConversion() || isArrayOp(); + } + + Type generatedRefSig() { + return types.erasure(tree.sym.type); + } + + Type bridgedRefSig() { + return types.erasure(types.findDescriptorSymbol(tree.targetType.tsym).type); + } + } + } + // + + enum LambdaSymbolKind { + CAPTURED_VAR, + CAPTURED_THIS, + LOCAL_VAR, + PARAM; + } +} diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java index ff89b7696c7..e06da066d14 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java @@ -120,6 +120,16 @@ public class TransTypes extends TreeTranslator { * @param tree The expression tree. * @param target The target type. */ + public JCExpression coerce(Env env, JCExpression tree, Type target) { + Env prevEnv = this.env; + try { + this.env = env; + return coerce(tree, target); + } + finally { + this.env = prevEnv; + } + } JCExpression coerce(JCExpression tree, Type target) { Type btarget = target.baseType(); if (tree.type.isPrimitive() == target.isPrimitive()) { @@ -196,6 +206,20 @@ public class TransTypes extends TreeTranslator { return _args; } + public List translateArgs(List _args, + List parameters, + Type varargsElement, + Env localEnv) { + Env prevEnv = env; + try { + env = localEnv; + return translateArgs(_args, parameters, varargsElement); + } + finally { + env = prevEnv; + } + } + /** Add a bridge definition and enter corresponding method symbol in * local scope of origin. * @@ -451,9 +475,9 @@ public class TransTypes extends TreeTranslator { result = tree; } - JCMethodDecl currentMethod = null; + JCTree currentMethod = null; public void visitMethodDef(JCMethodDecl tree) { - JCMethodDecl previousMethod = currentMethod; + JCTree previousMethod = currentMethod; try { currentMethod = tree; tree.restype = translate(tree.restype, null); @@ -519,6 +543,22 @@ public class TransTypes extends TreeTranslator { result = tree; } + public void visitLambda(JCLambda tree) { + JCTree prevMethod = currentMethod; + try { + currentMethod = null; + tree.params = translate(tree.params); + tree.body = translate(tree.body, null); + //save non-erased target + tree.targetType = tree.type; + tree.type = erasure(tree.type); + result = tree; + } + finally { + currentMethod = prevMethod; + } + } + public void visitSwitch(JCSwitch tree) { Type selsuper = types.supertype(tree.selector.type); boolean enumSwitch = selsuper != null && @@ -570,7 +610,7 @@ public class TransTypes extends TreeTranslator { } public void visitReturn(JCReturn tree) { - tree.expr = translate(tree.expr, currentMethod.sym.erasure(types).getReturnType()); + tree.expr = translate(tree.expr, currentMethod != null ? types.erasure(currentMethod.type).getReturnType() : null); result = tree; } @@ -601,6 +641,7 @@ public class TransTypes extends TreeTranslator { Assert.check(tree.args.length() == argtypes.length()); tree.args = translateArgs(tree.args, argtypes, tree.varargsElement); + tree.type = types.erasure(tree.type); // Insert casts of method invocation results as needed. result = retype(tree, mt.getReturnType(), pt); } @@ -614,6 +655,8 @@ public class TransTypes extends TreeTranslator { tree.args = translateArgs( tree.args, tree.constructor.erasure(types).getParameterTypes(), tree.varargsElement); tree.def = translate(tree.def, null); + if (tree.constructorType != null) + tree.constructorType = erasure(tree.constructorType); tree.type = erasure(tree.type); result = tree; } @@ -631,16 +674,6 @@ public class TransTypes extends TreeTranslator { result = tree; } - @Override - public void visitLambda(JCLambda tree) { - Assert.error("Translation of lambda expression not supported yet"); - } - - @Override - public void visitReference(JCMemberReference tree) { - Assert.error("Translation of method reference not supported yet"); - } - public void visitParens(JCParens tree) { tree.expr = translate(tree.expr, pt); tree.type = erasure(tree.type); @@ -749,6 +782,14 @@ public class TransTypes extends TreeTranslator { } } + public void visitReference(JCMemberReference tree) { + tree.expr = translate(tree.expr, null); + //save non-erased target + tree.targetType = tree.type; + tree.type = erasure(tree.type); + result = tree; + } + public void visitTypeArray(JCArrayTypeTree tree) { tree.elemtype = translate(tree.elemtype, null); tree.type = erasure(tree.type); 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 2b127b2cba5..b62da0f4b46 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 @@ -271,6 +271,10 @@ public class JavaCompiler implements ClassReader.SourceCompleter { */ protected TransTypes transTypes; + /** The lambda translator. + */ + protected LambdaToMethod lambdaToMethod; + /** The syntactic sugar desweetener. */ protected Lower lower; @@ -369,6 +373,8 @@ public class JavaCompiler implements ClassReader.SourceCompleter { options = Options.instance(context); + lambdaToMethod = LambdaToMethod.instance(context); + verbose = options.isSet(VERBOSE); sourceOutput = options.isSet(PRINTSOURCE); // used to be -s stubOutput = options.isSet("-stubs"); @@ -524,8 +530,10 @@ public class JavaCompiler implements ClassReader.SourceCompleter { ATTR(4), FLOW(5), TRANSTYPES(6), - LOWER(7), - GENERATE(8); + UNLAMBDA(7), + LOWER(8), + GENERATE(9); + CompileState(int value) { this.value = value; } @@ -1418,6 +1426,12 @@ public class JavaCompiler implements ClassReader.SourceCompleter { env.tree = transTypes.translateTopLevelClass(env.tree, localMake); compileStates.put(env, CompileState.TRANSTYPES); + if (shouldStop(CompileState.UNLAMBDA)) + return; + + env.tree = lambdaToMethod.translateTopLevelClass(env, env.tree, localMake); + compileStates.put(env, CompileState.UNLAMBDA); + if (shouldStop(CompileState.LOWER)) return; diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Names.java b/langtools/src/share/classes/com/sun/tools/javac/util/Names.java index 53827d2ce65..77d7d4097b1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Names.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Names.java @@ -170,6 +170,10 @@ public class Names { public final Name ex; public final Name package_info; + //lambda-related + public final Name lambda; + public final Name metaFactory; + public final Name.Table table; public Names(Context context) { @@ -298,6 +302,10 @@ public class Names { deprecated = fromString("deprecated"); ex = fromString("ex"); package_info = fromString("package-info"); + + //lambda-related + lambda = fromString("lambda"); + metaFactory = fromString("metaFactory"); } protected Name.Table createTable(Options options) { From 1203231cf954fd4097419f72fb7c7544f8cd044b Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Mon, 29 Oct 2012 10:42:41 -0700 Subject: [PATCH 123/241] 8000997: Multiple locale sensitive services cannot be loaded Reviewed-by: okutsu --- .../provider/LocaleServiceProviderPool.java | 2 +- .../provider/SPILocaleProviderAdapter.java | 504 +++++++++++++++++- .../CurrencyNameProviderTest.java | 30 +- .../CurrencyNameProviderTest.sh | 2 +- .../util/PluggableLocale/GenericTest.java | 2 + .../java/util/PluggableLocale/barprovider.jar | Bin 12810 -> 13747 bytes .../CurrencyNameProviderImpl2.java | 63 +++ .../util/PluggableLocale/providersrc/Makefile | 1 + .../java.util.spi.CurrencyNameProvider | 1 + 9 files changed, 595 insertions(+), 10 deletions(-) create mode 100644 jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java diff --git a/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java b/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java index 71e6b425887..2683b7dd62b 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java +++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java @@ -356,7 +356,7 @@ public final class LocaleServiceProviderPool { * @param locale the input locale * @return the list of candidate locales for the given locale */ - private static List getLookupLocales(Locale locale) { + static List getLookupLocales(Locale locale) { // Note: We currently use the default implementation of // ResourceBundle.Control.getCandidateLocales. The result // returned by getCandidateLocales are already normalized diff --git a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java index 0f123c5d51b..cb4f9aee7de 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java @@ -28,8 +28,11 @@ package sun.util.locale.provider; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; -import java.util.ServiceLoader; -import java.util.spi.LocaleServiceProvider; +import java.text.*; +import java.text.spi.*; +import java.util.*; +import java.util.concurrent.*; +import java.util.spi.*; /** * LocaleProviderAdapter implementation for the installed SPI implementations. @@ -54,11 +57,28 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override @SuppressWarnings("unchecked") public P run() { - P lsp = null; + P delegate = null; + for (LocaleServiceProvider provider : ServiceLoader.loadInstalled(c)) { - lsp = (P) provider; + if (delegate == null) { + try { + delegate = + (P) Class.forName(SPILocaleProviderAdapter.class.getCanonicalName() + + "$" + + c.getSimpleName() + + "Delegate") + .newInstance(); + } catch (ClassNotFoundException | + InstantiationException | + IllegalAccessException e) { + LocaleServiceProviderPool.config(SPILocaleProviderAdapter.class, e.toString()); + return null; } - return lsp; + } + + ((Delegate)delegate).addImpl(provider); + } + return delegate; } }); } catch (PrivilegedActionException e) { @@ -66,4 +86,478 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { } return null; } + + /* + * Delegate interface. All the implementations have to have the class name + * following "Delegate" convention. + */ + interface Delegate

    { + public void addImpl(P impl); + public P getImpl(Locale locale); +} + + /* + * Obtain the real SPI implementation, using locale fallback + */ + private static

    P getImpl(Map map, Locale locale) { + for (Locale l : LocaleServiceProviderPool.getLookupLocales(locale)) { + P ret = map.get(l); + if (ret != null) { + return ret; + } + } + return null; + } + + /* + * Delegates for the actual SPI implementations. + */ + static class BreakIteratorProviderDelegate extends BreakIteratorProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(BreakIteratorProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public BreakIteratorProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public BreakIterator getWordInstance(Locale locale) { + BreakIteratorProvider bip = getImpl(locale); + assert bip != null; + return bip.getWordInstance(locale); + } + + @Override + public BreakIterator getLineInstance(Locale locale) { + BreakIteratorProvider bip = getImpl(locale); + assert bip != null; + return bip.getLineInstance(locale); + } + + @Override + public BreakIterator getCharacterInstance(Locale locale) { + BreakIteratorProvider bip = getImpl(locale); + assert bip != null; + return bip.getCharacterInstance(locale); + } + + @Override + public BreakIterator getSentenceInstance(Locale locale) { + BreakIteratorProvider bip = getImpl(locale); + assert bip != null; + return bip.getSentenceInstance(locale); + } + + } + + static class CollatorProviderDelegate extends CollatorProvider implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(CollatorProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public CollatorProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public Collator getInstance(Locale locale) { + CollatorProvider cp = getImpl(locale); + assert cp != null; + return cp.getInstance(locale); + } + } + + static class DateFormatProviderDelegate extends DateFormatProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(DateFormatProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public DateFormatProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public DateFormat getTimeInstance(int style, Locale locale) { + DateFormatProvider dfp = getImpl(locale); + assert dfp != null; + return dfp.getTimeInstance(style, locale); + } + + @Override + public DateFormat getDateInstance(int style, Locale locale) { + DateFormatProvider dfp = getImpl(locale); + assert dfp != null; + return dfp.getDateInstance(style, locale); + } + + @Override + public DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) { + DateFormatProvider dfp = getImpl(locale); + assert dfp != null; + return dfp.getDateTimeInstance(dateStyle, timeStyle, locale); + } + } + + static class DateFormatSymbolsProviderDelegate extends DateFormatSymbolsProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(DateFormatSymbolsProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public DateFormatSymbolsProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public DateFormatSymbols getInstance(Locale locale) { + DateFormatSymbolsProvider dfsp = getImpl(locale); + assert dfsp != null; + return dfsp.getInstance(locale); + } + } + + static class DecimalFormatSymbolsProviderDelegate extends DecimalFormatSymbolsProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(DecimalFormatSymbolsProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public DecimalFormatSymbolsProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public DecimalFormatSymbols getInstance(Locale locale) { + DecimalFormatSymbolsProvider dfsp = getImpl(locale); + assert dfsp != null; + return dfsp.getInstance(locale); + } + } + + static class NumberFormatProviderDelegate extends NumberFormatProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(NumberFormatProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public NumberFormatProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public NumberFormat getCurrencyInstance(Locale locale) { + NumberFormatProvider nfp = getImpl(locale); + assert nfp != null; + return nfp.getCurrencyInstance(locale); + } + + @Override + public NumberFormat getIntegerInstance(Locale locale) { + NumberFormatProvider nfp = getImpl(locale); + assert nfp != null; + return nfp.getIntegerInstance(locale); + } + + @Override + public NumberFormat getNumberInstance(Locale locale) { + NumberFormatProvider nfp = getImpl(locale); + assert nfp != null; + return nfp.getNumberInstance(locale); + } + + @Override + public NumberFormat getPercentInstance(Locale locale) { + NumberFormatProvider nfp = getImpl(locale); + assert nfp != null; + return nfp.getPercentInstance(locale); + } + } + + static class CalendarDataProviderDelegate extends CalendarDataProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(CalendarDataProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public CalendarDataProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public int getFirstDayOfWeek(Locale locale) { + CalendarDataProvider cdp = getImpl(locale); + assert cdp != null; + return cdp.getFirstDayOfWeek(locale); + } + + @Override + public int getMinimalDaysInFirstWeek(Locale locale) { + CalendarDataProvider cdp = getImpl(locale); + assert cdp != null; + return cdp.getMinimalDaysInFirstWeek(locale); + } + + @Override + public String getDisplayName(String calendarType, + int field, int value, + int style, Locale locale) { + CalendarDataProvider cdp = getImpl(locale); + assert cdp != null; + return cdp.getDisplayName(calendarType, field, value, style, locale); + } + + @Override + public Map getDisplayNames(String calendarType, + int field, int style, + Locale locale) { + CalendarDataProvider cdp = getImpl(locale); + assert cdp != null; + return cdp.getDisplayNames(calendarType, field, style, locale); + } + } + + static class CurrencyNameProviderDelegate extends CurrencyNameProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(CurrencyNameProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public CurrencyNameProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public String getSymbol(String currencyCode, Locale locale) { + CurrencyNameProvider cnp = getImpl(locale); + assert cnp != null; + return cnp.getSymbol(currencyCode, locale); + } + + @Override + public String getDisplayName(String currencyCode, Locale locale) { + CurrencyNameProvider cnp = getImpl(locale); + assert cnp != null; + return cnp.getDisplayName(currencyCode, locale); + } + } + + static class LocaleNameProviderDelegate extends LocaleNameProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(LocaleNameProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public LocaleNameProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public String getDisplayLanguage(String languageCode, Locale locale) { + LocaleNameProvider lnp = getImpl(locale); + assert lnp != null; + return lnp.getDisplayLanguage(languageCode, locale); + } + + @Override + public String getDisplayScript(String scriptCode, Locale locale) { + LocaleNameProvider lnp = getImpl(locale); + assert lnp != null; + return lnp.getDisplayScript(scriptCode, locale); + } + + @Override + public String getDisplayCountry(String countryCode, Locale locale) { + LocaleNameProvider lnp = getImpl(locale); + assert lnp != null; + return lnp.getDisplayCountry(countryCode, locale); + } + + @Override + public String getDisplayVariant(String variant, Locale locale) { + LocaleNameProvider lnp = getImpl(locale); + assert lnp != null; + return lnp.getDisplayVariant(variant, locale); + } + } + + static class TimeZoneNameProviderDelegate extends TimeZoneNameProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(TimeZoneNameProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public TimeZoneNameProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public String getDisplayName(String ID, boolean daylight, int style, Locale locale) { + TimeZoneNameProvider tznp = getImpl(locale); + assert tznp != null; + return tznp.getDisplayName(ID, daylight, style, locale); + } + } } diff --git a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.java b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.java index 7c9f631258b..ebffc3f4f3c 100644 --- a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.java @@ -48,10 +48,13 @@ public class CurrencyNameProviderTest extends ProviderTest { void test1() { com.bar.CurrencyNameProviderImpl cnp = new com.bar.CurrencyNameProviderImpl(); + com.bar.CurrencyNameProviderImpl2 cnp2 = new com.bar.CurrencyNameProviderImpl2(); Locale[] availloc = Locale.getAvailableLocales(); Locale[] testloc = availloc.clone(); List jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getCurrencyNameProvider().getAvailableLocales()); - List providerloc = Arrays.asList(cnp.getAvailableLocales()); + List providerloc = new ArrayList(); + providerloc.addAll(Arrays.asList(cnp.getAvailableLocales())); + providerloc.addAll(Arrays.asList(cnp2.getAvailableLocales())); for (Locale target: availloc) { // pure JRE implementation @@ -79,8 +82,13 @@ public class CurrencyNameProviderTest extends ProviderTest { String providerscurrency = null; String providersname = null; if (providerloc.contains(target)) { + if (cnp.isSupportedLocale(target)) { providerscurrency = cnp.getSymbol(c.getCurrencyCode(), target); providersname = cnp.getDisplayName(c.getCurrencyCode(), target); + } else { + providerscurrency = cnp2.getSymbol(c.getCurrencyCode(), target); + providersname = cnp2.getDisplayName(c.getCurrencyCode(), target); + } } // JRE's name @@ -109,18 +117,22 @@ public class CurrencyNameProviderTest extends ProviderTest { final String pattern = "###,###\u00A4"; final String YEN_IN_OSAKA = "100,000\u5186\u3084\u3002"; final String YEN_IN_KYOTO = "100,000\u5186\u3069\u3059\u3002"; + final String YEN_IN_TOKYO= "100,000JPY-tokyo"; final Locale OSAKA = new Locale("ja", "JP", "osaka"); final Locale KYOTO = new Locale("ja", "JP", "kyoto"); + final Locale TOKYO = new Locale("ja", "JP", "tokyo"); Integer i = new Integer(100000); String formatted; DecimalFormat df; void test2() { + Locale defloc = Locale.getDefault(); + try { df = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance(OSAKA)); System.out.println(formatted = df.format(i)); if(!formatted.equals(YEN_IN_OSAKA)) { - throw new RuntimeException("formatted zone names mismatch. " + + throw new RuntimeException("formatted currency names mismatch. " + "Should match with " + YEN_IN_OSAKA); } @@ -130,13 +142,25 @@ public class CurrencyNameProviderTest extends ProviderTest { df = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance()); System.out.println(formatted = df.format(i)); if(!formatted.equals(YEN_IN_KYOTO)) { - throw new RuntimeException("formatted zone names mismatch. " + + throw new RuntimeException("formatted currency names mismatch. " + "Should match with " + YEN_IN_KYOTO); } df.parse(YEN_IN_KYOTO); + + Locale.setDefault(TOKYO); + df = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance()); + System.out.println(formatted = df.format(i)); + if(!formatted.equals(YEN_IN_TOKYO)) { + throw new RuntimeException("formatted currency names mismatch. " + + "Should match with " + YEN_IN_TOKYO); + } + + df.parse(YEN_IN_TOKYO); } catch (ParseException pe) { throw new RuntimeException("parse error occured" + pe); + } finally { + Locale.setDefault(defloc); } } } diff --git a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh index a0a9d582eae..f9abbe09071 100644 --- a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh +++ b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh @@ -23,6 +23,6 @@ #!/bin/sh # # @test -# @bug 4052440 +# @bug 4052440 8000997 # @summary CurrencyNameProvider tests # @run shell ExecTest.sh bar CurrencyNameProviderTest true diff --git a/jdk/test/java/util/PluggableLocale/GenericTest.java b/jdk/test/java/util/PluggableLocale/GenericTest.java index 3987f986bea..288d7a3ab04 100644 --- a/jdk/test/java/util/PluggableLocale/GenericTest.java +++ b/jdk/test/java/util/PluggableLocale/GenericTest.java @@ -38,6 +38,7 @@ public class GenericTest { com.foo.DecimalFormatSymbolsProviderImpl decimalFSP = new com.foo.DecimalFormatSymbolsProviderImpl(); com.foo.NumberFormatProviderImpl numberFP = new com.foo.NumberFormatProviderImpl(); com.bar.CurrencyNameProviderImpl currencyNP = new com.bar.CurrencyNameProviderImpl(); + com.bar.CurrencyNameProviderImpl2 currencyNP2 = new com.bar.CurrencyNameProviderImpl2(); com.bar.LocaleNameProviderImpl localeNP = new com.bar.LocaleNameProviderImpl(); com.bar.TimeZoneNameProviderImpl tzNP = new com.bar.TimeZoneNameProviderImpl(); com.bar.CalendarDataProviderImpl calDataP = new com.bar.CalendarDataProviderImpl(); @@ -68,6 +69,7 @@ public class GenericTest { expected.addAll(Arrays.asList(decimalFSP.getAvailableLocales())); expected.addAll(Arrays.asList(numberFP.getAvailableLocales())); expected.addAll(Arrays.asList(currencyNP.getAvailableLocales())); + expected.addAll(Arrays.asList(currencyNP2.getAvailableLocales())); expected.addAll(Arrays.asList(localeNP.getAvailableLocales())); expected.addAll(Arrays.asList(tzNP.getAvailableLocales())); expected.addAll(Arrays.asList(calDataP.getAvailableLocales())); diff --git a/jdk/test/java/util/PluggableLocale/barprovider.jar b/jdk/test/java/util/PluggableLocale/barprovider.jar index b5247a09262b7ad030f74b0cb32aca424065e4ca..901b2b2b7f6264a4f8fe6b7e4af75f573897e55e 100644 GIT binary patch delta 1600 zcmY*Z2~ZPf6kb9I7_M-HCL|;n8m`_I*cU<@*fze%eTL zKu=E(I20au!titLCGeHNFhpJgP)o}OMg_`J?xppU&JvL;P$Z-Y^xy@oxa`0Il#R%V z8519sn%X1{4K(w@+*$;4#;e7&=V+W~Y&+ISiMAdNU=xF-Wu1>~FaLh%o~rRrS=W|U z{~yD2q|$j+ZuR(W87Ax4s4TtojmJQXs-#P?Ygdc*sW#f03Ebt)gxEDv23v6*hcg9Q zF{U4J<|e~K$%(f0MN)pYgNgsA?xLIAlZwNquxz{N2wu>QtQ=c9I>c0cROam};GUJu zS!eL>`gHe9`#j%9YqX40v-XHbnVfHw>W$g^d)$NYmM>1rR3p_6JsA}j4!q^=4s!0$ zo=TXiX}|B7Tkc&!O{1LKUL;KqW;!0Y*~v4ltiTt&npij7PZ2lflwUYjC&HE^1^!XJ z+*=O|KNd)+x%J1N_w3C3ZPUxPlAhv(a_>g#e)&DK34X1!{O66X9gmPnWMjlD z&r6v~AUedP%JRD96a4(YDeQn7Ft&uIOqxsXG_ZcU_d47=f(HV|1$}&zfsbnq!P332w!aCr@vw6!f}xpE1ZU z%#T(R9b&J3*i)@zV$3@;SW}dL!Q3rn_n7h-`T^0eyzJTur?2{bOFG7P7T1r~8)(06 zt#zF!EqGiLP7<0(V!8F+M(?`0t_s52z@zg4wBi&i?G$B$W8Djef1)U~EV+{%rlbrs ze|B*zk2dWbTK;--FTD{LHc~e8N3CURMnhchHC{!t!l5xRxpbRXoZ+3iyA^|(4Q`8` ziyv}k9{64Hb!&18BDPG_l*!f$GpdC(Z%SD&2W9$I{yI_4p`zBOTdwLF`#r3bJf6Xq z$k9sRDTYdO6wdy2aZ-eKU=3R}(?X1hpsB2wK~QnB)woh z5IL5aE}1sGq}C-UaEg}>BYSOrh3Hd?i)rca~?9IQC#jJ^(iX+jXI_E5W z=6V+D`kDIQ{VfSr-e?HG-o;3L$68uVyGLBsr*{v}?mV`GsXH@_Tsj0|LVWgqNF-#? zy;^R-M8_t$J0?xj7+5dq*Qm;);vh65CnNxnR%jUjG?_ucSnwB& zK4{D|fL}~v5)j!Ikl6-|ST-dv30gm?F4OFofs_3|?qJ#*g;=m*e zB=|3r2v@XX5fCM0$ZP@fS$NnK51E1~U>=JL)9VoJvk$qvIkqJIFQNKbhUv^ zKuprWFt#82bTEQL0gWBZ!TW5@hpwChcU4;>nqU$~lkdeLAZi&lTpX?=aPcb-Y1IOFLAC@+6 zFb`bg`XRG%O8nydy!JP5n!UA7brvsHo2IC7)vB&pwPy0;#k-67p2x0j_7M;8X6J|q zY1*90z`#%s#E?*9hX&i^L%MsRZZe$QX(}@LxLz%o@2+nFrknKb!SoS*eK7q^-xy5m z7zBdp1}Lp*D9!YkYqBq&+TM|UtW zFx+8bU{C})2mwrmfr^#k3iqB2FWCT8cowKo3!w_gvJnF+l$g9vQe<+x5yY}QBWWfV zNwDxS8407IMf>HZnE= z`zq5|+PX@Wfgw3RS3fO3KPj5_Dds(oBlllPBt#O`dDY!3Xk*05BAuXoJiF0O|$^-2eap diff --git a/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java b/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java new file mode 100644 index 00000000000..5ed7222f95e --- /dev/null +++ b/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * + */ + +package com.bar; + +import java.util.*; +import java.util.spi.*; + +import com.foobar.Utils; + +public class CurrencyNameProviderImpl2 extends CurrencyNameProvider { + static Locale[] avail = {new Locale("ja", "JP", "tokyo")}; + public Locale[] getAvailableLocales() { + return avail; + } + + @Override + public String getSymbol(String c, Locale locale) { + if (!Utils.supportsLocale(Arrays.asList(avail), locale)) { + throw new IllegalArgumentException("locale is not supported: "+locale); + } + + if (c.equals("JPY") && Utils.supportsLocale(avail[0], locale)) { + return "JPY-tokyo"; + } + return null; + } + + @Override + public String getDisplayName(String c, Locale locale) { + if (!Utils.supportsLocale(Arrays.asList(avail), locale)) { + throw new IllegalArgumentException("locale is not supported: "+locale); + } + + if (c.equals("JPY") && Utils.supportsLocale(avail[0], locale)) { + return "JPY-tokyo"; + } + return null; + } +} diff --git a/jdk/test/java/util/PluggableLocale/providersrc/Makefile b/jdk/test/java/util/PluggableLocale/providersrc/Makefile index d69cecd149d..3c550992691 100644 --- a/jdk/test/java/util/PluggableLocale/providersrc/Makefile +++ b/jdk/test/java/util/PluggableLocale/providersrc/Makefile @@ -35,6 +35,7 @@ FOOFILES_JAVA = \ BARFILES_JAVA = \ CurrencyNameProviderImpl.java \ + CurrencyNameProviderImpl2.java \ TimeZoneNameProviderImpl.java \ LocaleNameProviderImpl.java \ CalendarDataProviderImpl.java \ diff --git a/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider b/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider index 938d6b090c1..9817ed386e2 100644 --- a/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider +++ b/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider @@ -5,3 +5,4 @@ # implementation class # com.bar.CurrencyNameProviderImpl +com.bar.CurrencyNameProviderImpl2 From e184d5cc4ec66640366d2d30d8dfaba74a1003a7 Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Mon, 29 Oct 2012 11:08:48 -0700 Subject: [PATCH 124/241] 8000780: make Zero build and run with JDK8 Reviewed-by: coleenp, dholmes, twisti --- hotspot/make/Makefile | 16 + .../zero/vm/cppInterpreterGenerator_zero.hpp | 13 +- .../src/cpu/zero/vm/cppInterpreter_zero.cpp | 567 +----------------- .../src/cpu/zero/vm/cppInterpreter_zero.hpp | 2 - hotspot/src/cpu/zero/vm/frame_zero.cpp | 7 +- hotspot/src/cpu/zero/vm/frame_zero.inline.hpp | 2 + hotspot/src/cpu/zero/vm/icBuffer_zero.cpp | 5 +- .../src/cpu/zero/vm/methodHandles_zero.cpp | 165 ++++- .../src/cpu/zero/vm/methodHandles_zero.hpp | 10 +- hotspot/src/cpu/zero/vm/register_zero.hpp | 3 + hotspot/src/cpu/zero/vm/relocInfo_zero.cpp | 4 + .../src/cpu/zero/vm/sharedRuntime_zero.cpp | 31 +- hotspot/src/share/vm/asm/codeBuffer.cpp | 2 +- .../vm/interpreter/abstractInterpreter.hpp | 1 + .../vm/interpreter/bytecodeInterpreter.cpp | 69 ++- .../vm/interpreter/bytecodeInterpreter.hpp | 5 +- .../share/vm/interpreter/cppInterpreter.cpp | 6 +- .../src/share/vm/interpreter/interpreter.cpp | 8 + .../vm/interpreter/templateInterpreter.cpp | 6 +- hotspot/src/share/vm/runtime/vmStructs.cpp | 2 +- hotspot/src/share/vm/utilities/macros.hpp | 16 + 21 files changed, 323 insertions(+), 617 deletions(-) diff --git a/hotspot/make/Makefile b/hotspot/make/Makefile index a0b7ba7687c..fe5a6b684d6 100644 --- a/hotspot/make/Makefile +++ b/hotspot/make/Makefile @@ -453,14 +453,30 @@ ifneq ($(OSNAME),windows) ifeq ($(JVM_VARIANT_ZEROSHARK), true) $(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX) $(install-file) + $(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo): $(SHARK_DIR)/%.debuginfo + $(install-file) + $(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(SHARK_DIR)/%.diz + $(install-file) $(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX) $(install-file) + $(EXPORT_SERVER_DIR)/%.debuginfo: $(SHARK_DIR)/%.debuginfo + $(install-file) + $(EXPORT_SERVER_DIR)/%.diz: $(SHARK_DIR)/%.diz + $(install-file) endif ifeq ($(JVM_VARIANT_ZERO), true) $(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX) $(install-file) + $(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(ZERO_DIR)/%.debuginfo + $(install-file) + $(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(ZERO_DIR)/%.diz + $(install-file) $(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX) $(install-file) + $(EXPORT_SERVER_DIR)/%.debuginfo: $(ZERO_DIR)/%.debuginfo + $(install-file) + $(EXPORT_SERVER_DIR)/%.diz: $(ZERO_DIR)/%.diz + $(install-file) endif ifeq ($(JVM_VARIANT_MINIMAL1), true) $(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX) diff --git a/hotspot/src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp b/hotspot/src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp index ff61306c760..6b2cacf5ae2 100644 --- a/hotspot/src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp +++ b/hotspot/src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp @@ -31,12 +31,17 @@ return _masm; } - protected: - address generate_entry(address entry_point) { - ZeroEntry *entry = (ZeroEntry *) assembler()->pc(); - assembler()->advance(sizeof(ZeroEntry)); + public: + static address generate_entry_impl(MacroAssembler* masm, address entry_point) { + ZeroEntry *entry = (ZeroEntry *) masm->pc(); + masm->advance(sizeof(ZeroEntry)); entry->set_entry_point(entry_point); return (address) entry; } + protected: + address generate_entry(address entry_point) { + return generate_entry_impl(assembler(), entry_point); + } + #endif // CPU_ZERO_VM_CPPINTERPRETERGENERATOR_ZERO_HPP diff --git a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp index 1b2da5a5d15..ee855a9efbc 100644 --- a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp +++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp @@ -180,25 +180,6 @@ void CppInterpreter::main_loop(int recurse, TRAPS) { method, istate->osr_entry(), istate->osr_buf(), THREAD); return; } - else if (istate->msg() == BytecodeInterpreter::call_method_handle) { - oop method_handle = istate->callee(); - - // Trim back the stack to put the parameters at the top - stack->set_sp(istate->stack() + 1); - - // Make the call - process_method_handle(method_handle, THREAD); - fixup_after_potential_safepoint(); - - // Convert the result - istate->set_stack(stack->sp() - 1); - - // Restore the stack - stack->set_sp(istate->stack_limit() + 1); - - // Resume the interpreter - istate->set_msg(BytecodeInterpreter::method_resume); - } else { ShouldNotReachHere(); } @@ -535,35 +516,35 @@ int CppInterpreter::accessor_entry(Method* method, intptr_t UNUSED, TRAPS) { if (entry->is_volatile()) { switch (entry->flag_state()) { case ctos: - SET_LOCALS_INT(object->char_field_acquire(entry->f2()), 0); + SET_LOCALS_INT(object->char_field_acquire(entry->f2_as_index()), 0); break; case btos: - SET_LOCALS_INT(object->byte_field_acquire(entry->f2()), 0); + SET_LOCALS_INT(object->byte_field_acquire(entry->f2_as_index()), 0); break; case stos: - SET_LOCALS_INT(object->short_field_acquire(entry->f2()), 0); + SET_LOCALS_INT(object->short_field_acquire(entry->f2_as_index()), 0); break; case itos: - SET_LOCALS_INT(object->int_field_acquire(entry->f2()), 0); + SET_LOCALS_INT(object->int_field_acquire(entry->f2_as_index()), 0); break; case ltos: - SET_LOCALS_LONG(object->long_field_acquire(entry->f2()), 0); + SET_LOCALS_LONG(object->long_field_acquire(entry->f2_as_index()), 0); break; case ftos: - SET_LOCALS_FLOAT(object->float_field_acquire(entry->f2()), 0); + SET_LOCALS_FLOAT(object->float_field_acquire(entry->f2_as_index()), 0); break; case dtos: - SET_LOCALS_DOUBLE(object->double_field_acquire(entry->f2()), 0); + SET_LOCALS_DOUBLE(object->double_field_acquire(entry->f2_as_index()), 0); break; case atos: - SET_LOCALS_OBJECT(object->obj_field_acquire(entry->f2()), 0); + SET_LOCALS_OBJECT(object->obj_field_acquire(entry->f2_as_index()), 0); break; default: @@ -573,35 +554,35 @@ int CppInterpreter::accessor_entry(Method* method, intptr_t UNUSED, TRAPS) { else { switch (entry->flag_state()) { case ctos: - SET_LOCALS_INT(object->char_field(entry->f2()), 0); + SET_LOCALS_INT(object->char_field(entry->f2_as_index()), 0); break; case btos: - SET_LOCALS_INT(object->byte_field(entry->f2()), 0); + SET_LOCALS_INT(object->byte_field(entry->f2_as_index()), 0); break; case stos: - SET_LOCALS_INT(object->short_field(entry->f2()), 0); + SET_LOCALS_INT(object->short_field(entry->f2_as_index()), 0); break; case itos: - SET_LOCALS_INT(object->int_field(entry->f2()), 0); + SET_LOCALS_INT(object->int_field(entry->f2_as_index()), 0); break; case ltos: - SET_LOCALS_LONG(object->long_field(entry->f2()), 0); + SET_LOCALS_LONG(object->long_field(entry->f2_as_index()), 0); break; case ftos: - SET_LOCALS_FLOAT(object->float_field(entry->f2()), 0); + SET_LOCALS_FLOAT(object->float_field(entry->f2_as_index()), 0); break; case dtos: - SET_LOCALS_DOUBLE(object->double_field(entry->f2()), 0); + SET_LOCALS_DOUBLE(object->double_field(entry->f2_as_index()), 0); break; case atos: - SET_LOCALS_OBJECT(object->obj_field(entry->f2()), 0); + SET_LOCALS_OBJECT(object->obj_field(entry->f2_as_index()), 0); break; default: @@ -629,516 +610,6 @@ int CppInterpreter::empty_entry(Method* method, intptr_t UNUSED, TRAPS) { return 0; } -int CppInterpreter::method_handle_entry(Method* method, - intptr_t UNUSED, TRAPS) { - JavaThread *thread = (JavaThread *) THREAD; - ZeroStack *stack = thread->zero_stack(); - int argument_slots = method->size_of_parameters(); - int result_slots = type2size[result_type_of(method)]; - intptr_t *vmslots = stack->sp(); - intptr_t *unwind_sp = vmslots + argument_slots; - - // Find the MethodType - address p = (address) method; - for (jint* pc = method->method_type_offsets_chain(); (*pc) != -1; pc++) { - p = *(address*)(p + (*pc)); - } - oop method_type = (oop) p; - - // The MethodHandle is in the slot after the arguments - int num_vmslots = argument_slots - 1; - oop method_handle = VMSLOTS_OBJECT(num_vmslots); - - // InvokeGeneric requires some extra shuffling - oop mhtype = java_lang_invoke_MethodHandle::type(method_handle); - bool is_exact = mhtype == method_type; - if (!is_exact) { - if (true || // FIXME - method->intrinsic_id() == vmIntrinsics::_invokeExact) { - CALL_VM_NOCHECK_NOFIX( - SharedRuntime::throw_WrongMethodTypeException( - thread, method_type, mhtype)); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - stack->set_sp(unwind_sp); - return 0; - } - assert(method->intrinsic_id() == vmIntrinsics::_invokeGeneric, "should be"); - - // Load up an adapter from the calling type - // NB the x86 code for this (in methodHandles_x86.cpp, search for - // "genericInvoker") is really really odd. I'm hoping it's trying - // to accomodate odd VM/class library combinations I can ignore. - oop adapter = NULL; //FIXME: load the adapter from the CP cache - IF (adapter == NULL) { - CALL_VM_NOCHECK_NOFIX( - SharedRuntime::throw_WrongMethodTypeException( - thread, method_type, mhtype)); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - stack->set_sp(unwind_sp); - return 0; - } - - // Adapters are shared among form-families of method-type. The - // type being called is passed as a trusted first argument so that - // the adapter knows the actual types of its arguments and return - // values. - insert_vmslots(num_vmslots + 1, 1, THREAD); - if (HAS_PENDING_EXCEPTION) { - // NB all oops trashed! - stack->set_sp(unwind_sp); - return 0; - } - - vmslots = stack->sp(); - num_vmslots++; - SET_VMSLOTS_OBJECT(method_type, num_vmslots); - - method_handle = adapter; - } - - // Start processing - process_method_handle(method_handle, THREAD); - if (HAS_PENDING_EXCEPTION) - result_slots = 0; - - // If this is an invokeExact then the eventual callee will not - // have unwound the method handle argument so we have to do it. - // If a result is being returned the it will be above the method - // handle argument we're unwinding. - if (is_exact) { - intptr_t result[2]; - for (int i = 0; i < result_slots; i++) - result[i] = stack->pop(); - stack->pop(); - for (int i = result_slots - 1; i >= 0; i--) - stack->push(result[i]); - } - - // Check - assert(stack->sp() == unwind_sp - result_slots, "should be"); - - // No deoptimized frames on the stack - return 0; -} - -void CppInterpreter::process_method_handle(oop method_handle, TRAPS) { - JavaThread *thread = (JavaThread *) THREAD; - ZeroStack *stack = thread->zero_stack(); - intptr_t *vmslots = stack->sp(); - - bool direct_to_method = false; - BasicType src_rtype = T_ILLEGAL; - BasicType dst_rtype = T_ILLEGAL; - - MethodHandleEntry *entry = - java_lang_invoke_MethodHandle::vmentry(method_handle); - MethodHandles::EntryKind entry_kind = - (MethodHandles::EntryKind) (((intptr_t) entry) & 0xffffffff); - - Method* method = NULL; - switch (entry_kind) { - case MethodHandles::_invokestatic_mh: - direct_to_method = true; - break; - - case MethodHandles::_invokespecial_mh: - case MethodHandles::_invokevirtual_mh: - case MethodHandles::_invokeinterface_mh: - { - oop receiver = - VMSLOTS_OBJECT( - java_lang_invoke_MethodHandle::vmslots(method_handle) - 1); - if (receiver == NULL) { - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_NullPointerException())); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - if (entry_kind != MethodHandles::_invokespecial_mh) { - intptr_t index = java_lang_invoke_DirectMethodHandle::vmindex(method_handle); - InstanceKlass* rcvrKlass = - (InstanceKlass *) receiver->klass(); - if (entry_kind == MethodHandles::_invokevirtual_mh) { - method = (Method*) rcvrKlass->start_of_vtable()[index]; - } - else { - oop iclass = java_lang_invoke_MethodHandle::next_target(method_handle); - itableOffsetEntry* ki = - (itableOffsetEntry *) rcvrKlass->start_of_itable(); - int i, length = rcvrKlass->itable_length(); - for (i = 0; i < length; i++, ki++ ) { - if (ki->interface_klass() == iclass) - break; - } - if (i == length) { - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_IncompatibleClassChangeError())); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - itableMethodEntry* im = ki->first_method_entry(receiver->klass()); - method = im[index].method(); - if (method == NULL) { - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_AbstractMethodError())); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - } - } - } - direct_to_method = true; - break; - - case MethodHandles::_bound_ref_direct_mh: - case MethodHandles::_bound_int_direct_mh: - case MethodHandles::_bound_long_direct_mh: - direct_to_method = true; - // fall through - case MethodHandles::_bound_ref_mh: - case MethodHandles::_bound_int_mh: - case MethodHandles::_bound_long_mh: - { - BasicType arg_type = T_ILLEGAL; - int arg_mask = -1; - int arg_slots = -1; - MethodHandles::get_ek_bound_mh_info( - entry_kind, arg_type, arg_mask, arg_slots); - int arg_slot = - java_lang_invoke_BoundMethodHandle::vmargslot(method_handle); - - // Create the new slot(s) - intptr_t *unwind_sp = calculate_unwind_sp(stack, method_handle); - insert_vmslots(arg_slot, arg_slots, THREAD); - if (HAS_PENDING_EXCEPTION) { - // all oops trashed - stack->set_sp(unwind_sp); - return; - } - vmslots = stack->sp(); - - // Store bound argument into new stack slot - oop arg = java_lang_invoke_BoundMethodHandle::argument(method_handle); - if (arg_type == T_OBJECT) { - assert(arg_slots == 1, "should be"); - SET_VMSLOTS_OBJECT(arg, arg_slot); - } - else { - jvalue arg_value; - arg_type = java_lang_boxing_object::get_value(arg, &arg_value); - switch (arg_type) { - case T_BOOLEAN: - SET_VMSLOTS_INT(arg_value.z, arg_slot); - break; - case T_CHAR: - SET_VMSLOTS_INT(arg_value.c, arg_slot); - break; - case T_BYTE: - SET_VMSLOTS_INT(arg_value.b, arg_slot); - break; - case T_SHORT: - SET_VMSLOTS_INT(arg_value.s, arg_slot); - break; - case T_INT: - SET_VMSLOTS_INT(arg_value.i, arg_slot); - break; - case T_FLOAT: - SET_VMSLOTS_FLOAT(arg_value.f, arg_slot); - break; - case T_LONG: - SET_VMSLOTS_LONG(arg_value.j, arg_slot + 1); - break; - case T_DOUBLE: - SET_VMSLOTS_DOUBLE(arg_value.d, arg_slot + 1); - break; - default: - tty->print_cr("unhandled type %s", type2name(arg_type)); - ShouldNotReachHere(); - } - } - } - break; - - case MethodHandles::_adapter_retype_only: - case MethodHandles::_adapter_retype_raw: - src_rtype = result_type_of_handle( - java_lang_invoke_MethodHandle::next_target(method_handle)); - dst_rtype = result_type_of_handle(method_handle); - break; - - case MethodHandles::_adapter_check_cast: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - oop arg = VMSLOTS_OBJECT(arg_slot); - if (arg != NULL) { - Klass* objKlassOop = arg->klass(); - Klass* klassOf = java_lang_Class::as_Klass( - java_lang_invoke_AdapterMethodHandle::argument(method_handle)); - - if (objKlassOop != klassOf && - !objKlassOop->is_subtype_of(klassOf)) { - ResourceMark rm(THREAD); - const char* objName = Klass::cast(objKlassOop)->external_name(); - const char* klassName = Klass::cast(klassOf)->external_name(); - char* message = SharedRuntime::generate_class_cast_message( - objName, klassName); - - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_ClassCastException(), message)); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - } - } - break; - - case MethodHandles::_adapter_dup_args: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int conv = - java_lang_invoke_AdapterMethodHandle::conversion(method_handle); - int num_slots = -MethodHandles::adapter_conversion_stack_move(conv); - assert(num_slots > 0, "should be"); - - // Create the new slot(s) - intptr_t *unwind_sp = calculate_unwind_sp(stack, method_handle); - stack->overflow_check(num_slots, THREAD); - if (HAS_PENDING_EXCEPTION) { - // all oops trashed - stack->set_sp(unwind_sp); - return; - } - - // Duplicate the arguments - for (int i = num_slots - 1; i >= 0; i--) - stack->push(*VMSLOTS_SLOT(arg_slot + i)); - - vmslots = stack->sp(); // unused, but let the compiler figure that out - } - break; - - case MethodHandles::_adapter_drop_args: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int conv = - java_lang_invoke_AdapterMethodHandle::conversion(method_handle); - int num_slots = MethodHandles::adapter_conversion_stack_move(conv); - assert(num_slots > 0, "should be"); - - remove_vmslots(arg_slot, num_slots, THREAD); // doesn't trap - vmslots = stack->sp(); // unused, but let the compiler figure that out - } - break; - - case MethodHandles::_adapter_opt_swap_1: - case MethodHandles::_adapter_opt_swap_2: - case MethodHandles::_adapter_opt_rot_1_up: - case MethodHandles::_adapter_opt_rot_1_down: - case MethodHandles::_adapter_opt_rot_2_up: - case MethodHandles::_adapter_opt_rot_2_down: - { - int arg1 = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int conv = - java_lang_invoke_AdapterMethodHandle::conversion(method_handle); - int arg2 = MethodHandles::adapter_conversion_vminfo(conv); - - int swap_bytes = 0, rotate = 0; - MethodHandles::get_ek_adapter_opt_swap_rot_info( - entry_kind, swap_bytes, rotate); - int swap_slots = swap_bytes >> LogBytesPerWord; - - intptr_t tmp; - switch (rotate) { - case 0: // swap - for (int i = 0; i < swap_slots; i++) { - tmp = *VMSLOTS_SLOT(arg1 + i); - SET_VMSLOTS_SLOT(VMSLOTS_SLOT(arg2 + i), arg1 + i); - SET_VMSLOTS_SLOT(&tmp, arg2 + i); - } - break; - - case 1: // up - assert(arg1 - swap_slots > arg2, "should be"); - - tmp = *VMSLOTS_SLOT(arg1); - for (int i = arg1 - swap_slots; i >= arg2; i--) - SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i), i + swap_slots); - SET_VMSLOTS_SLOT(&tmp, arg2); - - break; - - case -1: // down - assert(arg2 - swap_slots > arg1, "should be"); - - tmp = *VMSLOTS_SLOT(arg1); - for (int i = arg1 + swap_slots; i <= arg2; i++) - SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i), i - swap_slots); - SET_VMSLOTS_SLOT(&tmp, arg2); - break; - - default: - ShouldNotReachHere(); - } - } - break; - - case MethodHandles::_adapter_opt_i2l: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int arg = VMSLOTS_INT(arg_slot); - intptr_t *unwind_sp = calculate_unwind_sp(stack, method_handle); - insert_vmslots(arg_slot, 1, THREAD); - if (HAS_PENDING_EXCEPTION) { - // all oops trashed - stack->set_sp(unwind_sp); - return; - } - vmslots = stack->sp(); - arg_slot++; - SET_VMSLOTS_LONG(arg, arg_slot); - } - break; - - case MethodHandles::_adapter_opt_unboxi: - case MethodHandles::_adapter_opt_unboxl: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - oop arg = VMSLOTS_OBJECT(arg_slot); - jvalue arg_value; - if (arg == NULL) { - // queue a nullpointer exception for the caller - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_NullPointerException())); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - BasicType arg_type = java_lang_boxing_object::get_value(arg, &arg_value); - if (arg_type == T_LONG || arg_type == T_DOUBLE) { - intptr_t *unwind_sp = calculate_unwind_sp(stack, method_handle); - insert_vmslots(arg_slot, 1, THREAD); - if (HAS_PENDING_EXCEPTION) { - // all oops trashed - stack->set_sp(unwind_sp); - return; - } - vmslots = stack->sp(); - arg_slot++; - } - switch (arg_type) { - case T_BOOLEAN: - SET_VMSLOTS_INT(arg_value.z, arg_slot); - break; - case T_CHAR: - SET_VMSLOTS_INT(arg_value.c, arg_slot); - break; - case T_BYTE: - SET_VMSLOTS_INT(arg_value.b, arg_slot); - break; - case T_SHORT: - SET_VMSLOTS_INT(arg_value.s, arg_slot); - break; - case T_INT: - SET_VMSLOTS_INT(arg_value.i, arg_slot); - break; - case T_FLOAT: - SET_VMSLOTS_FLOAT(arg_value.f, arg_slot); - break; - case T_LONG: - SET_VMSLOTS_LONG(arg_value.j, arg_slot); - break; - case T_DOUBLE: - SET_VMSLOTS_DOUBLE(arg_value.d, arg_slot); - break; - default: - tty->print_cr("unhandled type %s", type2name(arg_type)); - ShouldNotReachHere(); - } - } - break; - - default: - tty->print_cr("unhandled entry_kind %s", - MethodHandles::entry_name(entry_kind)); - ShouldNotReachHere(); - } - - // Continue along the chain - if (direct_to_method) { - if (method == NULL) { - method = - (Method*) java_lang_invoke_MethodHandle::vmtarget(method_handle); - } - address entry_point = method->from_interpreted_entry(); - Interpreter::invoke_method(method, entry_point, THREAD); - } - else { - process_method_handle( - java_lang_invoke_MethodHandle::next_target(method_handle), THREAD); - } - // NB all oops now trashed - - // Adapt the result type, if necessary - if (src_rtype != dst_rtype && !HAS_PENDING_EXCEPTION) { - switch (dst_rtype) { - case T_VOID: - for (int i = 0; i < type2size[src_rtype]; i++) - stack->pop(); - return; - - case T_INT: - switch (src_rtype) { - case T_VOID: - stack->overflow_check(1, CHECK); - stack->push(0); - return; - - case T_BOOLEAN: - case T_CHAR: - case T_BYTE: - case T_SHORT: - return; - } - // INT results sometimes need narrowing - case T_BOOLEAN: - case T_CHAR: - case T_BYTE: - case T_SHORT: - switch (src_rtype) { - case T_INT: - return; - } - } - - tty->print_cr("unhandled conversion:"); - tty->print_cr("src_rtype = %s", type2name(src_rtype)); - tty->print_cr("dst_rtype = %s", type2name(dst_rtype)); - ShouldNotReachHere(); - } -} - // The new slots will be inserted before slot insert_before. // Slots < insert_before will have the same slot number after the insert. // Slots >= insert_before will become old_slot + num_slots. @@ -1380,10 +851,6 @@ address AbstractInterpreterGenerator::generate_method_entry( entry_point = ((InterpreterGenerator*) this)->generate_abstract_entry(); break; - case Interpreter::method_handle: - entry_point = ((InterpreterGenerator*) this)->generate_method_handle_entry(); - break; - case Interpreter::java_lang_math_sin: case Interpreter::java_lang_math_cos: case Interpreter::java_lang_math_tan: @@ -1391,6 +858,8 @@ address AbstractInterpreterGenerator::generate_method_entry( case Interpreter::java_lang_math_log: case Interpreter::java_lang_math_log10: case Interpreter::java_lang_math_sqrt: + case Interpreter::java_lang_math_pow: + case Interpreter::java_lang_math_exp: entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind); break; diff --git a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp index 2faae7169ab..3a6bd52f2cb 100644 --- a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp +++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp @@ -36,7 +36,6 @@ static int native_entry(Method* method, intptr_t UNUSED, TRAPS); static int accessor_entry(Method* method, intptr_t UNUSED, TRAPS); static int empty_entry(Method* method, intptr_t UNUSED, TRAPS); - static int method_handle_entry(Method* method, intptr_t UNUSED, TRAPS); public: // Main loop of normal_entry @@ -44,7 +43,6 @@ private: // Helpers for method_handle_entry - static void process_method_handle(oop method_handle, TRAPS); static void insert_vmslots(int insert_before, int num_slots, TRAPS); static void remove_vmslots(int first_slot, int num_slots, TRAPS); static BasicType result_type_of_handle(oop method_handle); diff --git a/hotspot/src/cpu/zero/vm/frame_zero.cpp b/hotspot/src/cpu/zero/vm/frame_zero.cpp index 6ce4b23bc6b..8643af5953f 100644 --- a/hotspot/src/cpu/zero/vm/frame_zero.cpp +++ b/hotspot/src/cpu/zero/vm/frame_zero.cpp @@ -351,7 +351,7 @@ void SharkFrame::identify_word(int frame_index, switch (offset) { case pc_off: strncpy(fieldbuf, "pc", buflen); - if (method()->is_oop()) { + if (method()->is_method()) { nmethod *code = method()->code(); if (code && code->pc_desc_at(pc())) { SimpleScopeDesc ssd(code, pc()); @@ -367,7 +367,7 @@ void SharkFrame::identify_word(int frame_index, case method_off: strncpy(fieldbuf, "method", buflen); - if (method()->is_oop()) { + if (method()->is_method()) { method()->name_and_sig_as_C_string(valuebuf, buflen); } return; @@ -378,7 +378,7 @@ void SharkFrame::identify_word(int frame_index, } // Variable part - if (method()->is_oop()) { + if (method()->is_method()) { identify_vp_word(frame_index, addr_of_word(offset), addr_of_word(header_words + 1), unextended_sp() + method()->max_stack(), @@ -430,4 +430,3 @@ intptr_t *frame::initial_deoptimization_info() { // unused... but returns fp() to minimize changes introduced by 7087445 return fp(); } - diff --git a/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp b/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp index e41ec13798a..2bc703ae032 100644 --- a/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp +++ b/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp @@ -36,6 +36,8 @@ inline frame::frame() { _deopt_state = unknown; } +inline address frame::sender_pc() const { ShouldNotCallThis(); } + inline frame::frame(ZeroFrame* zf, intptr_t* sp) { _zeroframe = zf; _sp = sp; diff --git a/hotspot/src/cpu/zero/vm/icBuffer_zero.cpp b/hotspot/src/cpu/zero/vm/icBuffer_zero.cpp index af2f8bec5c1..95d0e115a66 100644 --- a/hotspot/src/cpu/zero/vm/icBuffer_zero.cpp +++ b/hotspot/src/cpu/zero/vm/icBuffer_zero.cpp @@ -40,7 +40,7 @@ int InlineCacheBuffer::ic_stub_code_size() { } void InlineCacheBuffer::assemble_ic_buffer_code(address code_begin, - Metadata* cached_oop, + void* cached_oop, address entry_point) { // NB ic_stub_code_size() must return the size of the code we generate ShouldNotCallThis(); @@ -51,7 +51,6 @@ address InlineCacheBuffer::ic_buffer_entry_point(address code_begin) { ShouldNotCallThis(); } -Metadata* InlineCacheBuffer::ic_buffer_cached_oop(address code_begin) { - // NB ic_stub_code_size() must return the size of the code we generate +void* InlineCacheBuffer::ic_buffer_cached_value(address code_begin) { ShouldNotCallThis(); } diff --git a/hotspot/src/cpu/zero/vm/methodHandles_zero.cpp b/hotspot/src/cpu/zero/vm/methodHandles_zero.cpp index 35f4b11f5d3..ea1bc0eedc1 100644 --- a/hotspot/src/cpu/zero/vm/methodHandles_zero.cpp +++ b/hotspot/src/cpu/zero/vm/methodHandles_zero.cpp @@ -24,26 +24,159 @@ */ #include "precompiled.hpp" +#include "interpreter/interpreterGenerator.hpp" #include "interpreter/interpreter.hpp" #include "memory/allocation.inline.hpp" #include "prims/methodHandles.hpp" -int MethodHandles::adapter_conversion_ops_supported_mask() { - return ((1<zero_stack(); + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + + // Trim back the stack to put the parameters at the top + stack->set_sp(istate->stack() + 1); + + Interpreter::invoke_method(method, method->from_interpreted_entry(), THREAD); + + // Convert the result + istate->set_stack(stack->sp() - 1); + } -void MethodHandles::generate_method_handle_stub(MacroAssembler* masm, - MethodHandles::EntryKind ek) { - init_entry(ek, (MethodHandleEntry *) ek); +oop MethodHandles::popFromStack(TRAPS) { + + JavaThread *thread = (JavaThread *) THREAD; + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + intptr_t* topOfStack = istate->stack(); + + oop top = STACK_OBJECT(-1); + MORE_STACK(-1); + istate->set_stack(topOfStack); + + return top; + +} + +int MethodHandles::method_handle_entry_invokeBasic(Method* method, intptr_t UNUSED, TRAPS) { + + JavaThread *thread = (JavaThread *) THREAD; + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + intptr_t* topOfStack = istate->stack(); + + // 'this' is a MethodHandle. We resolve the target method by accessing this.form.vmentry.vmtarget. + int numArgs = method->size_of_parameters(); + oop lform1 = java_lang_invoke_MethodHandle::form(STACK_OBJECT(-numArgs)); // this.form + oop vmEntry1 = java_lang_invoke_LambdaForm::vmentry(lform1); + Method* vmtarget = (Method*) java_lang_invoke_MemberName::vmtarget(vmEntry1); + + invoke_target(vmtarget, THREAD); + + // No deoptimized frames on the stack + return 0; +} + +int MethodHandles::method_handle_entry_linkToStaticOrSpecial(Method* method, intptr_t UNUSED, TRAPS) { + + // Pop appendix argument from stack. This is a MemberName which we resolve to the + // target method. + oop vmentry = popFromStack(THREAD); + + Method* vmtarget = (Method*) java_lang_invoke_MemberName::vmtarget(vmentry); + + invoke_target(vmtarget, THREAD); + + return 0; +} + +int MethodHandles::method_handle_entry_linkToInterface(Method* method, intptr_t UNUSED, TRAPS) { + JavaThread *thread = (JavaThread *) THREAD; + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + + // Pop appendix argument from stack. This is a MemberName which we resolve to the + // target method. + oop vmentry = popFromStack(THREAD); + intptr_t* topOfStack = istate->stack(); + + // Resolve target method by looking up in the receiver object's itable. + Klass* clazz = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(vmentry)); + intptr_t vmindex = java_lang_invoke_MemberName::vmindex(vmentry); + Method* target = (Method*) java_lang_invoke_MemberName::vmtarget(vmentry); + + int numArgs = target->size_of_parameters(); + oop recv = STACK_OBJECT(-numArgs); + + InstanceKlass* klass_part = InstanceKlass::cast(recv->klass()); + itableOffsetEntry* ki = (itableOffsetEntry*) klass_part->start_of_itable(); + int i; + for ( i = 0 ; i < klass_part->itable_length() ; i++, ki++ ) { + if (ki->interface_klass() == clazz) break; + } + + itableMethodEntry* im = ki->first_method_entry(recv->klass()); + Method* vmtarget = im[vmindex].method(); + + invoke_target(vmtarget, THREAD); + + return 0; +} + +int MethodHandles::method_handle_entry_linkToVirtual(Method* method, intptr_t UNUSED, TRAPS) { + JavaThread *thread = (JavaThread *) THREAD; + + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + + // Pop appendix argument from stack. This is a MemberName which we resolve to the + // target method. + oop vmentry = popFromStack(THREAD); + intptr_t* topOfStack = istate->stack(); + + // Resolve target method by looking up in the receiver object's vtable. + intptr_t vmindex = java_lang_invoke_MemberName::vmindex(vmentry); + Method* target = (Method*) java_lang_invoke_MemberName::vmtarget(vmentry); + int numArgs = target->size_of_parameters(); + oop recv = STACK_OBJECT(-numArgs); + Klass* clazz = recv->klass(); + Klass* klass_part = InstanceKlass::cast(clazz); + klassVtable* vtable = klass_part->vtable(); + Method* vmtarget = vtable->method_at(vmindex); + + invoke_target(vmtarget, THREAD); + + return 0; +} + +int MethodHandles::method_handle_entry_invalid(Method* method, intptr_t UNUSED, TRAPS) { + ShouldNotReachHere(); + return 0; +} + +address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* masm, + vmIntrinsics::ID iid) { + switch (iid) { + case vmIntrinsics::_invokeGeneric: + case vmIntrinsics::_compiledLambdaForm: + // Perhaps surprisingly, the symbolic references visible to Java are not directly used. + // They are linked to Java-generated adapters via MethodHandleNatives.linkMethod. + // They all allow an appendix argument. + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_invalid); + case vmIntrinsics::_invokeBasic: + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_invokeBasic); + case vmIntrinsics::_linkToStatic: + case vmIntrinsics::_linkToSpecial: + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_linkToStaticOrSpecial); + case vmIntrinsics::_linkToInterface: + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_linkToInterface); + case vmIntrinsics::_linkToVirtual: + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_linkToVirtual); + default: + ShouldNotReachHere(); + return NULL; + } } diff --git a/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp b/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp index a71fce34f12..f4eec005c4d 100644 --- a/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp +++ b/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp @@ -26,6 +26,14 @@ // Adapters enum /* platform_dependent_constants */ { - adapter_code_size = 0 + adapter_code_size = sizeof(ZeroEntry) * (Interpreter::method_handle_invoke_LAST - Interpreter::method_handle_invoke_FIRST + 1) }; +private: + static oop popFromStack(TRAPS); + static void invoke_target(Method* method, TRAPS); + static int method_handle_entry_invokeBasic(Method* method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_linkToStaticOrSpecial(Method* method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_linkToVirtual(Method* method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_linkToInterface(Method* method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_invalid(Method* method, intptr_t UNUSED, TRAPS); diff --git a/hotspot/src/cpu/zero/vm/register_zero.hpp b/hotspot/src/cpu/zero/vm/register_zero.hpp index 0bcc7638248..1ce7141adaf 100644 --- a/hotspot/src/cpu/zero/vm/register_zero.hpp +++ b/hotspot/src/cpu/zero/vm/register_zero.hpp @@ -114,5 +114,8 @@ class ConcreteRegisterImpl : public AbstractRegisterImpl { }; CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1)); +#ifndef DONT_USE_REGISTER_DEFINES +#define noreg ((Register)(noreg_RegisterEnumValue)) +#endif #endif // CPU_ZERO_VM_REGISTER_ZERO_HPP diff --git a/hotspot/src/cpu/zero/vm/relocInfo_zero.cpp b/hotspot/src/cpu/zero/vm/relocInfo_zero.cpp index 13f095e4746..ed7ee7bca6a 100644 --- a/hotspot/src/cpu/zero/vm/relocInfo_zero.cpp +++ b/hotspot/src/cpu/zero/vm/relocInfo_zero.cpp @@ -77,3 +77,7 @@ void poll_return_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dst) { ShouldNotCallThis(); } + +void metadata_Relocation::pd_fix_value(address x) { + ShouldNotCallThis(); +} diff --git a/hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp b/hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp index 3cb8cd7e46a..123d71ec044 100644 --- a/hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp +++ b/hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp @@ -35,6 +35,7 @@ #include "runtime/sharedRuntime.hpp" #include "runtime/vframeArray.hpp" #include "vmreg_zero.inline.hpp" + #ifdef COMPILER1 #include "c1/c1_Runtime1.hpp" #endif @@ -47,6 +48,12 @@ #endif + +static address zero_null_code_stub() { + address start = ShouldNotCallThisStub(); + return start; +} + int SharedRuntime::java_calling_convention(const BasicType *sig_bt, VMRegPair *regs, int total_args_passed, @@ -63,16 +70,14 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters( AdapterFingerPrint *fingerprint) { return AdapterHandlerLibrary::new_entry( fingerprint, - ShouldNotCallThisStub(), - ShouldNotCallThisStub(), - ShouldNotCallThisStub()); + CAST_FROM_FN_PTR(address,zero_null_code_stub), + CAST_FROM_FN_PTR(address,zero_null_code_stub), + CAST_FROM_FN_PTR(address,zero_null_code_stub)); } nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, methodHandle method, int compile_id, - int total_args_passed, - int max_arg, BasicType *sig_bt, VMRegPair *regs, BasicType ret_type) { @@ -96,19 +101,20 @@ uint SharedRuntime::out_preserve_stack_slots() { ShouldNotCallThis(); } +JRT_LEAF(void, zero_stub()) + ShouldNotCallThis(); +JRT_END + static RuntimeStub* generate_empty_runtime_stub(const char* name) { - CodeBuffer buffer(name, 0, 0); - return RuntimeStub::new_runtime_stub(name, &buffer, 0, 0, NULL, false); + return CAST_FROM_FN_PTR(RuntimeStub*,zero_stub); } static SafepointBlob* generate_empty_safepoint_blob() { - CodeBuffer buffer("handler_blob", 0, 0); - return SafepointBlob::create(&buffer, NULL, 0); + return CAST_FROM_FN_PTR(SafepointBlob*,zero_stub); } static DeoptimizationBlob* generate_empty_deopt_blob() { - CodeBuffer buffer("handler_blob", 0, 0); - return DeoptimizationBlob::create(&buffer, NULL, 0, 0, 0, 0); + return CAST_FROM_FN_PTR(DeoptimizationBlob*,zero_stub); } @@ -116,7 +122,7 @@ void SharedRuntime::generate_deopt_blob() { _deopt_blob = generate_empty_deopt_blob(); } -SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, bool cause_return) { +SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_type) { return generate_empty_safepoint_blob(); } @@ -124,6 +130,7 @@ RuntimeStub* SharedRuntime::generate_resolve_blob(address destination, const cha return generate_empty_runtime_stub("resolve_blob"); } + int SharedRuntime::c_calling_convention(const BasicType *sig_bt, VMRegPair *regs, int total_args_passed) { diff --git a/hotspot/src/share/vm/asm/codeBuffer.cpp b/hotspot/src/share/vm/asm/codeBuffer.cpp index bb1ae18fcb5..a3fc112f54f 100644 --- a/hotspot/src/share/vm/asm/codeBuffer.cpp +++ b/hotspot/src/share/vm/asm/codeBuffer.cpp @@ -758,7 +758,7 @@ void CodeBuffer::relocate_code_to(CodeBuffer* dest) const { } } - if (dest->blob() == NULL) { + if (dest->blob() == NULL && dest_filled != NULL) { // Destination is a final resting place, not just another buffer. // Normalize uninitialized bytes in the final padding. Copy::fill_to_bytes(dest_filled, dest_end - dest_filled, diff --git a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp index b0870c0f1e2..4dc2ef451c2 100644 --- a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp @@ -320,6 +320,7 @@ class AbstractInterpreterGenerator: public StackObj { void bang_stack_shadow_pages(bool native_call); void generate_all(); + void initialize_method_handle_entries(); public: AbstractInterpreterGenerator(StubQueue* _code); diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp index 6c18761dba2..a9d6cc9a981 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp @@ -235,10 +235,6 @@ #endif #endif -// JavaStack Implementation -#define MORE_STACK(count) \ - (topOfStack -= ((count) * Interpreter::stackElementWords)) - #define UPDATE_PC(opsize) {pc += opsize; } /* @@ -575,7 +571,7 @@ BytecodeInterpreter::run(interpreterState istate) { /* 0xE0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, /* 0xE4 */ &&opc_default, &&opc_fast_aldc, &&opc_fast_aldc_w, &&opc_return_register_finalizer, -/* 0xE8 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, +/* 0xE8 */ &&opc_invokehandle,&&opc_default, &&opc_default, &&opc_default, /* 0xEC */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, /* 0xF0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, @@ -1773,7 +1769,7 @@ run: oop obj; if ((Bytecodes::Code)opcode == Bytecodes::_getstatic) { - Klass* k = (Klass*) cache->f1(); + Klass* k = cache->f1_as_klass(); obj = k->java_mirror(); MORE_STACK(1); // Assume single slot push } else { @@ -1885,7 +1881,7 @@ run: --count; } if ((Bytecodes::Code)opcode == Bytecodes::_putstatic) { - Klass* k = (Klass*) cache->f1(); + Klass* k = cache->f1_as_klass(); obj = k->java_mirror(); } else { --count; @@ -2190,6 +2186,7 @@ run: } CASE(_invokedynamic): { + if (!EnableInvokeDynamic) { // We should not encounter this bytecode if !EnableInvokeDynamic. // The verifier will stop it. However, if we get past the verifier, @@ -2199,30 +2196,68 @@ run: ShouldNotReachHere(); } - int index = Bytes::get_native_u4(pc+1); + u4 index = Bytes::get_native_u4(pc+1); + ConstantPoolCacheEntry* cache = cp->constant_pool()->invokedynamic_cp_cache_entry_at(index); // We are resolved if the resolved_references field contains a non-null object (CallSite, etc.) // This kind of CP cache entry does not need to match the flags byte, because // there is a 1-1 relation between bytecode type and CP entry type. - ConstantPool* constants = METHOD->constants(); - oop result = constants->resolved_references()->obj_at(index); - if (result == NULL) { + if (! cache->is_resolved((Bytecodes::Code) opcode)) { CALL_VM(InterpreterRuntime::resolve_invokedynamic(THREAD), handle_exception); - result = THREAD->vm_result(); + cache = cp->constant_pool()->invokedynamic_cp_cache_entry_at(index); } - VERIFY_OOP(result); - oop method_handle = java_lang_invoke_CallSite::target(result); - CHECK_NULL(method_handle); + Method* method = cache->f1_as_method(); + VERIFY_OOP(method); - istate->set_msg(call_method_handle); - istate->set_callee((Method*) method_handle); + if (cache->has_appendix()) { + ConstantPool* constants = METHOD->constants(); + SET_STACK_OBJECT(cache->appendix_if_resolved(constants), 0); + MORE_STACK(1); + } + + istate->set_msg(call_method); + istate->set_callee(method); + istate->set_callee_entry_point(method->from_interpreted_entry()); istate->set_bcp_advance(5); UPDATE_PC_AND_RETURN(0); // I'll be back... } + CASE(_invokehandle): { + + if (!EnableInvokeDynamic) { + ShouldNotReachHere(); + } + + u2 index = Bytes::get_native_u2(pc+1); + ConstantPoolCacheEntry* cache = cp->entry_at(index); + + if (! cache->is_resolved((Bytecodes::Code) opcode)) { + CALL_VM(InterpreterRuntime::resolve_invokehandle(THREAD), + handle_exception); + cache = cp->entry_at(index); + } + + Method* method = cache->f1_as_method(); + + VERIFY_OOP(method); + + if (cache->has_appendix()) { + ConstantPool* constants = METHOD->constants(); + SET_STACK_OBJECT(cache->appendix_if_resolved(constants), 0); + MORE_STACK(1); + } + + istate->set_msg(call_method); + istate->set_callee(method); + istate->set_callee_entry_point(method->from_interpreted_entry()); + istate->set_bcp_advance(3); + + UPDATE_PC_AND_RETURN(0); // I'll be back... + } + CASE(_invokeinterface): { u2 index = Bytes::get_native_u2(pc+1); diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp index c1614cdf8e5..d528034d3f0 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp @@ -50,6 +50,10 @@ #ifdef CC_INTERP +// JavaStack Implementation +#define MORE_STACK(count) \ + (topOfStack -= ((count) * Interpreter::stackElementWords)) + // CVM definitions find hotspot equivalents... union VMJavaVal64 { @@ -107,7 +111,6 @@ public: rethrow_exception, // unwinding and throwing exception // requests to frame manager from C++ interpreter call_method, // request for new frame from interpreter, manager responds with method_entry - call_method_handle, // like the above, except the callee is a method handle return_from_method, // request from interpreter to unwind, manager responds with method_continue more_monitors, // need a new monitor throwing_exception, // unwind stack and rethrow diff --git a/hotspot/src/share/vm/interpreter/cppInterpreter.cpp b/hotspot/src/share/vm/interpreter/cppInterpreter.cpp index 9a6669519f6..0007aa8be25 100644 --- a/hotspot/src/share/vm/interpreter/cppInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/cppInterpreter.cpp @@ -117,7 +117,6 @@ void CppInterpreterGenerator::generate_all() { method_entry(empty); method_entry(accessor); method_entry(abstract); - method_entry(method_handle); method_entry(java_lang_math_sin ); method_entry(java_lang_math_cos ); method_entry(java_lang_math_tan ); @@ -125,7 +124,12 @@ void CppInterpreterGenerator::generate_all() { method_entry(java_lang_math_sqrt ); method_entry(java_lang_math_log ); method_entry(java_lang_math_log10 ); + method_entry(java_lang_math_pow ); + method_entry(java_lang_math_exp ); method_entry(java_lang_ref_reference_get); + + initialize_method_handle_entries(); + Interpreter::_native_entry_begin = Interpreter::code()->code_end(); method_entry(native); method_entry(native_synchronized); diff --git a/hotspot/src/share/vm/interpreter/interpreter.cpp b/hotspot/src/share/vm/interpreter/interpreter.cpp index dad8f9ec751..4513eebb79c 100644 --- a/hotspot/src/share/vm/interpreter/interpreter.cpp +++ b/hotspot/src/share/vm/interpreter/interpreter.cpp @@ -464,3 +464,11 @@ void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) { } } } + +void AbstractInterpreterGenerator::initialize_method_handle_entries() { + // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate: + for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) { + Interpreter::MethodKind kind = (Interpreter::MethodKind) i; + Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract]; + } +} diff --git a/hotspot/src/share/vm/interpreter/templateInterpreter.cpp b/hotspot/src/share/vm/interpreter/templateInterpreter.cpp index beb99fa15e4..53e50b1c7fe 100644 --- a/hotspot/src/share/vm/interpreter/templateInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/templateInterpreter.cpp @@ -373,11 +373,7 @@ void TemplateInterpreterGenerator::generate_all() { method_entry(java_lang_math_pow ) method_entry(java_lang_ref_reference_get) - // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate: - for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) { - Interpreter::MethodKind kind = (Interpreter::MethodKind) i; - Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract]; - } + initialize_method_handle_entries(); // all native method kinds (must be one contiguous block) Interpreter::_native_entry_begin = Interpreter::code()->code_end(); diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index 9159ad945af..367f3f8e009 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -2474,7 +2474,7 @@ typedef BinaryTreeDictionary MetablockTreeDictionary; /* frame */ \ /**********************/ \ \ - X86_ONLY(declare_constant(frame::entry_frame_call_wrapper_offset)) \ + NOT_ZERO(X86_ONLY(declare_constant(frame::entry_frame_call_wrapper_offset))) \ declare_constant(frame::pc_return_offset) \ \ /*************/ \ diff --git a/hotspot/src/share/vm/utilities/macros.hpp b/hotspot/src/share/vm/utilities/macros.hpp index e0e853c3c13..64e331d90b0 100644 --- a/hotspot/src/share/vm/utilities/macros.hpp +++ b/hotspot/src/share/vm/utilities/macros.hpp @@ -282,6 +282,22 @@ #define NOT_WIN64(code) code #endif +#if defined(ZERO) +#define ZERO_ONLY(code) code +#define NOT_ZERO(code) +#else +#define ZERO_ONLY(code) +#define NOT_ZERO(code) code +#endif + +#if defined(SHARK) +#define SHARK_ONLY(code) code +#define NOT_SHARK(code) +#else +#define SHARK_ONLY(code) +#define NOT_SHARK(code) code +#endif + #if defined(IA32) || defined(AMD64) #define X86 #define X86_ONLY(code) code From cb6de3855439cf7956b1da0967b5520be39c01be Mon Sep 17 00:00:00 2001 From: Serguei Spitsyn Date: Mon, 29 Oct 2012 11:35:20 -0700 Subject: [PATCH 125/241] 6533010: SPEC: A few broken links in jvmti.html Fix the incorrect links in jvmti.html reported by the LinkCheck tool Reviewed-by: jjh, dholmes --- hotspot/src/share/vm/prims/jvmti.xml | 47 ++++++++++++--------- hotspot/src/share/vm/prims/jvmtiEnvBase.hpp | 2 +- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/hotspot/src/share/vm/prims/jvmti.xml b/hotspot/src/share/vm/prims/jvmti.xml index 512e3cb0033..517083f20e3 100644 --- a/hotspot/src/share/vm/prims/jvmti.xml +++ b/hotspot/src/share/vm/prims/jvmti.xml @@ -1,7 +1,7 @@ inline) or rejection msg if (m->is_abstract()) return (_msg = "abstract method"); // note: we allow ik->is_abstract() - if (!InstanceKlass::cast(m->method_holder())->is_initialized()) return (_msg = "method holder not initialized"); + if (!m->method_holder()->is_initialized()) return (_msg = "method holder not initialized"); if (m->is_native()) return (_msg = "native method"); nmethod* m_code = m->code(); if (m_code != NULL && m_code->code_size() > InlineSmallCode) diff --git a/hotspot/src/share/vm/runtime/deoptimization.cpp b/hotspot/src/share/vm/runtime/deoptimization.cpp index 962b9882762..01f4dc75fe1 100644 --- a/hotspot/src/share/vm/runtime/deoptimization.cpp +++ b/hotspot/src/share/vm/runtime/deoptimization.cpp @@ -1191,12 +1191,12 @@ void Deoptimization::load_class_by_index(constantPoolHandle constant_pool, int i if (!constant_pool->tag_at(index).is_symbol()) return; - Handle class_loader (THREAD, InstanceKlass::cast(constant_pool->pool_holder())->class_loader()); + Handle class_loader (THREAD, constant_pool->pool_holder()->class_loader()); Symbol* symbol = constant_pool->symbol_at(index); // class name? if (symbol->byte_at(0) != '(') { - Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain()); + Handle protection_domain (THREAD, constant_pool->pool_holder()->protection_domain()); SystemDictionary::resolve_or_null(symbol, class_loader, protection_domain, CHECK); return; } @@ -1206,7 +1206,7 @@ void Deoptimization::load_class_by_index(constantPoolHandle constant_pool, int i for (SignatureStream ss(symbol); !ss.is_done(); ss.next()) { if (ss.is_object()) { Symbol* class_name = ss.as_symbol(CHECK); - Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain()); + Handle protection_domain (THREAD, constant_pool->pool_holder()->protection_domain()); SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK); } } diff --git a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp index 23011684d92..001d5d23e11 100644 --- a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp +++ b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp @@ -36,7 +36,7 @@ oop fieldDescriptor::loader() const { - return InstanceKlass::cast(_cp->pool_holder())->class_loader(); + return _cp->pool_holder()->class_loader(); } Symbol* fieldDescriptor::generic_signature() const { @@ -45,7 +45,7 @@ Symbol* fieldDescriptor::generic_signature() const { } int idx = 0; - InstanceKlass* ik = InstanceKlass::cast(field_holder()); + InstanceKlass* ik = field_holder(); for (AllFieldStream fs(ik); !fs.done(); fs.next()) { if (idx == _index) { return fs.generic_signature(); @@ -58,7 +58,7 @@ Symbol* fieldDescriptor::generic_signature() const { } AnnotationArray* fieldDescriptor::annotations() const { - InstanceKlass* ik = InstanceKlass::cast(field_holder()); + InstanceKlass* ik = field_holder(); Array* md = ik->fields_annotations(); if (md == NULL) return NULL; diff --git a/hotspot/src/share/vm/runtime/fieldDescriptor.hpp b/hotspot/src/share/vm/runtime/fieldDescriptor.hpp index 496b160cd8d..00caf89844f 100644 --- a/hotspot/src/share/vm/runtime/fieldDescriptor.hpp +++ b/hotspot/src/share/vm/runtime/fieldDescriptor.hpp @@ -43,12 +43,12 @@ class fieldDescriptor VALUE_OBJ_CLASS_SPEC { // update the access_flags for the field in the klass void update_klass_field_access_flag() { - InstanceKlass* ik = InstanceKlass::cast(field_holder()); + InstanceKlass* ik = field_holder(); ik->field(index())->set_access_flags(_access_flags.as_short()); } FieldInfo* field() const { - InstanceKlass* ik = InstanceKlass::cast(field_holder()); + InstanceKlass* ik = field_holder(); return ik->field(_index); } @@ -59,46 +59,46 @@ class fieldDescriptor VALUE_OBJ_CLASS_SPEC { Symbol* signature() const { return field()->signature(_cp); } - Klass* field_holder() const { return _cp->pool_holder(); } - ConstantPool* constants() const { return _cp(); } - AccessFlags access_flags() const { return _access_flags; } - oop loader() const; + InstanceKlass* field_holder() const { return _cp->pool_holder(); } + ConstantPool* constants() const { return _cp(); } + AccessFlags access_flags() const { return _access_flags; } + oop loader() const; // Offset (in words) of field from start of instanceOop / Klass* - int offset() const { return field()->offset(); } - Symbol* generic_signature() const; - int index() const { return _index; } - AnnotationArray* annotations() const; + int offset() const { return field()->offset(); } + Symbol* generic_signature() const; + int index() const { return _index; } + AnnotationArray* annotations() const; // Initial field value - bool has_initial_value() const { return field()->initval_index() != 0; } - int initial_value_index() const { return field()->initval_index(); } + bool has_initial_value() const { return field()->initval_index() != 0; } + int initial_value_index() const { return field()->initval_index(); } constantTag initial_value_tag() const; // The tag will return true on one of is_int(), is_long(), is_single(), is_double() - jint int_initial_value() const; - jlong long_initial_value() const; - jfloat float_initial_value() const; - jdouble double_initial_value() const; - oop string_initial_value(TRAPS) const; + jint int_initial_value() const; + jlong long_initial_value() const; + jfloat float_initial_value() const; + jdouble double_initial_value() const; + oop string_initial_value(TRAPS) const; // Field signature type - BasicType field_type() const { return FieldType::basic_type(signature()); } + BasicType field_type() const { return FieldType::basic_type(signature()); } // Access flags - bool is_public() const { return access_flags().is_public(); } - bool is_private() const { return access_flags().is_private(); } - bool is_protected() const { return access_flags().is_protected(); } - bool is_package_private() const { return !is_public() && !is_private() && !is_protected(); } + bool is_public() const { return access_flags().is_public(); } + bool is_private() const { return access_flags().is_private(); } + bool is_protected() const { return access_flags().is_protected(); } + bool is_package_private() const { return !is_public() && !is_private() && !is_protected(); } - bool is_static() const { return access_flags().is_static(); } - bool is_final() const { return access_flags().is_final(); } - bool is_volatile() const { return access_flags().is_volatile(); } - bool is_transient() const { return access_flags().is_transient(); } + bool is_static() const { return access_flags().is_static(); } + bool is_final() const { return access_flags().is_final(); } + bool is_volatile() const { return access_flags().is_volatile(); } + bool is_transient() const { return access_flags().is_transient(); } - bool is_synthetic() const { return access_flags().is_synthetic(); } + bool is_synthetic() const { return access_flags().is_synthetic(); } - bool is_field_access_watched() const { return access_flags().is_field_access_watched(); } + bool is_field_access_watched() const { return access_flags().is_field_access_watched(); } bool is_field_modification_watched() const - { return access_flags().is_field_modification_watched(); } - bool has_generic_signature() const { return access_flags().field_has_generic_signature(); } + { return access_flags().is_field_modification_watched(); } + bool has_generic_signature() const { return access_flags().field_has_generic_signature(); } void set_is_field_access_watched(const bool value) { _access_flags.set_is_field_access_watched(value); diff --git a/hotspot/src/share/vm/runtime/javaCalls.cpp b/hotspot/src/share/vm/runtime/javaCalls.cpp index 0eb14c46212..fe965acb9a2 100644 --- a/hotspot/src/share/vm/runtime/javaCalls.cpp +++ b/hotspot/src/share/vm/runtime/javaCalls.cpp @@ -189,7 +189,7 @@ void JavaCalls::call_default_constructor(JavaThread* thread, methodHandle method assert(method->name() == vmSymbols::object_initializer_name(), "Should only be called for default constructor"); assert(method->signature() == vmSymbols::void_method_signature(), "Should only be called for default constructor"); - InstanceKlass* ik = InstanceKlass::cast(method->method_holder()); + InstanceKlass* ik = method->method_holder(); if (ik->is_initialized() && ik->has_vanilla_constructor()) { // safe to skip constructor call } else { @@ -344,11 +344,11 @@ void JavaCalls::call_helper(JavaValue* result, methodHandle* m, JavaCallArgument #ifdef ASSERT - { Klass* holder = method->method_holder(); + { InstanceKlass* holder = method->method_holder(); // A klass might not be initialized since JavaCall's might be used during the executing of // the . For example, a Thread.start might start executing on an object that is // not fully initialized! (bad Java programming style) - assert(InstanceKlass::cast(holder)->is_linked(), "rewritting must have taken place"); + assert(holder->is_linked(), "rewritting must have taken place"); } #endif diff --git a/hotspot/src/share/vm/runtime/reflection.cpp b/hotspot/src/share/vm/runtime/reflection.cpp index d87c7ae085a..d4756bcf924 100644 --- a/hotspot/src/share/vm/runtime/reflection.cpp +++ b/hotspot/src/share/vm/runtime/reflection.cpp @@ -56,14 +56,14 @@ static void trace_class_resolution(Klass* to_class) { vframeStream vfst(jthread); // skip over any frames belonging to java.lang.Class while (!vfst.at_end() && - InstanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class()) { + vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class()) { vfst.next(); } if (!vfst.at_end()) { // this frame is a likely suspect caller = vfst.method()->method_holder(); line_number = vfst.method()->line_number_from_bci(vfst.bci()); - Symbol* s = InstanceKlass::cast(vfst.method()->method_holder())->source_file_name(); + Symbol* s = vfst.method()->method_holder()->source_file_name(); if (s != NULL) { source_file = s->as_C_string(); } @@ -642,8 +642,8 @@ oop get_mirror_from_signature(methodHandle method, SignatureStream* ss, TRAPS) { case T_OBJECT: case T_ARRAY: Symbol* name = ss->as_symbol(CHECK_NULL); - oop loader = InstanceKlass::cast(method->method_holder())->class_loader(); - oop protection_domain = InstanceKlass::cast(method->method_holder())->protection_domain(); + oop loader = method->method_holder()->class_loader(); + oop protection_domain = method->method_holder()->protection_domain(); Klass* k = SystemDictionary::resolve_or_fail( name, Handle(THREAD, loader), @@ -714,7 +714,7 @@ oop Reflection::new_method(methodHandle method, bool intern_name, bool for_const assert(!method()->is_initializer() || (for_constant_pool_access && method()->is_static()) || (method()->name() == vmSymbols::class_initializer_name() - && Klass::cast(method()->method_holder())->is_interface() && JDK_Version::is_jdk12x_version()), "should call new_constructor instead"); + && method()->method_holder()->is_interface() && JDK_Version::is_jdk12x_version()), "should call new_constructor instead"); instanceKlassHandle holder (THREAD, method->method_holder()); int slot = method->method_idnum(); @@ -832,7 +832,7 @@ oop Reflection::new_field(fieldDescriptor* fd, bool intern_name, TRAPS) { Handle type = new_type(signature, holder, CHECK_NULL); Handle rh = java_lang_reflect_Field::create(CHECK_NULL); - java_lang_reflect_Field::set_clazz(rh(), Klass::cast(fd->field_holder())->java_mirror()); + java_lang_reflect_Field::set_clazz(rh(), fd->field_holder()->java_mirror()); java_lang_reflect_Field::set_slot(rh(), fd->index()); java_lang_reflect_Field::set_name(rh(), name()); java_lang_reflect_Field::set_type(rh(), type()); @@ -900,7 +900,7 @@ oop Reflection::invoke(instanceKlassHandle klass, methodHandle reflected_method, method = reflected_method; } else { // resolve based on the receiver - if (InstanceKlass::cast(reflected_method->method_holder())->is_interface()) { + if (reflected_method->method_holder()->is_interface()) { // resolve interface call if (ReflectionWrapResolutionErrors) { // new default: 6531596 diff --git a/hotspot/src/share/vm/runtime/vframe.cpp b/hotspot/src/share/vm/runtime/vframe.cpp index b1c2db81859..382ac4b0961 100644 --- a/hotspot/src/share/vm/runtime/vframe.cpp +++ b/hotspot/src/share/vm/runtime/vframe.cpp @@ -161,7 +161,7 @@ void javaVFrame::print_lock_info_on(outputStream* st, int frame_count) { // If this is the first frame, and java.lang.Object.wait(...) then print out the receiver. if (frame_count == 0) { if (method()->name() == vmSymbols::wait_name() && - InstanceKlass::cast(method()->method_holder())->name() == vmSymbols::java_lang_Object()) { + method()->method_holder()->name() == vmSymbols::java_lang_Object()) { StackValueCollection* locs = locals(); if (!locs->is_empty()) { StackValue* sv = locs->at(0); @@ -407,7 +407,7 @@ void vframeStreamCommon::security_get_caller_frame(int depth) { if (Universe::reflect_invoke_cache()->is_same_method(method())) { // This is Method.invoke() -- skip it } else if (use_new_reflection && - Klass::cast(method()->method_holder()) + method()->method_holder() ->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass())) { // This is an auxilary frame -- skip it } else if (method()->is_method_handle_intrinsic() || @@ -471,8 +471,8 @@ void vframeStreamCommon::skip_prefixed_method_and_wrappers() { void vframeStreamCommon::skip_reflection_related_frames() { while (!at_end() && (JDK_Version::is_gte_jdk14x_version() && UseNewReflection && - (Klass::cast(method()->method_holder())->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass()) || - Klass::cast(method()->method_holder())->is_subclass_of(SystemDictionary::reflect_ConstructorAccessorImpl_klass())))) { + (method()->method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass()) || + method()->method_holder()->is_subclass_of(SystemDictionary::reflect_ConstructorAccessorImpl_klass())))) { next(); } } @@ -547,13 +547,13 @@ void javaVFrame::print() { void javaVFrame::print_value() const { Method* m = method(); - Klass* k = m->method_holder(); + InstanceKlass* k = m->method_holder(); tty->print_cr("frame( sp=" INTPTR_FORMAT ", unextended_sp=" INTPTR_FORMAT ", fp=" INTPTR_FORMAT ", pc=" INTPTR_FORMAT ")", _fr.sp(), _fr.unextended_sp(), _fr.fp(), _fr.pc()); tty->print("%s.%s", Klass::cast(k)->internal_name(), m->name()->as_C_string()); if (!m->is_native()) { - Symbol* source_name = InstanceKlass::cast(k)->source_file_name(); + Symbol* source_name = k->source_file_name(); int line_number = m->line_number_from_bci(bci()); if (source_name != NULL && (line_number != -1)) { tty->print("(%s:%d)", source_name->as_C_string(), line_number); diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index 367f3f8e009..eb6d3cd78a8 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -289,7 +289,7 @@ typedef BinaryTreeDictionary MetablockTreeDictionary; nonstatic_field(CompiledICHolder, _holder_klass, Klass*) \ nonstatic_field(ConstantPool, _tags, Array*) \ nonstatic_field(ConstantPool, _cache, ConstantPoolCache*) \ - nonstatic_field(ConstantPool, _pool_holder, Klass*) \ + nonstatic_field(ConstantPool, _pool_holder, InstanceKlass*) \ nonstatic_field(ConstantPool, _operands, Array*) \ nonstatic_field(ConstantPool, _length, int) \ nonstatic_field(ConstantPool, _resolved_references, jobject) \ diff --git a/hotspot/src/share/vm/services/heapDumper.cpp b/hotspot/src/share/vm/services/heapDumper.cpp index fe3f50df64a..46d1fad6d7c 100644 --- a/hotspot/src/share/vm/services/heapDumper.cpp +++ b/hotspot/src/share/vm/services/heapDumper.cpp @@ -1117,8 +1117,8 @@ void DumperSupport::dump_stack_frame(DumpWriter* writer, writer->write_symbolID(m->name()); // method's name writer->write_symbolID(m->signature()); // method's signature - assert(Klass::cast(m->method_holder())->oop_is_instance(), "not InstanceKlass"); - writer->write_symbolID(InstanceKlass::cast(m->method_holder())->source_file_name()); // source file name + assert(m->method_holder()->oop_is_instance(), "not InstanceKlass"); + writer->write_symbolID(m->method_holder()->source_file_name()); // source file name writer->write_u4(class_serial_num); // class serial number writer->write_u4((u4) line_number); // line number } From 096a52585a5350225f285d279f6d8d3cb35a436d Mon Sep 17 00:00:00 2001 From: Chris Hegarty Date: Tue, 6 Nov 2012 21:01:43 +0000 Subject: [PATCH 191/241] 8002297: sun/net/www/protocol/http/StackTraceTest.java fails intermittently Reviewed-by: alanb, dsamersoff --- .../net/www/protocol/http/StackTraceTest.java | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/jdk/test/sun/net/www/protocol/http/StackTraceTest.java b/jdk/test/sun/net/www/protocol/http/StackTraceTest.java index 3b2cc3ac768..cd3f6a56aad 100644 --- a/jdk/test/sun/net/www/protocol/http/StackTraceTest.java +++ b/jdk/test/sun/net/www/protocol/http/StackTraceTest.java @@ -32,26 +32,28 @@ import java.net.*; import java.io.IOException; public class StackTraceTest { - public static void main(String[] args) { + public static void main(String[] args) throws Exception { + URL url; + try (ServerSocket ss = new ServerSocket(0)) { // refusing socket + url = new URL("http://localhost:" + ss.getLocalPort() + "/"); + } + URLConnection uc = url.openConnection(); + + // Trigger implicit connection by trying to retrieve bogus + // response header, and force remembered exception + uc.getHeaderFieldKey(20); + try { - URL url = new URL("http://localhost:8080/"); - URLConnection uc = url.openConnection(); - System.out.println("key = "+uc.getHeaderFieldKey(20)); - uc.getInputStream(); + uc.getInputStream(); // expect to throw + throw new RuntimeException("Expected getInputStream to throw"); } catch (IOException ioe) { - ioe.printStackTrace(); - - if (!(ioe instanceof ConnectException)) { - throw new RuntimeException("Expect ConnectException, got "+ioe); - } - if (ioe.getMessage() == null) { + if (!(ioe instanceof ConnectException)) + throw new RuntimeException("Expect ConnectException, got " + ioe); + if (ioe.getMessage() == null) throw new RuntimeException("Exception message is null"); - } - - // this exception should be a chained exception - if (ioe.getCause() == null) { - throw new RuntimeException("Excepting a chained exception, but got: ", ioe); - } + if (ioe.getCause() == null) + throw new RuntimeException("Excepting a chained exception, but got: ", + ioe); } } } From 1ebf7b911671de0f787f11f8ca88838da01fbaa7 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Tue, 6 Nov 2012 15:16:32 -0800 Subject: [PATCH 192/241] 8002069: Assert failed in C2: assert(field->edge_count() > 0) failed: sanity Added missed type check of initializing store in ConnectionGraph::find_init_values(). Reviewed-by: roland, twisti, vlivanov --- hotspot/src/share/vm/opto/escape.cpp | 103 +++++++++++++++--- .../test/compiler/8002069/Test8002069.java | 98 +++++++++++++++++ 2 files changed, 183 insertions(+), 18 deletions(-) create mode 100644 hotspot/test/compiler/8002069/Test8002069.java diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp index a5aa47119da..40acbdbe770 100644 --- a/hotspot/src/share/vm/opto/escape.cpp +++ b/hotspot/src/share/vm/opto/escape.cpp @@ -1386,12 +1386,12 @@ int ConnectionGraph::find_init_values(JavaObjectNode* pta, PointsToNode* init_va // Non-escaped allocation returned from Java or runtime call have // unknown values in fields. for (EdgeIterator i(pta); i.has_next(); i.next()) { - PointsToNode* ptn = i.get(); - if (ptn->is_Field() && ptn->as_Field()->is_oop()) { - if (add_edge(ptn, phantom_obj)) { + PointsToNode* field = i.get(); + if (field->is_Field() && field->as_Field()->is_oop()) { + if (add_edge(field, phantom_obj)) { // New edge was added new_edges++; - add_field_uses_to_worklist(ptn->as_Field()); + add_field_uses_to_worklist(field->as_Field()); } } } @@ -1413,30 +1413,30 @@ int ConnectionGraph::find_init_values(JavaObjectNode* pta, PointsToNode* init_va // captured by Initialize node. // for (EdgeIterator i(pta); i.has_next(); i.next()) { - PointsToNode* ptn = i.get(); // Field (AddP) - if (!ptn->is_Field() || !ptn->as_Field()->is_oop()) + PointsToNode* field = i.get(); // Field (AddP) + if (!field->is_Field() || !field->as_Field()->is_oop()) continue; // Not oop field - int offset = ptn->as_Field()->offset(); + int offset = field->as_Field()->offset(); if (offset == Type::OffsetBot) { if (!visited_bottom_offset) { // OffsetBot is used to reference array's element, // always add reference to NULL to all Field nodes since we don't // known which element is referenced. - if (add_edge(ptn, null_obj)) { + if (add_edge(field, null_obj)) { // New edge was added new_edges++; - add_field_uses_to_worklist(ptn->as_Field()); + add_field_uses_to_worklist(field->as_Field()); visited_bottom_offset = true; } } } else { // Check only oop fields. - const Type* adr_type = ptn->ideal_node()->as_AddP()->bottom_type(); + const Type* adr_type = field->ideal_node()->as_AddP()->bottom_type(); if (adr_type->isa_rawptr()) { #ifdef ASSERT // Raw pointers are used for initializing stores so skip it // since it should be recorded already - Node* base = get_addp_base(ptn->ideal_node()); + Node* base = get_addp_base(field->ideal_node()); assert(adr_type->isa_rawptr() && base->is_Proj() && (base->in(0) == alloc),"unexpected pointer type"); #endif @@ -1446,10 +1446,54 @@ int ConnectionGraph::find_init_values(JavaObjectNode* pta, PointsToNode* init_va offsets_worklist.append(offset); Node* value = NULL; if (ini != NULL) { - BasicType ft = UseCompressedOops ? T_NARROWOOP : T_OBJECT; - Node* store = ini->find_captured_store(offset, type2aelembytes(ft), phase); - if (store != NULL && store->is_Store()) { + // StoreP::memory_type() == T_ADDRESS + BasicType ft = UseCompressedOops ? T_NARROWOOP : T_ADDRESS; + Node* store = ini->find_captured_store(offset, type2aelembytes(ft, true), phase); + // Make sure initializing store has the same type as this AddP. + // This AddP may reference non existing field because it is on a + // dead branch of bimorphic call which is not eliminated yet. + if (store != NULL && store->is_Store() && + store->as_Store()->memory_type() == ft) { value = store->in(MemNode::ValueIn); +#ifdef ASSERT + if (VerifyConnectionGraph) { + // Verify that AddP already points to all objects the value points to. + PointsToNode* val = ptnode_adr(value->_idx); + assert((val != NULL), "should be processed already"); + PointsToNode* missed_obj = NULL; + if (val->is_JavaObject()) { + if (!field->points_to(val->as_JavaObject())) { + missed_obj = val; + } + } else { + if (!val->is_LocalVar() || (val->edge_count() == 0)) { + tty->print_cr("----------init store has invalid value -----"); + store->dump(); + val->dump(); + assert(val->is_LocalVar() && (val->edge_count() > 0), "should be processed already"); + } + for (EdgeIterator j(val); j.has_next(); j.next()) { + PointsToNode* obj = j.get(); + if (obj->is_JavaObject()) { + if (!field->points_to(obj->as_JavaObject())) { + missed_obj = obj; + break; + } + } + } + } + if (missed_obj != NULL) { + tty->print_cr("----------field---------------------------------"); + field->dump(); + tty->print_cr("----------missed referernce to object-----------"); + missed_obj->dump(); + tty->print_cr("----------object referernced by init store -----"); + store->dump(); + val->dump(); + assert(!field->points_to(missed_obj->as_JavaObject()), "missed JavaObject reference"); + } + } +#endif } else { // There could be initializing stores which follow allocation. // For example, a volatile field store is not collected @@ -1462,10 +1506,10 @@ int ConnectionGraph::find_init_values(JavaObjectNode* pta, PointsToNode* init_va } if (value == NULL) { // A field's initializing value was not recorded. Add NULL. - if (add_edge(ptn, null_obj)) { + if (add_edge(field, null_obj)) { // New edge was added new_edges++; - add_field_uses_to_worklist(ptn->as_Field()); + add_field_uses_to_worklist(field->as_Field()); } } } @@ -1607,7 +1651,26 @@ void ConnectionGraph::verify_connection_graph( } // Verify that all fields have initializing values. if (field->edge_count() == 0) { + tty->print_cr("----------field does not have references----------"); field->dump(); + for (BaseIterator i(field); i.has_next(); i.next()) { + PointsToNode* base = i.get(); + tty->print_cr("----------field has next base---------------------"); + base->dump(); + if (base->is_JavaObject() && (base != phantom_obj) && (base != null_obj)) { + tty->print_cr("----------base has fields-------------------------"); + for (EdgeIterator j(base); j.has_next(); j.next()) { + j.get()->dump(); + } + tty->print_cr("----------base has references---------------------"); + for (UseIterator j(base); j.has_next(); j.next()) { + j.get()->dump(); + } + } + } + for (UseIterator i(field); i.has_next(); i.next()) { + i.get()->dump(); + } assert(field->edge_count() > 0, "sanity"); } } @@ -1967,7 +2030,7 @@ bool PointsToNode::points_to(JavaObjectNode* ptn) const { if (is_JavaObject()) { return (this == ptn); } - assert(is_LocalVar(), "sanity"); + assert(is_LocalVar() || is_Field(), "sanity"); for (EdgeIterator i(this); i.has_next(); i.next()) { if (i.get() == ptn) return true; @@ -3127,10 +3190,14 @@ void PointsToNode::dump(bool print_state) const { EscapeState fields_es = fields_escape_state(); tty->print("%s(%s) ", esc_names[(int)es], esc_names[(int)fields_es]); if (nt == PointsToNode::JavaObject && !this->scalar_replaceable()) - tty->print("NSR"); + tty->print("NSR "); } if (is_Field()) { FieldNode* f = (FieldNode*)this; + if (f->is_oop()) + tty->print("oop "); + if (f->offset() > 0) + tty->print("+%d ", f->offset()); tty->print("("); for (BaseIterator i(f); i.has_next(); i.next()) { PointsToNode* b = i.get(); diff --git a/hotspot/test/compiler/8002069/Test8002069.java b/hotspot/test/compiler/8002069/Test8002069.java new file mode 100644 index 00000000000..9d11c25564d --- /dev/null +++ b/hotspot/test/compiler/8002069/Test8002069.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 8002069 + * @summary Assert failed in C2: assert(field->edge_count() > 0) failed: sanity + * + * @run main/othervm -Xmx32m -XX:+IgnoreUnrecognizedVMOptions -Xbatch -XX:CompileCommand=exclude,Test8002069.dummy Test8002069 + */ + +abstract class O { + int f; + public O() { f = 5; } + abstract void put(int i); + public int foo(int i) { + put(i); + return i; + } +}; + +class A extends O { + int[] a; + public A(int s) { + a = new int[s]; + } + public void put(int i) { + a[i%a.length] = i; + } +} + +class B extends O { + int sz; + int[] a; + public B(int s) { + sz = s; + a = new int[s]; + } + public void put(int i) { + a[i%sz] = i; + } +} + +public class Test8002069 { + public static void main(String args[]) { + int sum = 0; + for (int i=0; i<8000; i++) { + sum += test1(i); + } + for (int i=0; i<100000; i++) { + sum += test2(i); + } + System.out.println("PASSED. sum = " + sum); + } + + private O o; + + private int foo(int i) { + return o.foo(i); + } + static int test1(int i) { + Test8002069 t = new Test8002069(); + t.o = new A(5); + return t.foo(i); + } + static int test2(int i) { + Test8002069 t = new Test8002069(); + t.o = new B(5); + dummy(i); + return t.foo(i); + } + + static int dummy(int i) { + return i*2; + } +} + From 81afea614693f831d449fbb6ddb8435506ee4ccb Mon Sep 17 00:00:00 2001 From: Yuka Kamiya Date: Wed, 7 Nov 2012 09:58:39 +0900 Subject: [PATCH 193/241] 7198195: Support Unicode 6.2.0 Reviewed-by: okutsu --- .../CharacterData01.java.template | 4 ++- jdk/make/tools/UnicodeData/PropList.txt | 6 ++--- jdk/make/tools/UnicodeData/Scripts.txt | 17 ++++++------- jdk/make/tools/UnicodeData/SpecialCasing.txt | 6 ++--- jdk/make/tools/UnicodeData/UnicodeData.txt | 9 ++++--- jdk/make/tools/UnicodeData/VERSION | 2 +- .../share/classes/java/lang/Character.java | 6 ++--- jdk/test/java/lang/Character/CheckProp.java | 2 +- jdk/test/java/lang/Character/CheckScript.java | 2 +- jdk/test/java/lang/Character/PropList.txt | 6 ++--- .../lang/Character/PropertyValueAliases.txt | 25 +++++++------------ jdk/test/java/lang/Character/Scripts.txt | 17 ++++++------- 12 files changed, 47 insertions(+), 55 deletions(-) diff --git a/jdk/make/tools/GenerateCharacter/CharacterData01.java.template b/jdk/make/tools/GenerateCharacter/CharacterData01.java.template index a1d2822955b..44bd980ab02 100644 --- a/jdk/make/tools/GenerateCharacter/CharacterData01.java.template +++ b/jdk/make/tools/GenerateCharacter/CharacterData01.java.template @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -311,6 +311,8 @@ class CharacterData01 extends CharacterData { case 0x011063: retval = 90; break; // BRAHMI NUMBER NINETY case 0x011064: retval = 100; break; // BRAHMI NUMBER ONE HUNDRED case 0x011065: retval = 1000; break; // BRAHMI NUMBER ONE THOUSAND + case 0x012432: retval = 216000; break; // CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH + case 0x012433: retval = 432000; break; // CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN 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 diff --git a/jdk/make/tools/UnicodeData/PropList.txt b/jdk/make/tools/UnicodeData/PropList.txt index f9dcb2ae74a..9ce7eec9713 100644 --- a/jdk/make/tools/UnicodeData/PropList.txt +++ b/jdk/make/tools/UnicodeData/PropList.txt @@ -1,8 +1,8 @@ -# PropList-6.1.0.txt -# Date: 2011-11-30, 01:49:54 GMT [MD] +# PropList-6.2.0.txt +# Date: 2012-05-23, 20:34:59 GMT [MD] # # Unicode Character Database -# Copyright (c) 1991-2011 Unicode, Inc. +# Copyright (c) 1991-2012 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ diff --git a/jdk/make/tools/UnicodeData/Scripts.txt b/jdk/make/tools/UnicodeData/Scripts.txt index 2516f889d66..1a8e7229cc6 100644 --- a/jdk/make/tools/UnicodeData/Scripts.txt +++ b/jdk/make/tools/UnicodeData/Scripts.txt @@ -1,8 +1,8 @@ -# Scripts-6.1.0.txt -# Date: 2011-11-27, 05:10:50 GMT [MD] +# Scripts-6.2.0.txt +# Date: 2012-06-04, 17:21:29 GMT [MD] # # Unicode Character Database -# Copyright (c) 1991-2011 Unicode, Inc. +# Copyright (c) 1991-2012 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ @@ -146,7 +146,7 @@ 208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN 208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS 208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS -20A0..20B9 ; Common # Sc [26] EURO-CURRENCY SIGN..INDIAN RUPEE SIGN +20A0..20BA ; Common # Sc [27] EURO-CURRENCY SIGN..TURKISH LIRA SIGN 2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT 2102 ; Common # L& DOUBLE-STRUCK CAPITAL C 2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA @@ -576,7 +576,7 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR E0001 ; Common # Cf LANGUAGE TAG E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG -# Total code points: 6412 +# Total code points: 6413 # ================================================ @@ -760,7 +760,7 @@ FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATU 061E ; Arabic # Po ARABIC TRIPLE DOT PUNCTUATION MARK 0620..063F ; Arabic # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE 0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -0656..065E ; Arabic # Mn [9] ARABIC SUBSCRIPT ALEF..ARABIC FATHA WITH TWO DOTS +0656..065F ; Arabic # Mn [10] ARABIC SUBSCRIPT ALEF..ARABIC WAVY HAMZA BELOW 066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR 066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF 0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE @@ -827,7 +827,7 @@ FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA 1EEAB..1EEBB ; Arabic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1EEF0..1EEF1 ; Arabic # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL -# Total code points: 1234 +# Total code points: 1235 # ================================================ @@ -1477,7 +1477,6 @@ A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE 0300..036F ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X 0485..0486 ; Inherited # Mn [2] COMBINING CYRILLIC DASIA PNEUMATA..COMBINING CYRILLIC PSILI PNEUMATA 064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW -065F ; Inherited # Mn ARABIC WAVY HAMZA BELOW 0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF 0951..0952 ; Inherited # Mn [2] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI STRESS SIGN ANUDATTA 1CD0..1CD2 ; Inherited # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA @@ -1504,7 +1503,7 @@ FE20..FE26 ; Inherited # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CON 1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 524 +# Total code points: 523 # ================================================ diff --git a/jdk/make/tools/UnicodeData/SpecialCasing.txt b/jdk/make/tools/UnicodeData/SpecialCasing.txt index d650b6d9dcd..994043f01bf 100644 --- a/jdk/make/tools/UnicodeData/SpecialCasing.txt +++ b/jdk/make/tools/UnicodeData/SpecialCasing.txt @@ -1,8 +1,8 @@ -# SpecialCasing-6.1.0.txt -# Date: 2011-11-27, 05:10:51 GMT [MD] +# SpecialCasing-6.2.0.txt +# Date: 2012-05-23, 20:35:15 GMT [MD] # # Unicode Character Database -# Copyright (c) 1991-2011 Unicode, Inc. +# Copyright (c) 1991-2012 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ # diff --git a/jdk/make/tools/UnicodeData/UnicodeData.txt b/jdk/make/tools/UnicodeData/UnicodeData.txt index 9f204050c6b..086379eb4f3 100644 --- a/jdk/make/tools/UnicodeData/UnicodeData.txt +++ b/jdk/make/tools/UnicodeData/UnicodeData.txt @@ -7190,6 +7190,7 @@ 20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; 20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; 20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +20BA;TURKISH LIRA 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;;;; @@ -18703,8 +18704,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;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;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;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;;;;; @@ -18739,8 +18740,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;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;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;-1;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;-1;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;;;;; diff --git a/jdk/make/tools/UnicodeData/VERSION b/jdk/make/tools/UnicodeData/VERSION index dfda3e0b4f0..6abaeb2f907 100644 --- a/jdk/make/tools/UnicodeData/VERSION +++ b/jdk/make/tools/UnicodeData/VERSION @@ -1 +1 @@ -6.1.0 +6.2.0 diff --git a/jdk/src/share/classes/java/lang/Character.java b/jdk/src/share/classes/java/lang/Character.java index 5d957a97ce2..53bb738ea02 100644 --- a/jdk/src/share/classes/java/lang/Character.java +++ b/jdk/src/share/classes/java/lang/Character.java @@ -40,7 +40,7 @@ import java.util.Locale; * a character's category (lowercase letter, digit, etc.) and for converting * characters from uppercase to lowercase and vice versa. *

    - * Character information is based on the Unicode Standard, version 6.1.0. + * Character information is based on the Unicode Standard, version 6.2.0. *

    * The methods and data of class {@code Character} are defined by * the information in the UnicodeData file that is part of the @@ -3758,8 +3758,7 @@ class Character implements java.io.Serializable, Comparable { 0x0640, // 0640..0640; COMMON 0x0641, // 0641..064A; ARABIC 0x064B, // 064B..0655; INHERITED - 0x0656, // 0656..065E; ARABIC - 0x065F, // 065F..065F; INHERITED + 0x0656, // 0656..065F; ARABIC 0x0660, // 0660..0669; COMMON 0x066A, // 066A..066F; ARABIC 0x0670, // 0670..0670; INHERITED @@ -4081,7 +4080,6 @@ class Character implements java.io.Serializable, Comparable { ARABIC, INHERITED, ARABIC, - INHERITED, COMMON, ARABIC, INHERITED, diff --git a/jdk/test/java/lang/Character/CheckProp.java b/jdk/test/java/lang/Character/CheckProp.java index ee1b6492fb4..c460d42ef78 100644 --- a/jdk/test/java/lang/Character/CheckProp.java +++ b/jdk/test/java/lang/Character/CheckProp.java @@ -24,7 +24,7 @@ /** * @test - * @bug 7037261 7070436 + * @bug 7037261 7070436 7198195 * @summary Check j.l.Character.isLowerCase/isUppercase/isAlphabetic/isIdeographic */ diff --git a/jdk/test/java/lang/Character/CheckScript.java b/jdk/test/java/lang/Character/CheckScript.java index 147f931e988..713e3c8e886 100644 --- a/jdk/test/java/lang/Character/CheckScript.java +++ b/jdk/test/java/lang/Character/CheckScript.java @@ -24,7 +24,7 @@ /** * @test - * @bug 6945564 6959267 7033561 7070436 + * @bug 6945564 6959267 7033561 7070436 7198195 * @summary Check that the j.l.Character.UnicodeScript */ diff --git a/jdk/test/java/lang/Character/PropList.txt b/jdk/test/java/lang/Character/PropList.txt index f9dcb2ae74a..9ce7eec9713 100644 --- a/jdk/test/java/lang/Character/PropList.txt +++ b/jdk/test/java/lang/Character/PropList.txt @@ -1,8 +1,8 @@ -# PropList-6.1.0.txt -# Date: 2011-11-30, 01:49:54 GMT [MD] +# PropList-6.2.0.txt +# Date: 2012-05-23, 20:34:59 GMT [MD] # # Unicode Character Database -# Copyright (c) 1991-2011 Unicode, Inc. +# Copyright (c) 1991-2012 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ diff --git a/jdk/test/java/lang/Character/PropertyValueAliases.txt b/jdk/test/java/lang/Character/PropertyValueAliases.txt index 2f7bde28ec8..d9048fb32f7 100644 --- a/jdk/test/java/lang/Character/PropertyValueAliases.txt +++ b/jdk/test/java/lang/Character/PropertyValueAliases.txt @@ -1,8 +1,8 @@ -# PropertyValueAliases-6.1.0.txt -# Date: 2011-12-07, 23:40:57 GMT [MD] +# PropertyValueAliases-6.2.0.txt +# Date: 2012-08-14, 16:05:11 GMT [MD] # # Unicode Character Database -# Copyright (c) 1991-2011 Unicode, Inc. +# Copyright (c) 1991-2012 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ # @@ -73,6 +73,7 @@ age; 5.1 ; V5_1 age; 5.2 ; V5_2 age; 6.0 ; V6_0 age; 6.1 ; V6_1 +age; 6.2 ; V6_2 age; NA ; Unassigned # Alphabetic (Alpha) @@ -382,7 +383,8 @@ ccc; 118; CCC118 ; CCC118 ccc; 122; CCC122 ; CCC122 ccc; 129; CCC129 ; CCC129 ccc; 130; CCC130 ; CCC130 -ccc; 132; CCC133 ; CCC133 +ccc; 132; CCC132 ; CCC132 +ccc; 133; CCC133 ; CCC133 # RESERVED ccc; 200; ATBL ; Attached_Below_Left ccc; 202; ATB ; Attached_Below ccc; 214; ATA ; Attached_Above @@ -592,6 +594,7 @@ GCB; LF ; LF GCB; LV ; LV GCB; LVT ; LVT GCB; PP ; Prepend +GCB; RI ; Regional_Indicator GCB; SM ; SpacingMark GCB; T ; T GCB; V ; V @@ -862,6 +865,7 @@ lb ; OP ; Open_Punctuation lb ; PO ; Postfix_Numeric lb ; PR ; Prefix_Numeric lb ; QU ; Quotation +lb ; RI ; Regional_Indicator lb ; SA ; Complex_Context lb ; SG ; Surrogate lb ; SP ; Space @@ -880,10 +884,6 @@ LOE; Y ; Yes ; T Lower; N ; No ; F ; False Lower; Y ; Yes ; T ; True -# Lowercase_Mapping (lc) - -# @missing: 0000..10FFFF; Lowercase_Mapping; - # Math (Math) Math; N ; No ; F ; False @@ -1159,10 +1159,6 @@ SD ; Y ; Yes ; T Term; N ; No ; F ; False Term; Y ; Yes ; T ; True -# Titlecase_Mapping (tc) - -# @missing: 0000..10FFFF; Titlecase_Mapping; - # Unicode_1_Name (na1) # @missing: 0000..10FFFF; Unicode_1_Name; @@ -1177,10 +1173,6 @@ UIdeo; Y ; Yes ; T Upper; N ; No ; F ; False Upper; Y ; Yes ; T ; True -# Uppercase_Mapping (uc) - -# @missing: 0000..10FFFF; Uppercase_Mapping; - # Variation_Selector (VS) VS ; N ; No ; F ; False @@ -1205,6 +1197,7 @@ WB ; ML ; MidLetter WB ; MN ; MidNum WB ; NL ; Newline WB ; NU ; Numeric +WB ; RI ; Regional_Indicator WB ; XX ; Other # XID_Continue (XIDC) diff --git a/jdk/test/java/lang/Character/Scripts.txt b/jdk/test/java/lang/Character/Scripts.txt index 2516f889d66..1a8e7229cc6 100644 --- a/jdk/test/java/lang/Character/Scripts.txt +++ b/jdk/test/java/lang/Character/Scripts.txt @@ -1,8 +1,8 @@ -# Scripts-6.1.0.txt -# Date: 2011-11-27, 05:10:50 GMT [MD] +# Scripts-6.2.0.txt +# Date: 2012-06-04, 17:21:29 GMT [MD] # # Unicode Character Database -# Copyright (c) 1991-2011 Unicode, Inc. +# Copyright (c) 1991-2012 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ @@ -146,7 +146,7 @@ 208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN 208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS 208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS -20A0..20B9 ; Common # Sc [26] EURO-CURRENCY SIGN..INDIAN RUPEE SIGN +20A0..20BA ; Common # Sc [27] EURO-CURRENCY SIGN..TURKISH LIRA SIGN 2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT 2102 ; Common # L& DOUBLE-STRUCK CAPITAL C 2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA @@ -576,7 +576,7 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR E0001 ; Common # Cf LANGUAGE TAG E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG -# Total code points: 6412 +# Total code points: 6413 # ================================================ @@ -760,7 +760,7 @@ FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATU 061E ; Arabic # Po ARABIC TRIPLE DOT PUNCTUATION MARK 0620..063F ; Arabic # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE 0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -0656..065E ; Arabic # Mn [9] ARABIC SUBSCRIPT ALEF..ARABIC FATHA WITH TWO DOTS +0656..065F ; Arabic # Mn [10] ARABIC SUBSCRIPT ALEF..ARABIC WAVY HAMZA BELOW 066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR 066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF 0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE @@ -827,7 +827,7 @@ FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA 1EEAB..1EEBB ; Arabic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1EEF0..1EEF1 ; Arabic # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL -# Total code points: 1234 +# Total code points: 1235 # ================================================ @@ -1477,7 +1477,6 @@ A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE 0300..036F ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X 0485..0486 ; Inherited # Mn [2] COMBINING CYRILLIC DASIA PNEUMATA..COMBINING CYRILLIC PSILI PNEUMATA 064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW -065F ; Inherited # Mn ARABIC WAVY HAMZA BELOW 0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF 0951..0952 ; Inherited # Mn [2] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI STRESS SIGN ANUDATTA 1CD0..1CD2 ; Inherited # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA @@ -1504,7 +1503,7 @@ FE20..FE26 ; Inherited # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CON 1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 524 +# Total code points: 523 # ================================================ From 5fca8126cd215f8a2467a002034bef4a4826c2c9 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Wed, 7 Nov 2012 14:13:01 +0800 Subject: [PATCH 194/241] 6355584: Introduce constrained Kerberos delegation Reviewed-by: valeriep --- .../security/jgss/ExtendedGSSCredential.java | 52 +++ .../classes/sun/security/jgss/GSSCaller.java | 19 +- .../sun/security/jgss/GSSCredentialImpl.java | 16 +- .../classes/sun/security/jgss/HttpCaller.java | 1 + .../jgss/krb5/Krb5AcceptCredential.java | 18 ++ .../sun/security/jgss/krb5/Krb5Context.java | 81 ++++- .../jgss/krb5/Krb5InitCredential.java | 35 +- .../jgss/krb5/Krb5ProxyCredential.java | 115 +++++++ .../sun/security/jgss/krb5/Krb5Util.java | 20 +- .../security/jgss/spi/GSSCredentialSpi.java | 9 + .../security/jgss/spnego/SpNegoContext.java | 3 + .../jgss/spnego/SpNegoCredElement.java | 5 + .../security/jgss/wrapper/GSSCredElement.java | 7 + .../sun/security/krb5/Credentials.java | 29 +- .../sun/security/krb5/EncryptedData.java | 6 +- .../classes/sun/security/krb5/KrbApReq.java | 3 +- .../classes/sun/security/krb5/KrbKdcRep.java | 7 +- .../classes/sun/security/krb5/KrbTgsRep.java | 2 +- .../classes/sun/security/krb5/KrbTgsReq.java | 92 +++++- .../krb5/internal/CredentialsUtil.java | 302 ++++++++++-------- .../security/krb5/internal/EncKDCRepPart.java | 5 +- .../security/krb5/internal/KDCOptions.java | 46 +++ .../sun/security/krb5/internal/Krb5.java | 3 + .../sun/security/krb5/internal/PAData.java | 3 + .../security/krb5/internal/PAForUserEnc.java | 190 +++++++++++ .../krb5/internal/crypto/KeyUsage.java | 1 + .../security/krb5/internal/ktab/KeyTab.java | 3 + jdk/test/sun/security/krb5/auto/Basic.java | 10 +- jdk/test/sun/security/krb5/auto/Context.java | 108 +++++-- .../sun/security/krb5/auto/CrossRealm.java | 1 + jdk/test/sun/security/krb5/auto/KDC.java | 96 +++++- .../sun/security/krb5/auto/OkAsDelegate.java | 2 +- .../sun/security/krb5/auto/S4U2proxy.java | 79 +++++ .../sun/security/krb5/auto/S4U2proxyGSS.java | 98 ++++++ jdk/test/sun/security/krb5/auto/S4U2self.java | 136 ++++++++ .../security/krb5/auto/S4U2selfAsServer.java | 78 +++++ .../krb5/auto/S4U2selfAsServerGSS.java | 95 ++++++ .../sun/security/krb5/auto/S4U2selfGSS.java | 82 +++++ 38 files changed, 1619 insertions(+), 239 deletions(-) create mode 100644 jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSCredential.java create mode 100644 jdk/src/share/classes/sun/security/jgss/krb5/Krb5ProxyCredential.java create mode 100644 jdk/src/share/classes/sun/security/krb5/internal/PAForUserEnc.java create mode 100644 jdk/test/sun/security/krb5/auto/S4U2proxy.java create mode 100644 jdk/test/sun/security/krb5/auto/S4U2proxyGSS.java create mode 100644 jdk/test/sun/security/krb5/auto/S4U2self.java create mode 100644 jdk/test/sun/security/krb5/auto/S4U2selfAsServer.java create mode 100644 jdk/test/sun/security/krb5/auto/S4U2selfAsServerGSS.java create mode 100644 jdk/test/sun/security/krb5/auto/S4U2selfGSS.java diff --git a/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSCredential.java b/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSCredential.java new file mode 100644 index 00000000000..8f09482a7d0 --- /dev/null +++ b/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSCredential.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.security.jgss; + +import org.ietf.jgss.*; + +/** + * The extended GSSCredential interface for supporting additional + * functionalities not defined by {@code org.ietf.jgss.GSSCredential}. + * @since 1.8 + */ +public interface ExtendedGSSCredential extends GSSCredential { + /** + * Impersonates a principal. In Kerberos, this can be implemented + * using the Microsoft S4U2self extension. + *

    + * A {@link GSSException#NO_CRED GSSException.NO_CRED} will be thrown if the + * impersonation fails. A {@link GSSException#FAILURE GSSException.FAILURE} + * will be thrown if the impersonation method is not available to this + * credential object. + * @param name the name of the principal to impersonate + * @return a credential for that principal + * @throws GSSException containing the following + * major error codes: + * {@link GSSException#NO_CRED GSSException.NO_CRED} + * {@link GSSException#FAILURE GSSException.FAILURE} + */ + public GSSCredential impersonate(GSSName name) throws GSSException; +} diff --git a/jdk/src/share/classes/sun/security/jgss/GSSCaller.java b/jdk/src/share/classes/sun/security/jgss/GSSCaller.java index bc6eaa2b8ab..278e7b9f485 100644 --- a/jdk/src/share/classes/sun/security/jgss/GSSCaller.java +++ b/jdk/src/share/classes/sun/security/jgss/GSSCaller.java @@ -31,10 +31,19 @@ package sun.security.jgss; * different callers. */ public class GSSCaller { - public static final GSSCaller CALLER_UNKNOWN = new GSSCaller(); - public static final GSSCaller CALLER_INITIATE = new GSSCaller(); - public static final GSSCaller CALLER_ACCEPT = new GSSCaller(); - public static final GSSCaller CALLER_SSL_CLIENT = new GSSCaller(); - public static final GSSCaller CALLER_SSL_SERVER = new GSSCaller(); + public static final GSSCaller CALLER_UNKNOWN = new GSSCaller("UNKNOWN"); + public static final GSSCaller CALLER_INITIATE = new GSSCaller("INITIATE"); + public static final GSSCaller CALLER_ACCEPT = new GSSCaller("ACCEPT"); + public static final GSSCaller CALLER_SSL_CLIENT = new GSSCaller("SSL_CLIENT"); + public static final GSSCaller CALLER_SSL_SERVER = new GSSCaller("SSL_SERVER"); + + private String name; + GSSCaller(String s) { + name = s; + } + @Override + public String toString() { + return "GSSCaller{" + name + '}'; + } } diff --git a/jdk/src/share/classes/sun/security/jgss/GSSCredentialImpl.java b/jdk/src/share/classes/sun/security/jgss/GSSCredentialImpl.java index 36037e12f59..6330f71c1b0 100644 --- a/jdk/src/share/classes/sun/security/jgss/GSSCredentialImpl.java +++ b/jdk/src/share/classes/sun/security/jgss/GSSCredentialImpl.java @@ -28,8 +28,9 @@ package sun.security.jgss; import org.ietf.jgss.*; import sun.security.jgss.spi.*; import java.util.*; +import com.sun.security.jgss.*; -public class GSSCredentialImpl implements GSSCredential { +public class GSSCredentialImpl implements ExtendedGSSCredential { private GSSManagerImpl gssManager = null; private boolean destroyed = false; @@ -122,6 +123,19 @@ public class GSSCredentialImpl implements GSSCredential { } } + public GSSCredential impersonate(GSSName name) throws GSSException { + if (destroyed) { + throw new IllegalStateException("This credential is " + + "no longer valid"); + } + Oid mech = tempCred.getMechanism(); + GSSNameSpi nameElement = (name == null ? null : + ((GSSNameImpl)name).getElement(mech)); + GSSCredentialSpi cred = tempCred.impersonate(nameElement); + return (cred == null ? + null : new GSSCredentialImpl(gssManager, cred)); + } + public GSSName getName() throws GSSException { if (destroyed) { throw new IllegalStateException("This credential is " + diff --git a/jdk/src/share/classes/sun/security/jgss/HttpCaller.java b/jdk/src/share/classes/sun/security/jgss/HttpCaller.java index ae56b2786ac..b4f3e01fd7f 100644 --- a/jdk/src/share/classes/sun/security/jgss/HttpCaller.java +++ b/jdk/src/share/classes/sun/security/jgss/HttpCaller.java @@ -35,6 +35,7 @@ public class HttpCaller extends GSSCaller { final private HttpCallerInfo hci; public HttpCaller(HttpCallerInfo hci) { + super("HTTP_CLIENT"); this.hci = hci; } diff --git a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5AcceptCredential.java b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5AcceptCredential.java index 1df500bc524..0f65137cecf 100644 --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5AcceptCredential.java +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5AcceptCredential.java @@ -25,6 +25,7 @@ package sun.security.jgss.krb5; +import java.io.IOException; import org.ietf.jgss.*; import sun.security.jgss.GSSCaller; import sun.security.jgss.spi.*; @@ -177,4 +178,21 @@ public class Krb5AcceptCredential public void destroy() throws DestroyFailedException { screds.destroy(); } + + /** + * Impersonation is only available on the initiator side. The + * service must starts as an initiator to get an initial TGT to complete + * the S4U2self protocol. + */ + @Override + public GSSCredentialSpi impersonate(GSSNameSpi name) throws GSSException { + Credentials cred = screds.getInitCred(); + if (cred != null) { + return Krb5InitCredential.getInstance(this.name, cred) + .impersonate(name); + } else { + throw new GSSException(GSSException.FAILURE, -1, + "Only an initiate credentials can impersonate"); + } + } } diff --git a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java index 37c7b98a277..be8074097c9 100644 --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java @@ -45,6 +45,7 @@ import java.security.PrivilegedActionException; import javax.crypto.Cipher; import javax.security.auth.Subject; import javax.security.auth.kerberos.*; +import sun.security.krb5.internal.Ticket; /** * Implements the mechanism specific context class for the Kerberos v5 @@ -76,7 +77,7 @@ class Krb5Context implements GSSContextSpi { * values. */ - private boolean credDelegState = false; + private boolean credDelegState = false; // now only useful at client private boolean mutualAuthState = true; private boolean replayDetState = true; private boolean sequenceDetState = true; @@ -84,6 +85,8 @@ class Krb5Context implements GSSContextSpi { private boolean integState = true; private boolean delegPolicyState = false; + private boolean isConstrainedDelegationTried = false; + private int mySeqNumber; private int peerSeqNumber; private int keySrc; @@ -113,13 +116,11 @@ class Krb5Context implements GSSContextSpi { private Krb5CredElement myCred; private Krb5CredElement delegatedCred; // Set only on acceptor side - /* DESCipher instance used by the corresponding GSSContext */ - private Cipher desCipher = null; - // XXX See if the required info from these can be extracted and // stored elsewhere private Credentials serviceCreds; private KrbApReq apReq; + Ticket serviceTicket; final private GSSCaller caller; private static final boolean DEBUG = Krb5Util.DEBUG; @@ -248,7 +249,14 @@ class Krb5Context implements GSSContextSpi { * Is credential delegation enabled? */ public final boolean getCredDelegState() { - return credDelegState; + if (isInitiator()) { + return credDelegState; + } else { + // Server side deleg state is not flagged by credDelegState. + // It can use constrained delegation. + tryConstrainedDelegation(); + return delegatedCred != null; + } } /** @@ -498,7 +506,8 @@ class Krb5Context implements GSSContextSpi { * Returns the delegated credential for the context. This * is an optional feature of contexts which not all * mechanisms will support. A context can be requested to - * support credential delegation by using the CRED_DELEG. + * support credential delegation by using the CRED_DELEG, + * or it can request for a constrained delegation. * This is only valid on the acceptor side of the context. * @return GSSCredentialSpi object for the delegated credential * @exception GSSException @@ -507,11 +516,41 @@ class Krb5Context implements GSSContextSpi { public final GSSCredentialSpi getDelegCred() throws GSSException { if (state != STATE_IN_PROCESS && state != STATE_DONE) throw new GSSException(GSSException.NO_CONTEXT); - if (delegatedCred == null) + if (isInitiator()) { throw new GSSException(GSSException.NO_CRED); + } + tryConstrainedDelegation(); + if (delegatedCred == null) { + throw new GSSException(GSSException.NO_CRED); + } return delegatedCred; } + private void tryConstrainedDelegation() { + if (state != STATE_IN_PROCESS && state != STATE_DONE) { + return; + } + // We will only try constrained delegation once (if necessary). + if (!isConstrainedDelegationTried) { + if (delegatedCred == null) { + if (DEBUG) { + System.out.println(">>> Constrained deleg from " + caller); + } + // The constrained delegation part. The acceptor needs to have + // isInitiator=true in order to get a TGT, either earlier at + // logon stage, if useSubjectCredsOnly, or now. + try { + delegatedCred = new Krb5ProxyCredential( + Krb5InitCredential.getInstance( + GSSCaller.CALLER_ACCEPT, myName, lifetime), + peerName, serviceTicket); + } catch (GSSException gsse) { + // OK, delegatedCred is null then + } + } + isConstrainedDelegationTried = true; + } + } /** * Tests if this is the initiator side of the context. * @@ -577,8 +616,15 @@ class Krb5Context implements GSSContextSpi { "No TGT available"); } myName = (Krb5NameElement) myCred.getName(); - Credentials tgt = - ((Krb5InitCredential) myCred).getKrb5Credentials(); + Credentials tgt; + final Krb5ProxyCredential second; + if (myCred instanceof Krb5InitCredential) { + second = null; + tgt = ((Krb5InitCredential) myCred).getKrb5Credentials(); + } else { + second = (Krb5ProxyCredential) myCred; + tgt = second.self.getKrb5Credentials(); + } checkPermission(peerName.getKrb5PrincipalName().getName(), "initiate"); @@ -607,7 +653,9 @@ class Krb5Context implements GSSContextSpi { GSSCaller.CALLER_UNKNOWN, // since it's useSubjectCredsOnly here, // don't worry about the null - myName.getKrb5PrincipalName().getName(), + second == null ? + myName.getKrb5PrincipalName().getName(): + second.getName().getKrb5PrincipalName().getName(), peerName.getKrb5PrincipalName().getName(), acc); }}); @@ -638,9 +686,17 @@ class Krb5Context implements GSSContextSpi { "the subject"); } // Get Service ticket using the Kerberos protocols - serviceCreds = Credentials.acquireServiceCreds( + if (second == null) { + serviceCreds = Credentials.acquireServiceCreds( peerName.getKrb5PrincipalName().getName(), tgt); + } else { + serviceCreds = Credentials.acquireS4U2proxyCreds( + peerName.getKrb5PrincipalName().getName(), + second.tkt, + second.getName().getKrb5PrincipalName(), + tgt); + } if (GSSUtil.useSubjectCredsOnly(caller)) { final Subject subject = AccessController.doPrivileged( @@ -776,6 +832,7 @@ class Krb5Context implements GSSContextSpi { retVal = new AcceptSecContextToken(this, token.getKrbApReq()).encode(); } + serviceTicket = token.getKrbApReq().getCreds().getTicket(); myCred = null; state = STATE_DONE; } else { @@ -802,8 +859,6 @@ class Krb5Context implements GSSContextSpi { return retVal; } - - /** * Queries the context for largest data size to accomodate * the specified protection and be <= maxTokSize. diff --git a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java index 1932a950654..fa9a95a6a40 100644 --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java @@ -309,8 +309,7 @@ public class Krb5InitCredential int initLifetime) throws GSSException { - String realm = null; - final String clientPrincipal, tgsPrincipal = null; + final String clientPrincipal; /* * Find the TGT for the realm that the client is in. If the client @@ -318,20 +317,8 @@ public class Krb5InitCredential */ if (name != null) { clientPrincipal = (name.getKrb5PrincipalName()).getName(); - realm = (name.getKrb5PrincipalName()).getRealmAsString(); } else { clientPrincipal = null; - try { - Config config = Config.getInstance(); - realm = config.getDefaultRealm(); - } catch (KrbException e) { - GSSException ge = - new GSSException(GSSException.NO_CRED, -1, - "Attempt to obtain INITIATE credentials failed!" + - " (" + e.getMessage() + ")"); - ge.initCause(e); - throw ge; - } } final AccessControlContext acc = AccessController.getContext(); @@ -343,9 +330,11 @@ public class Krb5InitCredential return AccessController.doPrivileged( new PrivilegedExceptionAction() { public KerberosTicket run() throws Exception { + // It's OK to use null as serverPrincipal. TGT is almost + // the first ticket for a principal and we use list. return Krb5Util.getTicket( realCaller, - clientPrincipal, tgsPrincipal, acc); + clientPrincipal, null, acc); }}); } catch (PrivilegedActionException e) { GSSException ge = @@ -356,4 +345,20 @@ public class Krb5InitCredential throw ge; } } + + @Override + public GSSCredentialSpi impersonate(GSSNameSpi name) throws GSSException { + try { + Krb5NameElement kname = (Krb5NameElement)name; + Credentials newCred = Credentials.acquireS4U2selfCreds( + kname.getKrb5PrincipalName(), krb5Credentials); + return new Krb5ProxyCredential(this, kname, newCred.getTicket()); + } catch (IOException | KrbException ke) { + GSSException ge = + new GSSException(GSSException.FAILURE, -1, + "Attempt to obtain S4U2self credentials failed!"); + ge.initCause(ke); + throw ge; + } + } } diff --git a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5ProxyCredential.java b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5ProxyCredential.java new file mode 100644 index 00000000000..4c5690b3942 --- /dev/null +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5ProxyCredential.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.jgss.krb5; + +import org.ietf.jgss.*; +import sun.security.jgss.spi.*; +import java.util.Date; +import sun.security.krb5.internal.Ticket; + +/** + * Implements the krb5 proxy credential element used in constrained + * delegation. It is used in both impersonation (where there is no Kerberos 5 + * communication between the middle server and the client) and normal + * constrained delegation (where there is, but client has not called + * requestCredDeleg(true)). + * @since 1.8 + */ + +public class Krb5ProxyCredential + implements Krb5CredElement { + + public final Krb5InitCredential self; // the middle server + private final Krb5NameElement client; // the client + + // The ticket with cname=client and sname=self. This can be a normal + // service ticket or an S4U2self ticket. + public final Ticket tkt; + + Krb5ProxyCredential(Krb5InitCredential self, Krb5NameElement client, + Ticket tkt) { + this.self = self; + this.tkt = tkt; + this.client = client; + } + + // The client name behind the proxy + @Override + public final Krb5NameElement getName() throws GSSException { + return client; + } + + @Override + public int getInitLifetime() throws GSSException { + // endTime of tkt is not used by KDC, and it's also not + // available in the case of kerberos constr deleg + return self.getInitLifetime(); + } + + @Override + public int getAcceptLifetime() throws GSSException { + return 0; + } + + @Override + public boolean isInitiatorCredential() throws GSSException { + return true; + } + + @Override + public boolean isAcceptorCredential() throws GSSException { + return false; + } + + @Override + public final Oid getMechanism() { + return Krb5MechFactory.GSS_KRB5_MECH_OID; + } + + @Override + public final java.security.Provider getProvider() { + return Krb5MechFactory.PROVIDER; + } + + @Override + public void dispose() throws GSSException { + try { + self.destroy(); + } catch (javax.security.auth.DestroyFailedException e) { + GSSException gssException = + new GSSException(GSSException.FAILURE, -1, + "Could not destroy credentials - " + e.getMessage()); + gssException.initCause(e); + } + } + + @Override + public GSSCredentialSpi impersonate(GSSNameSpi name) throws GSSException { + // Cannot impersonate multiple levels without the impersonatee's TGT. + throw new GSSException(GSSException.FAILURE, -1, + "Only an initiate credentials can impersonate"); + } +} diff --git a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Util.java b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Util.java index 28df9520411..97f1a12447c 100644 --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Util.java +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Util.java @@ -206,7 +206,7 @@ public class Krb5Util { * identity, which can be: * 1. Some KerberosKeys (generated from password) * 2. A KeyTab (for a typical service) - * 3. A TGT (for a user2user service. Not supported yet) + * 3. A TGT (for S4U2proxy extension) * * Note that some creds can coexist. For example, a user2user service * can use its keytab (or keys) if the client can successfully obtain a @@ -219,7 +219,7 @@ public class Krb5Util { private List ktabs; private List kk; private Subject subj; - //private KerberosTicket tgt; // user2user, not supported yet + private KerberosTicket tgt; private static ServiceCreds getInstance( Subject subj, String serverPrincipal) { @@ -255,6 +255,8 @@ public class Krb5Util { subj, null, null, KeyTab.class); sc.kk = SubjectComber.findMany( subj, serverPrincipal, null, KerberosKey.class); + sc.tgt = SubjectComber.find(subj, null, null, KerberosTicket.class); + if (sc.ktabs.isEmpty() && sc.kk.isEmpty()) { return null; } @@ -310,10 +312,22 @@ public class Krb5Util { return ekeys; } + public Credentials getInitCred() { + if (tgt == null) { + return null; + } + try { + return ticketToCreds(tgt); + } catch (KrbException | IOException e) { + return null; + } + } + public void destroy() { kp = null; ktabs = null; kk = null; + tgt = null; } } /** @@ -357,7 +371,7 @@ public class Krb5Util { }; public static Credentials ticketToCreds(KerberosTicket kerbTicket) - throws KrbException, IOException { + throws KrbException, IOException { return new Credentials( kerbTicket.getEncoded(), kerbTicket.getClient().getName(), diff --git a/jdk/src/share/classes/sun/security/jgss/spi/GSSCredentialSpi.java b/jdk/src/share/classes/sun/security/jgss/spi/GSSCredentialSpi.java index 0c7e6288991..bab8a5dea52 100644 --- a/jdk/src/share/classes/sun/security/jgss/spi/GSSCredentialSpi.java +++ b/jdk/src/share/classes/sun/security/jgss/spi/GSSCredentialSpi.java @@ -96,4 +96,13 @@ public interface GSSCredentialSpi { * @exception GSSException may be thrown */ public Oid getMechanism(); + + /** + * Impersonates another client. + * + * @param name the client to impersonate + * @return the new credential + * @exception GSSException may be thrown + */ + public GSSCredentialSpi impersonate(GSSNameSpi name) throws GSSException; } diff --git a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java index 849737a98b0..d6bc6d92e6e 100644 --- a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java +++ b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java @@ -1059,6 +1059,9 @@ public class SpNegoContext implements GSSContextSpi { if (mechContext != null) { GSSCredentialImpl delegCred = (GSSCredentialImpl)mechContext.getDelegCred(); + if (delegCred == null) { + return null; + } // determine delegated cred element usage boolean initiate = false; if (delegCred.getUsage() == GSSCredential.INITIATE_ONLY) { diff --git a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoCredElement.java b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoCredElement.java index ae9990085cf..69116f56bd2 100644 --- a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoCredElement.java +++ b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoCredElement.java @@ -88,4 +88,9 @@ public class SpNegoCredElement implements GSSCredentialSpi { public Oid getMechanism() { return GSSUtil.GSS_SPNEGO_MECH_OID; } + + @Override + public GSSCredentialSpi impersonate(GSSNameSpi name) throws GSSException { + return cred.impersonate(name); + } } diff --git a/jdk/src/share/classes/sun/security/jgss/wrapper/GSSCredElement.java b/jdk/src/share/classes/sun/security/jgss/wrapper/GSSCredElement.java index 275ef58651e..e38c4c6bd42 100644 --- a/jdk/src/share/classes/sun/security/jgss/wrapper/GSSCredElement.java +++ b/jdk/src/share/classes/sun/security/jgss/wrapper/GSSCredElement.java @@ -28,6 +28,7 @@ import org.ietf.jgss.*; import java.security.Provider; import sun.security.jgss.GSSUtil; import sun.security.jgss.spi.GSSCredentialSpi; +import sun.security.jgss.spi.GSSNameSpi; /** * This class is essentially a wrapper class for the gss_cred_id_t @@ -132,4 +133,10 @@ public class GSSCredElement implements GSSCredentialSpi { protected void finalize() throws Throwable { dispose(); } + + @Override + public GSSCredentialSpi impersonate(GSSNameSpi name) throws GSSException { + throw new GSSException(GSSException.FAILURE, -1, + "Not supported yet"); + } } diff --git a/jdk/src/share/classes/sun/security/krb5/Credentials.java b/jdk/src/share/classes/sun/security/krb5/Credentials.java index bdb8f7c1045..bf4d57bb2b6 100644 --- a/jdk/src/share/classes/sun/security/krb5/Credentials.java +++ b/jdk/src/share/classes/sun/security/krb5/Credentials.java @@ -449,6 +449,18 @@ public class Credentials { return CredentialsUtil.acquireServiceCreds(service, ccreds); } + public static Credentials acquireS4U2selfCreds(PrincipalName user, + Credentials ccreds) throws KrbException, IOException { + return CredentialsUtil.acquireS4U2selfCreds(user, ccreds); + } + + public static Credentials acquireS4U2proxyCreds(String service, + Ticket second, PrincipalName client, Credentials ccreds) + throws KrbException, IOException { + return CredentialsUtil.acquireS4U2proxyCreds( + service, second, client, ccreds); + } + public CredentialsCache getCache() { return cache; } @@ -490,18 +502,19 @@ public class Credentials { public String toString() { StringBuffer buffer = new StringBuffer("Credentials:"); - buffer.append("\nclient=").append(client); - buffer.append("\nserver=").append(server); + buffer.append( "\n client=").append(client); + buffer.append( "\n server=").append(server); if (authTime != null) { - buffer.append("\nauthTime=").append(authTime); + buffer.append("\n authTime=").append(authTime); } if (startTime != null) { - buffer.append("\nstartTime=").append(startTime); + buffer.append("\n startTime=").append(startTime); } - buffer.append("\nendTime=").append(endTime); - buffer.append("\nrenewTill=").append(renewTill); - buffer.append("\nflags: ").append(flags); - buffer.append("\nEType (int): ").append(key.getEType()); + buffer.append( "\n endTime=").append(endTime); + buffer.append( "\n renewTill=").append(renewTill); + buffer.append( "\n flags=").append(flags); + buffer.append( "\nEType (skey)=").append(key.getEType()); + buffer.append( "\n (tkt key)=").append(ticket.encPart.eType); return buffer.toString(); } diff --git a/jdk/src/share/classes/sun/security/krb5/EncryptedData.java b/jdk/src/share/classes/sun/security/krb5/EncryptedData.java index f9907687e30..0849f919b92 100644 --- a/jdk/src/share/classes/sun/security/krb5/EncryptedData.java +++ b/jdk/src/share/classes/sun/security/krb5/EncryptedData.java @@ -160,8 +160,6 @@ public class EncryptedData implements Cloneable { kvno = key.getKeyVersionNumber(); } */ - - // currently destructive on cipher public byte[] decrypt( EncryptionKey key, int usage) throws KdcErrException, KrbApErrException, KrbCryptoException { @@ -175,7 +173,9 @@ public class EncryptedData implements Cloneable { EType etypeEngine = EType.getInstance(eType); plain = etypeEngine.decrypt(cipher, key.getBytes(), usage); - cipher = null; + // The service ticket will be used in S4U2proxy request. Therefore + // the raw ticket is still needed. + //cipher = null; return etypeEngine.decryptedData(plain); } diff --git a/jdk/src/share/classes/sun/security/krb5/KrbApReq.java b/jdk/src/share/classes/sun/security/krb5/KrbApReq.java index 3120490d039..f4e52d35f7d 100644 --- a/jdk/src/share/classes/sun/security/krb5/KrbApReq.java +++ b/jdk/src/share/classes/sun/security/krb5/KrbApReq.java @@ -287,8 +287,9 @@ public class KrbApReq { cusec = authenticator.cusec; authenticator.ctime.setMicroSeconds(authenticator.cusec); - if (!authenticator.cname.equals(enc_ticketPart.cname)) + if (!authenticator.cname.equals(enc_ticketPart.cname)) { throw new KrbApErrException(Krb5.KRB_AP_ERR_BADMATCH); + } KerberosTime currTime = new KerberosTime(KerberosTime.NOW); if (!authenticator.ctime.inClockSkew(currTime)) diff --git a/jdk/src/share/classes/sun/security/krb5/KrbKdcRep.java b/jdk/src/share/classes/sun/security/krb5/KrbKdcRep.java index 1100aadf506..dd0e951028d 100644 --- a/jdk/src/share/classes/sun/security/krb5/KrbKdcRep.java +++ b/jdk/src/share/classes/sun/security/krb5/KrbKdcRep.java @@ -64,7 +64,12 @@ abstract class KrbKdcRep { for (int i = 1; i < 6; i++) { if (req.reqBody.kdcOptions.get(i) != - rep.encKDCRepPart.flags.get(i)) { + rep.encKDCRepPart.flags.get(i)) { + if (Krb5.DEBUG) { + System.out.println("> KrbKdcRep.check: at #" + i + + ". request for " + req.reqBody.kdcOptions.get(i) + + ", received " + rep.encKDCRepPart.flags.get(i)); + } throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED); } } diff --git a/jdk/src/share/classes/sun/security/krb5/KrbTgsRep.java b/jdk/src/share/classes/sun/security/krb5/KrbTgsRep.java index 7ec38701e74..6fc6cebaa70 100644 --- a/jdk/src/share/classes/sun/security/krb5/KrbTgsRep.java +++ b/jdk/src/share/classes/sun/security/krb5/KrbTgsRep.java @@ -87,7 +87,7 @@ public class KrbTgsRep extends KrbKdcRep { check(false, req, rep); this.creds = new Credentials(rep.ticket, - req.reqBody.cname, + rep.cname, rep.ticket.sname, enc_part.key, enc_part.flags, diff --git a/jdk/src/share/classes/sun/security/krb5/KrbTgsReq.java b/jdk/src/share/classes/sun/security/krb5/KrbTgsReq.java index bbdb8a3e018..9cd84c6d9a4 100644 --- a/jdk/src/share/classes/sun/security/krb5/KrbTgsReq.java +++ b/jdk/src/share/classes/sun/security/krb5/KrbTgsReq.java @@ -35,6 +35,7 @@ import sun.security.krb5.internal.*; import sun.security.krb5.internal.crypto.*; import java.io.IOException; import java.net.UnknownHostException; +import java.util.Arrays; /** * This class encapsulates a Kerberos TGS-REQ that is sent from the @@ -55,7 +56,7 @@ public class KrbTgsReq { private byte[] obuf; private byte[] ibuf; - // Used in CredentialsUtil + // Used in CredentialsUtil public KrbTgsReq(Credentials asCreds, PrincipalName sname) throws KrbException, IOException { @@ -72,6 +73,45 @@ public class KrbTgsReq { null); // EncryptionKey subSessionKey } + // S4U2proxy + public KrbTgsReq(Credentials asCreds, + Ticket second, + PrincipalName sname) + throws KrbException, IOException { + this(KDCOptions.with(KDCOptions.CNAME_IN_ADDL_TKT, + KDCOptions.FORWARDABLE), + asCreds, + sname, + null, + null, + null, + null, + null, + null, + new Ticket[] {second}, // the service ticket + null); + } + + // S4U2user + public KrbTgsReq(Credentials asCreds, + PrincipalName sname, + PAData extraPA) + throws KrbException, IOException { + this(KDCOptions.with(KDCOptions.FORWARDABLE), + asCreds, + asCreds.getClient(), + sname, + null, + null, + null, + null, + null, + null, + null, + null, + extraPA); // the PA-FOR-USER + } + // Called by Credentials, KrbCred KrbTgsReq( KDCOptions options, @@ -85,14 +125,42 @@ public class KrbTgsReq { AuthorizationData authorizationData, Ticket[] additionalTickets, EncryptionKey subKey) throws KrbException, IOException { + this(options, asCreds, asCreds.getClient(), sname, + from, till, rtime, eTypes, addresses, + authorizationData, additionalTickets, subKey, null); + } - princName = asCreds.client; + private KrbTgsReq( + KDCOptions options, + Credentials asCreds, + PrincipalName cname, + PrincipalName sname, + KerberosTime from, + KerberosTime till, + KerberosTime rtime, + int[] eTypes, + HostAddresses addresses, + AuthorizationData authorizationData, + Ticket[] additionalTickets, + EncryptionKey subKey, + PAData extraPA) throws KrbException, IOException { + + princName = cname; servName = sname; ctime = new KerberosTime(KerberosTime.NOW); // check if they are valid arguments. The optional fields // should be consistent with settings in KDCOptions. + + // TODO: Is this necessary? If the TGT is not FORWARDABLE, + // you can still request for a FORWARDABLE ticket, just the + // KDC will give you a non-FORWARDABLE one. Even if you + // cannot use the ticket expected, it still contains info. + // This means there will be problem later. We already have + // flags check in KrbTgsRep. Of course, sometimes the KDC + // will not issue the ticket at all. + if (options.get(KDCOptions.FORWARDABLE) && (!(asCreds.flags.get(Krb5.TKT_OPTS_FORWARDABLE)))) { throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS); @@ -130,13 +198,13 @@ public class KrbTgsReq { } else { if (rtime != null) rtime = null; } - if (options.get(KDCOptions.ENC_TKT_IN_SKEY)) { + if (options.get(KDCOptions.ENC_TKT_IN_SKEY) || options.get(KDCOptions.CNAME_IN_ADDL_TKT)) { if (additionalTickets == null) throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS); // in TGS_REQ there could be more than one additional // tickets, but in file-based credential cache, // there is only one additional ticket field. - secondTicket = additionalTickets[0]; + secondTicket = additionalTickets[0]; } else { if (additionalTickets != null) additionalTickets = null; @@ -156,7 +224,8 @@ public class KrbTgsReq { addresses, authorizationData, additionalTickets, - subKey); + subKey, + extraPA); obuf = tgsReqMessg.asn1Encode(); // XXX We need to revisit this to see if can't move it @@ -221,7 +290,8 @@ public class KrbTgsReq { HostAddresses addresses, AuthorizationData authorizationData, Ticket[] additionalTickets, - EncryptionKey subKey) + EncryptionKey subKey, + PAData extraPA) throws Asn1Exception, IOException, KdcErrException, KrbApErrException, UnknownHostException, KrbCryptoException { KerberosTime req_till = null; @@ -318,10 +388,12 @@ public class KrbTgsReq { null, null).getMessage(); - PAData[] tgsPAData = new PAData[1]; - tgsPAData[0] = new PAData(Krb5.PA_TGS_REQ, tgs_ap_req); - - return new TGSReq(tgsPAData, reqBody); + PAData tgsPAData = new PAData(Krb5.PA_TGS_REQ, tgs_ap_req); + return new TGSReq( + extraPA != null ? + new PAData[] {extraPA, tgsPAData } : + new PAData[] {tgsPAData}, + reqBody); } TGSReq getMessage() { diff --git a/jdk/src/share/classes/sun/security/krb5/internal/CredentialsUtil.java b/jdk/src/share/classes/sun/security/krb5/internal/CredentialsUtil.java index f1577c2cba6..e6cd420ca80 100644 --- a/jdk/src/share/classes/sun/security/krb5/internal/CredentialsUtil.java +++ b/jdk/src/share/classes/sun/security/krb5/internal/CredentialsUtil.java @@ -32,17 +32,7 @@ package sun.security.krb5.internal; import sun.security.krb5.*; -import sun.security.krb5.internal.ccache.CredentialsCache; -import java.util.StringTokenizer; -import sun.security.krb5.internal.ktab.*; -import java.io.File; import java.io.IOException; -import java.util.Date; -import java.util.Vector; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.net.InetAddress; /** * This class is a utility that contains much of the TGS-Exchange @@ -53,77 +43,158 @@ public class CredentialsUtil { private static boolean DEBUG = sun.security.krb5.internal.Krb5.DEBUG; - /** - * Acquires credentials for a specified service using initial credential. Wh -en the service has a different realm - * from the initial credential, we do cross-realm authentication - first, we - use the current credential to get - * a cross-realm credential from the local KDC, then use that cross-realm cr -edential to request service credential - * from the foreigh KDC. - * - * @param service the name of service principal using format components@real -m - * @param ccreds client's initial credential. - * @exception Exception general exception will be thrown when any error occu -rs. - * @return a Credentials object. - */ + /** + * Used by a middle server to acquire credentials on behalf of a + * client to itself using the S4U2self extension. + * @param client the client to impersonate + * @param ccreds the TGT of the middle service + * @return the new creds (cname=client, sname=middle) + */ + public static Credentials acquireS4U2selfCreds(PrincipalName client, + Credentials ccreds) throws KrbException, IOException { + String uRealm = client.getRealmString(); + String localRealm = ccreds.getClient().getRealmString(); + if (!uRealm.equals(localRealm)) { + // TODO: we do not support kerberos referral now + throw new KrbException("Cross realm impersonation not supported"); + } + KrbTgsReq req = new KrbTgsReq( + ccreds, + ccreds.getClient(), + new PAData(Krb5.PA_FOR_USER, + new PAForUserEnc(client, + ccreds.getSessionKey()).asn1Encode())); + Credentials creds = req.sendAndGetCreds(); + if (!creds.getClient().equals(client)) { + throw new KrbException("S4U2self request not honored by KDC"); + } + return creds; + } + + /** + * Used by a middle server to acquire a service ticket to a backend + * server using the S4U2proxy extension. + * @param backend the name of the backend service + * @param second the client's service ticket to the middle server + * @param ccreds the TGT of the middle server + * @return the creds (cname=client, sname=backend) + */ + public static Credentials acquireS4U2proxyCreds( + String backend, Ticket second, + PrincipalName client, Credentials ccreds) + throws KrbException, IOException { + KrbTgsReq req = new KrbTgsReq( + ccreds, + second, + new PrincipalName(backend)); + Credentials creds = req.sendAndGetCreds(); + if (!creds.getClient().equals(client)) { + throw new KrbException("S4U2proxy request not honored by KDC"); + } + return creds; + } + + /** + * Acquires credentials for a specified service using initial + * credential. When the service has a different realm from the initial + * credential, we do cross-realm authentication - first, we use the + * current credential to get a cross-realm credential from the local KDC, + * then use that cross-realm credential to request service credential + * from the foreign KDC. + * + * @param service the name of service principal + * @param ccreds client's initial credential + */ public static Credentials acquireServiceCreds( String service, Credentials ccreds) - throws KrbException, IOException { + throws KrbException, IOException { PrincipalName sname = new PrincipalName(service); String serviceRealm = sname.getRealmString(); String localRealm = ccreds.getClient().getRealmString(); - /* - if (!localRealm.equalsIgnoreCase(serviceRealm)) { //do cross-realm auth entication - if (DEBUG) { - System.out.println(">>>DEBUG: Credentails request cross realm ticket for " + "krbtgt/" + serviceRealm + "@" + localRealm); - } - Credentials crossCreds = serviceCreds(new ServiceName("krbtgt/" + serviceRealm + "@" + localRealm), ccreds); - if (DEBUG) { - printDebug(crossCreds); - } - Credentials result = serviceCreds(sname, crossCreds); - if (DEBUG) { - printDebug(result); - } - return result; - } - else return serviceCreds(sname, ccreds); - */ - - if (localRealm.equals(serviceRealm)) - { - if (DEBUG) - System.out.println(">>> Credentials acquireServiceCreds: same realm"); + if (localRealm.equals(serviceRealm)) { + if (DEBUG) { + System.out.println( + ">>> Credentials acquireServiceCreds: same realm"); + } return serviceCreds(sname, ccreds); } + Credentials theCreds = null; + + boolean[] okAsDelegate = new boolean[1]; + Credentials theTgt = getTGTforRealm(localRealm, serviceRealm, + ccreds, okAsDelegate); + if (theTgt != null) { + if (DEBUG) { + System.out.println(">>> Credentials acquireServiceCreds: " + + "got right tgt"); + System.out.println(">>> Credentials acquireServiceCreds: " + + "obtaining service creds for " + sname); + } + + try { + theCreds = serviceCreds(sname, theTgt); + } catch (Exception exc) { + if (DEBUG) { + System.out.println(exc); + } + theCreds = null; + } + } + + if (theCreds != null) { + if (DEBUG) { + System.out.println(">>> Credentials acquireServiceCreds: " + + "returning creds:"); + Credentials.printDebug(theCreds); + } + if (!okAsDelegate[0]) { + theCreds.resetDelegate(); + } + return theCreds; + } + throw new KrbApErrException(Krb5.KRB_AP_ERR_GEN_CRED, + "No service creds"); + } + + /** + * Gets a TGT to another realm + * @param localRealm this realm + * @param serviceRealm the other realm + * @param ccreds TGT in this realm + * @param okAsDelegate an [out] argument to receive the okAsDelegate + * property. True only if all realms allow delegation. + * @return the TGT for the other realm, null if cannot find a path + * @throws KrbException if something goes wrong + */ + private static Credentials getTGTforRealm(String localRealm, + String serviceRealm, Credentials ccreds, boolean[] okAsDelegate) + throws KrbException { // Get a list of realms to traverse String[] realms = Realm.getRealmsList(localRealm, serviceRealm); - boolean okAsDelegate = true; - if (realms == null || realms.length == 0) - { - if (DEBUG) - System.out.println(">>> Credentials acquireServiceCreds: no realms list"); + if (realms == null || realms.length == 0) { + if (DEBUG) { + System.out.println( + ">>> Credentials acquireServiceCreds: no realms list"); + } return null; } int i = 0, k = 0; Credentials cTgt = null, newTgt = null, theTgt = null; PrincipalName tempService = null; - String realm = null, newTgtRealm = null, theTgtRealm = null; + String newTgtRealm = null; - for (cTgt = ccreds, i = 0; i < realms.length;) - { + okAsDelegate[0] = true; + for (cTgt = ccreds, i = 0; i < realms.length;) { tempService = PrincipalName.tgsService(serviceRealm, realms[i]); - if (DEBUG) - { - System.out.println(">>> Credentials acquireServiceCreds: main loop: [" + i +"] tempService=" + tempService); + if (DEBUG) { + System.out.println( + ">>> Credentials acquireServiceCreds: main loop: [" + + i +"] tempService=" + tempService); } try { @@ -132,11 +203,10 @@ rs. newTgt = null; } - if (newTgt == null) - { - if (DEBUG) - { - System.out.println(">>> Credentials acquireServiceCreds: no tgt; searching backwards"); + if (newTgt == null) { + if (DEBUG) { + System.out.println(">>> Credentials acquireServiceCreds: " + + "no tgt; searching backwards"); } /* @@ -144,17 +214,15 @@ rs. * realm as close to the target as possible. * That means traversing the realms list backwards. */ - for (newTgt = null, k = realms.length - 1; - newTgt == null && k > i; k--) - { - + newTgt == null && k > i; k--) { tempService = PrincipalName.tgsService(realms[k], realms[i]); - if (DEBUG) - { - System.out.println(">>> Credentials acquireServiceCreds: inner loop: [" + k +"] tempService=" + tempService); + if (DEBUG) { + System.out.println( + ">>> Credentials acquireServiceCreds: " + + "inner loop: [" + k + + "] tempService=" + tempService); } - try { newTgt = serviceCreds(tempService, cTgt); } catch (Exception exc) { @@ -163,11 +231,10 @@ rs. } } // Ends 'if (newTgt == null)' - if (newTgt == null) - { - if (DEBUG) - { - System.out.println(">>> Credentials acquireServiceCreds: no tgt; cannot get creds"); + if (newTgt == null) { + if (DEBUG) { + System.out.println(">>> Credentials acquireServiceCreds: " + + "no tgt; cannot get creds"); } break; } @@ -176,29 +243,24 @@ rs. * We have a tgt. It may or may not be for the target. * If it's for the target realm, we're done looking for a tgt. */ - newTgtRealm = newTgt.getServer().getInstanceComponent(); - if (okAsDelegate && !newTgt.checkDelegate()) { - if (DEBUG) - { + if (okAsDelegate[0] && !newTgt.checkDelegate()) { + if (DEBUG) { System.out.println(">>> Credentials acquireServiceCreds: " + "global OK-AS-DELEGATE turned off at " + newTgt.getServer()); } - okAsDelegate = false; + okAsDelegate[0] = false; } - if (DEBUG) - { - System.out.println(">>> Credentials acquireServiceCreds: got tgt"); - //printDebug(newTgt); + if (DEBUG) { + System.out.println(">>> Credentials acquireServiceCreds: " + + "got tgt"); } - if (newTgtRealm.equals(serviceRealm)) - { + if (newTgtRealm.equals(serviceRealm)) { /* We got the right tgt */ theTgt = newTgt; - theTgtRealm = newTgtRealm; break; } @@ -207,17 +269,13 @@ rs. * See if the realm of the new tgt is in the list of realms * and continue looking from there. */ - - for (k = i+1; k < realms.length; k++) - { - if (newTgtRealm.equals(realms[k])) - { + for (k = i+1; k < realms.length; k++) { + if (newTgtRealm.equals(realms[k])) { break; } } - if (k < realms.length) - { + if (k < realms.length) { /* * (re)set the counter so we start looking * from the realm we just obtained a tgt for. @@ -225,64 +283,24 @@ rs. i = k; cTgt = newTgt; - if (DEBUG) - { - System.out.println(">>> Credentials acquireServiceCreds: continuing with main loop counter reset to " + i); + if (DEBUG) { + System.out.println(">>> Credentials acquireServiceCreds: " + + "continuing with main loop counter reset to " + i); } - continue; } - else - { + else { /* * The new tgt's realm is not in the heirarchy of realms. * It's probably not safe to get a tgt from * a tgs that is outside the known list of realms. * Give up now. */ - break; } } // Ends outermost/main 'for' loop - Credentials theCreds = null; - - if (theTgt != null) - { - /* We have the right tgt. Let's get the service creds */ - - if (DEBUG) - { - System.out.println(">>> Credentials acquireServiceCreds: got right tgt"); - - //printDebug(theTgt); - - System.out.println(">>> Credentials acquireServiceCreds: obtaining service creds for " + sname); - } - - try { - theCreds = serviceCreds(sname, theTgt); - } catch (Exception exc) { - if (DEBUG) - System.out.println(exc); - theCreds = null; - } - } - - if (theCreds != null) - { - if (DEBUG) - { - System.out.println(">>> Credentials acquireServiceCreds: returning creds:"); - Credentials.printDebug(theCreds); - } - if (!okAsDelegate) { - theCreds.resetDelegate(); - } - return theCreds; - } - throw new KrbApErrException(Krb5.KRB_AP_ERR_GEN_CRED, - "No service creds"); + return theTgt; } /* diff --git a/jdk/src/share/classes/sun/security/krb5/internal/EncKDCRepPart.java b/jdk/src/share/classes/sun/security/krb5/internal/EncKDCRepPart.java index 943869d60b8..2dd4c841ccc 100644 --- a/jdk/src/share/classes/sun/security/krb5/internal/EncKDCRepPart.java +++ b/jdk/src/share/classes/sun/security/krb5/internal/EncKDCRepPart.java @@ -160,9 +160,10 @@ public class EncKDCRepPart { if (der.getData().available() > 0) { caddr = HostAddresses.parse(der.getData(), (byte) 0x0B, true); } - if (der.getData().available() > 0) { + // We observe extra data from MSAD + /*if (der.getData().available() > 0) { throw new Asn1Exception(Krb5.ASN1_BAD_ID); - } + }*/ } /** diff --git a/jdk/src/share/classes/sun/security/krb5/internal/KDCOptions.java b/jdk/src/share/classes/sun/security/krb5/internal/KDCOptions.java index f154eeb1dc9..a3d93021710 100644 --- a/jdk/src/share/classes/sun/security/krb5/internal/KDCOptions.java +++ b/jdk/src/share/classes/sun/security/krb5/internal/KDCOptions.java @@ -139,13 +139,45 @@ public class KDCOptions extends KerberosFlags { public static final int UNUSED9 = 9; public static final int UNUSED10 = 10; public static final int UNUSED11 = 11; + public static final int CNAME_IN_ADDL_TKT = 14; public static final int RENEWABLE_OK = 27; public static final int ENC_TKT_IN_SKEY = 28; public static final int RENEW = 30; public static final int VALIDATE = 31; + private static final String[] names = { + "RESERVED", //0 + "FORWARDABLE", //1; + "FORWARDED", //2; + "PROXIABLE", //3; + "PROXY", //4; + "ALLOW_POSTDATE", //5; + "POSTDATED", //6; + "UNUSED7", //7; + "RENEWABLE", //8; + "UNUSED9", //9; + "UNUSED10", //10; + "UNUSED11", //11; + null,null, + "CNAME_IN_ADDL_TKT",//14; + null,null,null,null,null,null,null,null,null,null,null,null, + "RENEWABLE_OK", //27; + "ENC_TKT_IN_SKEY", //28; + null, + "RENEW", //30; + "VALIDATE", //31; + }; + private boolean DEBUG = Krb5.DEBUG; + public static KDCOptions with(int... flags) { + KDCOptions options = new KDCOptions(); + for (int flag: flags) { + options.set(flag, true); + } + return options; + } + public KDCOptions() { super(Krb5.KDC_OPTS_MAX + 1); setDefault(); @@ -238,6 +270,20 @@ public class KDCOptions extends KerberosFlags { return super.get(option); } + @Override public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("KDCOptions: "); + for (int i=0; i + * padata-type ::= PA-FOR-USER + * -- value 129 + * padata-value ::= EncryptedData + * -- PA-FOR-USER-ENC + * PA-FOR-USER-ENC ::= SEQUENCE { + * userName[0] PrincipalName, + * userRealm[1] Realm, + * cksum[2] Checksum, + * auth-package[3] KerberosString + * } + * + * + *

    + * This definition reflects MS-SFU. + */ + +public class PAForUserEnc { + final public PrincipalName name; + final private EncryptionKey key; + final public static String AUTH_PACKAGE = "Kerberos"; + + public PAForUserEnc(PrincipalName name, EncryptionKey key) { + this.name = name; + this.key = key; + } + + /** + * Constructs a PA-FOR-USER object from a DER encoding. + * @param encoding the input object + * @param key the key to verify the checksum inside encoding + * @throws KrbException if the verification fails. + * Note: this method is now only used by test KDC, therefore + * the verification is ignored (at the moment). + */ + public PAForUserEnc(DerValue encoding, EncryptionKey key) + throws Asn1Exception, KrbException, IOException { + DerValue der = null; + this.key = key; + + if (encoding.getTag() != DerValue.tag_Sequence) { + throw new Asn1Exception(Krb5.ASN1_BAD_ID); + } + + // Realm after name? Quite abnormal. + PrincipalName tmpName = null; + der = encoding.getData().getDerValue(); + if ((der.getTag() & 0x1F) == 0x00) { + try { + tmpName = new PrincipalName(der.getData().getDerValue(), + new Realm("PLACEHOLDER")); + } catch (RealmException re) { + // Impossible + } + } else { + throw new Asn1Exception(Krb5.ASN1_BAD_ID); + } + + der = encoding.getData().getDerValue(); + if ((der.getTag() & 0x1F) == 0x01) { + try { + Realm realm = new Realm(der.getData().getDerValue()); + name = new PrincipalName( + tmpName.getNameType(), tmpName.getNameStrings(), realm); + } catch (RealmException re) { + throw new IOException(re); + } + } else { + throw new Asn1Exception(Krb5.ASN1_BAD_ID); + } + + der = encoding.getData().getDerValue(); + if ((der.getTag() & 0x1F) == 0x02) { + // Deal with the checksum + } else { + throw new Asn1Exception(Krb5.ASN1_BAD_ID); + } + + der = encoding.getData().getDerValue(); + if ((der.getTag() & 0x1F) == 0x03) { + String authPackage = new KerberosString(der.getData().getDerValue()).toString(); + if (!authPackage.equalsIgnoreCase(AUTH_PACKAGE)) { + throw new IOException("Incorrect auth-package"); + } + } else { + throw new Asn1Exception(Krb5.ASN1_BAD_ID); + } + if (encoding.getData().available() > 0) + throw new Asn1Exception(Krb5.ASN1_BAD_ID); + } + + public byte[] asn1Encode() throws Asn1Exception, IOException { + DerOutputStream bytes = new DerOutputStream(); + bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), name.asn1Encode()); + bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), name.getRealm().asn1Encode()); + + try { + Checksum cks = new Checksum( + Checksum.CKSUMTYPE_HMAC_MD5_ARCFOUR, + getS4UByteArray(), + key, + KeyUsage.KU_PA_FOR_USER_ENC_CKSUM); + bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), cks.asn1Encode()); + } catch (KrbException ke) { + throw new IOException(ke); + } + + DerOutputStream temp = new DerOutputStream(); + temp.putDerValue(new KerberosString(AUTH_PACKAGE).toDerValue()); + bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), temp); + + temp = new DerOutputStream(); + temp.write(DerValue.tag_Sequence, bytes); + return temp.toByteArray(); + } + + /** + * Returns S4UByteArray, the block to calculate checksum inside a + * PA-FOR-USER-ENC data structure. It includes: + * 1. userName.name-type encoded as a 4-byte integer in little endian + * byte order + * 2. all string values in the sequence of strings contained in the + * userName.name-string field + * 3. the string value of the userRealm field + * 4. the string value of auth-package field + */ + public byte[] getS4UByteArray() { + try { + ByteArrayOutputStream ba = new ByteArrayOutputStream(); + ba.write(new byte[4]); + for (String s: name.getNameStrings()) { + ba.write(s.getBytes("UTF-8")); + } + ba.write(name.getRealm().toString().getBytes("UTF-8")); + ba.write(AUTH_PACKAGE.getBytes("UTF-8")); + byte[] output = ba.toByteArray(); + int pnType = name.getNameType(); + output[0] = (byte)(pnType & 0xff); + output[1] = (byte)((pnType>>8) & 0xff); + output[2] = (byte)((pnType>>16) & 0xff); + output[3] = (byte)((pnType>>24) & 0xff); + return output; + } catch (IOException ioe) { + // not possible + throw new AssertionError("Cannot write ByteArrayOutputStream", ioe); + } + } + + public String toString() { + return "PA-FOR-USER: " + name; + } +} diff --git a/jdk/src/share/classes/sun/security/krb5/internal/crypto/KeyUsage.java b/jdk/src/share/classes/sun/security/krb5/internal/crypto/KeyUsage.java index fcc831b0798..69c6fc8d992 100644 --- a/jdk/src/share/classes/sun/security/krb5/internal/crypto/KeyUsage.java +++ b/jdk/src/share/classes/sun/security/krb5/internal/crypto/KeyUsage.java @@ -54,6 +54,7 @@ public class KeyUsage { public static final int KU_ENC_KRB_PRIV_PART = 13; // KrbPriv public static final int KU_ENC_KRB_CRED_PART = 14; // KrbCred public static final int KU_KRB_SAFE_CKSUM = 15; // KrbSafe + public static final int KU_PA_FOR_USER_ENC_CKSUM = 17; // S4U2user public static final int KU_AD_KDC_ISSUED_CKSUM = 19; public static final boolean isValid(int usage) { diff --git a/jdk/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java b/jdk/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java index 2a12a816270..b2a71ce6693 100644 --- a/jdk/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java +++ b/jdk/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java @@ -279,6 +279,9 @@ public class KeyTab implements KeyTabConstants { EncryptionKey key; int size = entries.size(); ArrayList keys = new ArrayList<>(size); + if (DEBUG) { + System.out.println("Looking for keys for: " + service); + } for (int i = size-1; i >= 0; i--) { entry = entries.elementAt(i); if (entry.service.match(service)) { diff --git a/jdk/test/sun/security/krb5/auto/Basic.java b/jdk/test/sun/security/krb5/auto/Basic.java index 1048dc037e4..ef7f11db509 100644 --- a/jdk/test/sun/security/krb5/auto/Basic.java +++ b/jdk/test/sun/security/krb5/auto/Basic.java @@ -38,11 +38,13 @@ public class Basic { new OneKDC(null).writeJAASConf(); - Context c, s; + Context c, s, s2, b; c = Context.fromJAAS("client"); s = Context.fromJAAS("server"); + b = Context.fromJAAS("backend"); c.startAsClient(OneKDC.SERVER, GSSUtil.GSS_KRB5_MECH_OID); + c.x().requestCredDeleg(true); s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID); Context.handshake(c, s); @@ -50,7 +52,13 @@ public class Basic { Context.transmit("i say high --", c, s); Context.transmit(" you say low", s, c); + s2 = s.delegated(); s.dispose(); c.dispose(); + + s2.startAsClient(OneKDC.BACKEND, GSSUtil.GSS_KRB5_MECH_OID); + b.startAsServer(GSSUtil.GSS_KRB5_MECH_OID); + + Context.handshake(s2, b); } } diff --git a/jdk/test/sun/security/krb5/auto/Context.java b/jdk/test/sun/security/krb5/auto/Context.java index 64ef5908262..7eef77c61c8 100644 --- a/jdk/test/sun/security/krb5/auto/Context.java +++ b/jdk/test/sun/security/krb5/auto/Context.java @@ -42,9 +42,10 @@ import org.ietf.jgss.Oid; import com.sun.security.jgss.ExtendedGSSContext; import com.sun.security.jgss.InquireType; import com.sun.security.jgss.AuthorizationDataEntry; +import com.sun.security.jgss.ExtendedGSSCredential; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import javax.security.auth.kerberos.KeyTab; +import java.security.Principal; /** * Context of a JGSS subject, encapsulating Subject and GSSContext. @@ -90,7 +91,21 @@ public class Context { public Context delegated() throws Exception { Context out = new Context(); out.s = s; - out.cred = x.getDelegCred(); + try { + out.cred = Subject.doAs(s, new PrivilegedExceptionAction() { + @Override + public GSSCredential run() throws Exception { + GSSCredential cred = x.getDelegCred(); + if (cred == null && x.getCredDelegState() || + cred != null && !x.getCredDelegState()) { + throw new Exception("getCredDelegState not match"); + } + return cred; + } + }); + } catch (PrivilegedActionException pae) { + throw pae.getException(); + } out.name = name + " as " + out.cred.getName().toString(); return out; } @@ -212,28 +227,34 @@ public class Context { * @throws java.lang.Exception */ public void startAsServer(final Oid mech) throws Exception { - startAsServer(null, mech); + startAsServer(null, mech, false); } + public void startAsServer(final String name, final Oid mech) throws Exception { + startAsServer(name, mech, false); + } /** * Starts as a server with the specified service name * @param name the service name * @param mech GSS mech * @throws java.lang.Exception */ - public void startAsServer(final String name, final Oid mech) throws Exception { + public void startAsServer(final String name, final Oid mech, final boolean asInitiator) throws Exception { doAs(new Action() { @Override public byte[] run(Context me, byte[] dummy) throws Exception { GSSManager m = GSSManager.getInstance(); - me.x = (ExtendedGSSContext)m.createContext(m.createCredential( + me.cred = m.createCredential( name == null ? null : (name.indexOf('@') < 0 ? m.createName(name, null) : m.createName(name, GSSName.NT_HOSTBASED_SERVICE)), GSSCredential.INDEFINITE_LIFETIME, mech, - GSSCredential.ACCEPT_ONLY)); + asInitiator? + GSSCredential.INITIATE_AND_ACCEPT: + GSSCredential.ACCEPT_ONLY); + me.x = (ExtendedGSSContext)m.createContext(me.cred); return null; } }, null); @@ -331,27 +352,38 @@ public class Context { } catch (Exception e) { ;// Don't care } - System.out.println("====== Private Credentials Set ======"); - for (Object o : s.getPrivateCredentials()) { - System.out.println(" " + o.getClass()); - if (o instanceof KerberosTicket) { - KerberosTicket kt = (KerberosTicket) o; - System.out.println(" " + kt.getServer() + " for " + kt.getClient()); - } else if (o instanceof KerberosKey) { - KerberosKey kk = (KerberosKey) o; - System.out.print(" " + kk.getKeyType() + " " + kk.getVersionNumber() + " " + kk.getAlgorithm() + " "); - for (byte b : kk.getEncoded()) { - System.out.printf("%02X", b & 0xff); - } - System.out.println(); - } else if (o instanceof Map) { - Map map = (Map) o; - for (Object k : map.keySet()) { - System.out.println(" " + k + ": " + map.get(k)); - } - } else { + if (s != null) { + System.out.println("====== START SUBJECT CONTENT ====="); + for (Principal p: s.getPrincipals()) { + System.out.println(" Principal: " + p); + } + for (Object o : s.getPublicCredentials()) { + System.out.println(" " + o.getClass()); System.out.println(" " + o); } + System.out.println("====== Private Credentials Set ======"); + for (Object o : s.getPrivateCredentials()) { + System.out.println(" " + o.getClass()); + if (o instanceof KerberosTicket) { + KerberosTicket kt = (KerberosTicket) o; + System.out.println(" " + kt.getServer() + " for " + kt.getClient()); + } else if (o instanceof KerberosKey) { + KerberosKey kk = (KerberosKey) o; + System.out.print(" " + kk.getKeyType() + " " + kk.getVersionNumber() + " " + kk.getAlgorithm() + " "); + for (byte b : kk.getEncoded()) { + System.out.printf("%02X", b & 0xff); + } + System.out.println(); + } else if (o instanceof Map) { + Map map = (Map) o; + for (Object k : map.keySet()) { + System.out.println(" " + k + ": " + map.get(k)); + } + } else { + System.out.println(" " + o); + } + } + System.out.println("====== END SUBJECT CONTENT ====="); } if (x != null && x instanceof ExtendedGSSContext) { if (x.isEstablished()) { @@ -510,6 +542,29 @@ public class Context { return sb.toString(); } + public Context impersonate(final String someone) throws Exception { + try { + GSSCredential creds = Subject.doAs(s, new PrivilegedExceptionAction() { + @Override + public GSSCredential run() throws Exception { + GSSManager m = GSSManager.getInstance(); + GSSName other = m.createName(someone, GSSName.NT_USER_NAME); + if (Context.this.cred == null) { + Context.this.cred = m.createCredential(GSSCredential.INITIATE_ONLY); + } + return ((ExtendedGSSCredential)Context.this.cred).impersonate(other); + } + }); + Context out = new Context(); + out.s = s; + out.cred = creds; + out.name = name + " as " + out.cred.getName().toString(); + return out; + } catch (PrivilegedActionException pae) { + throw pae.getException(); + } + } + public byte[] take(final byte[] in) throws Exception { return doAs(new Action() { @Override @@ -522,10 +577,11 @@ public class Context { } return null; } else { - System.out.println(name + " call initSecContext"); if (me.x.isInitiator()) { + System.out.println(name + " call initSecContext"); return me.x.initSecContext(input, 0, input.length); } else { + System.out.println(name + " call acceptSecContext"); return me.x.acceptSecContext(input, 0, input.length); } } diff --git a/jdk/test/sun/security/krb5/auto/CrossRealm.java b/jdk/test/sun/security/krb5/auto/CrossRealm.java index 21927b6f8a8..ef04521c66d 100644 --- a/jdk/test/sun/security/krb5/auto/CrossRealm.java +++ b/jdk/test/sun/security/krb5/auto/CrossRealm.java @@ -24,6 +24,7 @@ /* * @test * @bug 6706974 + * @compile -XDignore.symbol.file CrossRealm.java * @run main/othervm CrossRealm * @summary Add krb5 test infrastructure */ diff --git a/jdk/test/sun/security/krb5/auto/KDC.java b/jdk/test/sun/security/krb5/auto/KDC.java index 716e2fa0e07..409f3131fb8 100644 --- a/jdk/test/sun/security/krb5/auto/KDC.java +++ b/jdk/test/sun/security/krb5/auto/KDC.java @@ -178,6 +178,20 @@ public class KDC { * What backend server can be delegated to */ OK_AS_DELEGATE, + /** + * Allow S4U2self, List of middle servers. + * If not set, means KDC does not understand S4U2self at all, therefore + * would ignore any PA-FOR-USER request and send a ticket using the + * cname of teh requestor. If set, it returns FORWARDABLE tickets to + * a server with its name in the list + */ + ALLOW_S4U2SELF, + /** + * Allow S4U2proxy, Map> of middle servers to + * backends. If not set or a backend not in a server's list, + * Krb5.KDC_ERR_POLICY will be send for S4U2proxy request. + */ + ALLOW_S4U2PROXY, }; static { @@ -618,13 +632,18 @@ public class KDC { int e2 = eTypes[0]; // etype for outgoing session key int e3 = eTypes[0]; // etype for outgoing ticket - PAData[] pas = kDCReqDotPAData(tgsReq); + PAData[] pas = KDCReqDotPAData(tgsReq); Ticket tkt = null; EncTicketPart etp = null; + + PrincipalName cname = null; + boolean allowForwardable = true; + if (pas == null || pas.length == 0) { throw new KrbException(Krb5.KDC_ERR_PADATA_TYPE_NOSUPP); } else { + PrincipalName forUserCName = null; for (PAData pa: pas) { if (pa.getType() == Krb5.PA_TGS_REQ) { APReq apReq = new APReq(pa.getValue()); @@ -636,8 +655,31 @@ public class KDC { DerInputStream derIn = new DerInputStream(bb); DerValue der = derIn.getDerValue(); etp = new EncTicketPart(der.toByteArray()); + // Finally, cname will be overwritten by PA-FOR-USER + // if it exists. + cname = etp.cname; + System.out.println(realm + "> presenting a ticket of " + + etp.cname + " to " + tkt.sname); + } else if (pa.getType() == Krb5.PA_FOR_USER) { + if (options.containsKey(Option.ALLOW_S4U2SELF)) { + PAForUserEnc p4u = new PAForUserEnc( + new DerValue(pa.getValue()), null); + forUserCName = p4u.name; + System.out.println(realm + "> presenting a PA_FOR_USER " + + " in the name of " + p4u.name); + } } } + if (forUserCName != null) { + List names = (List)options.get(Option.ALLOW_S4U2SELF); + if (!names.contains(cname.toString())) { + // Mimic the normal KDC behavior. When a server is not + // allowed to send S4U2self, do not send an error. + // Instead, send a ticket which is useless later. + allowForwardable = false; + } + cname = forUserCName; + } if (tkt == null) { throw new KrbException(Krb5.KDC_ERR_PADATA_TYPE_NOSUPP); } @@ -658,7 +700,8 @@ public class KDC { } boolean[] bFlags = new boolean[Krb5.TKT_OPTS_MAX+1]; - if (body.kdcOptions.get(KDCOptions.FORWARDABLE)) { + if (body.kdcOptions.get(KDCOptions.FORWARDABLE) + && allowForwardable) { bFlags[Krb5.TKT_OPTS_FORWARDABLE] = true; } if (body.kdcOptions.get(KDCOptions.FORWARDED) || @@ -678,6 +721,37 @@ public class KDC { if (body.kdcOptions.get(KDCOptions.ALLOW_POSTDATE)) { bFlags[Krb5.TKT_OPTS_MAY_POSTDATE] = true; } + if (body.kdcOptions.get(KDCOptions.CNAME_IN_ADDL_TKT)) { + if (!options.containsKey(Option.ALLOW_S4U2PROXY)) { + // Don't understand CNAME_IN_ADDL_TKT + throw new KrbException(Krb5.KDC_ERR_BADOPTION); + } else { + Map> map = (Map>) + options.get(Option.ALLOW_S4U2PROXY); + Ticket second = KDCReqBodyDotFirstAdditionalTicket(body); + EncryptionKey key2 = keyForUser(second.sname, second.encPart.getEType(), true); + byte[] bb = second.encPart.decrypt(key2, KeyUsage.KU_TICKET); + DerInputStream derIn = new DerInputStream(bb); + DerValue der = derIn.getDerValue(); + EncTicketPart tktEncPart = new EncTicketPart(der.toByteArray()); + if (!tktEncPart.flags.get(Krb5.TKT_OPTS_FORWARDABLE)) { + //throw new KrbException(Krb5.KDC_ERR_BADOPTION); + } + PrincipalName client = tktEncPart.cname; + System.out.println(realm + "> and an additional ticket of " + + client + " to " + second.sname); + if (map.containsKey(cname.toString())) { + if (map.get(cname.toString()).contains(service.toString())) { + System.out.println(realm + "> S4U2proxy OK"); + } else { + throw new KrbException(Krb5.KDC_ERR_BADOPTION); + } + } else { + throw new KrbException(Krb5.KDC_ERR_BADOPTION); + } + cname = client; + } + } String okAsDelegate = (String)options.get(Option.OK_AS_DELEGATE); if (okAsDelegate != null && ( @@ -691,7 +765,7 @@ public class KDC { EncTicketPart enc = new EncTicketPart( tFlags, key, - etp.cname, + cname, new TransitedEncoding(1, new byte[0]), // TODO new KerberosTime(new Date()), body.from, @@ -729,7 +803,7 @@ public class KDC { ); EncryptedData edata = new EncryptedData(ckey, enc_part.asn1Encode(), KeyUsage.KU_ENC_TGS_REP_PART_SESSKEY); TGSRep tgsRep = new TGSRep(null, - etp.cname, + cname, t, edata); System.out.println(" Return " + tgsRep.cname @@ -942,7 +1016,7 @@ public class KDC { outPAs.add(new PAData(Krb5.PA_ETYPE_INFO, eid.toByteArray())); } - PAData[] inPAs = kDCReqDotPAData(asReq); + PAData[] inPAs = KDCReqDotPAData(asReq); if (inPAs == null || inPAs.length == 0) { Object preauth = options.get(Option.PREAUTH_REQUIRED); if (preauth == null || preauth.equals(Boolean.TRUE)) { @@ -1252,6 +1326,7 @@ public class KDC { private static final Field getEType; private static final Constructor ctorEncryptedData; private static final Method stringToKey; + private static final Field getAddlTkt; static { try { @@ -1265,6 +1340,8 @@ public class KDC { "stringToKey", char[].class, String.class, byte[].class, Integer.TYPE); stringToKey.setAccessible(true); + getAddlTkt = KDCReqBody.class.getDeclaredField("additionalTickets"); + getAddlTkt.setAccessible(true); } catch (NoSuchFieldException nsfe) { throw new AssertionError(nsfe); } catch (NoSuchMethodException nsme) { @@ -1278,7 +1355,7 @@ public class KDC { throw new AssertionError(e); } } - private static PAData[] kDCReqDotPAData(KDCReq req) { + private static PAData[] KDCReqDotPAData(KDCReq req) { try { return (PAData[])getPADataField.get(req); } catch (Exception e) { @@ -1303,4 +1380,11 @@ public class KDC { throw new AssertionError(e); } } + private static Ticket KDCReqBodyDotFirstAdditionalTicket(KDCReqBody body) { + try { + return ((Ticket[])getAddlTkt.get(body))[0]; + } catch (Exception e) { + throw new AssertionError(e); + } + } } diff --git a/jdk/test/sun/security/krb5/auto/OkAsDelegate.java b/jdk/test/sun/security/krb5/auto/OkAsDelegate.java index 90376341f2d..d66e2421b82 100644 --- a/jdk/test/sun/security/krb5/auto/OkAsDelegate.java +++ b/jdk/test/sun/security/krb5/auto/OkAsDelegate.java @@ -91,7 +91,7 @@ public class OkAsDelegate { Context c, s; c = Context.fromJAAS("client"); - s = Context.fromJAAS("server"); + s = Context.fromJAAS("com.sun.security.jgss.krb5.accept"); Oid mech = GSSUtil.GSS_KRB5_MECH_OID; if (System.getProperty("test.spnego") != null) { diff --git a/jdk/test/sun/security/krb5/auto/S4U2proxy.java b/jdk/test/sun/security/krb5/auto/S4U2proxy.java new file mode 100644 index 00000000000..dd7d50c3892 --- /dev/null +++ b/jdk/test/sun/security/krb5/auto/S4U2proxy.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6355584 + * @summary Introduce constrained Kerberos delegation + * @compile -XDignore.symbol.file S4U2proxy.java + * @run main/othervm S4U2proxy krb5 + * @run main/othervm S4U2proxy spnego + */ + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.ietf.jgss.Oid; +import sun.security.jgss.GSSUtil; + +public class S4U2proxy { + + public static void main(String[] args) throws Exception { + Oid mech; + if (args[0].equals("spnego")) { + mech = GSSUtil.GSS_SPNEGO_MECH_OID; + } else if (args[0].contains("krb5")) { + mech = GSSUtil.GSS_KRB5_MECH_OID; + } else { + throw new Exception("Unknown mech"); + } + + OneKDC kdc = new OneKDC(null); + kdc.writeJAASConf(); + kdc.setOption(KDC.Option.PREAUTH_REQUIRED, false); + Map> map = new HashMap<>(); + map.put(OneKDC.SERVER + "@" + OneKDC.REALM, Arrays.asList( + new String[]{OneKDC.BACKEND + "@" + OneKDC.REALM})); + kdc.setOption(KDC.Option.ALLOW_S4U2PROXY, map); + + Context c, s, b; + c = Context.fromJAAS("client"); + s = Context.fromJAAS("server"); + b = Context.fromJAAS("backend"); + + c.startAsClient(OneKDC.SERVER, mech); + s.startAsServer(null, mech, false); + + Context.handshake(c, s); + Context p = s.delegated(); + + p.startAsClient(OneKDC.BACKEND, mech); + b.startAsServer(mech); + Context.handshake(p, b); + + p.startAsClient(OneKDC.BACKEND, mech); + b.startAsServer(mech); + Context.handshake(p, b); + } +} diff --git a/jdk/test/sun/security/krb5/auto/S4U2proxyGSS.java b/jdk/test/sun/security/krb5/auto/S4U2proxyGSS.java new file mode 100644 index 00000000000..f2f0b305e05 --- /dev/null +++ b/jdk/test/sun/security/krb5/auto/S4U2proxyGSS.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6355584 + * @summary Introduce constrained Kerberos delegation + * @compile -XDignore.symbol.file S4U2proxyGSS.java + * @run main/othervm -Djavax.security.auth.useSubjectCredsOnly=false S4U2proxyGSS krb5 + * @run main/othervm -Djavax.security.auth.useSubjectCredsOnly=false S4U2proxyGSS spnego + */ + +import java.io.File; +import java.io.FileOutputStream; +import java.security.Security; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.ietf.jgss.Oid; +import sun.security.jgss.GSSUtil; + +public class S4U2proxyGSS { + + public static void main(String[] args) throws Exception { + Oid mech; + if (args[0].equals("spnego")) { + mech = GSSUtil.GSS_SPNEGO_MECH_OID; + } else if (args[0].contains("krb5")) { + mech = GSSUtil.GSS_KRB5_MECH_OID; + } else { + throw new Exception("Unknown mech"); + } + + OneKDC kdc = new OneKDC(null); + kdc.writeJAASConf(); + kdc.setOption(KDC.Option.PREAUTH_REQUIRED, false); + Map> map = new HashMap<>(); + map.put(OneKDC.SERVER + "@" + OneKDC.REALM, Arrays.asList( + new String[]{OneKDC.SERVER + "@" + OneKDC.REALM})); + kdc.setOption(KDC.Option.ALLOW_S4U2PROXY, map); + + Context c, s, b; + System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); + System.setProperty("java.security.auth.login.config", OneKDC.JAAS_CONF); + File f = new File(OneKDC.JAAS_CONF); + FileOutputStream fos = new FileOutputStream(f); + fos.write(( + "com.sun.security.jgss.krb5.initiate {\n" + + " com.sun.security.auth.module.Krb5LoginModule required;\n};\n" + + "com.sun.security.jgss.krb5.accept {\n" + + " com.sun.security.auth.module.Krb5LoginModule required\n" + + " principal=\"" + OneKDC.SERVER + "\"\n" + + " useKeyTab=true\n" + + " storeKey=true;\n};\n" + ).getBytes()); + fos.close(); + Security.setProperty("auth.login.defaultCallbackHandler", "OneKDC$CallbackForClient"); + c = Context.fromThinAir(); + s = Context.fromThinAir(); + b = Context.fromThinAir(); + c.startAsClient(OneKDC.SERVER, mech); + c.x().requestCredDeleg(false); + s.startAsServer(mech); + + Context.handshake(c, s); + Context p = s.delegated(); + p.startAsClient(OneKDC.SERVER, mech); + b.startAsServer(mech); + Context.handshake(p, b); + + String n1 = p.x().getSrcName().toString().split("@")[0]; + String n2 = b.x().getSrcName().toString().split("@")[0]; + if (!n1.equals(OneKDC.USER) || !n2.equals(OneKDC.USER)) { + throw new Exception("Delegation failed"); + } + } +} diff --git a/jdk/test/sun/security/krb5/auto/S4U2self.java b/jdk/test/sun/security/krb5/auto/S4U2self.java new file mode 100644 index 00000000000..a6c4b21c192 --- /dev/null +++ b/jdk/test/sun/security/krb5/auto/S4U2self.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6355584 + * @summary Introduce constrained Kerberos delegation + * @compile -XDignore.symbol.file S4U2self.java + * @run main/othervm -Dsun.security.krb5.debug=false S4U2self krb5 0 + * @run main/othervm/fail -Dsun.security.krb5.debug=false S4U2self krb5 1 + * @run main/othervm/fail -Dsun.security.krb5.debug=false S4U2self krb5 2 + * @run main/othervm/fail -Dsun.security.krb5.debug=false S4U2self krb5 3 + * @run main/othervm/fail -Dsun.security.krb5.debug=false S4U2self krb5 4 + * @run main/othervm/fail -Dsun.security.krb5.debug=false S4U2self krb5 5 + * @run main/othervm -Dsun.security.krb5.debug=false S4U2self spnego + */ + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.ietf.jgss.Oid; +import sun.security.jgss.GSSUtil; + +public class S4U2self { + + public static void main(String[] args) throws Exception { + // Test case, different policy settings in KDC: + // | ALLOW_S4U2SELF on + // | USER USER2 none + // ALLOW_S4U2PORXY |------------------------- + // USER to BACKEND | 0 1 2 + // USER2 to BACKEND | 3 + // USER to SERVER | 4 + // none | 5 + // + // 0 should succeed, all other fail + int test = 0; + Oid mech; + if (args[0].equals("spnego")) { + mech = GSSUtil.GSS_SPNEGO_MECH_OID; + } else if (args[0].contains("krb5")) { + mech = GSSUtil.GSS_KRB5_MECH_OID; + test = Integer.parseInt(args[1]); + } else { + throw new Exception("Unknown mech"); + } + + OneKDC kdc = new OneKDC(null); + kdc.writeJAASConf(); + + switch (test) { + case 1: + kdc.setOption(KDC.Option.ALLOW_S4U2SELF, Arrays.asList( + new String[]{OneKDC.USER2 + "@" + OneKDC.REALM})); + break; + case 2: + // No S4U2self + break; + default: + kdc.setOption(KDC.Option.ALLOW_S4U2SELF, Arrays.asList( + new String[]{OneKDC.USER + "@" + OneKDC.REALM})); + break; + } + + Map> map = new HashMap<>(); + switch (test) { + case 3: + map.put(OneKDC.USER2 + "@" + OneKDC.REALM, Arrays.asList( + new String[]{OneKDC.BACKEND + "@" + OneKDC.REALM})); + kdc.setOption(KDC.Option.ALLOW_S4U2PROXY, map); + break; + case 4: + map.put(OneKDC.USER + "@" + OneKDC.REALM, Arrays.asList( + new String[]{OneKDC.SERVER + "@" + OneKDC.REALM})); + kdc.setOption(KDC.Option.ALLOW_S4U2PROXY, map); + break; + case 5: + // No S4U2proxy set + break; + default: + map.put(OneKDC.USER + "@" + OneKDC.REALM, Arrays.asList( + new String[]{OneKDC.BACKEND + "@" + OneKDC.REALM})); + kdc.setOption(KDC.Option.ALLOW_S4U2PROXY, map); + break; + } + + Context c, s; + c = Context.fromJAAS("client"); + + c = c.impersonate(OneKDC.USER2); + c.status(); + + c.startAsClient(OneKDC.BACKEND, mech); + + s = Context.fromJAAS("backend"); + s.startAsServer(mech); + + Context.handshake(c, s); + + Context.transmit("i say high --", c, s); + Context.transmit(" you say low", s, c); + + c.status(); + s.status(); + + String n1 = c.x().getSrcName().toString().split("@")[0]; + String n2 = s.x().getSrcName().toString().split("@")[0]; + if (!n1.equals(OneKDC.USER2) || !n2.equals(OneKDC.USER2)) { + throw new Exception("Impersonate failed"); + } + + s.dispose(); + c.dispose(); + } +} diff --git a/jdk/test/sun/security/krb5/auto/S4U2selfAsServer.java b/jdk/test/sun/security/krb5/auto/S4U2selfAsServer.java new file mode 100644 index 00000000000..467129c16e3 --- /dev/null +++ b/jdk/test/sun/security/krb5/auto/S4U2selfAsServer.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6355584 + * @summary Introduce constrained Kerberos delegation + * @compile -XDignore.symbol.file S4U2selfAsServer.java + * @run main/othervm S4U2selfAsServer krb5 + * @run main/othervm S4U2selfAsServer spnego + */ + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.ietf.jgss.Oid; +import sun.security.jgss.GSSUtil; + +public class S4U2selfAsServer { + + public static void main(String[] args) throws Exception { + Oid mech; + if (args[0].equals("spnego")) { + mech = GSSUtil.GSS_SPNEGO_MECH_OID; + } else if (args[0].contains("krb5")) { + mech = GSSUtil.GSS_KRB5_MECH_OID; + } else { + throw new Exception("Unknown mech"); + } + + OneKDC kdc = new OneKDC(null); + kdc.writeJAASConf(); + kdc.setOption(KDC.Option.PREAUTH_REQUIRED, false); + Map> map = new HashMap<>(); + map.put(OneKDC.SERVER + "@" + OneKDC.REALM, Arrays.asList( + new String[]{OneKDC.BACKEND + "@" + OneKDC.REALM})); + kdc.setOption(KDC.Option.ALLOW_S4U2PROXY, map); + kdc.setOption(KDC.Option.ALLOW_S4U2SELF, Arrays.asList( + new String[]{OneKDC.SERVER + "@" + OneKDC.REALM})); + + Context s, b; + s = Context.fromJAAS("server"); + b = Context.fromJAAS("backend"); + + s.startAsServer(null, mech, false); + + Context p = s.impersonate(OneKDC.USER); + + p.startAsClient(OneKDC.BACKEND, mech); + b.startAsServer(mech); + Context.handshake(p, b); + + p.startAsClient(OneKDC.BACKEND, mech); + b.startAsServer(mech); + Context.handshake(p, b); + } +} diff --git a/jdk/test/sun/security/krb5/auto/S4U2selfAsServerGSS.java b/jdk/test/sun/security/krb5/auto/S4U2selfAsServerGSS.java new file mode 100644 index 00000000000..0ff2b7bb53d --- /dev/null +++ b/jdk/test/sun/security/krb5/auto/S4U2selfAsServerGSS.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6355584 + * @summary Introduce constrained Kerberos delegation + * @compile -XDignore.symbol.file S4U2selfAsServerGSS.java + * @run main/othervm -Djavax.security.auth.useSubjectCredsOnly=false S4U2selfAsServerGSS krb5 + * @run main/othervm -Djavax.security.auth.useSubjectCredsOnly=false S4U2selfAsServerGSS spnego + */ + +import java.io.File; +import java.io.FileOutputStream; +import java.security.Security; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.ietf.jgss.Oid; +import sun.security.jgss.GSSUtil; + +public class S4U2selfAsServerGSS { + + public static void main(String[] args) throws Exception { + Oid mech; + if (args[0].equals("spnego")) { + mech = GSSUtil.GSS_SPNEGO_MECH_OID; + } else if (args[0].contains("krb5")) { + mech = GSSUtil.GSS_KRB5_MECH_OID; + } else { + throw new Exception("Unknown mech"); + } + + OneKDC kdc = new OneKDC(null); + kdc.writeJAASConf(); + kdc.setOption(KDC.Option.PREAUTH_REQUIRED, false); + Map> map = new HashMap<>(); + map.put(OneKDC.SERVER + "@" + OneKDC.REALM, Arrays.asList( + new String[]{OneKDC.SERVER + "@" + OneKDC.REALM})); + kdc.setOption(KDC.Option.ALLOW_S4U2PROXY, map); + kdc.setOption(KDC.Option.ALLOW_S4U2SELF, Arrays.asList( + new String[]{OneKDC.SERVER + "@" + OneKDC.REALM})); + + Context s, b; + System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); + System.setProperty("java.security.auth.login.config", OneKDC.JAAS_CONF); + File f = new File(OneKDC.JAAS_CONF); + FileOutputStream fos = new FileOutputStream(f); + fos.write(( + "com.sun.security.jgss.krb5.accept {\n" + + " com.sun.security.auth.module.Krb5LoginModule required\n" + + " principal=\"" + OneKDC.SERVER + "\"\n" + + " useKeyTab=true\n" + + " storeKey=true;\n};\n" + ).getBytes()); + fos.close(); + Security.setProperty("auth.login.defaultCallbackHandler", "OneKDC$CallbackForClient"); + s = Context.fromThinAir(); + b = Context.fromThinAir(); + s.startAsServer(mech); + + Context p = s.impersonate(OneKDC.USER); + + p.startAsClient(OneKDC.SERVER, mech); + b.startAsServer(mech); + Context.handshake(p, b); + + String n1 = p.x().getSrcName().toString().split("@")[0]; + String n2 = b.x().getSrcName().toString().split("@")[0]; + if (!n1.equals(OneKDC.USER) || !n2.equals(OneKDC.USER)) { + throw new Exception("Delegation failed"); + } + } +} diff --git a/jdk/test/sun/security/krb5/auto/S4U2selfGSS.java b/jdk/test/sun/security/krb5/auto/S4U2selfGSS.java new file mode 100644 index 00000000000..f060c787ffb --- /dev/null +++ b/jdk/test/sun/security/krb5/auto/S4U2selfGSS.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6355584 + * @summary Introduce constrained Kerberos delegation + * @compile -XDignore.symbol.file S4U2selfGSS.java + * @run main/othervm -Dsun.security.krb5.debug=false S4U2selfGSS krb5 + * @run main/othervm -Dsun.security.krb5.debug=false S4U2selfGSS spnego + */ + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.ietf.jgss.Oid; +import sun.security.jgss.GSSUtil; + +public class S4U2selfGSS { + + public static void main(String[] args) throws Exception { + Oid mech; + if (args[0].equals("spnego")) { + mech = GSSUtil.GSS_SPNEGO_MECH_OID; + } else if (args[0].contains("krb5")) { + mech = GSSUtil.GSS_KRB5_MECH_OID; + } else { + throw new Exception("Unknown mech"); + } + + OneKDC kdc = new OneKDC(null); + kdc.writeJAASConf(); + kdc.setOption(KDC.Option.ALLOW_S4U2SELF, Arrays.asList( + new String[]{OneKDC.USER + "@" + OneKDC.REALM})); + Map> map = new HashMap<>(); + map.put(OneKDC.USER + "@" + OneKDC.REALM, Arrays.asList( + new String[]{OneKDC.SERVER + "@" + OneKDC.REALM})); + kdc.setOption(KDC.Option.ALLOW_S4U2PROXY, map); + + Context c, s; + System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); + c = Context.fromThinAir(); + s = Context.fromThinAir(); + + c = c.impersonate(OneKDC.USER2); + + c.startAsClient(OneKDC.SERVER, mech); + s.startAsServer(mech); + + Context.handshake(c, s); + + String n1 = c.x().getSrcName().toString().split("@")[0]; + String n2 = s.x().getSrcName().toString().split("@")[0]; + if (!n1.equals(OneKDC.USER2) || !n2.equals(OneKDC.USER2)) { + throw new Exception("Impersonate failed"); + } + + s.dispose(); + c.dispose(); + } +} From 1f34c4e8ad2d838f955d0ac4fe1c1430ec609338 Mon Sep 17 00:00:00 2001 From: John Zavgren Date: Wed, 7 Nov 2012 10:49:19 +0000 Subject: [PATCH 195/241] 8001579: Cleanup warnings in security native code Reviewed-by: chegar, alanb, vinnie --- .../sun/security/jgss/wrapper/GSSLibStub.c | 135 +++++++++--------- .../sun/security/jgss/wrapper/NativeUtil.c | 5 +- .../sun/security/pkcs11/wrapper/p11_convert.c | 4 + .../sun/security/pkcs11/wrapper/p11_crypt.c | 12 +- .../sun/security/pkcs11/wrapper/p11_digest.c | 3 +- .../sun/security/pkcs11/wrapper/p11_general.c | 10 +- .../security/pkcs11/wrapper/p11_sessmgmt.c | 2 +- .../sun/security/pkcs11/wrapper/p11_sign.c | 7 +- .../sun/security/pkcs11/wrapper/p11_util.c | 4 +- .../native/sun/security/pkcs11/j2secmod_md.c | 6 +- .../sun/security/pkcs11/wrapper/p11_md.c | 2 +- 11 files changed, 100 insertions(+), 90 deletions(-) diff --git a/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c b/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c index fa888669591..abd2c2d5295 100644 --- a/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c +++ b/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c @@ -26,6 +26,7 @@ #include "sun_security_jgss_wrapper_GSSLibStub.h" #include "NativeUtil.h" #include "NativeFunc.h" +#include "jlong.h" /* Constants for indicating what type of info is needed for inqueries */ const int TYPE_CRED_NAME = 10; @@ -75,14 +76,14 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getMechPtr(JNIEnv *env, jclass jcls, jbyteArray jbytes) { gss_OID cOid; - int i, len; + unsigned int i, len; jbyte* bytes; jthrowable gssEx; jboolean found; if (jbytes != NULL) { found = JNI_FALSE; - len = (*env)->GetArrayLength(env, jbytes) - 2; + len = (unsigned int)((*env)->GetArrayLength(env, jbytes) - 2); bytes = (*env)->GetByteArrayElements(env, jbytes, NULL); if (bytes != NULL) { for (i = 0; i < ftab->mechs->count; i++) { @@ -98,9 +99,9 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getMechPtr(JNIEnv *env, } if (found != JNI_TRUE) { checkStatus(env, NULL, GSS_S_BAD_MECH, 0, "[GSSLibStub_getMechPtr]"); - return NULL; - } else return cOid; - } else return GSS_C_NO_OID; + return ptr_to_jlong(NULL); + } else return ptr_to_jlong(cOid); + } else return ptr_to_jlong(GSS_C_NO_OID); } @@ -244,7 +245,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_inquireNamesForMech(JNIEnv *env, if (ftab->inquireNamesForMech != NULL) { - mech = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech); + mech = (gss_OID)jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech)); nameTypes = GSS_C_NO_OID_SET; /* gss_inquire_names_for_mech(...) => N/A */ @@ -273,7 +274,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_releaseName(JNIEnv *env, OM_uint32 minor, major; gss_name_t nameHdl; - nameHdl = (gss_name_t) pName; + nameHdl = (gss_name_t) jlong_to_ptr(pName); sprintf(debugBuf, "[GSSLibStub_releaseName] %ld", (long) pName); debug(env, debugBuf); @@ -319,7 +320,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_importName(JNIEnv *env, resetGSSBuffer(env, jnameVal, &nameVal); checkStatus(env, jobj, major, minor, "[GSSLibStub_importName]"); - return (jlong) nameHdl; + return ptr_to_jlong(nameHdl); } @@ -339,8 +340,8 @@ Java_sun_security_jgss_wrapper_GSSLibStub_compareName(JNIEnv *env, int isEqual; isEqual = 0; - nameHdl1 = (gss_name_t) pName1; - nameHdl2 = (gss_name_t) pName2; + nameHdl1 = (gss_name_t) jlong_to_ptr(pName1); + nameHdl2 = (gss_name_t) jlong_to_ptr(pName2); sprintf(debugBuf, "[GSSLibStub_compareName] %ld %ld", (long) pName1, (long) pName2); @@ -370,12 +371,12 @@ Java_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName(JNIEnv *env, gss_name_t nameHdl, mnNameHdl; gss_OID mech; - nameHdl = (gss_name_t) pName; + nameHdl = (gss_name_t) jlong_to_ptr(pName); sprintf(debugBuf, "[GSSLibStub_canonicalizeName] %ld", (long) pName); debug(env, debugBuf); if (nameHdl != GSS_C_NO_NAME) { - mech = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech); + mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech)); mnNameHdl = GSS_C_NO_NAME; /* gss_canonicalize_name(...) may return GSS_S_BAD_NAMETYPE, @@ -391,7 +392,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName(JNIEnv *env, checkStatus(env, jobj, major, minor, "[GSSLibStub_canonicalizeName]"); } else mnNameHdl = GSS_C_NO_NAME; - return (jlong) mnNameHdl; + return ptr_to_jlong(mnNameHdl); } /* @@ -408,7 +409,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_exportName(JNIEnv *env, gss_buffer_desc outBuf; jbyteArray jresult; - nameHdl = (gss_name_t) pName; + nameHdl = (gss_name_t) jlong_to_ptr(pName); sprintf(debugBuf, "[GSSLibStub_exportName] %ld", (long) pName); debug(env, debugBuf); @@ -420,16 +421,16 @@ Java_sun_security_jgss_wrapper_GSSLibStub_exportName(JNIEnv *env, if (major == GSS_S_NAME_NOT_MN) { debug(env, "[GSSLibStub_exportName] canonicalize and re-try"); - mNameHdl = (gss_name_t) + mNameHdl = (gss_name_t)jlong_to_ptr( Java_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName - (env, jobj, pName); + (env, jobj, pName)); /* return immediately if an exception has occurred */ if ((*env)->ExceptionCheck(env)) { return NULL; } major = (*ftab->exportName)(&minor, mNameHdl, &outBuf); Java_sun_security_jgss_wrapper_GSSLibStub_releaseName - (env, jobj, (jlong) mNameHdl); + (env, jobj, ptr_to_jlong(mNameHdl)); /* return immediately if an exception has occurred */ if ((*env)->ExceptionCheck(env)) { return NULL; @@ -460,7 +461,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_displayName(JNIEnv *env, jobject jtype; jobjectArray jresult; - nameHdl = (gss_name_t) pName; + nameHdl = (gss_name_t) jlong_to_ptr(pName); sprintf(debugBuf, "[GSSLibStub_displayName] %ld", (long) pName); debug(env, debugBuf); @@ -512,10 +513,10 @@ Java_sun_security_jgss_wrapper_GSSLibStub_acquireCred(JNIEnv *env, debug(env, "[GSSLibStub_acquireCred]"); - mech = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech); + mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech)); mechs = newGSSOIDSet(env, mech); credUsage = (gss_cred_usage_t) usage; - nameHdl = (gss_name_t) pName; + nameHdl = (gss_name_t) jlong_to_ptr(pName); credHdl = GSS_C_NO_CREDENTIAL; sprintf(debugBuf, "[GSSLibStub_acquireCred] pName=%ld, usage=%d", @@ -534,7 +535,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_acquireCred(JNIEnv *env, debug(env, debugBuf); checkStatus(env, jobj, major, minor, "[GSSLibStub_acquireCred]"); - return (jlong) credHdl; + return ptr_to_jlong(credHdl); } /* @@ -550,9 +551,9 @@ Java_sun_security_jgss_wrapper_GSSLibStub_releaseCred(JNIEnv *env, OM_uint32 minor, major; gss_cred_id_t credHdl; - credHdl = (gss_cred_id_t) pCred; + credHdl = (gss_cred_id_t) jlong_to_ptr(pCred); - sprintf(debugBuf, "[GSSLibStub_releaseCred] %ld", pCred); + sprintf(debugBuf, "[GSSLibStub_releaseCred] %ld", (long int)pCred); debug(env, debugBuf); if (credHdl != GSS_C_NO_CREDENTIAL) { @@ -562,7 +563,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_releaseCred(JNIEnv *env, checkStatus(env, jobj, major, minor, "[GSSLibStub_releaseCred]"); } - return (jlong) credHdl; + return ptr_to_jlong(credHdl); } /* @@ -570,7 +571,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_releaseCred(JNIEnv *env, */ void inquireCred(JNIEnv *env, jobject jobj, gss_cred_id_t pCred, jint type, void *result) { - OM_uint32 minor, major; + OM_uint32 minor, major=GSS_C_QOP_DEFAULT; OM_uint32 routineErr; gss_cred_id_t credHdl; @@ -617,9 +618,9 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getCredName(JNIEnv *env, gss_name_t nameHdl; gss_cred_id_t credHdl; - credHdl = (gss_cred_id_t) pCred; + credHdl = (gss_cred_id_t) jlong_to_ptr(pCred); - sprintf(debugBuf, "[GSSLibStub_getCredName] %ld", pCred); + sprintf(debugBuf, "[GSSLibStub_getCredName] %ld", (long int)pCred); debug(env, debugBuf); nameHdl = GSS_C_NO_NAME; @@ -633,7 +634,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getCredName(JNIEnv *env, sprintf(debugBuf, "[GSSLibStub_getCredName] pName=%ld", (long) nameHdl); debug(env, debugBuf); - return (jlong) nameHdl; + return ptr_to_jlong(nameHdl); } /* @@ -649,9 +650,9 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getCredTime(JNIEnv *env, gss_cred_id_t credHdl; OM_uint32 lifetime; - credHdl = (gss_cred_id_t) pCred; + credHdl = (gss_cred_id_t) jlong_to_ptr(pCred); - sprintf(debugBuf, "[GSSLibStub_getCredTime] %ld", pCred); + sprintf(debugBuf, "[GSSLibStub_getCredTime] %ld", (long int)pCred); debug(env, debugBuf); lifetime = 0; @@ -677,9 +678,9 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getCredUsage(JNIEnv *env, gss_cred_usage_t usage; gss_cred_id_t credHdl; - credHdl = (gss_cred_id_t) pCred; + credHdl = (gss_cred_id_t) jlong_to_ptr(pCred); - sprintf(debugBuf, "[GSSLibStub_getCredUsage] %ld", pCred); + sprintf(debugBuf, "[GSSLibStub_getCredUsage] %ld", (long int)pCred); debug(env, debugBuf); inquireCred(env, jobj, credHdl, TYPE_CRED_USAGE, &usage); @@ -738,13 +739,13 @@ Java_sun_security_jgss_wrapper_GSSLibStub_importContext(JNIEnv *env, return NULL; } - mech2 = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech); + mech2 = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech)); if (sameMech(env, mech, mech2) == JNI_TRUE) { /* mech match - return the context object */ return (*env)->NewObject(env, CLS_NativeGSSContext, MID_NativeGSSContext_ctor, - (jlong) contextHdl, jobj); + ptr_to_jlong(contextHdl), jobj); } else { /* mech mismatch - clean up then return null */ major = (*ftab->deleteSecContext)(&minor, &contextHdl, GSS_C_NO_BUFFER); @@ -784,11 +785,11 @@ Java_sun_security_jgss_wrapper_GSSLibStub_initContext(JNIEnv *env, */ debug(env, "[GSSLibStub_initContext]"); - credHdl = (gss_cred_id_t) pCred; - contextHdl = (gss_ctx_id_t) - (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext); - targetName = (gss_name_t) pName; - mech = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech); + credHdl = (gss_cred_id_t) jlong_to_ptr(pCred); + contextHdl = (gss_ctx_id_t) jlong_to_ptr( + (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext)); + targetName = (gss_name_t) jlong_to_ptr(pName); + mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech)); flags = (OM_uint32) (*env)->GetIntField(env, jcontextSpi, FID_NativeGSSContext_flags); time = getGSSTime((*env)->GetIntField(env, jcontextSpi, @@ -821,7 +822,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_initContext(JNIEnv *env, if (GSS_ERROR(major) == GSS_S_COMPLETE) { /* update member values if needed */ (*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext, - (jlong) contextHdl); + ptr_to_jlong(contextHdl)); (*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_flags, aFlags); sprintf(debugBuf, "[GSSLibStub_initContext] set flags=0x%x", aFlags); debug(env, debugBuf); @@ -879,7 +880,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_acceptContext(JNIEnv *env, OM_uint32 aFlags; OM_uint32 aTime; gss_cred_id_t delCred; - jobject jsrcName; + jobject jsrcName=GSS_C_NO_NAME; jobject jdelCred; jobject jMech; jbyteArray jresult; @@ -889,9 +890,9 @@ Java_sun_security_jgss_wrapper_GSSLibStub_acceptContext(JNIEnv *env, debug(env, "[GSSLibStub_acceptContext]"); - contextHdl = (gss_ctx_id_t) - (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext); - credHdl = (gss_cred_id_t) pCred; + contextHdl = (gss_ctx_id_t)jlong_to_ptr( + (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext)); + credHdl = (gss_cred_id_t) jlong_to_ptr(pCred); initGSSBuffer(env, jinToken, &inToken); cb = getGSSCB(env, jcb); srcName = GSS_C_NO_NAME; @@ -922,7 +923,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_acceptContext(JNIEnv *env, if (GSS_ERROR(major) == GSS_S_COMPLETE) { /* update member values if needed */ (*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext, - (jlong) contextHdl); + ptr_to_jlong(contextHdl)); sprintf(debugBuf, "[GSSLibStub_acceptContext] set pContext=%ld", (long)contextHdl); debug(env, debugBuf); @@ -940,7 +941,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_acceptContext(JNIEnv *env, NULL, NULL); jtargetName = (*env)->NewObject(env, CLS_GSSNameElement, MID_GSSNameElement_ctor, - (jlong) targetName, jobj); + ptr_to_jlong(targetName), jobj); /* return immediately if an exception has occurred */ if ((*env)->ExceptionCheck(env)) { @@ -955,7 +956,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_acceptContext(JNIEnv *env, if (srcName != GSS_C_NO_NAME) { jsrcName = (*env)->NewObject(env, CLS_GSSNameElement, MID_GSSNameElement_ctor, - (jlong) srcName, jobj); + ptr_to_jlong(srcName), jobj); /* return immediately if an exception has occurred */ if ((*env)->ExceptionCheck(env)) { return NULL; @@ -981,7 +982,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_acceptContext(JNIEnv *env, if (delCred != GSS_C_NO_CREDENTIAL) { jdelCred = (*env)->NewObject(env, CLS_GSSCredElement, MID_GSSCredElement_ctor, - (jlong) delCred, jsrcName, jMech); + ptr_to_jlong(delCred), jsrcName, jMech); /* return immediately if an exception has occurred */ if ((*env)->ExceptionCheck(env)) { return NULL; @@ -1031,7 +1032,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_inquireContext(JNIEnv *env, jlong result[6]; jlongArray jresult; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_inquireContext] %ld", (long)contextHdl); debug(env, debugBuf); @@ -1051,8 +1052,8 @@ Java_sun_security_jgss_wrapper_GSSLibStub_inquireContext(JNIEnv *env, (long)targetName); debug(env, debugBuf); - result[0] = (jlong) srcName; - result[1] = (jlong) targetName; + result[0] = ptr_to_jlong(srcName); + result[1] = ptr_to_jlong(targetName); result[2] = (jlong) isInitiator; result[3] = (jlong) isEstablished; result[4] = (jlong) flags; @@ -1081,9 +1082,9 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getContextMech(JNIEnv *env, gss_OID mech; gss_ctx_id_t contextHdl; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); - sprintf(debugBuf, "[GSSLibStub_getContextMech] %ld", pContext); + sprintf(debugBuf, "[GSSLibStub_getContextMech] %ld", (long int)pContext); debug(env, debugBuf); major = (*ftab->inquireContext)(&minor, contextHdl, NULL, NULL, @@ -1111,7 +1112,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getContextName(JNIEnv *env, gss_name_t nameHdl; gss_ctx_id_t contextHdl; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_getContextName] %ld, isSrc=%d", (long)contextHdl, isSrc); @@ -1129,13 +1130,13 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getContextName(JNIEnv *env, checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContextAll]"); /* return immediately if an exception has occurred */ if ((*env)->ExceptionCheck(env)) { - return (long)NULL; + return ptr_to_jlong(NULL); } sprintf(debugBuf, "[GSSLibStub_getContextName] pName=%ld", (long) nameHdl); debug(env, debugBuf); - return (jlong) nameHdl; + return ptr_to_jlong(nameHdl); } /* @@ -1151,7 +1152,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getContextTime(JNIEnv *env, gss_ctx_id_t contextHdl; OM_uint32 time; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_getContextTime] %ld", (long)contextHdl); debug(env, debugBuf); @@ -1180,17 +1181,17 @@ Java_sun_security_jgss_wrapper_GSSLibStub_deleteContext(JNIEnv *env, OM_uint32 minor, major; gss_ctx_id_t contextHdl; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_deleteContext] %ld", (long)contextHdl); debug(env, debugBuf); - if (contextHdl == GSS_C_NO_CONTEXT) return GSS_C_NO_CONTEXT; + if (contextHdl == GSS_C_NO_CONTEXT) return ptr_to_jlong(GSS_C_NO_CONTEXT); /* gss_delete_sec_context(...) => GSS_S_NO_CONTEXT(!) */ major = (*ftab->deleteSecContext)(&minor, &contextHdl, GSS_C_NO_BUFFER); checkStatus(env, jobj, major, minor, "[GSSLibStub_deleteContext]"); - return (jlong) contextHdl; + return (jlong) ptr_to_jlong(contextHdl); } /* @@ -1211,7 +1212,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_wrapSizeLimit(JNIEnv *env, OM_uint32 outSize, maxInSize; gss_qop_t qop; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_wrapSizeLimit] %ld", (long)contextHdl); debug(env, debugBuf); @@ -1244,7 +1245,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_exportContext(JNIEnv *env, gss_buffer_desc interProcToken; jbyteArray jresult; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_exportContext] %ld", (long)contextHdl); debug(env, debugBuf); @@ -1281,7 +1282,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getMic(JNIEnv *env, jobject jobj, gss_buffer_desc msgToken; jbyteArray jresult; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_getMic] %ld", (long)contextHdl); debug(env, debugBuf); @@ -1290,7 +1291,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_getMic(JNIEnv *env, jobject jobj, checkStatus(env, jobj, GSS_S_CONTEXT_EXPIRED, 0, "[GSSLibStub_getMic]"); return NULL; } - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); qop = (gss_qop_t) jqop; initGSSBuffer(env, jmsg, &msg); @@ -1326,7 +1327,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_verifyMic(JNIEnv *env, gss_buffer_desc msgToken; gss_qop_t qop; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_verifyMic] %ld", (long)contextHdl); debug(env, debugBuf); @@ -1376,7 +1377,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_wrap(JNIEnv *env, gss_ctx_id_t contextHdl; jbyteArray jresult; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_wrap] %ld", (long)contextHdl); debug(env, debugBuf); @@ -1427,7 +1428,7 @@ Java_sun_security_jgss_wrapper_GSSLibStub_unwrap(JNIEnv *env, gss_qop_t qop; jbyteArray jresult; - contextHdl = (gss_ctx_id_t) pContext; + contextHdl = (gss_ctx_id_t) jlong_to_ptr(pContext); sprintf(debugBuf, "[GSSLibStub_unwrap] %ld", (long)contextHdl); debug(env, debugBuf); diff --git a/jdk/src/share/native/sun/security/jgss/wrapper/NativeUtil.c b/jdk/src/share/native/sun/security/jgss/wrapper/NativeUtil.c index e1cb4038231..7c15ed6e1c8 100644 --- a/jdk/src/share/native/sun/security/jgss/wrapper/NativeUtil.c +++ b/jdk/src/share/native/sun/security/jgss/wrapper/NativeUtil.c @@ -25,6 +25,7 @@ #include "NativeUtil.h" #include "NativeFunc.h" +#include "jlong.h" const int JAVA_DUPLICATE_TOKEN_CODE = 19; /* DUPLICATE_TOKEN */ const int JAVA_OLD_TOKEN_CODE = 20; /* OLD_TOKEN */ @@ -412,7 +413,7 @@ OM_uint32 getGSSTime(jint jtime) { OM_uint32 result; /* special handle values equal to JAVA_MAX */ - if (jtime == JAVA_MAX) { + if (jtime == (jint)JAVA_MAX) { result = GSS_C_INDEFINITE; } else { result = jtime; @@ -482,7 +483,7 @@ jstring getMinorMessage(JNIEnv *env, jobject jstub, OM_uint32 statusValue) { messageContext = 0; if (jstub != NULL) { - mech = (gss_OID) (*env)->GetLongField(env, jstub, FID_GSSLibStub_pMech); + mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jstub, FID_GSSLibStub_pMech)); } else { mech = GSS_C_NO_OID; } diff --git a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c index 82cb5af82c0..bd0eab3c113 100644 --- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c +++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c @@ -422,6 +422,7 @@ CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute) jfieldID jFieldID; jlong jType; jobject jPValue; + memset(&ckAttribute, 0, sizeof(CK_ATTRIBUTE)); // TBD: what if jAttribute == NULL?! @@ -1577,6 +1578,7 @@ CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject CK_RSA_PKCS_PSS_PARAMS ckParam; jfieldID fieldID; jlong jHashAlg, jMgf, jSLen; + memset(&ckParam, 0, sizeof(CK_RSA_PKCS_PSS_PARAMS)); /* get hashAlg */ jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS); @@ -1617,6 +1619,7 @@ CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobjec jfieldID fieldID; jlong jLong; jobject jSharedData, jPublicData; + memset(&ckParam, 0, sizeof(CK_ECDH1_DERIVE_PARAMS)); /* get kdf */ jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS); @@ -1663,6 +1666,7 @@ CK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobjec jfieldID fieldID; jlong jKdf, jPrivateDataLen, jPrivateData; jobject jSharedData, jPublicData, jPublicData2; + memset(&ckParam, 0, sizeof(CK_ECDH2_DERIVE_PARAMS)); /* get kdf */ jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS); diff --git a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_crypt.c b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_crypt.c index dc8f65fd5c5..41a0b283437 100644 --- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_crypt.c +++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_crypt.c @@ -180,14 +180,14 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptUpdate ckSessionHandle = jLongToCKULong(jSessionHandle); if (directIn != 0) { - inBufP = (CK_BYTE_PTR) directIn; + inBufP = (CK_BYTE_PTR) jlong_to_ptr(directIn); } else { inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL); if (inBufP == NULL) { return 0; } } if (directOut != 0) { - outBufP = (CK_BYTE_PTR) directOut; + outBufP = (CK_BYTE_PTR) jlong_to_ptr(directOut); } else { outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); if (outBufP == NULL) { @@ -249,7 +249,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptFinal ckSessionHandle = jLongToCKULong(jSessionHandle); if (directOut != 0) { - outBufP = (CK_BYTE_PTR) directOut; + outBufP = (CK_BYTE_PTR) jlong_to_ptr(directOut); } else { outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); if (outBufP == NULL) { return 0; } @@ -401,14 +401,14 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptUpdate ckSessionHandle = jLongToCKULong(jSessionHandle); if (directIn != 0) { - inBufP = (CK_BYTE_PTR) directIn; + inBufP = (CK_BYTE_PTR) jlong_to_ptr(directIn); } else { inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL); if (inBufP == NULL) { return 0; } } if (directOut != 0) { - outBufP = (CK_BYTE_PTR) directOut; + outBufP = (CK_BYTE_PTR) jlong_to_ptr(directOut); } else { outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); if (outBufP == NULL) { @@ -465,7 +465,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptFinal ckSessionHandle = jLongToCKULong(jSessionHandle); if (directOut != 0) { - outBufP = (CK_BYTE_PTR) directOut; + outBufP = (CK_BYTE_PTR) jlong_to_ptr(directOut); } else { outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); if (outBufP == NULL) { return 0; } diff --git a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c index 592720dcf3d..0119c4e0ed9 100644 --- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c +++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c @@ -51,6 +51,7 @@ #include #include #include +#include "jlong.h" #include "sun_security_pkcs11_wrapper_PKCS11.h" @@ -178,7 +179,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestUpdate ckSessionHandle = jLongToCKULong(jSessionHandle); if (directIn != 0) { - rv = (*ckpFunctions->C_DigestUpdate)(ckSessionHandle, (CK_BYTE_PTR)directIn, jInLen); + rv = (*ckpFunctions->C_DigestUpdate)(ckSessionHandle, (CK_BYTE_PTR)jlong_to_ptr(directIn), jInLen); ckAssertReturnValueOK(env, rv); return; } diff --git a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_general.c b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_general.c index 4a4ac43ffb2..b607b1f4465 100644 --- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_general.c +++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_general.c @@ -253,10 +253,12 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetInfo (JNIEnv *env, jobject obj) { CK_INFO ckLibInfo; - jobject jInfoObject; + jobject jInfoObject=NULL; CK_RV rv; + CK_FUNCTION_LIST_PTR ckpFunctions; + memset(&ckLibInfo, 0, sizeof(CK_INFO)); - CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); + ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return NULL; } rv = (*ckpFunctions->C_GetInfo)(&ckLibInfo); @@ -384,7 +386,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSlotInfo { CK_SLOT_ID ckSlotID; CK_SLOT_INFO ckSlotInfo; - jobject jSlotInfoObject; + jobject jSlotInfoObject=NULL; CK_RV rv; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); @@ -396,7 +398,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSlotInfo if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { jSlotInfoObject = ckSlotInfoPtrToJSlotInfo(env, &ckSlotInfo); } - return jSlotInfoObject ; + return jSlotInfoObject; } /* diff --git a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c index abf3c8509e1..79b3963a250 100644 --- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c +++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c @@ -256,7 +256,7 @@ JNIEXPORT jobject JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSessionI { CK_SESSION_HANDLE ckSessionHandle; CK_SESSION_INFO ckSessionInfo; - jobject jSessionInfo; + jobject jSessionInfo=NULL; CK_RV rv; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); diff --git a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c index 07e7e9b77a6..ed8424bddb5 100644 --- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c +++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c @@ -51,6 +51,7 @@ #include #include #include +#include "jlong.h" #include "sun_security_pkcs11_wrapper_PKCS11.h" @@ -198,7 +199,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignUpdate ckSessionHandle = jLongToCKULong(jSessionHandle); if (directIn != 0) { - rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, (CK_BYTE_PTR)directIn, jInLen); + rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, (CK_BYTE_PTR) jlong_to_ptr(directIn), jInLen); ckAssertReturnValueOK(env, rv); return; } @@ -262,7 +263,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignFina ckSessionHandle = jLongToCKULong(jSessionHandle); - if ((jExpectedLength > 0) && (jExpectedLength < ckSignatureLength)) { + if ((jExpectedLength > 0) && ((CK_ULONG)jExpectedLength < ckSignatureLength)) { ckSignatureLength = jExpectedLength; } @@ -496,7 +497,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyUpdate ckSessionHandle = jLongToCKULong(jSessionHandle); if (directIn != 0) { - rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, (CK_BYTE_PTR)directIn, jInLen); + rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, (CK_BYTE_PTR)jlong_to_ptr(directIn), jInLen); ckAssertReturnValueOK(env, rv); return; } diff --git a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_util.c b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_util.c index bfef4e72288..8889f740d0e 100644 --- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_util.c +++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_util.c @@ -106,7 +106,7 @@ void putModuleEntry(JNIEnv *env, jobject pkcs11Implementation, ModuleData *modul if (moduleData == NULL) { return ; } - (*env)->SetLongField(env, pkcs11Implementation, pNativeDataID, (jlong)moduleData); + (*env)->SetLongField(env, pkcs11Implementation, pNativeDataID, ptr_to_jlong(moduleData)); } @@ -120,7 +120,7 @@ ModuleData * getModuleEntry(JNIEnv *env, jobject pkcs11Implementation) { return NULL; } jData = (*env)->GetLongField(env, pkcs11Implementation, pNativeDataID); - return (ModuleData*)jData; + return (ModuleData*)jlong_to_ptr(jData); } CK_FUNCTION_LIST_PTR getFunctionList(JNIEnv *env, jobject pkcs11Implementation) { diff --git a/jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c b/jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c index 2aca46cfbbe..f509c42b559 100644 --- a/jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c +++ b/jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c @@ -34,7 +34,7 @@ #include "j2secmod.h" void *findFunction(JNIEnv *env, jlong jHandle, const char *functionName) { - void *hModule = (void*)jHandle; + void *hModule = (void*)jlong_to_ptr(jHandle); void *fAddress = dlsym(hModule, functionName); if (fAddress == NULL) { char errorMessage[256]; @@ -53,7 +53,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_Secmod_nssGetLibraryHandle void *hModule = dlopen(libName, RTLD_NOLOAD); dprintf2("-handle for %s: %u\n", libName, hModule); (*env)->ReleaseStringUTFChars(env, jLibName, libName); - return (jlong)hModule; + return ptr_to_jlong(hModule); } JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_Secmod_nssLoadLibrary @@ -72,5 +72,5 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_Secmod_nssLoadLibrary return 0; } - return (jlong)hModule; + return ptr_to_jlong(hModule); } diff --git a/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c b/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c index 042cf234da0..12a4f24ef0a 100644 --- a/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c +++ b/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c @@ -79,7 +79,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_connect { void *hModule; char *error; - CK_C_GetFunctionList C_GetFunctionList; + CK_C_GetFunctionList C_GetFunctionList=NULL; CK_RV rv; ModuleData *moduleData; jobject globalPKCS11ImplementationReference; From f2eac8a30a83879cb83cdc24b3ecf6aedf40819e Mon Sep 17 00:00:00 2001 From: Daniel Fuchs Date: Wed, 7 Nov 2012 13:24:39 +0100 Subject: [PATCH 196/241] 6720349: (ch) Channels tests depending on hosts inside Sun This changeset make the nio tests start small TCP or UDP servers from within the tests, instead of relying on external services. Reviewed-by: alanb --- .../DatagramChannel/AdaptDatagramSocket.java | 42 +- .../nio/channels/DatagramChannel/IsBound.java | 34 +- .../channels/DatagramChannel/IsConnected.java | 26 +- .../java/nio/channels/Selector/Alias.java | 21 +- .../nio/channels/Selector/BasicConnect.java | 91 +- .../java/nio/channels/Selector/Connect.java | 19 +- .../nio/channels/Selector/ConnectWrite.java | 18 +- .../java/nio/channels/Selector/KeysReady.java | 19 +- .../channels/SocketChannel/AdaptSocket.java | 52 +- .../nio/channels/SocketChannel/Basic.java | 16 +- .../channels/SocketChannel/BufferSize.java | 9 +- .../nio/channels/SocketChannel/Connect.java | 17 +- .../channels/SocketChannel/ConnectState.java | 110 ++- .../channels/SocketChannel/FinishConnect.java | 51 +- .../channels/SocketChannel/IsConnectable.java | 27 +- .../channels/SocketChannel/LocalAddress.java | 12 +- .../nio/channels/SocketChannel/Stream.java | 21 +- .../channels/SocketChannel/VectorParams.java | 26 +- jdk/test/java/nio/channels/TestServers.java | 849 ++++++++++++++++++ jdk/test/java/nio/channels/TestUtil.java | 4 - 20 files changed, 1217 insertions(+), 247 deletions(-) create mode 100644 jdk/test/java/nio/channels/TestServers.java diff --git a/jdk/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java b/jdk/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java index 022455fe42a..1763ef3a11e 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java +++ b/jdk/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,29 +27,16 @@ * @library .. */ -import java.io.*; import java.net.*; -import java.nio.*; import java.nio.channels.*; -import java.nio.charset.*; import java.util.*; public class AdaptDatagramSocket { static java.io.PrintStream out = System.out; - static Random rand = new Random(); - static final int ECHO_PORT = 7; - static final int DISCARD_PORT = 9; - static final String REMOTE_HOST = TestUtil.HOST; - - static final InetSocketAddress echoAddress - = new InetSocketAddress(REMOTE_HOST, ECHO_PORT); - static final InetSocketAddress discardAddress - = new InetSocketAddress(REMOTE_HOST, DISCARD_PORT); - static String toString(DatagramPacket dp) { return ("DatagramPacket[off=" + dp.getOffset() + ", len=" + dp.getLength() @@ -88,10 +75,11 @@ public class AdaptDatagramSocket { out.println("rtt: " + (System.currentTimeMillis() - start)); out.println("post op: " + toString(op) + " ip: " + toString(ip)); - for (int i = 0; i < ip.getLength(); i++) + for (int i = 0; i < ip.getLength(); i++) { if (ip.getData()[ip.getOffset() + i] != op.getData()[op.getOffset() + i]) throw new Exception("Incorrect data received"); + } if (!(ip.getSocketAddress().equals(dst))) { throw new Exception("Incorrect sender address, expected: " + dst @@ -130,8 +118,9 @@ public class AdaptDatagramSocket { ds.setSoTimeout(timeout); out.println("timeout: " + ds.getSoTimeout()); - for (int i = 0; i < 5; i++) + for (int i = 0; i < 5; i++) { test(ds, dst, shouldTimeout); + } // Leave the socket open so that we don't reuse the old src address //ds.close(); @@ -139,10 +128,23 @@ public class AdaptDatagramSocket { } public static void main(String[] args) throws Exception { - test(echoAddress, 0, false, false); - test(echoAddress, 0, false, true); - test(echoAddress, 5000, false, false); - test(discardAddress, 10, true, false); + // need an UDP echo server + try (TestServers.UdpEchoServer echoServer + = TestServers.UdpEchoServer.startNewServer(100)) { + final InetSocketAddress address + = new InetSocketAddress(echoServer.getAddress(), + echoServer.getPort()); + test(address, 0, false, false); + test(address, 0, false, true); + test(address, 5000, false, false); + } + try (TestServers.UdpDiscardServer discardServer + = TestServers.UdpDiscardServer.startNewServer()) { + final InetSocketAddress address + = new InetSocketAddress(discardServer.getAddress(), + discardServer.getPort()); + test(address, 10, true, false); + } } } diff --git a/jdk/test/java/nio/channels/DatagramChannel/IsBound.java b/jdk/test/java/nio/channels/DatagramChannel/IsBound.java index 6fae6681202..7a028ec9b8e 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/IsBound.java +++ b/jdk/test/java/nio/channels/DatagramChannel/IsBound.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,21 +34,25 @@ import java.nio.channels.*; public class IsBound { public static void main(String argv[]) throws Exception { - InetSocketAddress isa = new InetSocketAddress( - InetAddress.getByName(TestUtil.HOST), 13); - ByteBuffer bb = ByteBuffer.allocateDirect(256); - bb.put("hello".getBytes()); - bb.flip(); + try (TestServers.UdpDayTimeServer daytimeServer + = TestServers.UdpDayTimeServer.startNewServer(100)) { + InetSocketAddress isa = new InetSocketAddress( + daytimeServer.getAddress(), + daytimeServer.getPort()); + ByteBuffer bb = ByteBuffer.allocateDirect(256); + bb.put("hello".getBytes()); + bb.flip(); - DatagramChannel dc = DatagramChannel.open(); - dc.send(bb, isa); - if(!dc.socket().isBound()) - throw new Exception("Test failed"); - dc.close(); + DatagramChannel dc = DatagramChannel.open(); + dc.send(bb, isa); + if(!dc.socket().isBound()) + throw new Exception("Test failed"); + dc.close(); - dc = DatagramChannel.open(); - if(dc.socket().isBound()) - throw new Exception("Test failed"); - dc.close(); + dc = DatagramChannel.open(); + if(dc.socket().isBound()) + throw new Exception("Test failed"); + dc.close(); + } } } diff --git a/jdk/test/java/nio/channels/DatagramChannel/IsConnected.java b/jdk/test/java/nio/channels/DatagramChannel/IsConnected.java index f71d8696c17..db4cb8969ed 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/IsConnected.java +++ b/jdk/test/java/nio/channels/DatagramChannel/IsConnected.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,21 +28,23 @@ */ import java.net.*; -import java.nio.*; import java.nio.channels.*; public class IsConnected { public static void main(String argv[]) throws Exception { - InetSocketAddress isa = new InetSocketAddress( - InetAddress.getByName(TestUtil.HOST), 13); - DatagramChannel dc = DatagramChannel.open(); - dc.configureBlocking(true); - dc.connect(isa); - if (!dc.isConnected()) - throw new RuntimeException("channel.isConnected inconsistent"); - if (!dc.socket().isConnected()) - throw new RuntimeException("socket.isConnected inconsistent"); - dc.close(); + try (TestServers.UdpDayTimeServer daytimeServer + = TestServers.UdpDayTimeServer.startNewServer(100)) { + InetSocketAddress isa = new InetSocketAddress( + daytimeServer.getAddress(), daytimeServer.getPort()); + DatagramChannel dc = DatagramChannel.open(); + dc.configureBlocking(true); + dc.connect(isa); + if (!dc.isConnected()) + throw new RuntimeException("channel.isConnected inconsistent"); + if (!dc.socket().isConnected()) + throw new RuntimeException("socket.isConnected inconsistent"); + dc.close(); + } } } diff --git a/jdk/test/java/nio/channels/Selector/Alias.java b/jdk/test/java/nio/channels/Selector/Alias.java index c3554b9cc58..731703bd441 100644 --- a/jdk/test/java/nio/channels/Selector/Alias.java +++ b/jdk/test/java/nio/channels/Selector/Alias.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,12 +27,11 @@ * @library .. */ -import java.io.*; import java.net.*; import java.nio.*; import java.nio.channels.*; -import java.util.*; import java.nio.channels.spi.SelectorProvider; +import java.util.*; public class Alias { @@ -40,18 +39,26 @@ public class Alias { static int LIMIT = 20; // Hangs after just 1 if problem is present public static void main(String[] args) throws Exception { - test1(); + try (TestServers.DayTimeServer daytimeServer + = TestServers.DayTimeServer.startNewServer(100)) { + test1(daytimeServer); + } } - public static void test1() throws Exception { + static void test1(TestServers.DayTimeServer daytimeServer) throws Exception { Selector selector = SelectorProvider.provider().openSelector(); - InetAddress myAddress=InetAddress.getByName(TestUtil.HOST); - InetSocketAddress isa = new InetSocketAddress(myAddress,13); + InetAddress myAddress = daytimeServer.getAddress(); + InetSocketAddress isa + = new InetSocketAddress(myAddress, + daytimeServer.getPort()); for (int j=0; j 0) { - Set readyKeys = connectSelector.selectedKeys(); - Iterator i = readyKeys.iterator(); - while (i.hasNext()) { - SelectionKey sk = (SelectionKey)i.next(); - i.remove(); - SocketChannel nextReady = (SocketChannel)sk.channel(); - result = nextReady.finishConnect(); - if (result) - sk.cancel(); + try (TestServers.EchoServer echoServer + = TestServers.EchoServer.startNewServer(100)) { + InetSocketAddress isa + = new InetSocketAddress(echoServer.getAddress(), + echoServer.getPort()); + SocketChannel sc = SocketChannel.open(); + sc.configureBlocking(false); + boolean result = sc.connect(isa); + if (result) { + System.out.println("Socket immediately connected on " + + System.getProperty("os.name") + + ": " + sc); + } + while (!result) { + SelectionKey connectKey = sc.register(connectSelector, + SelectionKey.OP_CONNECT); + int keysAdded = connectSelector.select(); + if (keysAdded > 0) { + Set readyKeys = connectSelector.selectedKeys(); + Iterator i = readyKeys.iterator(); + while (i.hasNext()) { + SelectionKey sk = (SelectionKey)i.next(); + i.remove(); + SocketChannel nextReady = (SocketChannel)sk.channel(); + result = nextReady.finishConnect(); + if (result) + sk.cancel(); + } } } + + byte[] bs = new byte[] { (byte)0xca, (byte)0xfe, + (byte)0xba, (byte)0xbe }; + ByteBuffer bb = ByteBuffer.wrap(bs); + sc.configureBlocking(true); + sc.write(bb); + bb.rewind(); + + ByteBuffer bb2 = ByteBuffer.allocateDirect(100); + int n = sc.read(bb2); + bb2.flip(); + + sc.close(); + connectSelector.close(); + + if (!bb.equals(bb2)) + throw new Exception("Echoed bytes incorrect: Sent " + + bb + ", got " + bb2); } - - byte[] bs = new byte[] { (byte)0xca, (byte)0xfe, - (byte)0xba, (byte)0xbe }; - ByteBuffer bb = ByteBuffer.wrap(bs); - sc.configureBlocking(true); - sc.write(bb); - bb.rewind(); - - ByteBuffer bb2 = ByteBuffer.allocateDirect(100); - int n = sc.read(bb2); - bb2.flip(); - - sc.close(); - connectSelector.close(); - - if (!bb.equals(bb2)) - throw new Exception("Echoed bytes incorrect: Sent " - + bb + ", got " + bb2); } - } diff --git a/jdk/test/java/nio/channels/Selector/Connect.java b/jdk/test/java/nio/channels/Selector/Connect.java index af1ce984e14..67f48d8ebed 100644 --- a/jdk/test/java/nio/channels/Selector/Connect.java +++ b/jdk/test/java/nio/channels/Selector/Connect.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,12 +27,11 @@ * @library .. */ -import java.io.*; import java.net.*; import java.nio.*; import java.nio.channels.*; -import java.util.*; import java.nio.channels.spi.SelectorProvider; +import java.util.*; public class Connect { @@ -40,12 +39,18 @@ public class Connect { static int LIMIT = 100; public static void main(String[] args) throws Exception { - scaleTest(); + try (TestServers.DayTimeServer daytimeServer + = TestServers.DayTimeServer.startNewServer(50)) { + scaleTest(daytimeServer); + } } - public static void scaleTest() throws Exception { - InetAddress myAddress=InetAddress.getByName(TestUtil.HOST); - InetSocketAddress isa = new InetSocketAddress(myAddress,13); + static void scaleTest(TestServers.DayTimeServer daytimeServer) + throws Exception + { + InetAddress myAddress = daytimeServer.getAddress(); + InetSocketAddress isa + = new InetSocketAddress(myAddress, daytimeServer.getPort()); for (int j=0; j> NONE = Collections.emptySet(); + + // make a set of expected exception. + static Collection> expectedExceptions(Class... expected) { + final Collection> exceptions; + if (expected.length == 0) { + exceptions = NONE; + } else if (expected.length == 1) { + assert expected[0] != null; + exceptions = Collections.>singleton(expected[0]); + } else { + exceptions = new HashSet<>(Arrays.asList(expected)); + } + return exceptions; + } static abstract class Test { @@ -76,37 +95,65 @@ public class ConnectState { check(!sc.isConnectionPending(), "!isConnectionPending"); check(sc.isOpen(), "isOpen"); break; + case ST_PENDING_OR_CONNECTED: + check(sc.isConnected() || sc.isConnectionPending(), + "isConnected || isConnectionPending"); + check(sc.isOpen(), "isOpen"); + break; } } - Test(String name, Class exception, int state) throws Exception { + Test(String name, Class exception, int state) throws Exception { + this(name, expectedExceptions(exception), state); + } + + // On some architecture we may need to accept several exceptions. + // For instance on Solaris, when using a server colocated on the + // machine we cannot guarantee that we will get a + // ConnectionPendingException when connecting twice on the same + // non-blocking socket. We may instead get a an + // AlreadyConnectedException, which is also valid: it simply means + // that the first connection has been immediately accepted. + Test(String name, Collection> exceptions, int state) + throws Exception { SocketChannel sc = SocketChannel.open(); - String note = null; + String note; try { try { note = go(sc); } catch (Exception x) { - if (exception != null) { + Class expectedExceptionClass = null; + for (Class exception : exceptions) { if (exception.isInstance(x)) { log.println(name + ": As expected: " + x); + expectedExceptionClass = exception; check(sc, state); - return; - } else { - throw new Exception(name + break; + } + } + if (expectedExceptionClass == null + && !exceptions.isEmpty()) { + // we had an exception, but it's not of the set of + // exceptions we expected. + throw new Exception(name + ": Incorrect exception", x); - } - } else { + } else if (exceptions.isEmpty()) { + // we didn't expect any exception throw new Exception(name + ": Unexpected exception", x); } + // if we reach here, we have our expected exception + assert expectedExceptionClass != null; + return; } - if (exception != null) + if (!exceptions.isEmpty()) { throw new Exception(name + ": Expected exception not thrown: " - + exception); + + exceptions.iterator().next()); + } check(sc, state); log.println(name + ": Returned normally" + ((note != null) ? ": " + note : "")); @@ -123,6 +170,7 @@ public class ConnectState { new Test("Read unconnected", NotYetConnectedException.class, ST_UNCONNECTED) { + @Override String go(SocketChannel sc) throws Exception { ByteBuffer b = ByteBuffer.allocateDirect(1024); sc.read(b); @@ -131,19 +179,22 @@ public class ConnectState { new Test("Write unconnected", NotYetConnectedException.class, ST_UNCONNECTED) { + @Override String go(SocketChannel sc) throws Exception { ByteBuffer b = ByteBuffer.allocateDirect(1024); sc.write(b); return null; }}; - new Test("Simple connect", null, ST_CONNECTED) { + new Test("Simple connect", NONE, ST_CONNECTED) { + @Override String go(SocketChannel sc) throws Exception { sc.connect(remote); return null; }}; - new Test("Simple connect & finish", null, ST_CONNECTED) { + new Test("Simple connect & finish", NONE, ST_CONNECTED) { + @Override String go(SocketChannel sc) throws Exception { sc.connect(remote); if (!sc.finishConnect()) @@ -153,6 +204,7 @@ public class ConnectState { new Test("Double connect", AlreadyConnectedException.class, ST_CONNECTED) { + @Override String go(SocketChannel sc) throws Exception { sc.connect(remote); sc.connect(remote); @@ -161,12 +213,16 @@ public class ConnectState { new Test("Finish w/o start", NoConnectionPendingException.class, ST_UNCONNECTED) { + @Override String go(SocketChannel sc) throws Exception { sc.finishConnect(); return null; }}; - new Test("NB simple connect", null, ST_CONNECTED) { + // Note: using our local EchoServer rather than echo on a distant + // host - we see that Tries to finish = 0 (instead of ~ 18). + new Test("NB simple connect", NONE, ST_CONNECTED) { + @Override String go(SocketChannel sc) throws Exception { sc.configureBlocking(false); sc.connect(remote); @@ -179,8 +235,15 @@ public class ConnectState { return ("Tries to finish = " + n); }}; + // Note: using our local EchoServer rather than echo on a distant + // host - we cannot guarantee that this test will get a + // a ConnectionPendingException: it may get an + // AlreadyConnectedException, so we should allow for both. new Test("NB double connect", - ConnectionPendingException.class, ST_PENDING) { + expectedExceptions(ConnectionPendingException.class, + AlreadyConnectedException.class), + ST_PENDING_OR_CONNECTED) { + @Override String go(SocketChannel sc) throws Exception { sc.configureBlocking(false); sc.connect(remote); @@ -190,13 +253,15 @@ public class ConnectState { new Test("NB finish w/o start", NoConnectionPendingException.class, ST_UNCONNECTED) { + @Override String go(SocketChannel sc) throws Exception { sc.configureBlocking(false); sc.finishConnect(); return null; }}; - new Test("NB connect, B finish", null, ST_CONNECTED) { + new Test("NB connect, B finish", NONE, ST_CONNECTED) { + @Override String go(SocketChannel sc) throws Exception { sc.configureBlocking(false); sc.connect(remote); @@ -208,9 +273,12 @@ public class ConnectState { } public static void main(String[] args) throws Exception { - remote = new InetSocketAddress(InetAddress.getByName(REMOTE_HOST), - REMOTE_PORT); - tests(); + try (TestServers.EchoServer echoServer + = TestServers.EchoServer.startNewServer(500)) { + remote = new InetSocketAddress(echoServer.getAddress(), + echoServer.getPort()); + tests(); + } } } diff --git a/jdk/test/java/nio/channels/SocketChannel/FinishConnect.java b/jdk/test/java/nio/channels/SocketChannel/FinishConnect.java index 3d53c986e5e..efcf38a43b7 100644 --- a/jdk/test/java/nio/channels/SocketChannel/FinishConnect.java +++ b/jdk/test/java/nio/channels/SocketChannel/FinishConnect.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,21 +36,25 @@ import java.util.*; public class FinishConnect { - static final int DAYTIME_PORT = 13; - static final String DAYTIME_HOST = TestUtil.HOST; - public static void main(String[] args) throws Exception { - test1(true, true); - test1(true, false); - test1(false, true); - test1(false, false); - test2(); + try (TestServers.DayTimeServer dayTimeServer + = TestServers.DayTimeServer.startNewServer(100)) { + test1(dayTimeServer, true, true); + test1(dayTimeServer, true, false); + test1(dayTimeServer, false, true); + test1(dayTimeServer, false, false); + test2(dayTimeServer); + } } - static void test1(boolean select, boolean setBlocking) throws Exception { + static void test1(TestServers.DayTimeServer daytimeServer, + boolean select, + boolean setBlocking) + throws Exception + { InetSocketAddress isa - = new InetSocketAddress(InetAddress.getByName(DAYTIME_HOST), - DAYTIME_PORT); + = new InetSocketAddress(daytimeServer.getAddress(), + daytimeServer.getPort()); SocketChannel sc = SocketChannel.open(); sc.configureBlocking(false); boolean connected = sc.connect(isa); @@ -109,15 +113,27 @@ public class FinishConnect { sc.close(); } - static void test2() throws Exception { + static void test2(TestServers.DayTimeServer daytimeServer) throws Exception { InetSocketAddress isa - = new InetSocketAddress(InetAddress.getByName(DAYTIME_HOST), - DAYTIME_PORT); + = new InetSocketAddress(daytimeServer.getAddress(), + daytimeServer.getPort()); boolean done = false; int globalAttempts = 0; + int connectSuccess = 0; while (!done) { - if (globalAttempts++ > 50) + // When using a local daytime server it is not always possible + // to get a pending connection, as sc.connect(isa) may always + // return true. + // So we're going to throw the exception only if there was + // at least 1 case where we did not manage to connect. + if (globalAttempts++ > 50) { + if (globalAttempts == connectSuccess + 1) { + System.out.println("Can't fully test on " + + System.getProperty("os.name")); + break; + } throw new RuntimeException("Failed to connect"); + } SocketChannel sc = SocketChannel.open(); sc.configureBlocking(false); boolean connected = sc.connect(isa); @@ -132,6 +148,9 @@ public class FinishConnect { } Thread.sleep(10); } + if (connected) { + connectSuccess++; + } sc.close(); } } diff --git a/jdk/test/java/nio/channels/SocketChannel/IsConnectable.java b/jdk/test/java/nio/channels/SocketChannel/IsConnectable.java index d646d194aa2..21bdd80b394 100644 --- a/jdk/test/java/nio/channels/SocketChannel/IsConnectable.java +++ b/jdk/test/java/nio/channels/SocketChannel/IsConnectable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,24 +28,19 @@ */ import java.net.*; -import java.io.*; -import java.nio.*; import java.nio.channels.*; import java.nio.channels.spi.SelectorProvider; import java.util.*; public class IsConnectable { - static final int DAYTIME_PORT = 13; - static final String DAYTIME_HOST = TestUtil.HOST; - - static void test() throws Exception { + static void test(TestServers.DayTimeServer daytimeServer) throws Exception { InetSocketAddress isa - = new InetSocketAddress(InetAddress.getByName(DAYTIME_HOST), - DAYTIME_PORT); + = new InetSocketAddress(daytimeServer.getAddress(), + daytimeServer.getPort()); SocketChannel sc = SocketChannel.open(); sc.configureBlocking(false); - sc.connect(isa); + final boolean immediatelyConnected = sc.connect(isa); Selector selector = SelectorProvider.provider().openSelector(); try { @@ -67,7 +62,12 @@ public class IsConnectable { throw new Exception("Test failed: 4737146 detected"); } } else { - throw new Exception("Select failed"); + if (!immediatelyConnected) { + throw new Exception("Select failed"); + } else { + System.out.println("IsConnectable couldn't be fully tested for " + + System.getProperty("os.name")); + } } } finally { sc.close(); @@ -76,7 +76,10 @@ public class IsConnectable { } public static void main(String[] args) throws Exception { - test(); + try (TestServers.DayTimeServer daytimeServer + = TestServers.DayTimeServer.startNewServer(100)) { + test(daytimeServer); + } } } diff --git a/jdk/test/java/nio/channels/SocketChannel/LocalAddress.java b/jdk/test/java/nio/channels/SocketChannel/LocalAddress.java index 1bcd0a189d9..03a038285e3 100644 --- a/jdk/test/java/nio/channels/SocketChannel/LocalAddress.java +++ b/jdk/test/java/nio/channels/SocketChannel/LocalAddress.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,18 +28,20 @@ */ import java.net.*; -import java.nio.*; import java.nio.channels.*; public class LocalAddress { public static void main(String[] args) throws Exception { - test1(); + try (TestServers.EchoServer echoServer + = TestServers.EchoServer.startNewServer()) { + test1(echoServer); + } } - static void test1() throws Exception { + static void test1(TestServers.AbstractServer server) throws Exception { InetAddress bogus = InetAddress.getByName("0.0.0.0"); InetSocketAddress saddr = new InetSocketAddress( - InetAddress.getByName(TestUtil.HOST), 23); + server.getAddress(), server.getPort()); //Test1: connect only SocketChannel sc = SocketChannel.open(); diff --git a/jdk/test/java/nio/channels/SocketChannel/Stream.java b/jdk/test/java/nio/channels/SocketChannel/Stream.java index 456363fbfdb..fadf0dc908f 100644 --- a/jdk/test/java/nio/channels/SocketChannel/Stream.java +++ b/jdk/test/java/nio/channels/SocketChannel/Stream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,22 +27,17 @@ * @library .. */ -import java.net.*; import java.io.*; -import java.nio.*; +import java.net.*; import java.nio.channels.*; -import java.nio.charset.*; public class Stream { - static final int DAYTIME_PORT = 13; - static final String DAYTIME_HOST = TestUtil.HOST; - - static void test() throws Exception { + static void test(TestServers.DayTimeServer daytimeServer) throws Exception { InetSocketAddress isa - = new InetSocketAddress(InetAddress.getByName(DAYTIME_HOST), - DAYTIME_PORT); + = new InetSocketAddress(daytimeServer.getAddress(), + daytimeServer.getPort()); SocketChannel sc = SocketChannel.open(); sc.connect(isa); sc.configureBlocking(false); @@ -58,7 +53,9 @@ public class Stream { } public static void main(String[] args) throws Exception { - test(); + try (TestServers.DayTimeServer dayTimeServer + = TestServers.DayTimeServer.startNewServer(100)) { + test(dayTimeServer); + } } - } diff --git a/jdk/test/java/nio/channels/SocketChannel/VectorParams.java b/jdk/test/java/nio/channels/SocketChannel/VectorParams.java index 9696927c2dc..f90867f3822 100644 --- a/jdk/test/java/nio/channels/SocketChannel/VectorParams.java +++ b/jdk/test/java/nio/channels/SocketChannel/VectorParams.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,31 +27,31 @@ * @library .. */ -import java.net.*; import java.io.*; +import java.net.*; import java.nio.*; import java.nio.channels.*; -import java.nio.charset.*; public class VectorParams { static java.io.PrintStream out = System.out; - static final int DAYTIME_PORT = 13; - static final String DAYTIME_HOST = TestUtil.HOST; static final int testSize = 10; static ByteBuffer[] bufs = null; static InetSocketAddress isa = null; public static void main(String[] args) throws Exception { - initBufs(); - testSocketChannelVectorParams(); - testDatagramChannelVectorParams(); - testPipeVectorParams(); - testFileVectorParams(); + try (TestServers.DayTimeServer daytimeServer + = TestServers.DayTimeServer.startNewServer(100)) { + initBufs(daytimeServer); + testSocketChannelVectorParams(); + testDatagramChannelVectorParams(); + testPipeVectorParams(); + testFileVectorParams(); + } } - static void initBufs() throws Exception { + static void initBufs(TestServers.DayTimeServer daytimeServer) throws Exception { bufs = new ByteBuffer[testSize]; for(int i=0; i connections = new ArrayList<>(); + private ServerSocket serverSocket; // the server socket + private boolean started = false; // whether the server is started + Throwable error = null; + + /** + * Creates a new abstract TCP server. + * + * @param linger the amount of time the server should wait before + * responding to requests. + */ + protected AbstractTcpServer(long linger) { + this.linger = linger; + } + + /** + * The local port to which the server is bound. + * + * @return The local port to which the server is bound. + * @exception IllegalStateException is thrown if the server is not + * started. + */ + @Override + public final synchronized int getPort() { + if (!started) { + throw new IllegalStateException("Not started"); + } + return serverSocket.getLocalPort(); + } + + /** + * The local address to which the server is bound. + * + * @return The local address to which the server is bound. + * @exception IllegalStateException is thrown if the server is not + * started. + */ + @Override + public final synchronized InetAddress getAddress() { + if (!started) { + throw new IllegalStateException("Not started"); + } + return serverSocket.getInetAddress(); + } + + /** + * Tells whether the server is started. + * + * @return true if the server is started. + */ + public final synchronized boolean isStarted() { + return started; + } + + /** + * Creates a new server socket. + * + * @param port local port to bind to. + * @param backlog requested maximum length of the queue of incoming + * connections. + * @param address local address to bind to. + * @return a new bound server socket ready to accept connections. + * @throws IOException if the socket cannot be created or bound. + */ + protected ServerSocket newServerSocket(int port, int backlog, + InetAddress address) + throws IOException { + return new ServerSocket(port, backlog, address); + } + + /** + * Starts listening for connections. + * + * @throws IOException if the server socket cannot be created or bound. + */ + public final synchronized void start() throws IOException { + if (started) { + return; + } + final ServerSocket socket = + newServerSocket(0, 100, InetAddress.getLocalHost()); + serverSocket = socket; + acceptThread = new Thread(this); + acceptThread.setDaemon(true); + acceptThread.start(); + started = true; + } + + /** + * Calls {@code Thread.sleep(linger);} + */ + protected final void lingerIfRequired() { + if (linger > 0) { + try { + Thread.sleep(linger); + } catch (InterruptedException x) { + Thread.interrupted(); + final ServerSocket socket = serverSocket(); + if (socket != null && !socket.isClosed()) { + System.err.println("Thread interrupted..."); + } + } + } + } + + final synchronized ServerSocket serverSocket() { + return this.serverSocket; + } + + /** + * The main accept loop. + */ + @Override + public final void run() { + final ServerSocket sSocket = serverSocket(); + try { + Socket s; + while (isStarted() && !Thread.interrupted() + && (s = sSocket.accept()) != null) { + lingerIfRequired(); + listen(s); + } + } catch (Exception x) { + error = x; + } finally { + synchronized (this) { + if (!sSocket.isClosed()) { + try { + sSocket.close(); + } catch (IOException x) { + System.err.println("Failed to close server socket"); + } + } + if (started && this.serverSocket == sSocket) { + started = false; + this.serverSocket = null; + this.acceptThread = null; + } + } + } + } + + /** + * Represents a connection accepted by the server. + */ + protected abstract class TcpConnectionThread extends Thread { + + protected final Socket socket; + + protected TcpConnectionThread(Socket socket) { + this.socket = socket; + this.setDaemon(true); + } + + public void close() throws IOException { + socket.close(); + interrupt(); + } + } + + /** + * Creates a new TcpConnnectionThread to handle the connection through + * an accepted socket. + * + * @param s the socket returned by {@code serverSocket.accept()}. + * @return a new TcpConnnectionThread to handle the connection through + * an accepted socket. + */ + protected abstract TcpConnectionThread createConnection(Socket s); + + /** + * Creates and starts a new TcpConnectionThread to handle the accepted + * socket. + * + * @param s the socket returned by {@code serverSocket.accept()}. + */ + private synchronized void listen(Socket s) { + TcpConnectionThread c = createConnection(s); + c.start(); + addConnection(c); + } + + /** + * Add the connection to the list of accepted connections. + * + * @param connection an accepted connection. + */ + protected synchronized void addConnection( + TcpConnectionThread connection) { + connections.add(connection); + } + + /** + * Remove the connection from the list of accepted connections. + * + * @param connection an accepted connection. + */ + protected synchronized void removeConnection( + TcpConnectionThread connection) { + connections.remove(connection); + } + + /** + * Close the server socket and all the connections present in the list + * of accepted connections. + * + * @throws IOException + */ + @Override + public synchronized void close() throws IOException { + if (serverSocket != null && !serverSocket.isClosed()) { + serverSocket.close(); + } + if (acceptThread != null) { + acceptThread.interrupt(); + } + int failed = 0; + for (TcpConnectionThread c : connections) { + try { + c.close(); + } catch (IOException x) { + // no matter - we're closing. + failed++; + } + } + connections.clear(); + if (failed > 0) { + throw new IOException("Failed to close some connections"); + } + } + } + + /** + * A small TCP Server that emulates the echo service for tests purposes. See + * http://en.wikipedia.org/wiki/Echo_Protocol This server uses an anonymous + * port - NOT the standard port 7. We don't guarantee that its behavior + * exactly matches the RFC - the only purpose of this server is to have + * something that responds to nio tests... + */ + static final class EchoServer extends AbstractTcpServer { + + public EchoServer() { + this(0L); + } + + public EchoServer(long linger) { + super(linger); + } + + @Override + protected TcpConnectionThread createConnection(Socket s) { + return new EchoConnection(s); + } + + private final class EchoConnection extends TcpConnectionThread { + + public EchoConnection(Socket socket) { + super(socket); + } + + @Override + public void run() { + try { + final InputStream is = socket.getInputStream(); + final OutputStream out = socket.getOutputStream(); + byte[] b = new byte[255]; + int n; + while ((n = is.read(b)) > 0) { + lingerIfRequired(); + out.write(b, 0, n); + } + } catch (IOException io) { + // fall through to finally + } finally { + if (!socket.isClosed()) { + try { + socket.close(); + } catch (IOException x) { + System.err.println( + "Failed to close echo connection socket"); + } + } + removeConnection(this); + } + } + } + + public static EchoServer startNewServer() throws IOException { + return startNewServer(0); + } + + public static EchoServer startNewServer(long linger) throws IOException { + final EchoServer echoServer = new EchoServer(linger); + echoServer.start(); + return echoServer; + } + } + + /** + * A small TCP server that emulates the Day & Time service for tests + * purposes. See http://en.wikipedia.org/wiki/Daytime_Protocol This server + * uses an anonymous port - NOT the standard port 13. We don't guarantee + * that its behavior exactly matches the RFC - the only purpose of this + * server is to have something that responds to nio tests... + */ + static final class DayTimeServer extends AbstractTcpServer { + + public DayTimeServer() { + this(0L); + } + + public DayTimeServer(long linger) { + super(linger); + } + + @Override + protected TcpConnectionThread createConnection(Socket s) { + return new DayTimeServerConnection(s); + } + + @Override + protected void addConnection(TcpConnectionThread connection) { + // do nothing - the connection just write the date and terminates. + } + + @Override + protected void removeConnection(TcpConnectionThread connection) { + // do nothing - we're not adding connections to the list... + } + + private final class DayTimeServerConnection extends TcpConnectionThread { + + public DayTimeServerConnection(Socket socket) { + super(socket); + } + + @Override + public void run() { + try { + final OutputStream out = socket.getOutputStream(); + lingerIfRequired(); + out.write(new Date(System.currentTimeMillis()) + .toString().getBytes("US-ASCII")); + out.flush(); + } catch (IOException io) { + // fall through to finally + } finally { + if (!socket.isClosed()) { + try { + socket.close(); + } catch (IOException x) { + System.err.println( + "Failed to close echo connection socket"); + } + } + } + } + } + + public static DayTimeServer startNewServer() + throws IOException { + return startNewServer(0); + } + + public static DayTimeServer startNewServer(long linger) + throws IOException { + final DayTimeServer daytimeServer = new DayTimeServer(linger); + daytimeServer.start(); + return daytimeServer; + } + } + + /** + * An abstract class for implementing small UDP Servers for the nio tests + * purposes. Disclaimer: This is a naive implementation that uses the old + * networking APIs (not those from {@code java.nio.*}) and shamelessly + * extends/creates Threads instead of using an executor service. + */ + static abstract class AbstractUdpServer extends AbstractServer + implements Runnable, Closeable { + + protected final long linger; // #of ms to wait before responding + private Thread acceptThread; // thread waiting for packets + private DatagramSocket serverSocket; // the server socket + private boolean started = false; // whether the server is started + Throwable error = null; + + /** + * Creates a new abstract UDP server. + * + * @param linger the amount of time the server should wait before + * responding to requests. + */ + protected AbstractUdpServer(long linger) { + this.linger = linger; + } + + /** + * The local port to which the server is bound. + * + * @return The local port to which the server is bound. + * @exception IllegalStateException is thrown if the server is not + * started. + */ + @Override + public final synchronized int getPort() { + if (!started) { + throw new IllegalStateException("Not started"); + } + return serverSocket.getLocalPort(); + } + + /** + * The local address to which the server is bound. + * + * @return The local address to which the server is bound. + * @exception IllegalStateException is thrown if the server is not + * started. + */ + @Override + public final synchronized InetAddress getAddress() { + if (!started) { + throw new IllegalStateException("Not started"); + } + return serverSocket.getLocalAddress(); + } + + /** + * Tells whether the server is started. + * + * @return true if the server is started. + */ + public final synchronized boolean isStarted() { + return started; + } + + /** + * Creates a new datagram socket. + * + * @param port local port to bind to. + * @param address local address to bind to. + * @return a new bound server socket ready to listen for packets. + * @throws IOException if the socket cannot be created or bound. + */ + protected DatagramSocket newDatagramSocket(int port, + InetAddress address) + throws IOException { + return new DatagramSocket(port, address); + } + + /** + * Starts listening for connections. + * + * @throws IOException if the server socket cannot be created or bound. + */ + public final synchronized void start() throws IOException { + if (started) { + return; + } + final DatagramSocket socket = + newDatagramSocket(0, InetAddress.getLocalHost()); + serverSocket = socket; + acceptThread = new Thread(this); + acceptThread.setDaemon(true); + acceptThread.start(); + started = true; + } + + /** + * Calls {@code Thread.sleep(linger);} + */ + protected final void lingerIfRequired() { + if (linger > 0) { + try { + Thread.sleep(linger); + } catch (InterruptedException x) { + Thread.interrupted(); + final DatagramSocket socket = serverSocket(); + if (socket != null && !socket.isClosed()) { + System.err.println("Thread interrupted..."); + } + } + } + } + + final synchronized DatagramSocket serverSocket() { + return this.serverSocket; + } + + final synchronized boolean send(DatagramSocket socket, + DatagramPacket response) throws IOException { + if (!socket.isClosed()) { + socket.send(response); + return true; + } else { + return false; + } + } + + /** + * The main receive loop. + */ + @Override + public final void run() { + final DatagramSocket sSocket = serverSocket(); + try { + final int size = Math.max(1024, sSocket.getReceiveBufferSize()); + if (size > sSocket.getReceiveBufferSize()) { + sSocket.setReceiveBufferSize(size); + } + while (isStarted() && !Thread.interrupted() && !sSocket.isClosed()) { + final byte[] buf = new byte[size]; + final DatagramPacket packet = + new DatagramPacket(buf, buf.length); + lingerIfRequired(); + sSocket.receive(packet); + //System.out.println("Received packet from: " + // + packet.getAddress()+":"+packet.getPort()); + handle(sSocket, packet); + } + } catch (Exception x) { + error = x; + } finally { + synchronized (this) { + if (!sSocket.isClosed()) { + sSocket.close(); + } + if (started && this.serverSocket == sSocket) { + started = false; + this.serverSocket = null; + this.acceptThread = null; + } + } + } + } + + /** + * Represents an UDP request received by the server. + */ + protected abstract class UdpRequestThread extends Thread { + + protected final DatagramPacket request; + protected final DatagramSocket socket; + + protected UdpRequestThread(DatagramSocket socket, DatagramPacket request) { + this.socket = socket; + this.request = request; + this.setDaemon(true); + } + } + + /** + * Creates a new UdpRequestThread to handle a DatagramPacket received + * through a DatagramSocket. + * + * @param socket the socket through which the request was received. + * @param request the datagram packet received through the socket. + * @return a new UdpRequestThread to handle the request received through + * a DatagramSocket. + */ + protected abstract UdpRequestThread createConnection(DatagramSocket socket, + DatagramPacket request); + + /** + * Creates and starts a new UdpRequestThread to handle the received + * datagram packet. + * + * @param socket the socket through which the request was received. + * @param request the datagram packet received through the socket. + */ + private synchronized void handle(DatagramSocket socket, + DatagramPacket request) { + UdpRequestThread c = createConnection(socket, request); + // c can be null if the request requires no response. + if (c != null) { + c.start(); + } + } + + /** + * Close the server socket. + * + * @throws IOException + */ + @Override + public synchronized void close() throws IOException { + if (serverSocket != null && !serverSocket.isClosed()) { + serverSocket.close(); + } + if (acceptThread != null) { + acceptThread.interrupt(); + } + } + } + + /** + * A small UDP Server that emulates the discard service for tests purposes. + * See http://en.wikipedia.org/wiki/Discard_Protocol This server uses an + * anonymous port - NOT the standard port 9. We don't guarantee that its + * behavior exactly matches the RFC - the only purpose of this server is to + * have something that responds to nio tests... + */ + static final class UdpDiscardServer extends AbstractUdpServer { + + public UdpDiscardServer() { + this(0L); + } + + public UdpDiscardServer(long linger) { + super(linger); + } + + @Override + protected UdpRequestThread createConnection(DatagramSocket socket, + DatagramPacket request) { + // no response required + return null; + } + + public static UdpDiscardServer startNewServer() throws IOException { + return startNewServer(0); + } + + public static UdpDiscardServer startNewServer(long linger) throws IOException { + final UdpDiscardServer discardServer = new UdpDiscardServer(linger); + discardServer.start(); + return discardServer; + } + } + + /** + * A small UDP Server that emulates the echo service for tests purposes. See + * http://en.wikipedia.org/wiki/Echo_Protocol This server uses an anonymous + * port - NOT the standard port 7. We don't guarantee that its behavior + * exactly matches the RFC - the only purpose of this server is to have + * something that responds to nio tests... + */ + static final class UdpEchoServer extends AbstractUdpServer { + + public UdpEchoServer() { + this(0L); + } + + public UdpEchoServer(long linger) { + super(linger); + } + + @Override + protected UdpEchoRequest createConnection(DatagramSocket socket, + DatagramPacket request) { + return new UdpEchoRequest(socket, request); + } + + private final class UdpEchoRequest extends UdpRequestThread { + + public UdpEchoRequest(DatagramSocket socket, DatagramPacket request) { + super(socket, request); + } + + @Override + public void run() { + try { + lingerIfRequired(); + final DatagramPacket response = + new DatagramPacket(request.getData(), + request.getOffset(), request.getLength(), + request.getAddress(), request.getPort()); + send(socket, response); + } catch (IOException io) { + System.err.println("Failed to send response: " + io); + io.printStackTrace(System.err); + } + } + } + + public static UdpEchoServer startNewServer() throws IOException { + return startNewServer(0); + } + + public static UdpEchoServer startNewServer(long linger) throws IOException { + final UdpEchoServer echoServer = new UdpEchoServer(linger); + echoServer.start(); + return echoServer; + } + } + + /** + * A small UDP server that emulates the Day & Time service for tests + * purposes. See http://en.wikipedia.org/wiki/Daytime_Protocol This server + * uses an anonymous port - NOT the standard port 13. We don't guarantee + * that its behavior exactly matches the RFC - the only purpose of this + * server is to have something that responds to nio tests... + */ + static final class UdpDayTimeServer extends AbstractUdpServer { + + public UdpDayTimeServer() { + this(0L); + } + + public UdpDayTimeServer(long linger) { + super(linger); + } + + @Override + protected UdpDayTimeRequestThread createConnection(DatagramSocket socket, + DatagramPacket request) { + return new UdpDayTimeRequestThread(socket, request); + } + + private final class UdpDayTimeRequestThread extends UdpRequestThread { + + public UdpDayTimeRequestThread(DatagramSocket socket, + DatagramPacket request) { + super(socket, request); + } + + @Override + public void run() { + try { + lingerIfRequired(); + final byte[] data = new Date(System.currentTimeMillis()) + .toString().getBytes("US-ASCII"); + final DatagramPacket response = + new DatagramPacket(data, 0, data.length, + request.getAddress(), request.getPort()); + send(socket, response); + } catch (IOException io) { + System.err.println("Failed to send response: " + io); + io.printStackTrace(System.err); + } + } + } + + public static UdpDayTimeServer startNewServer() throws IOException { + return startNewServer(0); + } + + public static UdpDayTimeServer startNewServer(long linger) + throws IOException { + final UdpDayTimeServer echoServer = new UdpDayTimeServer(linger); + echoServer.start(); + return echoServer; + } + } +} diff --git a/jdk/test/java/nio/channels/TestUtil.java b/jdk/test/java/nio/channels/TestUtil.java index f06ffc4a847..5fbdf9ce45d 100644 --- a/jdk/test/java/nio/channels/TestUtil.java +++ b/jdk/test/java/nio/channels/TestUtil.java @@ -27,7 +27,6 @@ import java.io.*; import java.net.*; -import java.nio.*; import java.nio.channels.*; import java.util.Random; @@ -36,9 +35,6 @@ public class TestUtil { // Test hosts used by the channels tests - change these when // executing in a different network. - public static final String HOST = "javaweb.sfbay.sun.com"; - public static final String REFUSING_HOST = "jano1.sfbay.sun.com"; - public static final String FAR_HOST = "irejano.ireland.sun.com"; public static final String UNRESOLVABLE_HOST = "blah-blah.blah-blah.blah"; private TestUtil() { } From 309e36603fc6c46591146182512ce18c744bf923 Mon Sep 17 00:00:00 2001 From: Sean Coffey Date: Wed, 7 Nov 2012 18:48:48 +0000 Subject: [PATCH 197/241] 8002227: (tz) Support tzdata2012i Reviewed-by: peytoia, asaha --- jdk/make/sun/javazic/tzdata/VERSION | 2 +- jdk/make/sun/javazic/tzdata/africa | 49 +++++-- jdk/make/sun/javazic/tzdata/asia | 174 ++++++++++++----------- jdk/make/sun/javazic/tzdata/australasia | 91 +++++++----- jdk/make/sun/javazic/tzdata/europe | 14 +- jdk/make/sun/javazic/tzdata/leapseconds | 6 +- jdk/make/sun/javazic/tzdata/northamerica | 33 +++-- jdk/make/sun/javazic/tzdata/southamerica | 33 +++-- jdk/makefiles/GendataTimeZone.gmk | 2 +- 9 files changed, 238 insertions(+), 166 deletions(-) diff --git a/jdk/make/sun/javazic/tzdata/VERSION b/jdk/make/sun/javazic/tzdata/VERSION index 80cedce6711..85db871ccf3 100644 --- a/jdk/make/sun/javazic/tzdata/VERSION +++ b/jdk/make/sun/javazic/tzdata/VERSION @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2012c +tzdata2012i diff --git a/jdk/make/sun/javazic/tzdata/africa b/jdk/make/sun/javazic/tzdata/africa index 74c886175c2..7db9b3d269d 100644 --- a/jdk/make/sun/javazic/tzdata/africa +++ b/jdk/make/sun/javazic/tzdata/africa @@ -260,7 +260,7 @@ Rule Egypt 2006 only - Sep 21 23:00s 0 - # I received a mail from an airline which says that the daylight # saving time in Egypt will end in the night of 2007-09-06 to 2007-09-07. # From Jesper Norgaard Welen (2007-08-15): [The following agree:] -# http://www.nentjes.info/Bill/bill5.htm +# http://www.nentjes.info/Bill/bill5.htm # http://www.timeanddate.com/worldclock/city.html?n=53 # From Steffen Thorsen (2007-09-04): The official information...: # http://www.sis.gov.eg/En/EgyptOnline/Miscellaneous/000002/0207000000000000001580.htm @@ -314,18 +314,18 @@ Rule Egypt 2007 only - Sep Thu>=1 23:00s 0 - # in September. # From Steffen Thorsen (2009-08-11): -# We have been able to confirm the August change with the Egyptian Cabinet +# We have been able to confirm the August change with the Egyptian Cabinet # Information and Decision Support Center: # # http://www.timeanddate.com/news/time/egypt-dst-ends-2009.html # -# +# # The Middle East News Agency # # http://www.mena.org.eg/index.aspx # # also reports "Egypt starts winter time on August 21" -# today in article numbered "71, 11/08/2009 12:25 GMT." +# today in article numbered "71, 11/08/2009 12:25 GMT." # Only the title above is available without a subscription to their service, # and can be found by searching for "winter" in their search engine # (at least today). @@ -504,7 +504,7 @@ Zone Africa/Nouakchott -1:03:48 - LMT 1912 # From Steffen Thorsen (2008-06-25): # Mauritius plans to observe DST from 2008-11-01 to 2009-03-31 on a trial # basis.... -# It seems that Mauritius observed daylight saving time from 1982-10-10 to +# It seems that Mauritius observed daylight saving time from 1982-10-10 to # 1983-03-20 as well, but that was not successful.... # http://www.timeanddate.com/news/time/mauritius-daylight-saving-time.html @@ -528,12 +528,12 @@ Zone Africa/Nouakchott -1:03:48 - LMT 1912 # than previously announced (2008-11-01 to 2009-03-31). The new start # date is 2008-10-26 at 02:00 and the new end date is 2009-03-27 (no time # given, but it is probably at either 2 or 3 wall clock time). -# -# A little strange though, since the article says that they moved the date -# to align itself with Europe and USA which also change time on that date, -# but that means they have not paid attention to what happened in -# USA/Canada last year (DST ends first Sunday in November). I also wonder -# why that they end on a Friday, instead of aligning with Europe which +# +# A little strange though, since the article says that they moved the date +# to align itself with Europe and USA which also change time on that date, +# but that means they have not paid attention to what happened in +# USA/Canada last year (DST ends first Sunday in November). I also wonder +# why that they end on a Friday, instead of aligning with Europe which # changes two days later. # From Alex Krivenyshev (2008-07-11): @@ -592,7 +592,7 @@ Zone Africa/Nouakchott -1:03:48 - LMT 1912 # # From Arthur David Olson (2009-07-11): -# The "mauritius-dst-will-not-repeat" wrapup includes this: +# The "mauritius-dst-will-not-repeat" wrapup includes this: # "The trial ended on March 29, 2009, when the clocks moved back by one hour # at 2am (or 02:00) local time..." @@ -686,8 +686,8 @@ Zone Indian/Mayotte 3:00:56 - LMT 1911 Jul # Mamoutzou # XXX--guess that it is only Morocco for now; guess only 2008 for now. # From Steffen Thorsen (2008-08-27): -# Morocco will change the clocks back on the midnight between August 31 -# and September 1. They originally planned to observe DST to near the end +# Morocco will change the clocks back on the midnight between August 31 +# and September 1. They originally planned to observe DST to near the end # of September: # # One article about it (in French): @@ -821,6 +821,23 @@ Zone Indian/Mayotte 3:00:56 - LMT 1911 Jul # Mamoutzou # "...à partir du dernier dimance d'avril et non fins mars, # comme annoncé précédemment." +# From Milamber Space Network (2012-07-17): +# The official return to GMT is announced by the Moroccan government: +# +# http://www.mmsp.gov.ma/fr/actualites.aspx?id=288 [in French] +# +# +# Google translation, lightly edited: +# Back to the standard time of the Kingdom (GMT) +# Pursuant to Decree No. 2-12-126 issued on 26 Jumada (I) 1433 (April 18, +# 2012) and in accordance with the order of Mr. President of the +# Government No. 3-47-12 issued on 24 Sha'ban (11 July 2012), the Ministry +# of Public Service and Administration Modernization announces the return +# of the legal time of the Kingdom (GMT) from Friday, July 20, 2012 until +# Monday, August 20, 2012. So the time will be delayed by 60 minutes from +# 3:00 am Friday, July 20, 2012 and will again be advanced by 60 minutes +# August 20, 2012 from 2:00 am. + # RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Morocco 1939 only - Sep 12 0:00 1:00 S @@ -848,6 +865,8 @@ Rule Morocco 2011 only - Apr 3 0:00 1:00 S Rule Morocco 2011 only - Jul 31 0 0 - Rule Morocco 2012 max - Apr lastSun 2:00 1:00 S Rule Morocco 2012 max - Sep lastSun 3:00 0 - +Rule Morocco 2012 only - Jul 20 3:00 0 - +Rule Morocco 2012 only - Aug 20 2:00 1:00 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26 @@ -876,7 +895,7 @@ Zone Africa/Maputo 2:10:20 - LMT 1903 Mar # Forecasting Riaan van Zyl explained that the far eastern parts of # the country are close to 40 minutes earlier in sunrise than the rest # of the country. -# +# # From Paul Eggert (2007-03-31): # Apparently the Caprivi Strip informally observes Botswana time, but # we have no details. In the meantime people there can use Africa/Gaborone. diff --git a/jdk/make/sun/javazic/tzdata/asia b/jdk/make/sun/javazic/tzdata/asia index ccf7945c05e..9ef3ef8df54 100644 --- a/jdk/make/sun/javazic/tzdata/asia +++ b/jdk/make/sun/javazic/tzdata/asia @@ -124,7 +124,7 @@ Zone Asia/Kabul 4:36:48 - LMT 1890 # From Alexander Krivenyshev (2012-02-10): # According to News Armenia, on Feb 9, 2012, # http://newsarmenia.ru/society/20120209/42609695.html -# +# # The Armenia National Assembly adopted final reading of Amendments to the # Law "On procedure of calculation time on the territory of the Republic of # Armenia" according to which Armenia [is] abolishing Daylight Saving Time. @@ -204,15 +204,15 @@ Zone Asia/Bahrain 3:22:20 - LMT 1920 # Al Manamah # # From A. N. M. Kamrus Saadat (2009-06-15): -# Finally we've got the official mail regarding DST start time where DST start -# time is mentioned as Jun 19 2009, 23:00 from BTRC (Bangladesh -# Telecommunication Regulatory Commission). +# Finally we've got the official mail regarding DST start time where DST start +# time is mentioned as Jun 19 2009, 23:00 from BTRC (Bangladesh +# Telecommunication Regulatory Commission). # # No DST end date has been announced yet. # From Alexander Krivenyshev (2009-09-25): -# Bangladesh won't go back to Standard Time from October 1, 2009, -# instead it will continue DST measure till the cabinet makes a fresh decision. +# Bangladesh won't go back to Standard Time from October 1, 2009, +# instead it will continue DST measure till the cabinet makes a fresh decision. # # Following report by same newspaper-"The Daily Star Friday": # "DST change awaits cabinet decision-Clock won't go back by 1-hr from Oct 1" @@ -226,8 +226,8 @@ Zone Asia/Bahrain 3:22:20 - LMT 1920 # Al Manamah # From Steffen Thorsen (2009-10-13): # IANS (Indo-Asian News Service) now reports: -# Bangladesh has decided that the clock advanced by an hour to make -# maximum use of daylight hours as an energy saving measure would +# Bangladesh has decided that the clock advanced by an hour to make +# maximum use of daylight hours as an energy saving measure would # "continue for an indefinite period." # # One of many places where it is published: @@ -255,7 +255,7 @@ Zone Asia/Bahrain 3:22:20 - LMT 1920 # Al Manamah # From Alexander Krivenyshev (2010-03-22): # According to Bangladesh newspaper "The Daily Star," -# Cabinet cancels Daylight Saving Time +# Cabinet cancels Daylight Saving Time # # http://www.thedailystar.net/newDesign/latest_news.php?nid=22817 # @@ -383,11 +383,11 @@ Rule PRC 1987 1991 - Apr Sun>=10 0:00 1:00 D # observing daylight saving time in 1986. # # From Thomas S. Mullaney (2008-02-11): -# I think you're combining two subjects that need to treated -# separately: daylight savings (which, you're correct, wasn't -# implemented until the 1980s) and the unified time zone centered near -# Beijing (which was implemented in 1949). Briefly, there was also a -# "Lhasa Time" in Tibet and "Urumqi Time" in Xinjiang. The first was +# I think you're combining two subjects that need to treated +# separately: daylight savings (which, you're correct, wasn't +# implemented until the 1980s) and the unified time zone centered near +# Beijing (which was implemented in 1949). Briefly, there was also a +# "Lhasa Time" in Tibet and "Urumqi Time" in Xinjiang. The first was # ceased, and the second eventually recognized (again, in the 1980s). # # From Paul Eggert (2008-06-30): @@ -524,7 +524,7 @@ Zone Asia/Kashgar 5:03:56 - LMT 1928 # or Kashi or Kaxgar # as of 2009-10-28: # Year Period # 1941 1 Apr to 30 Sep -# 1942 Whole year +# 1942 Whole year # 1943 Whole year # 1944 Whole year # 1945 Whole year @@ -615,16 +615,16 @@ Zone Asia/Hong_Kong 7:36:36 - LMT 1904 Oct 30 # From Arthur David Olson (2010-04-07): # Here's Google's translation of the table at the bottom of the "summert.htm" page: # Decade Name Start and end date -# Republic of China 34 years to 40 years (AD 1945-1951 years) Summer Time May 1 to September 30 -# 41 years of the Republic of China (AD 1952) Daylight Saving Time March 1 to October 31 -# Republic of China 42 years to 43 years (AD 1953-1954 years) Daylight Saving Time April 1 to October 31 -# In the 44 years to 45 years (AD 1955-1956 years) Daylight Saving Time April 1 to September 30 -# Republic of China 46 years to 48 years (AD 1957-1959) Summer Time April 1 to September 30 -# Republic of China 49 years to 50 years (AD 1960-1961) Summer Time June 1 to September 30 -# Republic of China 51 years to 62 years (AD 1962-1973 years) Stop Summer Time -# Republic of China 63 years to 64 years (1974-1975 AD) Daylight Saving Time April 1 to September 30 -# Republic of China 65 years to 67 years (1976-1978 AD) Stop Daylight Saving Time -# Republic of China 68 years (AD 1979) Daylight Saving Time July 1 to September 30 +# Republic of China 34 years to 40 years (AD 1945-1951 years) Summer Time May 1 to September 30 +# 41 years of the Republic of China (AD 1952) Daylight Saving Time March 1 to October 31 +# Republic of China 42 years to 43 years (AD 1953-1954 years) Daylight Saving Time April 1 to October 31 +# In the 44 years to 45 years (AD 1955-1956 years) Daylight Saving Time April 1 to September 30 +# Republic of China 46 years to 48 years (AD 1957-1959) Summer Time April 1 to September 30 +# Republic of China 49 years to 50 years (AD 1960-1961) Summer Time June 1 to September 30 +# Republic of China 51 years to 62 years (AD 1962-1973 years) Stop Summer Time +# Republic of China 63 years to 64 years (1974-1975 AD) Daylight Saving Time April 1 to September 30 +# Republic of China 65 years to 67 years (1976-1978 AD) Stop Daylight Saving Time +# Republic of China 68 years (AD 1979) Daylight Saving Time July 1 to September 30 # Republic of China since 69 years (AD 1980) Stop Daylight Saving Time # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S @@ -1193,15 +1193,15 @@ Rule Zion 2004 only - Sep 22 1:00 0 S # # ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2005+beyond.ps -# From Paul Eggert (2005-02-22): +# From Paul Eggert (2012-10-26): # I used Ephraim Silverberg's dst-israel.el program # (2005-02-20) # along with Ed Reingold's cal-hebrew in GNU Emacs 21.4, -# to generate the transitions in this list. +# to generate the transitions from 2005 through 2012. # (I replaced "lastFri" with "Fri>=26" by hand.) -# The spring transitions below all correspond to the following Rule: +# The spring transitions all correspond to the following Rule: # -# Rule Zion 2005 max - Mar Fri>=26 2:00 1:00 D +# Rule Zion 2005 2012 - Mar Fri>=26 2:00 1:00 D # # but older zic implementations (e.g., Solaris 8) do not support # "Fri>=26" to mean April 1 in years like 2005, so for now we list the @@ -1218,39 +1218,36 @@ Rule Zion 2009 only - Sep 27 2:00 0 S Rule Zion 2010 only - Sep 12 2:00 0 S Rule Zion 2011 only - Apr 1 2:00 1:00 D Rule Zion 2011 only - Oct 2 2:00 0 S -Rule Zion 2012 2015 - Mar Fri>=26 2:00 1:00 D +Rule Zion 2012 only - Mar Fri>=26 2:00 1:00 D Rule Zion 2012 only - Sep 23 2:00 0 S -Rule Zion 2013 only - Sep 8 2:00 0 S -Rule Zion 2014 only - Sep 28 2:00 0 S -Rule Zion 2015 only - Sep 20 2:00 0 S -Rule Zion 2016 only - Apr 1 2:00 1:00 D -Rule Zion 2016 only - Oct 9 2:00 0 S -Rule Zion 2017 2021 - Mar Fri>=26 2:00 1:00 D -Rule Zion 2017 only - Sep 24 2:00 0 S -Rule Zion 2018 only - Sep 16 2:00 0 S -Rule Zion 2019 only - Oct 6 2:00 0 S -Rule Zion 2020 only - Sep 27 2:00 0 S -Rule Zion 2021 only - Sep 12 2:00 0 S -Rule Zion 2022 only - Apr 1 2:00 1:00 D -Rule Zion 2022 only - Oct 2 2:00 0 S -Rule Zion 2023 2032 - Mar Fri>=26 2:00 1:00 D -Rule Zion 2023 only - Sep 24 2:00 0 S -Rule Zion 2024 only - Oct 6 2:00 0 S -Rule Zion 2025 only - Sep 28 2:00 0 S -Rule Zion 2026 only - Sep 20 2:00 0 S -Rule Zion 2027 only - Oct 10 2:00 0 S -Rule Zion 2028 only - Sep 24 2:00 0 S -Rule Zion 2029 only - Sep 16 2:00 0 S -Rule Zion 2030 only - Oct 6 2:00 0 S -Rule Zion 2031 only - Sep 21 2:00 0 S -Rule Zion 2032 only - Sep 12 2:00 0 S -Rule Zion 2033 only - Apr 1 2:00 1:00 D -Rule Zion 2033 only - Oct 2 2:00 0 S -Rule Zion 2034 2037 - Mar Fri>=26 2:00 1:00 D -Rule Zion 2034 only - Sep 17 2:00 0 S -Rule Zion 2035 only - Oct 7 2:00 0 S -Rule Zion 2036 only - Sep 28 2:00 0 S -Rule Zion 2037 only - Sep 13 2:00 0 S + +# From Ephraim Silverberg (2012-10-18): + +# Yesterday, the Interior Ministry Committee, after more than a year +# past, approved sending the proposed June 2011 changes to the Time +# Decree Law back to the Knesset for second and third (final) votes +# before the upcoming elections on Jan. 22, 2013. Hence, although the +# changes are not yet law, they are expected to be so before February 2013. +# +# As of 2013, DST starts at 02:00 on the Friday before the last Sunday in March. +# DST ends at 02:00 on the first Sunday after October 1, unless it occurs on the +# second day of the Jewish Rosh Hashana holiday, in which case DST ends a day +# later (i.e. at 02:00 the first Monday after October 2). +# [Rosh Hashana holidays are factored in until 2100.] + +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Zion 2013 max - Mar Fri>=23 2:00 1:00 D +Rule Zion 2013 2026 - Oct Sun>=2 2:00 0 S +Rule Zion 2027 only - Oct Mon>=3 2:00 0 S +Rule Zion 2028 max - Oct Sun>=2 2:00 0 S +# The following rules are commented out for now, as they break older +# versions of zic that support only signed 32-bit timestamps, i.e., +# through 2038-01-19 03:14:07 UTC. +#Rule Zion 2028 2053 - Oct Sun>=2 2:00 0 S +#Rule Zion 2054 only - Oct Mon>=3 2:00 0 S +#Rule Zion 2055 2080 - Oct Sun>=2 2:00 0 S +#Rule Zion 2081 only - Oct Mon>=3 2:00 0 S +#Rule Zion 2082 max - Oct Sun>=2 2:00 0 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Jerusalem 2:20:56 - LMT 1880 @@ -1385,6 +1382,16 @@ Zone Asia/Tokyo 9:18:59 - LMT 1887 Dec 31 15:00u # From Arthur David Olson (2009-04-06): # We still have Jordan switching to DST on Thursdays in 2000 and 2001. +# From Steffen Thorsen (2012-10-25): +# Yesterday the government in Jordan announced that they will not +# switch back to standard time this winter, so the will stay on DST +# until about the same time next year (at least). +# http://www.petra.gov.jo/Public_News/Nws_NewsDetails.aspx?NewsID=88950 +# +# From Paul Eggert (2012-10-25): +# For now, assume this is just a one-year measure. If it becomes +# permanent, we should move Jordan from EET to AST effective tomorrow. + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Jordan 1973 only - Jun 6 0:00 1:00 S Rule Jordan 1973 1975 - Oct 1 0:00 0 - @@ -1413,7 +1420,8 @@ Rule Jordan 2002 max - Mar lastThu 24:00 1:00 S Rule Jordan 2003 only - Oct 24 0:00s 0 - Rule Jordan 2004 only - Oct 15 0:00s 0 - Rule Jordan 2005 only - Sep lastFri 0:00s 0 - -Rule Jordan 2006 max - Oct lastFri 0:00s 0 - +Rule Jordan 2006 2011 - Oct lastFri 0:00s 0 - +Rule Jordan 2013 max - Oct lastFri 0:00s 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Amman 2:23:44 - LMT 1931 2:00 Jordan EE%sT @@ -1858,15 +1866,15 @@ Zone Asia/Muscat 3:54:20 - LMT 1920 # shown 8 per cent higher consumption of electricity. # From Alex Krivenyshev (2008-05-15): -# -# Here is an article that Pakistan plan to introduce Daylight Saving Time +# +# Here is an article that Pakistan plan to introduce Daylight Saving Time # on June 1, 2008 for 3 months. -# -# "... The federal cabinet on Wednesday announced a new conservation plan to help -# reduce load shedding by approving the closure of commercial centres at 9pm and -# moving clocks forward by one hour for the next three months. +# +# "... The federal cabinet on Wednesday announced a new conservation plan to help +# reduce load shedding by approving the closure of commercial centres at 9pm and +# moving clocks forward by one hour for the next three months. # ...." -# +# # # http://www.worldtimezone.net/dst_news/dst_news_pakistan01.html # @@ -1926,7 +1934,7 @@ Zone Asia/Muscat 3:54:20 - LMT 1920 # Government has decided to restore the previous time by moving the # clocks backward by one hour from October 1. A formal announcement to # this effect will be made after the Prime Minister grants approval in -# this regard." +# this regard." # # http://www.thenews.com.pk/updates.asp?id=87168 # @@ -2222,7 +2230,7 @@ Zone Asia/Karachi 4:28:12 - LMT 1907 # # http://www.maannews.net/eng/ViewDetails.aspx?ID=306795 # -# the clocks were set back one hour at 2010-08-11 00:00:00 local time in +# the clocks were set back one hour at 2010-08-11 00:00:00 local time in # Gaza and the West Bank. # Some more background info: # @@ -2261,7 +2269,7 @@ Zone Asia/Karachi 4:28:12 - LMT 1907 # The rules for Egypt are stolen from the `africa' file. # From Steffen Thorsen (2011-09-30): -# West Bank did end Daylight Saving Time this morning/midnight (2011-09-30 +# West Bank did end Daylight Saving Time this morning/midnight (2011-09-30 # 00:00). # So West Bank and Gaza now have the same time again. # @@ -2316,6 +2324,8 @@ Rule Palestine 2010 only - Aug 11 0:00 0 - # From Arthur David Olson (2011-09-20): # 2011 transitions per http://www.timeanddate.com as of 2011-09-20. +# From Paul Eggert (2012-10-12): +# 2012 transitions per http://www.timeanddate.com as of 2012-10-12. # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Gaza 2:17:52 - LMT 1900 Oct @@ -2326,7 +2336,7 @@ Zone Asia/Gaza 2:17:52 - LMT 1900 Oct 2:00 Palestine EE%sT 2011 Apr 2 12:01 2:00 1:00 EEST 2011 Aug 1 2:00 - EET 2012 Mar 30 - 2:00 1:00 EEST 2012 Sep 28 + 2:00 1:00 EEST 2012 Sep 21 1:00 2:00 - EET Zone Asia/Hebron 2:20:23 - LMT 1900 Oct @@ -2341,7 +2351,7 @@ Zone Asia/Hebron 2:20:23 - LMT 1900 Oct 2:00 - EET 2011 Aug 30 2:00 1:00 EEST 2011 Sep 30 3:00 2:00 - EET 2012 Mar 30 - 2:00 1:00 EEST 2012 Sep 28 3:00 + 2:00 1:00 EEST 2012 Sep 21 1:00 2:00 - EET # Paracel Is @@ -2535,19 +2545,19 @@ Rule Syria 2007 only - Mar lastFri 0:00 1:00 S # having it between Wednesday and Thursday (two workdays in Syria) since the # weekend in Syria is not Saturday and Sunday, but Friday and Saturday. So now # it is implemented at midnight of the last workday before weekend... -# +# # From Steffen Thorsen (2007-10-27): # Jesper Norgaard Welen wrote: -# +# # > "Winter local time in Syria will be observed at midnight of Thursday 1 # > November 2007, and the clock will be put back 1 hour." -# +# # I found confirmation on this in this gov.sy-article (Arabic): # http://wehda.alwehda.gov.sy/_print_veiw.asp?FileName=12521710520070926111247 -# +# # which using Google's translate tools says: -# Council of Ministers also approved the commencement of work on -# identifying the winter time as of Friday, 2/11/2007 where the 60th +# Council of Ministers also approved the commencement of work on +# identifying the winter time as of Friday, 2/11/2007 where the 60th # minute delay at midnight Thursday 1/11/2007. Rule Syria 2007 only - Nov Fri>=1 0:00 0 - @@ -2613,8 +2623,8 @@ Rule Syria 2007 only - Nov Fri>=1 0:00 0 - # # From Steffen Thorsen (2009-10-27): -# The Syrian Arab News Network on 2009-09-29 reported that Syria will -# revert back to winter (standard) time on midnight between Thursday +# The Syrian Arab News Network on 2009-09-29 reported that Syria will +# revert back to winter (standard) time on midnight between Thursday # 2009-10-29 and Friday 2009-10-30: # # http://www.sana.sy/ara/2/2009/09/29/247012.htm (Arabic) diff --git a/jdk/make/sun/javazic/tzdata/australasia b/jdk/make/sun/javazic/tzdata/australasia index 3a63e2dd133..7f83448f3fb 100644 --- a/jdk/make/sun/javazic/tzdata/australasia +++ b/jdk/make/sun/javazic/tzdata/australasia @@ -306,9 +306,9 @@ Zone Indian/Cocos 6:27:40 - LMT 1900 # # From Alexander Krivenyshev (2010-10-24): -# According to Radio Fiji and Fiji Times online, Fiji will end DST 3 +# According to Radio Fiji and Fiji Times online, Fiji will end DST 3 # weeks earlier than expected - on March 6, 2011, not March 27, 2011... -# Here is confirmation from Government of the Republic of the Fiji Islands, +# Here is confirmation from Government of the Republic of the Fiji Islands, # Ministry of Information (fiji.gov.fj) web site: # # http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=2608:daylight-savings&catid=71:press-releases&Itemid=155 @@ -319,15 +319,15 @@ Zone Indian/Cocos 6:27:40 - LMT 1900 # # From Steffen Thorsen (2011-10-03): -# Now the dates have been confirmed, and at least our start date +# Now the dates have been confirmed, and at least our start date # assumption was correct (end date was one week wrong). # # # www.fiji.gov.fj/index.php?option=com_content&view=article&id=4966:daylight-saving-starts-in-fiji&catid=71:press-releases&Itemid=155 # # which says -# Members of the public are reminded to change their time to one hour in -# advance at 2am to 3am on October 23, 2011 and one hour back at 3am to +# Members of the public are reminded to change their time to one hour in +# advance at 2am to 3am on October 23, 2011 and one hour back at 3am to # 2am on February 26 next year. # From Ken Rylander (2011-10-24) @@ -344,15 +344,23 @@ Zone Indian/Cocos 6:27:40 - LMT 1900 # The commencement of daylight saving will remain unchanged and start # on the 23rd of October, 2011. +# From the Fiji Government Online Portal (2012-08-21) via Steffen Thorsen: +# The Minister for Labour, Industrial Relations and Employment Mr Jone Usamate +# today confirmed that Fiji will start daylight savings at 2 am on Sunday 21st +# October 2012 and end at 3 am on Sunday 20th January 2013. +# http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=6702&catid=71&Itemid=155 +# +# From Paul Eggert (2012-08-31): +# For now, guess a pattern of the penultimate Sundays in October and January. + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Fiji 1998 1999 - Nov Sun>=1 2:00 1:00 S Rule Fiji 1999 2000 - Feb lastSun 3:00 0 - Rule Fiji 2009 only - Nov 29 2:00 1:00 S Rule Fiji 2010 only - Mar lastSun 3:00 0 - -Rule Fiji 2010 only - Oct 24 2:00 1:00 S +Rule Fiji 2010 max - Oct Sun>=18 2:00 1:00 S Rule Fiji 2011 only - Mar Sun>=1 3:00 0 - -Rule Fiji 2011 only - Oct 23 2:00 1:00 S -Rule Fiji 2012 only - Jan 22 3:00 0 - +Rule Fiji 2012 max - Jan Sun>=18 3:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Pacific/Fiji 11:53:40 - LMT 1915 Oct 26 # Suva 12:00 Fiji FJ%sT # Fiji Time @@ -581,7 +589,7 @@ Zone Pacific/Pago_Pago 12:37:12 - LMT 1879 Jul 5 # From David Zuelke (2011-05-09): # Subject: Samoa to move timezone from east to west of international date line -# +# # # http://www.morningstar.co.uk/uk/markets/newsfeeditem.aspx?id=138501958347963 # @@ -643,6 +651,23 @@ Zone Pacific/Pago_Pago 12:37:12 - LMT 1879 Jul 5 # Although Samoa has used Daylight Saving Time in the 2010-2011 and 2011-2012 # seasons, there is not yet any indication that this trend will continue on # a regular basis. For now, we have explicitly listed the transitions below. +# +# From Nicky (2012-09-10): +# Daylight Saving Time commences on Sunday 30th September 2012 and +# ends on Sunday 7th of April 2013. +# +# Please find link below for more information. +# http://www.mcil.gov.ws/mcil_publications.html +# +# That publication also includes dates for Summer of 2013/4 as well +# which give the impression of a pattern in selecting dates for the +# future, so for now, we will guess this will continue. + +# Western Samoa +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule WS 2012 max - Sep lastSun 3:00 1 D +Rule WS 2012 max - Apr Sun>=1 4:00 0 - +# Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Pacific/Apia 12:33:04 - LMT 1879 Jul 5 -11:26:56 - LMT 1911 -11:30 - SAMT 1950 # Samoa Time @@ -650,8 +675,8 @@ Zone Pacific/Apia 12:33:04 - LMT 1879 Jul 5 -11:00 1:00 WSDT 2011 Apr 2 4:00 -11:00 - WST 2011 Sep 24 3:00 -11:00 1:00 WSDT 2011 Dec 30 - 13:00 1:00 WSDT 2012 Apr 1 4:00 - 13:00 - WST + 13:00 1:00 WSDT 2012 Apr Sun>=1 4:00 + 13:00 WS WS%sT # Solomon Is # excludes Bougainville, for which see Papua New Guinea @@ -663,25 +688,25 @@ Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct # Honiara # # From Gwillim Law (2011-12-29) # A correspondent informed me that Tokelau, like Samoa, will be skipping -# December 31 this year, thereby changing its time zone from UTC-10 to -# UTC+14. When I tried to verify this statement, I found a confirming -# article in Time magazine online -# -# (http://www.time.com/time/world/article/0,8599,2103243,00.html). -# +# December 31 this year ... # -# From Jonathan Leffler (2011-12-29) -# Information from the BBC to the same effect: -# -# http://www.bbc.co.uk/news/world-asia-16351377 -# +# From Steffen Thorsen (2012-07-25) +# ... we double checked by calling hotels and offices based in Tokelau asking +# about the time there, and they all told a time that agrees with UTC+13.... +# Shanks says UTC-10 from 1901 [but] ... there is a good chance the change +# actually was to UTC-11 back then. # -# Patch supplied by Tim Parenti (2011-12-29) +# From Paul Eggert (2012-07-25) +# A Google Books snippet of Appendix to the Journals of the House of +# Representatives of New Zealand, Session 1948, +# , page 65, says Tokelau +# was "11 hours slow on G.M.T." Go with Thorsen and assume Shanks & Pottenger +# are off by an hour starting in 1901. # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Pacific/Fakaofo -11:24:56 - LMT 1901 - -10:00 - TKT 2011 Dec 30 # Tokelau Time - 14:00 - TKT + -11:00 - TKT 2011 Dec 30 # Tokelau Time + 13:00 - TKT # Tonga # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S @@ -1362,22 +1387,22 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901 # See "southeast Australia" above for 2008 and later. # From Steffen Thorsen (2009-04-28): -# According to the official press release, South Australia's extended daylight -# saving period will continue with the same rules as used during the 2008-2009 +# According to the official press release, South Australia's extended daylight +# saving period will continue with the same rules as used during the 2008-2009 # summer (southern hemisphere). -# +# # From # # http://www.safework.sa.gov.au/uploaded_files/DaylightDatesSet.pdf # -# The extended daylight saving period that South Australia has been trialling +# The extended daylight saving period that South Australia has been trialling # for over the last year is now set to be ongoing. -# Daylight saving will continue to start on the first Sunday in October each +# Daylight saving will continue to start on the first Sunday in October each # year and finish on the first Sunday in April the following year. -# Industrial Relations Minister, Paul Caica, says this provides South Australia -# with a consistent half hour time difference with NSW, Victoria, Tasmania and +# Industrial Relations Minister, Paul Caica, says this provides South Australia +# with a consistent half hour time difference with NSW, Victoria, Tasmania and # the ACT for all 52 weeks of the year... -# +# # We have a wrap-up here: # # http://www.timeanddate.com/news/time/south-australia-extends-dst.html diff --git a/jdk/make/sun/javazic/tzdata/europe b/jdk/make/sun/javazic/tzdata/europe index 55714aa9a4c..9a0d0b9db94 100644 --- a/jdk/make/sun/javazic/tzdata/europe +++ b/jdk/make/sun/javazic/tzdata/europe @@ -597,12 +597,12 @@ Rule Russia 1996 2010 - Oct lastSun 2:00s 0 - # According to Kremlin press service, Russian President Dmitry Medvedev # signed a federal law "On calculation of time" on June 9, 2011. # According to the law Russia is abolishing daylight saving time. -# -# Medvedev signed a law "On the Calculation of Time" (in russian): +# +# Medvedev signed a law "On the Calculation of Time" (in russian): # # http://bmockbe.ru/events/?ID=7583 # -# +# # Medvedev signed a law on the calculation of the time (in russian): # # http://www.regnum.ru/news/polit/1413906.html @@ -1710,7 +1710,7 @@ Zone Europe/Malta 0:58:04 - LMT 1893 Nov 2 0:00s # Valletta # From Alexander Krivenyshev (2011-10-26) # NO need to divide Moldova into two timezones at this point. # As of today, Transnistria (Pridnestrovie)- Tiraspol reversed its own -# decision to abolish DST this winter. +# decision to abolish DST this winter. # Following Moldova and neighboring Ukraine- Transnistria (Pridnestrovie)- # Tiraspol will go back to winter time on October 30, 2011. # News from Moldova (in russian): @@ -2600,11 +2600,11 @@ Zone Europe/Zurich 0:34:08 - LMT 1848 Sep 12 # http://www.alomaliye.com/bkk_2002_3769.htm # From Gökdeniz Karadağ (2011-03-10): -# +# # According to the articles linked below, Turkey will change into summer # time zone (GMT+3) on March 28, 2011 at 3:00 a.m. instead of March 27. # This change is due to a nationwide exam on 27th. -# +# # # http://www.worldbulletin.net/?aType=haber&ArticleID=70872 # @@ -2721,7 +2721,7 @@ Link Europe/Istanbul Asia/Istanbul # Istanbul is in both continents. # time this year after all. # # From Udo Schwedt (2011-10-18): -# As far as I understand, the recent change to the Ukranian time zone +# As far as I understand, the recent change to the Ukranian time zone # (Europe/Kiev) to introduce permanent daylight saving time (similar # to Russia) was reverted today: # diff --git a/jdk/make/sun/javazic/tzdata/leapseconds b/jdk/make/sun/javazic/tzdata/leapseconds index f8902f7486d..ab6720ded58 100644 --- a/jdk/make/sun/javazic/tzdata/leapseconds +++ b/jdk/make/sun/javazic/tzdata/leapseconds @@ -100,8 +100,8 @@ Leap 2012 Jun 30 23:59:60 + S # # # A positive leap second will be introduced at the end of June 2012. -# The sequence of dates of the UTC second markers will be: -# +# The sequence of dates of the UTC second markers will be: +# # 2012 June 30, 23h 59m 59s # 2012 June 30, 23h 59m 60s # 2012 July 1, 0h 0m 0s @@ -118,6 +118,6 @@ Leap 2012 Jun 30 23:59:60 + S # # # Daniel GAMBIS -# Head +# Head # Earth Orientation Center of IERS # Observatoire de Paris, France diff --git a/jdk/make/sun/javazic/tzdata/northamerica b/jdk/make/sun/javazic/tzdata/northamerica index 2b94d0588f1..c3033267404 100644 --- a/jdk/make/sun/javazic/tzdata/northamerica +++ b/jdk/make/sun/javazic/tzdata/northamerica @@ -501,7 +501,7 @@ Zone America/Juneau 15:02:19 - LMT 1867 Oct 18 -8:00 US P%sT 1946 -8:00 - PST 1969 -8:00 US P%sT 1980 Apr 27 2:00 - -9:00 US Y%sT 1980 Oct 26 2:00 + -9:00 US Y%sT 1980 Oct 26 2:00 -8:00 US P%sT 1983 Oct 30 2:00 -9:00 US Y%sT 1983 Nov 30 -9:00 US AK%sT @@ -1866,7 +1866,7 @@ Zone America/Edmonton -7:33:52 - LMT 1906 Sep # Here is a summary of the three clock change events in Creston's history: # 1. 1884 or 1885: adoption of Mountain Standard Time (GMT-7) # Exact date unknown -# 2. Oct 1916: switch to Pacific Standard Time (GMT-8) +# 2. Oct 1916: switch to Pacific Standard Time (GMT-8) # Exact date in October unknown; Sunday October 1 is a reasonable guess. # 3. June 1918: switch to Pacific Daylight Time (GMT-7) # Exact date in June unknown; Sunday June 2 is a reasonable guess. @@ -2696,20 +2696,20 @@ Zone America/Costa_Rica -5:36:20 - LMT 1890 # San Jose # except that it switches at midnight standard time as usual. # # From Steffen Thorsen (2007-10-25): -# Carlos Alberto Fonseca Arauz informed me that Cuba will end DST one week +# Carlos Alberto Fonseca Arauz informed me that Cuba will end DST one week # earlier - on the last Sunday of October, just like in 2006. -# +# # He supplied these references: -# +# # http://www.prensalatina.com.mx/article.asp?ID=%7B4CC32C1B-A9F7-42FB-8A07-8631AFC923AF%7D&language=ES # http://actualidad.terra.es/sociedad/articulo/cuba_llama_ahorrar_energia_cambio_1957044.htm -# +# # From Alex Kryvenishev (2007-10-25): # Here is also article from Granma (Cuba): -# +# # [Regira] el Horario Normal desde el [proximo] domingo 28 de octubre # http://www.granma.cubaweb.cu/2007/10/24/nacional/artic07.html -# +# # http://www.worldtimezone.com/dst_news/dst_news_cuba03.html # From Arthur David Olson (2008-03-09): @@ -2793,7 +2793,7 @@ Zone America/Costa_Rica -5:36:20 - LMT 1890 # San Jose # # # From Steffen Thorsen (2011-10-30) -# Cuba will end DST two weeks later this year. Instead of going back +# Cuba will end DST two weeks later this year. Instead of going back # tonight, it has been delayed to 2011-11-13 at 01:00. # # One source (Spanish) @@ -2805,11 +2805,11 @@ Zone America/Costa_Rica -5:36:20 - LMT 1890 # San Jose # # http://www.timeanddate.com/news/time/cuba-time-changes-2011.html # -# +# # From Steffen Thorsen (2012-03-01) -# According to Radio Reloj, Cuba will start DST on Midnight between March +# According to Radio Reloj, Cuba will start DST on Midnight between March # 31 and April 1. -# +# # Radio Reloj has the following info (Spanish): # # http://www.radioreloj.cu/index.php/noticias-radio-reloj/71-miscelaneas/7529-cuba-aplicara-el-horario-de-verano-desde-el-1-de-abril @@ -2820,6 +2820,13 @@ Zone America/Costa_Rica -5:36:20 - LMT 1890 # San Jose # http://www.timeanddate.com/news/time/cuba-starts-dst-2012.html # +# From Steffen Thorsen (2012-11-03): +# Radio Reloj and many other sources report that Cuba is changing back +# to standard time on 2012-11-04: +# http://www.radioreloj.cu/index.php/noticias-radio-reloj/36-nacionales/9961-regira-horario-normal-en-cuba-desde-el-domingo-cuatro-de-noviembre +# From Paul Eggert (2012-11-03): +# For now, assume the future rule is first Sunday in November. + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Cuba 1928 only - Jun 10 0:00 1:00 D Rule Cuba 1928 only - Oct 10 0:00 0 S @@ -2857,7 +2864,7 @@ Rule Cuba 2009 2010 - Mar Sun>=8 0:00s 1:00 D Rule Cuba 2011 only - Mar Sun>=15 0:00s 1:00 D Rule Cuba 2011 only - Nov 13 0:00s 0 S Rule Cuba 2012 only - Apr 1 0:00s 1:00 D -Rule Cuba 2012 max - Oct lastSun 0:00s 0 S +Rule Cuba 2012 max - Nov Sun>=1 0:00s 0 S Rule Cuba 2013 max - Mar Sun>=8 0:00s 1:00 D # Zone NAME GMTOFF RULES FORMAT [UNTIL] diff --git a/jdk/make/sun/javazic/tzdata/southamerica b/jdk/make/sun/javazic/tzdata/southamerica index dd746f3cbeb..0d6797eab6b 100644 --- a/jdk/make/sun/javazic/tzdata/southamerica +++ b/jdk/make/sun/javazic/tzdata/southamerica @@ -254,7 +254,7 @@ Rule Arg 2000 only - Mar 3 0:00 0 - Rule Arg 2007 only - Dec 30 0:00 1:00 S Rule Arg 2008 2009 - Mar Sun>=15 0:00 0 - Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 S - + # From Mariano Absatz (2004-05-21): # Today it was officially published that the Province of Mendoza is changing # its timezone this winter... starting tomorrow night.... @@ -344,9 +344,9 @@ Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 S # confirms what Alex Krivenyshev has earlier sent to the tz # emailing list about that San Luis plans to return to standard # time much earlier than the rest of the country. It also -# confirms that upon request the provinces San Juan and Mendoza -# refused to follow San Luis in this change. -# +# confirms that upon request the provinces San Juan and Mendoza +# refused to follow San Luis in this change. +# # The change is supposed to take place Monday the 21.st at 0:00 # hours. As far as I understand it if this goes ahead, we need # a new timezone for San Luis (although there are also documented @@ -408,7 +408,7 @@ Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 S # # http://www.lanacion.com.ar/nota.asp?nota_id=1107912 # -# +# # The press release says: # (...) anunció que el próximo domingo a las 00:00 los puntanos deberán # atrasar una hora sus relojes. @@ -822,8 +822,8 @@ Zone America/La_Paz -4:32:36 - LMT 1890 # # From Alexander Krivenyshev (2011-10-04): # State Bahia will return to Daylight savings time this year after 8 years off. -# The announcement was made by Governor Jaques Wagner in an interview to a -# television station in Salvador. +# The announcement was made by Governor Jaques Wagner in an interview to a +# television station in Salvador. # In Portuguese: # @@ -852,6 +852,15 @@ Zone America/La_Paz -4:32:36 - LMT 1890 # http://www.in.gov.br/visualiza/index.jsp?data=13/10/2011&jornal=1000&pagina=6&totalArquivos=6 # +# From Kelley Cook (2012-10-16): +# The governor of state of Bahia in Brazil announced on Thursday that +# due to public pressure, he is reversing the DST policy they implemented +# last year and will not be going to Summer Time on October 21st.... +# http://www.correio24horas.com.br/r/artigo/apos-pressoes-wagner-suspende-horario-de-verao-na-bahia + +# From Rodrigo Severo (2012-10-16): +# Tocantins state will have DST. +# http://noticias.terra.com.br/brasil/noticias/0,,OI6232536-EI306.html # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # Decree 20,466 (1931-10-01) @@ -1071,7 +1080,8 @@ Zone America/Araguaina -3:12:48 - LMT 1914 -3:00 Brazil BR%sT 1990 Sep 17 -3:00 - BRT 1995 Sep 14 -3:00 Brazil BR%sT 2003 Sep 24 - -3:00 - BRT + -3:00 - BRT 2012 Oct 21 + -3:00 Brazil BR%sT # # Alagoas (AL), Sergipe (SE) Zone America/Maceio -2:22:52 - LMT 1914 @@ -1090,7 +1100,8 @@ Zone America/Maceio -2:22:52 - LMT 1914 Zone America/Bahia -2:34:04 - LMT 1914 -3:00 Brazil BR%sT 2003 Sep 24 -3:00 - BRT 2011 Oct 16 - -3:00 Brazil BR%sT + -3:00 Brazil BR%sT 2012 Oct 21 + -3:00 - BRT # # Goias (GO), Distrito Federal (DF), Minas Gerais (MG), # Espirito Santo (ES), Rio de Janeiro (RJ), Sao Paulo (SP), Parana (PR), @@ -1182,7 +1193,7 @@ Zone America/Rio_Branco -4:31:12 - LMT 1914 # Due to drought, Chile extends Daylight Time in three weeks. This # is one-time change (Saturday 3/29 at 24:00 for America/Santiago # and Saturday 3/29 at 22:00 for Pacific/Easter) -# The Supreme Decree is located at +# The Supreme Decree is located at # # http://www.shoa.cl/servicios/supremo316.pdf # @@ -1193,7 +1204,7 @@ Zone America/Rio_Branco -4:31:12 - LMT 1914 # From Jose Miguel Garrido (2008-03-05): # ... -# You could see the announces of the change on +# You could see the announces of the change on # # http://www.shoa.cl/noticias/2008/04hora/hora.htm # . diff --git a/jdk/makefiles/GendataTimeZone.gmk b/jdk/makefiles/GendataTimeZone.gmk index 37520ceb377..dcca735b8f5 100644 --- a/jdk/makefiles/GendataTimeZone.gmk +++ b/jdk/makefiles/GendataTimeZone.gmk @@ -26,7 +26,7 @@ GENDATA_TIMEZONE := # TODO: read from make/sun/javazic/tzdata/VERSION -GENDATA_TIMEZONE_VERSION := tzdata2012c +GENDATA_TIMEZONE_VERSION := tzdata2012i GENDATA_TIMEZONE_DST := $(JDK_OUTPUTDIR)/lib/zi GENDATA_TIMEZONE_TMP := $(JDK_OUTPUTDIR)/gendata_timezone From f0ceb65207a78c926b7dfd7e7db1de251a9a9e73 Mon Sep 17 00:00:00 2001 From: Andrew John Hughes Date: Wed, 7 Nov 2012 16:07:54 -0500 Subject: [PATCH 198/241] 8003120: ResourceManager.getApplicationResources() does not close InputStreams Add finally blocks to close the InputStream instances Reviewed-by: lancea --- .../sun/naming/internal/ResourceManager.java | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java b/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java index de0c1108304..7443fbcf71a 100644 --- a/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java +++ b/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java @@ -542,14 +542,26 @@ public final class ResourceManager { try { NamingEnumeration resources = helper.getResources(cl, APP_RESOURCE_FILE_NAME); - while (resources.hasMore()) { - Properties props = new Properties(); - props.load(resources.next()); + try { + while (resources.hasMore()) { + Properties props = new Properties(); + InputStream istream = resources.next(); + try { + props.load(istream); + } finally { + istream.close(); + } - if (result == null) { - result = props; - } else { - mergeTables(result, props); + if (result == null) { + result = props; + } else { + mergeTables(result, props); + } + } + } finally { + while (resources.hasMore()) { + InputStream istream = (InputStream)resources.next(); + istream.close(); } } @@ -557,13 +569,17 @@ public final class ResourceManager { InputStream istream = helper.getJavaHomeLibStream(JRELIB_PROPERTY_FILE_NAME); if (istream != null) { - Properties props = new Properties(); - props.load(istream); + try { + Properties props = new Properties(); + props.load(istream); - if (result == null) { - result = props; - } else { - mergeTables(result, props); + if (result == null) { + result = props; + } else { + mergeTables(result, props); + } + } finally { + istream.close(); } } From bb434e94b4c2978c510258bb9ed09b92f6944700 Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Wed, 7 Nov 2012 15:08:28 -0800 Subject: [PATCH 199/241] 8001205: Calendar.getDisplayName(...): Returns null when provider is SPI but there is no SPI implementation 8001562: Collator.getAvailableLocales() doesn't return all locales for which localized instances are available Reviewed-by: okutsu --- .../provider/JRELocaleProviderAdapter.java | 3 - .../provider/LocaleServiceProviderPool.java | 22 ++-- jdk/test/java/util/Locale/Bug8001562.java | 112 ++++++++++++++++++ .../BreakIteratorProviderTest.java | 5 +- .../PluggableLocale/CollatorProviderTest.java | 5 +- .../DateFormatProviderTest.java | 13 ++ .../DateFormatSymbolsProviderTest.java | 5 +- .../DecimalFormatSymbolsProviderTest.java | 5 +- .../util/PluggableLocale/GenericTest.java | 1 - .../NumberFormatProviderTest.java | 5 +- 10 files changed, 150 insertions(+), 26 deletions(-) create mode 100644 jdk/test/java/util/Locale/Bug8001562.java diff --git a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java index 346cba08ac0..e6b3d9e1e32 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java @@ -329,9 +329,6 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { tagset.add(token); } - // ensure en-US is there (mandated by the spec, e.g. Collator.getAvailableLocales()) - tagset.add("en-US"); - return tagset; } diff --git a/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java b/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java index 2683b7dd62b..3a60061776d 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java +++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java @@ -26,6 +26,7 @@ package sun.util.locale.provider; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.IllformedLocaleException; @@ -177,7 +178,7 @@ public final class LocaleServiceProviderPool { for (Class c : spiClasses) { LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(c); - all.addAll(pool.getAvailableLocaleList()); + all.addAll(pool.getAvailableLocaleSet()); } allAvailableLocales = all.toArray(new Locale[0]); @@ -207,13 +208,23 @@ public final class LocaleServiceProviderPool { * @return an array of the available locales */ public Locale[] getAvailableLocales() { - Set locList = getAvailableLocaleList(); + Set locList = new HashSet<>(); + locList.addAll(getAvailableLocaleSet()); + // Make sure it all contains JRE's locales for compatibility. + locList.addAll(Arrays.asList(LocaleProviderAdapter.forJRE().getAvailableLocales())); Locale[] tmp = new Locale[locList.size()]; locList.toArray(tmp); return tmp; } - private synchronized Set getAvailableLocaleList() { + /** + * Returns the union of locale sets that are available from + * each service provider. This method does NOT return the + * defensive copy. + * + * @return a set of available locales + */ + private synchronized Set getAvailableLocaleSet() { if (availableLocales == null) { availableLocales = new HashSet<>(); for (LocaleServiceProvider lsp : providers.values()) { @@ -222,9 +233,6 @@ public final class LocaleServiceProviderPool { availableLocales.add(getLookupLocale(locale)); } } - - // Remove Locale.ROOT for the compatibility. - availableLocales.remove(Locale.ROOT); } return availableLocales; @@ -295,7 +303,7 @@ public final class LocaleServiceProviderPool { List lookupLocales = getLookupLocales(locale); - Set available = getAvailableLocaleList(); + Set available = getAvailableLocaleSet(); for (Locale current : lookupLocales) { if (available.contains(current)) { S providersObj; diff --git a/jdk/test/java/util/Locale/Bug8001562.java b/jdk/test/java/util/Locale/Bug8001562.java new file mode 100644 index 00000000000..1ff1b50c6a2 --- /dev/null +++ b/jdk/test/java/util/Locale/Bug8001562.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8001562 + * @summary Verify that getAvailableLocales() in locale sensitive services + * classes return compatible set of locales as in JDK7. + * @run main Bug8001562 + */ + +import java.text.*; +import java.util.*; + +public class Bug8001562 { + + static final String[] jdk7availTags = { + "ar", "ar-AE", "ar-BH", "ar-DZ", "ar-EG", "ar-IQ", "ar-JO", "ar-KW", + "ar-LB", "ar-LY", "ar-MA", "ar-OM", "ar-QA", "ar-SA", "ar-SD", "ar-SY", + "ar-TN", "ar-YE", "be", "be-BY", "bg", "bg-BG", "ca", "ca-ES", "cs", + "cs-CZ", "da", "da-DK", "de", "de-AT", "de-CH", "de-DE", "de-LU", "el", + "el-CY", "el-GR", "en", "en-AU", "en-CA", "en-GB", "en-IE", "en-IN", + "en-MT", "en-NZ", "en-PH", "en-SG", "en-US", "en-ZA", "es", "es-AR", + "es-BO", "es-CL", "es-CO", "es-CR", "es-DO", "es-EC", "es-ES", "es-GT", + "es-HN", "es-MX", "es-NI", "es-PA", "es-PE", "es-PR", "es-PY", "es-SV", + "es-US", "es-UY", "es-VE", "et", "et-EE", "fi", "fi-FI", "fr", "fr-BE", + "fr-CA", "fr-CH", "fr-FR", "fr-LU", "ga", "ga-IE", "he", "he-IL", + "hi-IN", "hr", "hr-HR", "hu", "hu-HU", "id", "id-ID", "is", "is-IS", + "it", "it-CH", "it-IT", "ja", "ja-JP", + "ja-JP-u-ca-japanese-x-lvariant-JP", "ko", "ko-KR", "lt", "lt-LT", "lv", + "lv-LV", "mk", "mk-MK", "ms", "ms-MY", "mt", "mt-MT", "nl", "nl-BE", + "nl-NL", "no", "no-NO", "no-NO-x-lvariant-NY", "pl", "pl-PL", "pt", + "pt-BR", "pt-PT", "ro", "ro-RO", "ru", "ru-RU", "sk", "sk-SK", "sl", + "sl-SI", "sq", "sq-AL", "sr", "sr-BA", "sr-CS", "sr-Latn", "sr-Latn-BA", + "sr-Latn-ME", "sr-Latn-RS", "sr-ME", "sr-RS", "sv", "sv-SE", "th", + "th-TH", "th-TH-u-nu-thai-x-lvariant-TH", "tr", "tr-TR", "uk", "uk-UA", + "vi", "vi-VN", "zh", "zh-CN", "zh-HK", "zh-SG", "zh-TW", }; + static List jdk7availLocs = new ArrayList<>(); + static { + for (String locStr : jdk7availTags) { + jdk7availLocs.add(Locale.forLanguageTag(locStr)); + } + } + + public static void main(String[] args) { + List avail = Arrays.asList(BreakIterator.getAvailableLocales()); + diffLocale(BreakIterator.class, avail); + + avail = Arrays.asList(Collator.getAvailableLocales()); + diffLocale(Collator.class, avail); + + avail = Arrays.asList(DateFormat.getAvailableLocales()); + diffLocale(DateFormat.class, avail); + + avail = Arrays.asList(DateFormatSymbols.getAvailableLocales()); + diffLocale(DateFormatSymbols.class, avail); + + avail = Arrays.asList(DecimalFormatSymbols.getAvailableLocales()); + diffLocale(DecimalFormatSymbols.class, avail); + + avail = Arrays.asList(NumberFormat.getAvailableLocales()); + diffLocale(NumberFormat.class, avail); + + avail = Arrays.asList(Locale.getAvailableLocales()); + diffLocale(Locale.class, avail); + } + + static void diffLocale(Class c, List locs) { + String diff = ""; + + System.out.printf("Only in target locales (%s.getAvailableLocales()): ", c.getSimpleName()); + for (Locale l : locs) { + if (!jdk7availLocs.contains(l)) { + diff += "\""+l.toLanguageTag()+"\", "; + } + } + System.out.println(diff); + diff = ""; + + System.out.printf("Only in JDK7 (%s.getAvailableLocales()): ", c.getSimpleName()); + for (Locale l : jdk7availLocs) { + if (!locs.contains(l)) { + diff += "\""+l.toLanguageTag()+"\", "; + } + } + System.out.println(diff); + + if (diff.length() > 0) { + throw new RuntimeException("Above locale(s) were not included in the target available locales"); + } + } +} diff --git a/jdk/test/java/util/PluggableLocale/BreakIteratorProviderTest.java b/jdk/test/java/util/PluggableLocale/BreakIteratorProviderTest.java index 2afd2631062..160f9fbcb4f 100644 --- a/jdk/test/java/util/PluggableLocale/BreakIteratorProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/BreakIteratorProviderTest.java @@ -53,9 +53,8 @@ public class BreakIteratorProviderTest extends ProviderTest { } void availableLocalesTest() { - Set localesFromAPI = new HashSet(availloc); - Set localesExpected = new HashSet(jreimplloc); - localesExpected.remove(Locale.ROOT); + Set localesFromAPI = new HashSet<>(availloc); + Set localesExpected = new HashSet<>(jreloc); localesExpected.addAll(providerloc); if (localesFromAPI.equals(localesExpected)) { System.out.println("availableLocalesTest passed."); diff --git a/jdk/test/java/util/PluggableLocale/CollatorProviderTest.java b/jdk/test/java/util/PluggableLocale/CollatorProviderTest.java index 234bdb15b91..718f1658ec3 100644 --- a/jdk/test/java/util/PluggableLocale/CollatorProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/CollatorProviderTest.java @@ -47,9 +47,8 @@ public class CollatorProviderTest extends ProviderTest { } void availableLocalesTest() { - Set localesFromAPI = new HashSet(availloc); - Set localesExpected = new HashSet(jreimplloc); - localesExpected.remove(Locale.ROOT); + Set localesFromAPI = new HashSet<>(availloc); + Set localesExpected = new HashSet<>(jreloc); localesExpected.addAll(providerloc); if (localesFromAPI.equals(localesExpected)) { System.out.println("availableLocalesTest passed."); diff --git a/jdk/test/java/util/PluggableLocale/DateFormatProviderTest.java b/jdk/test/java/util/PluggableLocale/DateFormatProviderTest.java index e17f8fe0134..d49b25b6acb 100644 --- a/jdk/test/java/util/PluggableLocale/DateFormatProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/DateFormatProviderTest.java @@ -34,6 +34,7 @@ public class DateFormatProviderTest extends ProviderTest { com.foo.DateFormatProviderImpl dfp = new com.foo.DateFormatProviderImpl(); List availloc = Arrays.asList(DateFormat.getAvailableLocales()); List providerloc = Arrays.asList(dfp.getAvailableLocales()); + List jreloc = Arrays.asList(LocaleProviderAdapter.forJRE().getAvailableLocales()); List jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getDateFormatProvider().getAvailableLocales()); public static void main(String[] s) { @@ -41,11 +42,23 @@ public class DateFormatProviderTest extends ProviderTest { } DateFormatProviderTest() { + availableLocalesTest(); objectValidityTest(); extendedVariantTest(); messageFormatTest(); } + void availableLocalesTest() { + Set localesFromAPI = new HashSet<>(availloc); + Set localesExpected = new HashSet<>(jreloc); + localesExpected.addAll(providerloc); + if (localesFromAPI.equals(localesExpected)) { + System.out.println("availableLocalesTest passed."); + } else { + throw new RuntimeException("availableLocalesTest failed"); + } + } + void objectValidityTest() { for (Locale target: availloc) { diff --git a/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java b/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java index 44d537b25ca..ef07f7e3f75 100644 --- a/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java @@ -48,9 +48,8 @@ public class DateFormatSymbolsProviderTest extends ProviderTest { } void availableLocalesTest() { - Set localesFromAPI = new HashSet(availloc); - Set localesExpected = new HashSet(jreimplloc); - localesExpected.remove(Locale.ROOT); + Set localesFromAPI = new HashSet<>(availloc); + Set localesExpected = new HashSet<>(jreloc); localesExpected.addAll(providerloc); if (localesFromAPI.equals(localesExpected)) { System.out.println("availableLocalesTest passed."); diff --git a/jdk/test/java/util/PluggableLocale/DecimalFormatSymbolsProviderTest.java b/jdk/test/java/util/PluggableLocale/DecimalFormatSymbolsProviderTest.java index 1249760c715..7d25542d650 100644 --- a/jdk/test/java/util/PluggableLocale/DecimalFormatSymbolsProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/DecimalFormatSymbolsProviderTest.java @@ -47,9 +47,8 @@ public class DecimalFormatSymbolsProviderTest extends ProviderTest { } void availableLocalesTest() { - Set localesFromAPI = new HashSet(availloc); - Set localesExpected = new HashSet(jreimplloc); - localesExpected.remove(Locale.ROOT); + Set localesFromAPI = new HashSet<>(availloc); + Set localesExpected = new HashSet<>(jreloc); localesExpected.addAll(providerloc); if (localesFromAPI.equals(localesExpected)) { System.out.println("availableLocalesTest passed."); diff --git a/jdk/test/java/util/PluggableLocale/GenericTest.java b/jdk/test/java/util/PluggableLocale/GenericTest.java index 288d7a3ab04..29a49fb3f26 100644 --- a/jdk/test/java/util/PluggableLocale/GenericTest.java +++ b/jdk/test/java/util/PluggableLocale/GenericTest.java @@ -73,7 +73,6 @@ public class GenericTest { expected.addAll(Arrays.asList(localeNP.getAvailableLocales())); expected.addAll(Arrays.asList(tzNP.getAvailableLocales())); expected.addAll(Arrays.asList(calDataP.getAvailableLocales())); - expected.remove(Locale.ROOT); if (!result.equals(expected)) { throw new RuntimeException("Locale.getAvailableLocales() does not return the union of locales: diff=" + getDiff(result, expected)); diff --git a/jdk/test/java/util/PluggableLocale/NumberFormatProviderTest.java b/jdk/test/java/util/PluggableLocale/NumberFormatProviderTest.java index 6c1efd9423a..13f63fd70d5 100644 --- a/jdk/test/java/util/PluggableLocale/NumberFormatProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/NumberFormatProviderTest.java @@ -50,9 +50,8 @@ public class NumberFormatProviderTest extends ProviderTest { } void availableLocalesTest() { - Set localesFromAPI = new HashSet(availloc); - Set localesExpected = new HashSet(jreimplloc); - localesExpected.remove(Locale.ROOT); + Set localesFromAPI = new HashSet<>(availloc); + Set localesExpected = new HashSet<>(jreloc); localesExpected.addAll(providerloc); if (localesFromAPI.equals(localesExpected)) { System.out.println("availableLocalesTest passed."); From eb055bba92f53c9a2a53f1c4cbb66259b53f9c38 Mon Sep 17 00:00:00 2001 From: Sonali Goel Date: Wed, 7 Nov 2012 17:01:19 -0800 Subject: [PATCH 200/241] 8002157: Write combo compiler tests for repeating annotations for JDK8 Reviewed-by: darcy, jjg --- .../combo/BasicSyntaxCombo.java | 209 ++++++++++++++++++ .../combo/DeprecatedAnnoCombo.java | 155 +++++++++++++ .../combo/DocumentedAnnoCombo.java | 127 +++++++++++ .../repeatingAnnotations/combo/Helper.java | 154 +++++++++++++ .../combo/InheritedAnnoCombo.java | 128 +++++++++++ .../combo/RetentionAnnoCombo.java | 201 +++++++++++++++++ 6 files changed, 974 insertions(+) create mode 100644 langtools/test/tools/javac/annotations/repeatingAnnotations/combo/BasicSyntaxCombo.java create mode 100644 langtools/test/tools/javac/annotations/repeatingAnnotations/combo/DeprecatedAnnoCombo.java create mode 100644 langtools/test/tools/javac/annotations/repeatingAnnotations/combo/DocumentedAnnoCombo.java create mode 100644 langtools/test/tools/javac/annotations/repeatingAnnotations/combo/Helper.java create mode 100644 langtools/test/tools/javac/annotations/repeatingAnnotations/combo/InheritedAnnoCombo.java create mode 100644 langtools/test/tools/javac/annotations/repeatingAnnotations/combo/RetentionAnnoCombo.java diff --git a/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/BasicSyntaxCombo.java b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/BasicSyntaxCombo.java new file mode 100644 index 00000000000..802f631f5b1 --- /dev/null +++ b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/BasicSyntaxCombo.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8002157 + * @author sogoel + * @summary Basic Syntax test for repeating annotations on all elements + * @build Helper + * @compile BasicSyntaxCombo.java + * @run main BasicSyntaxCombo + */ + + +import java.util.Arrays; +import javax.tools.DiagnosticCollector; +import javax.tools.JavaFileObject; +import javax.tools.Diagnostic; + +/* + * Generate test src for element kinds with repeating annotations. + * The test uses Helper.java to get the template to create test src and + * compile the test src. + * The test passes if valid test src compile as expected and + * and invalid test src fail as expected. + */ + +public class BasicSyntaxCombo extends Helper{ + static int errors = 0; + static boolean exitMode = false; + static String TESTPKG = "testpkg"; + static String srcContent = ""; + static String pkgInfoContent = ""; + + static { + // If EXIT_ON_FAIL is set, the combo test will exit at the first error + String exitOnFail = System.getenv("EXIT_ON_FAIL"); + if (exitOnFail == null || exitOnFail == "" ) { + exitMode = false; + } + else { + if (exitOnFail.equalsIgnoreCase("YES") || + exitOnFail.equalsIgnoreCase("Y") || + exitOnFail.equalsIgnoreCase("TRUE") || + exitOnFail.equalsIgnoreCase("T")) { + exitMode = true; + } + } + } + + enum TestElem { + ANNOTATION_TYPE(true), + PACKAGE(true), + CONSTRUCTOR(true), + FIELD(true), + LOCAL_VARIABLE(true), + METHOD(true), + TYPE(true), + PARAMETER(true), + INNER_CLASS(true), + STATIC_INI(false), + INSTANCE_INI(false); + + TestElem(boolean compile) { + this.compile = compile; + } + + boolean compile; + boolean shouldCompile() { + return compile; + } + } + + public static void main(String[] args) throws Exception { + new BasicSyntaxCombo().runTest(); + } + + public void runTest() throws Exception { + boolean result = false; + Iterable files = null; + int testCtr = 0; + for (TestElem type : TestElem.values()) { + testCtr++; + String className = "BasicCombo_"+type; + files = getFileList(className, type); + + boolean shouldCompile = type.shouldCompile(); + result = getCompileResult(className, shouldCompile,files); + + if (shouldCompile && !result) { + error(className + " did not compile as expected", srcContent); + if(!pkgInfoContent.isEmpty()) { + System.out.println("package-info.java contents: " + pkgInfoContent); + } + } + + if (!shouldCompile && !result) { + error(className + " compiled unexpectedly", srcContent); + if(!pkgInfoContent.isEmpty()) { + System.out.println("package-info.java contents: " + pkgInfoContent); + } + } + } + + System.out.println("Total number of tests run: " + testCtr); + System.out.println("Total number of errors: " + errors); + + if (errors > 0) + throw new Exception(errors + " errors found"); + } + + private boolean getCompileResult(String className, boolean shouldCompile, + Iterable files) throws Exception { + + DiagnosticCollector diagnostics = + new DiagnosticCollector(); + boolean ok = Helper.compileCode(diagnostics,files); + if (!shouldCompile && !ok) { + checkErrorKeys(className, diagnostics); + } + return (shouldCompile == ok); + } + + private void checkErrorKeys ( + String className, DiagnosticCollector diagnostics) throws Exception { + String expectedErrKey = "compiler.err.illegal.start.of.type"; + for (Diagnostic d : diagnostics.getDiagnostics()) { + if ((d.getKind() == Diagnostic.Kind.ERROR) && + d.getCode().contains(expectedErrKey)) { + break; // Found the expected error + } else { + error("Incorrect error key, expected = " + + expectedErrKey + ", Actual = " + d.getCode() + + " for className = " + className, srcContent); + } + } + } + + private Iterable getFileList(String className, + TestElem type ) { + + String template = Helper.template; + String replaceStr = "/*"+type+"*/"; + StringBuilder annoData = new StringBuilder(); + annoData.append(Helper.ContentVars.IMPORTCONTAINERSTMTS.getVal()) + .append(Helper.ContentVars.CONTAINERFOR.getVal()) + .append(Helper.ContentVars.CONTAINER.getVal()) + .append(Helper.ContentVars.CONTAINEDBY.getVal()) + .append(Helper.ContentVars.BASE.getVal()); + + JavaFileObject pkgInfoFile = null; + + if (type.equals("PACKAGE")) { + srcContent = template.replace(replaceStr, "package testpkg;") + .replace("#ClassName", className); + + String pkgInfoName = TESTPKG+"."+"package-info"; + pkgInfoContent = Helper.ContentVars.REPEATABLEANNO.getVal() + + "package " + TESTPKG + ";" + + annoData; + pkgInfoFile = getFile(pkgInfoName, pkgInfoContent); + } else { + template = template.replace(replaceStr, Helper.ContentVars.REPEATABLEANNO.getVal()) + .replace("#ClassName", className); + srcContent = annoData + template; + } + + JavaFileObject srcFile = getFile(className, srcContent); + + Iterable files = null; + if (pkgInfoFile != null) { + files = Arrays.asList(pkgInfoFile,srcFile); + } + else { + files = Arrays.asList(srcFile); + } + return files; + } + + private void error(String msg, String... contents) throws Exception { + System.out.println("error: " + msg); + errors++; + if (contents.length == 1) { + System.out.println("Contents = " + contents[0]); + } + // Test exits as soon as it gets a failure + if (exitMode) throw new Exception(); + } +} diff --git a/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/DeprecatedAnnoCombo.java b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/DeprecatedAnnoCombo.java new file mode 100644 index 00000000000..ba4e1652a03 --- /dev/null +++ b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/DeprecatedAnnoCombo.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8002157 + * @author sogoel + * @summary Combo test to check for usage of Deprecated + * @build Helper + * @compile DeprecatedAnnoCombo.java + * @run main DeprecatedAnnoCombo + */ + +import java.util.List; +import javax.tools.Diagnostic; +import javax.tools.DiagnosticCollector; +import javax.tools.JavaFileObject; + +/* + * Generate test src for use of @Deprecated on base anno + * or container anno or on both. In all cases, test src should compile and a + * warning should be generated. Repeating annotations used only on class for + * these generated test src. + */ + +public class DeprecatedAnnoCombo extends Helper { + static int errors = 0; + + enum TestCases { + DeprecatedonBoth, + DeprecatedonContainer, + DeprecatedonBase; + } + + public static void main(String[] args) throws Exception { + new DeprecatedAnnoCombo().runTest(); + } + + public void runTest() throws Exception { + boolean ok = false; + int testCtr = 0; + + for (TestCases clName : TestCases.values()) { + testCtr++; + + // Create test source content + String contents = getContent(clName.toString()); + + // Compile the generated source file + DiagnosticCollector diagnostics = + new DiagnosticCollector(); + ok = compileCode(clName.toString(), contents, diagnostics); + + String errorKey1 = "compiler.note.deprecated.filename"; + String errorKey2 = "compiler.note.deprecated.recompile"; + List> diags = diagnostics.getDiagnostics(); + + //Check for deprecated warnings + if (ok) { + if (diags.size() == 0) { + error("Did not get any warnings for @Deprecated usage"); + } else { + for (Diagnostic d : diags) { + if (d.getKind() == Diagnostic.Kind.NOTE) { + if (d.getCode().contains(errorKey1) + || d.getCode().contains(errorKey2)) { + System.out.println("TestCase =" + clName + " passed as expected"); + } else { + error("TestCase =" + clName + " did not give correct warnings" + + "Expected warning keys: " + + "errorKey1 = " + errorKey1 + + "errorKey2 = " + errorKey2 + + "actualErrorKey = " + d.getCode(), contents); + } + } else { + error("Diagnostic Kind is incorrect, expected = " + + Diagnostic.Kind.NOTE + "actual = " + d.getKind(), contents); + } + } + } + } else { + error("TestCase =" + clName + " did not compile as expected", contents); + } + } + + System.out.println("Total number of tests run: " + testCtr); + System.out.println("Total number of errors: " + errors); + if (errors > 0) + throw new Exception(errors + " errors found"); + } + + private String getContent(String className) { + StringBuilder annoData = new StringBuilder(); + + switch(className) { + case "DeprecatedonBoth": + annoData.append(Helper.ContentVars.DEPRECATED.getVal()) + .append(Helper.ContentVars.CONTAINERFOR.getVal()) + .append(Helper.ContentVars.CONTAINER.getVal()) + .append(Helper.ContentVars.DEPRECATED.getVal()) + .append(Helper.ContentVars.CONTAINEDBY.getVal()) + .append(Helper.ContentVars.BASE.getVal()); + break; + case "DeprecatedonBase": + annoData.append(Helper.ContentVars.CONTAINERFOR.getVal()) + .append(Helper.ContentVars.CONTAINER.getVal()) + .append(Helper.ContentVars.DEPRECATED.getVal()) + .append(Helper.ContentVars.CONTAINEDBY.getVal()) + .append(Helper.ContentVars.BASE.getVal()); + break; + case "DeprecatedonContainer": + annoData.append(Helper.ContentVars.DEPRECATED.getVal()) + .append(Helper.ContentVars.CONTAINERFOR.getVal()) + .append(Helper.ContentVars.CONTAINER.getVal()) + .append(Helper.ContentVars.CONTAINEDBY.getVal()) + .append(Helper.ContentVars.BASE.getVal()); + break; + } + + String contents = Helper.ContentVars.IMPORTCONTAINERSTMTS.getVal() + + Helper.ContentVars.IMPORTDEPRECATED.getVal() + + annoData + + Helper.ContentVars.REPEATABLEANNO.getVal() + + "\nclass "+ className + "{}"; + return contents; + } + + private void error(String msg, String... contents) { + System.out.println("error: " + msg); + errors++; + if (contents.length == 1) { + System.out.println("Contents = " + contents[0]); + } + } +} diff --git a/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/DocumentedAnnoCombo.java b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/DocumentedAnnoCombo.java new file mode 100644 index 00000000000..dbe38afd768 --- /dev/null +++ b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/DocumentedAnnoCombo.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8002157 + * @author sogoel + * @summary Positive combo test for use of Documented on baseAnno/containerAnno + * @build Helper + * @compile DocumentedAnnoCombo.java + * @run main DocumentedAnnoCombo + */ + +import javax.tools.DiagnosticCollector; +import javax.tools.JavaFileObject; + +/* + * Generate valid test src for the use of @Documented on container anno + * or on both base anno and container anno. Both test src should compile. + * Repeating annotations used only on class for these generated test src. + */ +public class DocumentedAnnoCombo extends Helper { + static int errors = 0; + + enum TestCases { + DocumentedonBothAnno(true), + DocumentedonContainer(true); + + TestCases(boolean compile) { + this.compile = compile; + } + + boolean compile; + boolean shouldCompile() { + return compile; + } + } + + public static void main(String[] args) throws Exception { + new DocumentedAnnoCombo().runTest(); + } + + public void runTest() throws Exception { + boolean ok = false; + int testCtr = 0; + + // Create test source content + for (TestCases className : TestCases.values()) { + testCtr++; + String contents = getContent(className.toString()); + + // Compile the generated source file + DiagnosticCollector diagnostics = + new DiagnosticCollector(); + ok = compileCode(className.toString(), contents, diagnostics); + if (!ok) { + error("Class="+ className +" did not compile as expected", contents); + } else { + System.out.println("Test passed for className: " + className); + } + } + + System.out.println("Total number of tests run: " + testCtr); + System.out.println("Total number of errors: " + errors); + + if (errors > 0) + throw new Exception(errors + " errors found"); + } + + private String getContent(String className) { + + StringBuilder annoData = new StringBuilder(); + switch(className) { + case "DocumentedonBothAnno": + annoData.append(Helper.ContentVars.DOCUMENTED.getVal()) + .append(Helper.ContentVars.CONTAINERFOR.getVal()) + .append(Helper.ContentVars.CONTAINER.getVal()) + .append(Helper.ContentVars.DOCUMENTED.getVal()) + .append(Helper.ContentVars.CONTAINEDBY.getVal()) + .append(Helper.ContentVars.BASE.getVal()); + break; + case "DocumentedonContainer": + annoData.append(Helper.ContentVars.DOCUMENTED.getVal()) + .append(Helper.ContentVars.CONTAINERFOR.getVal()) + .append(Helper.ContentVars.CONTAINER.getVal()) + .append(Helper.ContentVars.CONTAINEDBY.getVal()) + .append(Helper.ContentVars.BASE.getVal()); + break; + } + + String contents = Helper.ContentVars.IMPORTCONTAINERSTMTS.getVal() + + Helper.ContentVars.IMPORTDOCUMENTED.getVal() + + annoData + + Helper.ContentVars.REPEATABLEANNO.getVal() + + "\nclass "+ className + "{}"; + return contents; + } + + private void error(String msg, String... contents) { + System.out.println("error: " + msg); + errors++; + if (contents.length == 1) { + System.out.println("Contents = " + contents[0]); + } + } +} + diff --git a/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/Helper.java b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/Helper.java new file mode 100644 index 00000000000..653c2f5ce0a --- /dev/null +++ b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/Helper.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Arrays; +import javax.tools.DiagnosticCollector; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; +import javax.tools.ToolProvider; +import javax.tools.JavaCompiler.CompilationTask; + +public class Helper { + + enum ContentVars { + IMPORTCONTAINERSTMTS("\nimport java.lang.annotation.ContainedBy;\n" + + "\nimport java.lang.annotation.ContainerFor;\n"), + IMPORTDEPRECATED("import java.lang.Deprecated;\n"), + IMPORTDOCUMENTED("import java.lang.annotation.Documented;\n"), + IMPORTINHERITED("import java.lang.annotation.Inherited;\n"), + IMPORTRETENTION("import java.lang.annotation.Retention;\n" + + "\nimport java.lang.annotation.RetentionPolicy;\n"), + CONTAINEDBY("\n@ContainedBy(FooContainer.class)\n"), + CONTAINERFOR("@ContainerFor(Foo.class)\n"), + CONTAINER("@interface FooContainer {\n" +" Foo[] value();\n}\n"), + BASE("@interface Foo {}\n"), + REPEATABLEANNO("\n@Foo() @Foo()"), + DEPRECATED("\n@Deprecated"), + DOCUMENTED("\n@Documented"), + INHERITED("\n@Inherited"), + RETENTION("@Retention(RetentionPolicy.#VAL)\n"); + + private String val; + + + private ContentVars(String val) { + this.val = val; + } + + public String getVal() { + return val; + } + } + + /* String template where /**/ /*gets replaced by repeating anno + * Used to generate test src for combo tests + * - BasicSyntaxCombo.java + * - TargetAnnoCombo.java + */ + public static final String template = + "/*PACKAGE*/\n" + + "//pkg test;\n\n" + + "/*TYPE*/ //class\n" + + "class #ClassName {\n" + + " /*FIELD*/ //instance var\n" + + " public int x = 0;\n\n" + + " /*FIELD*/ //Enum constants\n" + + " TestEnum testEnum;\n\n" + + " /*FIELD*/ // Static field\n" + + " public static int num;\n\n" + + " /*STATIC_INI*/\n" + + " static { \n" + "num = 10; \n }\n\n" + + " /*CONSTRUCTOR*/\n" + + " #ClassName() {}\n\n" + + " /*INSTANCE_INI*/\n" + + " { \n x = 10; \n }" + + " /*INNER_CLASS*/\n" + + " class innerClass {}\n" + + " /*METHOD*/\n" + + " void bar(/*PARAMETER*/ int baz) {\n" + + " /*LOCAL_VARIABLE*/\n" + + " int y = 0;\n" + + " }\n" + + "}\n\n" + + "/*TYPE*/ //Enum\n" + + "enum TestEnum {}\n\n" + + "/*TYPE*/ //Interface\n" + + "interface TestInterface {}\n\n" + + "/*TYPE*/\n" + + "/*ANNOTATION_TYPE*/\n" + + "@interface TestAnnotationType{}\n"; + + // Create and compile FileObject using values for className and contents + public static boolean compileCode(String className, String contents, + DiagnosticCollector diagnostics) { + boolean ok = false; + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + if (compiler == null) { + throw new RuntimeException("can't get javax.tools.JavaCompiler!"); + } + + JavaFileObject file = getFile(className, contents); + Iterable compilationUnit = Arrays.asList(file); + + CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, compilationUnit); + ok = task.call(); + return ok; + + } + + // Compile a list of FileObjects + public static boolean compileCode(DiagnosticCollector diagnostics, Iterable files) { + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + if (compiler == null) { + throw new RuntimeException("can't get javax.tools.JavaCompiler!"); + } + + CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, files); + boolean ok = task.call(); + return ok; + } + + static JavaFileObject getFile(String name, String code) { + JavaFileObject o = null; + try { + o = new JavaStringFileObject(name, code); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + return o; + } + static class JavaStringFileObject extends SimpleJavaFileObject { + final String theCode; + public JavaStringFileObject(String fileName, String theCode) throws URISyntaxException { + super(new URI("string:///" + fileName.replace('.','/') + ".java"), Kind.SOURCE); + this.theCode = theCode; + } + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return theCode; + } + } +} diff --git a/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/InheritedAnnoCombo.java b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/InheritedAnnoCombo.java new file mode 100644 index 00000000000..b0b019f065d --- /dev/null +++ b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/InheritedAnnoCombo.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8002157 + * @author sogoel + * @summary Positive combo test for use of Inherited on baseAnno/containerAnno + * @build Helper + * @compile InheritedAnnoCombo.java + * @run main InheritedAnnoCombo + */ + +import javax.tools.DiagnosticCollector; +import javax.tools.JavaFileObject; + +/* + * Generate valid test src for the use of @Inherited on container anno + * or on both base anno and container anno. Both test src should compile. + * Repeating annotations used only on class for these generated test src. + */ + +public class InheritedAnnoCombo extends Helper { + static int errors = 0; + enum TestCases { + InheritedonBothAnno(true), + InheritedonBase(true); + + TestCases(boolean compile) { + this.compile = compile; + } + + boolean compile; + boolean shouldCompile() { + return compile; + } + } + + public static void main(String[] args) throws Exception { + new InheritedAnnoCombo().runTest(); + } + + public void runTest() throws Exception { + int testCtr = 0; + boolean ok = false; + + // Create test source content + for (TestCases className : TestCases.values()) { + testCtr++; + String contents = getContent(className.toString()); + + // Compile the generated code + DiagnosticCollector diagnostics = + new DiagnosticCollector(); + ok = compileCode(className.toString(), contents, diagnostics); + + if (!ok) { + error("Class="+ className +" did not compile as expected", contents); + } else { + System.out.println("Test passed for className: " + className); + } + } + + System.out.println("Total number of tests run: " + testCtr); + System.out.println("Total number of errors: " + errors); + + if (errors > 0) + throw new Exception(errors + " errors found"); + } + + private String getContent(String className) { + + StringBuilder annoData = new StringBuilder(); + switch(className) { + case "InheritedonBothAnno": + annoData.append(Helper.ContentVars.INHERITED.getVal()) + .append(Helper.ContentVars.CONTAINERFOR.getVal()) + .append(Helper.ContentVars.CONTAINER.getVal()) + .append(Helper.ContentVars.INHERITED.getVal()) + .append(Helper.ContentVars.CONTAINEDBY.getVal()) + .append(Helper.ContentVars.BASE.getVal()); + break; + case "InheritedonBase": + annoData.append(Helper.ContentVars.INHERITED.getVal()) + .append(Helper.ContentVars.CONTAINERFOR.getVal()) + .append(Helper.ContentVars.CONTAINER.getVal()) + .append(Helper.ContentVars.CONTAINEDBY.getVal()) + .append(Helper.ContentVars.BASE.getVal()); + break; + } + + String contents = Helper.ContentVars.IMPORTCONTAINERSTMTS.getVal() + + Helper.ContentVars.IMPORTINHERITED.getVal() + + annoData + + Helper.ContentVars.REPEATABLEANNO.getVal() + + "\nclass "+ className + "{}"; + return contents; + } + + private void error(String msg, String... contents) { + System.out.println("error: " + msg); + errors++; + if (contents.length == 1) { + System.out.println("Contents = " + contents[0]); + } + } +} + diff --git a/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/RetentionAnnoCombo.java b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/RetentionAnnoCombo.java new file mode 100644 index 00000000000..99c5c5eb0ce --- /dev/null +++ b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/RetentionAnnoCombo.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8002157 + * @author sogoel + * @summary Combo test for all possible combinations for Retention Values + * @build Helper + * @compile RetentionAnnoCombo.java + * @run main RetentionAnnoCombo + */ + +import java.util.HashMap; +import java.util.Map; + +import javax.tools.DiagnosticCollector; +import javax.tools.JavaFileObject; +import javax.tools.Diagnostic; + +/* + * Generate all combinations for the use of @Retention on base anno or container + * anno or both. The test passes if valid test src compile as expected and + * and invalid test src fail as expected. + * Repeating annotations used only on class for these generated test src. + */ + +public class RetentionAnnoCombo extends Helper { + static int errors = 0; + static boolean exitMode = false; + static { + String exitOnFail = System.getenv("EXIT_ON_FAIL"); + if (exitOnFail == null || exitOnFail == "" ) { + exitMode = false; + } + else { + if (exitOnFail.equalsIgnoreCase("YES") || + exitOnFail.equalsIgnoreCase("Y") || + exitOnFail.equalsIgnoreCase("TRUE") || + exitOnFail.equalsIgnoreCase("T")) { + exitMode = true; + } + } + } + + public static void main(String args[]) throws Exception { + new RetentionAnnoCombo().runTest(); + } + + public void runTest() throws Exception { + + /* 4x4 matrix for Retention values SOURCE, DEFAULT, CLASS, RUNTIME + * i -> Retention value on ContainerAnno + * j -> Retention value on BaseAnno + * 1 -> retention value combo should compile + */ + int[][] retention = { {1, 0, 0, 0}, + {1, 1, 1, 0}, + {1, 1, 1, 0}, + {1, 1, 1, 1} }; + + Map retMap = setRetentionValMatrix(); + String contents = ""; + boolean result = false; + int testCtr = 0; + for (int i = 0; i < 4 ; i ++) { + for (int j = 0; j < 4; j++ ) { + testCtr++; + String className = "RetentionTest_"+i+"_"+j; + contents = getContent(className, retMap, i, j); + if (retention[i][j] == 1) { + // Code generated should compile + result = getCompileResult(contents,className, true); + if (!result) { + error("FAIL: " + className + " did not compile as expected!", contents); + } + } else { + result = getCompileResult(contents,className, false); + if (!result) { + error("FAIL: " + className + " compiled unexpectedly!", contents); + } + } + if (result) { + System.out.println("Test passed for className = " + className); + } + } + } + + System.out.println("Total number of tests run: " + testCtr); + System.out.println("Total number of errors: " + errors); + + if (errors > 0) + throw new Exception(errors + " errors found"); + } + + private boolean getCompileResult(String contents, String className, + boolean shouldCompile) throws Exception{ + + DiagnosticCollector diagnostics = + new DiagnosticCollector(); + boolean ok = compileCode(className, contents, diagnostics); + + String expectedErrKey = "compiler.err.invalid.containedby" + + ".annotation.retention"; + if (!shouldCompile && !ok) { + for (Diagnostic d : diagnostics.getDiagnostics()) { + if (!((d.getKind() == Diagnostic.Kind.ERROR) && + d.getCode().contains(expectedErrKey))) { + error("FAIL: Incorrect error given, expected = " + + expectedErrKey + ", Actual = " + d.getCode() + + " for className = " + className, contents); + } + } + } + + return (shouldCompile == ok); + } + + private Map setRetentionValMatrix() { + HashMap hm = new HashMap<>(); + hm.put(0,"SOURCE"); + hm.put(1,"DEFAULT"); + hm.put(2,"CLASS"); + hm.put(3,"RUNTIME"); + return hm; + } + + private String getContent(String className, Map retMap, + int i, int j) { + + String retContainerVal = retMap.get(i).toString(); + String retBaseVal = retMap.get(j).toString(); + String replacedRetBaseVal = "", replacedRetCAVal = ""; + String retention = Helper.ContentVars.RETENTION.getVal(); + + // @Retention is available as default for both base and container anno + if (retContainerVal.equalsIgnoreCase("DEFAULT") + && retBaseVal.equalsIgnoreCase("DEFAULT")) { + replacedRetBaseVal = ""; + replacedRetCAVal = ""; + // @Retention is available as default for container anno + } else if (retContainerVal.equalsIgnoreCase("DEFAULT")) { + replacedRetBaseVal = retention.replace("#VAL", retBaseVal); + replacedRetCAVal = ""; + // @Retention is available as default for base anno + } else if (retBaseVal.equalsIgnoreCase("DEFAULT")) { + replacedRetBaseVal = ""; + replacedRetCAVal = retention.replace("#VAL", retContainerVal); + // @Retention is not available as default for both base and container anno + } else { + replacedRetBaseVal = retention.replace("#VAL", retBaseVal); + replacedRetCAVal = retention.replace("#VAL", retContainerVal); + } + + StringBuilder annoData = new StringBuilder(); + annoData.append(Helper.ContentVars.IMPORTCONTAINERSTMTS.getVal()) + .append(Helper.ContentVars.IMPORTRETENTION.getVal()) + .append(Helper.ContentVars.CONTAINERFOR.getVal()) + .append(replacedRetCAVal) + .append(Helper.ContentVars.CONTAINER.getVal()) + .append(Helper.ContentVars.CONTAINEDBY.getVal()) + .append(replacedRetBaseVal) + .append(Helper.ContentVars.BASE.getVal()); + + String contents = annoData + + Helper.ContentVars.REPEATABLEANNO.getVal() + + "\nclass "+ className + "{}"; + return contents; + } + + private void error(String msg,String... contents) throws Exception { + System.out.println("error: " + msg); + errors++; + if (contents.length == 1) { + System.out.println("Contents = " + contents[0]); + } + // Test exits as soon as it gets a failure + if (exitMode) throw new Exception(); + } +} + From 18b3a4951e321b1b29753fca2fa88c78c6aecf1e Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Wed, 7 Nov 2012 17:20:12 -0800 Subject: [PATCH 201/241] 8003134: CheckResourceKeys issues Reviewed-by: jjh, bpatel --- .../tools/doclets/formats/html/resources/standard.properties | 2 -- langtools/test/tools/javac/diags/CheckResourceKeys.java | 5 ++--- langtools/test/tools/javadoc/CheckResourceKeys.java | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) 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 23e9442811b..9dedf79fc52 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 @@ -91,9 +91,7 @@ doclet.Subclasses=Direct Known Subclasses: doclet.Subinterfaces=All Known Subinterfaces: doclet.Implementing_Classes=All Known Implementing Classes: doclet.also=also -doclet.FRAMES=FRAMES doclet.Frames=Frames -doclet.NO_FRAMES=NO FRAMES doclet.No_Frames=No Frames doclet.Package_Hierarchies=Package Hierarchies: doclet.Hierarchy_For_Package=Hierarchy For Package {0} diff --git a/langtools/test/tools/javac/diags/CheckResourceKeys.java b/langtools/test/tools/javac/diags/CheckResourceKeys.java index a34d32a0a30..4c10b1a9878 100644 --- a/langtools/test/tools/javac/diags/CheckResourceKeys.java +++ b/langtools/test/tools/javac/diags/CheckResourceKeys.java @@ -310,9 +310,8 @@ public class CheckResourceKeys { pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) { String name = fo.getName(); // ignore resource files, and files which are not really part of javac - if (name.matches(".*resources.[A-Za-z_0-9]+\\.class") - || name.endsWith("Launcher.class") - || name.endsWith("CreateSymbols.class")) + if (name.matches(".*resources.[A-Za-z_0-9]+\\.class.*") + || name.matches(".*CreateSymbols\\.class.*")) continue; scan(fo, results); } diff --git a/langtools/test/tools/javadoc/CheckResourceKeys.java b/langtools/test/tools/javadoc/CheckResourceKeys.java index 9b1512de8f3..45f3b13fd0f 100644 --- a/langtools/test/tools/javadoc/CheckResourceKeys.java +++ b/langtools/test/tools/javadoc/CheckResourceKeys.java @@ -151,7 +151,7 @@ public class CheckResourceKeys { pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) { String name = fo.getName(); // ignore resource files - if (name.matches(".*resources.[A-Za-z_0-9]+\\.class")) + if (name.matches(".*resources.[A-Za-z_0-9]+\\.class.*")) continue; scan(fo, results); } From dc77a5a2c949039b8c34a2312859bde3a70cb8c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Borggr=C3=A9n-Franck?= Date: Wed, 7 Nov 2012 17:39:34 -0800 Subject: [PATCH 202/241] 8001598: Augment ElementType enum for JSR 308 Reviewed-by: darcy --- .../java/lang/annotation/ElementType.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/jdk/src/share/classes/java/lang/annotation/ElementType.java b/jdk/src/share/classes/java/lang/annotation/ElementType.java index 917054991dd..a1125ffe117 100644 --- a/jdk/src/share/classes/java/lang/annotation/ElementType.java +++ b/jdk/src/share/classes/java/lang/annotation/ElementType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,7 @@ public enum ElementType { /** Method declaration */ METHOD, - /** Parameter declaration */ + /** Formal parameter declaration */ PARAMETER, /** Constructor declaration */ @@ -59,5 +59,19 @@ public enum ElementType { ANNOTATION_TYPE, /** Package declaration */ - PACKAGE + PACKAGE, + + /** + * Type parameter declaration + * + * @since 1.8 + */ + TYPE_PARAMETER, + + /** + * Use of a type + * + * @since 1.8 + */ + TYPE_USE } From f95e6bbe59e7501ace506b3efa24fbd89d9293d7 Mon Sep 17 00:00:00 2001 From: David Holmes Date: Wed, 7 Nov 2012 23:12:45 -0500 Subject: [PATCH 203/241] 8002040: Allow Full Debug Symbols when cross-compiling Reviewed-by: dcubed, erikj, tbell --- jdk/make/common/Defs-linux.gmk | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/jdk/make/common/Defs-linux.gmk b/jdk/make/common/Defs-linux.gmk index a0bfc3cc8d3..73921082728 100644 --- a/jdk/make/common/Defs-linux.gmk +++ b/jdk/make/common/Defs-linux.gmk @@ -111,21 +111,18 @@ _JUNK_ := $(shell \ # since objcopy is optional, we set ZIP_DEBUGINFO_FILES later ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) - # Default OBJCOPY comes from GNU Binutils on Linux: - DEF_OBJCOPY=/usr/bin/objcopy - ifdef CROSS_COMPILE_ARCH - # don't try to generate .debuginfo files when cross compiling - _JUNK_ := $(shell \ - echo >&2 "INFO: cross compiling for ARCH $(CROSS_COMPILE_ARCH)," \ - "skipping .debuginfo generation.") - OBJCOPY= + ifndef CROSS_COMPILE_ARCH + # Default OBJCOPY comes from GNU Binutils on Linux: + DEF_OBJCOPY=/usr/bin/objcopy else - OBJCOPY=$(shell test -x $(DEF_OBJCOPY) && echo $(DEF_OBJCOPY)) - ifneq ($(ALT_OBJCOPY),) - _JUNK_ := $(shell echo >&2 "INFO: ALT_OBJCOPY=$(ALT_OBJCOPY)") - # disable .debuginfo support by setting ALT_OBJCOPY to a non-existent path - OBJCOPY=$(shell test -x $(ALT_OBJCOPY) && echo $(ALT_OBJCOPY)) - endif + # Assume objcopy is part of the cross-compilation toolkit + DEF_OBJCOPY=$(COMPILER_PATH)/objcopy + endif + OBJCOPY=$(shell test -x $(DEF_OBJCOPY) && echo $(DEF_OBJCOPY)) + ifneq ($(ALT_OBJCOPY),) + _JUNK_ := $(shell echo >&2 "INFO: ALT_OBJCOPY=$(ALT_OBJCOPY)") + # disable .debuginfo support by setting ALT_OBJCOPY to a non-existent path + OBJCOPY=$(shell test -x $(ALT_OBJCOPY) && echo $(ALT_OBJCOPY)) endif # Setting ENABLE_FULL_DEBUG_SYMBOLS=1 (and OBJCOPY) above enables the @@ -137,7 +134,7 @@ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ifeq ($(OBJCOPY),) _JUNK_ := $(shell \ - echo >&2 "INFO: no objcopy cmd found so cannot create .debuginfo files.") + echo >&2 "INFO: no objcopy cmd found so cannot create .debuginfo files. You may need to set ALT_OBJCOPY.") ENABLE_FULL_DEBUG_SYMBOLS=0 else _JUNK_ := $(shell \ From 5d67e2bbb1f52a7510db61322aee768e5e120fa1 Mon Sep 17 00:00:00 2001 From: Roger Riggs Date: Wed, 7 Nov 2012 20:50:09 -0800 Subject: [PATCH 204/241] 6282196: There should be Math.mod(number, modulo) methods Added the requested methods Reviewed-by: darcy, emcmanus, alanb --- jdk/src/share/classes/java/lang/Math.java | 160 +++++++ .../share/classes/java/lang/StrictMath.java | 119 +++++- jdk/test/java/lang/Math/DivModTests.java | 395 ++++++++++++++++++ 3 files changed, 665 insertions(+), 9 deletions(-) create mode 100644 jdk/test/java/lang/Math/DivModTests.java diff --git a/jdk/src/share/classes/java/lang/Math.java b/jdk/src/share/classes/java/lang/Math.java index 7f4ab4fcaf4..b8cef07b131 100644 --- a/jdk/src/share/classes/java/lang/Math.java +++ b/jdk/src/share/classes/java/lang/Math.java @@ -742,6 +742,7 @@ public final class Math { * @param y the second value * @return the result * @throws ArithmeticException if the result overflows an int + * @since 1.8 */ public static int addExact(int x, int y) { int r = x + y; @@ -760,6 +761,7 @@ public final class Math { * @param y the second value * @return the result * @throws ArithmeticException if the result overflows a long + * @since 1.8 */ public static long addExact(long x, long y) { long r = x + y; @@ -778,6 +780,7 @@ public final class Math { * @param y the second value to subtract from the first * @return the result * @throws ArithmeticException if the result overflows an int + * @since 1.8 */ public static int subtractExact(int x, int y) { int r = x - y; @@ -797,6 +800,7 @@ public final class Math { * @param y the second value to subtract from the first * @return the result * @throws ArithmeticException if the result overflows a long + * @since 1.8 */ public static long subtractExact(long x, long y) { long r = x - y; @@ -816,6 +820,7 @@ public final class Math { * @param y the second value * @return the result * @throws ArithmeticException if the result overflows an int + * @since 1.8 */ public static int multiplyExact(int x, int y) { long r = (long)x * (long)y; @@ -833,6 +838,7 @@ public final class Math { * @param y the second value * @return the result * @throws ArithmeticException if the result overflows a long + * @since 1.8 */ public static long multiplyExact(long x, long y) { long r = x * y; @@ -857,6 +863,7 @@ public final class Math { * @param value the long value * @return the argument as an int * @throws ArithmeticException if the {@code argument} overflows an int + * @since 1.8 */ public static int toIntExact(long value) { if ((int)value != value) { @@ -865,6 +872,159 @@ public final class Math { return (int)value; } + /** + * Returns the largest (closest to positive infinity) + * {@code int} value that is less than or equal to the algebraic quotient. + * There is one special case, if the dividend is the + * {@linkplain Integer#MIN_VALUE Integer.MIN_VALUE} and the divisor is {@code -1}, + * then integer overflow occurs and + * the result is equal to the {@code Integer.MIN_VALUE}. + *

    + * Normal integer division operates under the round to zero rounding mode + * (truncation). This operation instead acts under the round toward + * negative infinity (floor) rounding mode. + * The floor rounding mode gives different results than truncation + * when the exact result is negative. + *

      + *
    • If the signs of the arguments are the same, the results of + * {@code floorDiv} and the {@code /} operator are the same.
      + * For example, {@code floorDiv(4, 3) == 1} and {@code (4 / 3) == 1}.
    • + *
    • If the signs of the arguments are different, the quotient is negative and + * {@code floorDiv} returns the integer less than or equal to the quotient + * and the {@code /} operator returns the integer closest to zero.
      + * For example, {@code floorDiv(-4, 3) == -2}, + * whereas {@code (-4 / 3) == -1}. + *
    • + *
    + *

    + * + * @param x the dividend + * @param y the divisor + * @return the largest (closest to positive infinity) + * {@code int} value that is less than or equal to the algebraic quotient. + * @throws ArithmeticException if the divisor {@code y} is zero + * @see #floorMod(int, int) + * @see #floor(double) + * @since 1.8 + */ + public static int floorDiv(int x, int y) { + int r = x / y; + // if the signs are different and modulo not zero, round down + if ((x ^ y) < 0 && (r * y != x)) { + r--; + } + return r; + } + + /** + * Returns the largest (closest to positive infinity) + * {@code long} value that is less than or equal to the algebraic quotient. + * There is one special case, if the dividend is the + * {@linkplain Long#MIN_VALUE Long.MIN_VALUE} and the divisor is {@code -1}, + * then integer overflow occurs and + * the result is equal to the {@code Long.MIN_VALUE}. + *

    + * Normal integer division operates under the round to zero rounding mode + * (truncation). This operation instead acts under the round toward + * negative infinity (floor) rounding mode. + * The floor rounding mode gives different results than truncation + * when the exact result is negative. + *

    + * For examples, see {@link #floorDiv(int, int)}. + * + * @param x the dividend + * @param y the divisor + * @return the largest (closest to positive infinity) + * {@code long} value that is less than or equal to the algebraic quotient. + * @throws ArithmeticException if the divisor {@code y} is zero + * @see #floorMod(long, long) + * @see #floor(double) + * @since 1.8 + */ + public static long floorDiv(long x, long y) { + long r = x / y; + // if the signs are different and modulo not zero, round down + if ((x ^ y) < 0 && (r * y != x)) { + r--; + } + return r; + } + + /** + * Returns the floor modulus of the {@code int} arguments. + *

    + * The floor modulus is {@code x - (floorDiv(x, y) * y)}, + * has the same sign as the divisor {@code y}, and + * is in the range of {@code -abs(y) < r < +abs(y)}. + * + *

    + * The relationship between {@code floorDiv} and {@code floorMod} is such that: + *

      + *
    • {@code floorDiv(x, y) * y + floorMod(x, y) == x} + *
    + *

    + * The difference in values between {@code floorMod} and + * the {@code %} operator is due to the difference between + * {@code floorDiv} that returns the integer less than or equal to the quotient + * and the {@code /} operator that returns the integer closest to zero. + *

    + * Examples: + *

      + *
    • If the signs of the arguments are the same, the results + * of {@code floorMod} and the {@code %} operator are the same.
      + *
        + *
      • {@code floorMod(4, 3) == 1};   and {@code (4 % 3) == 1}
      • + *
      + *
    • If the signs of the arguments are different, the results differ from the {@code %} operator.
      + *
        + *
      • {@code floorMod(+4, -3) == -2};   and {@code (+4 % -3) == +1}
      • + *
      • {@code floorMod(-4, +3) == +2};   and {@code (-4 % +3) == -1}
      • + *
      • {@code floorMod(-4, -3) == -1};   and {@code (-4 % -3) == -1 }
      • + *
      + *
    • + *
    + *

    + * If the signs of arguments are unknown and a positive modulus + * is needed it can be computed as {@code (floorMod(x, y) + abs(y)) % abs(y)}. + * + * @param x the dividend + * @param y the divisor + * @return the floor modulus {@code x - (floorDiv(x, y) * y)} + * @throws ArithmeticException if the divisor {@code y} is zero + * @see #floorDiv(int, int) + * @since 1.8 + */ + public static int floorMod(int x, int y) { + int r = x - floorDiv(x, y) * y; + return r; + } + + /** + * Returns the floor modulus of the {@code long} arguments. + *

    + * The floor modulus is {@code x - (floorDiv(x, y) * y)}, + * has the same sign as the divisor {@code y}, and + * is in the range of {@code -abs(y) < r < +abs(y)}. + * + *

    + * The relationship between {@code floorDiv} and {@code floorMod} is such that: + *

      + *
    • {@code floorDiv(x, y) * y + floorMod(x, y) == x} + *
    + *

    + * For examples, see {@link #floorMod(int, int)}. + * + * @param x the dividend + * @param y the divisor + * @return the floor modulus {@code x - (floorDiv(x, y) * y)} + * @throws ArithmeticException if the divisor {@code y} is zero + * @see #floorDiv(long, long) + * @since 1.8 + */ + public static long floorMod(long x, long y) { + return x - floorDiv(x, y) * y; + } + /** * Returns the absolute value of an {@code int} value. * If the argument is not negative, the argument is returned. diff --git a/jdk/src/share/classes/java/lang/StrictMath.java b/jdk/src/share/classes/java/lang/StrictMath.java index f5a96b249b2..e59c8d07781 100644 --- a/jdk/src/share/classes/java/lang/StrictMath.java +++ b/jdk/src/share/classes/java/lang/StrictMath.java @@ -365,7 +365,7 @@ public final class StrictMath { * @param a the value to be floored or ceiled * @param negativeBoundary result for values in (-1, 0) * @param positiveBoundary result for values in (0, 1) - * @param sign the sign of the result + * @param increment value to add when the argument is non-integral */ private static double floorOrCeil(double a, double negativeBoundary, @@ -702,7 +702,7 @@ public final class StrictMath { *

    This method is properly synchronized to allow correct use by * more than one thread. However, if many threads need to generate * pseudorandom numbers at a great rate, it may reduce contention - * for each thread to have its own pseudorandom number generator. + * for each thread to have its own pseudorandom-number generator. * * @return a pseudorandom {@code double} greater than or equal * to {@code 0.0} and less than {@code 1.0}. @@ -745,7 +745,7 @@ public final class StrictMath { } /** - * Return the difference of the arguments, + * Returns the difference of the arguments, * throwing an exception if the result overflows an {@code int}. * * @param x the first value @@ -760,7 +760,7 @@ public final class StrictMath { } /** - * Return the difference of the arguments, + * Returns the difference of the arguments, * throwing an exception if the result overflows a {@code long}. * * @param x the first value @@ -775,7 +775,7 @@ public final class StrictMath { } /** - * Return the product of the arguments, + * Returns the product of the arguments, * throwing an exception if the result overflows an {@code int}. * * @param x the first value @@ -790,7 +790,7 @@ public final class StrictMath { } /** - * Return the product of the arguments, + * Returns the product of the arguments, * throwing an exception if the result overflows a {@code long}. * * @param x the first value @@ -805,7 +805,7 @@ public final class StrictMath { } /** - * Return the value of the {@code long} argument; + * Returns the value of the {@code long} argument; * throwing an exception if the value overflows an {@code int}. * * @param value the long value @@ -818,6 +818,107 @@ public final class StrictMath { return Math.toIntExact(value); } + /** + * Returns the largest (closest to positive infinity) + * {@code int} value that is less than or equal to the algebraic quotient. + * There is one special case, if the dividend is the + * {@linkplain Integer#MIN_VALUE Integer.MIN_VALUE} and the divisor is {@code -1}, + * then integer overflow occurs and + * the result is equal to the {@code Integer.MIN_VALUE}. + *

    + * See {@link Math#floorDiv(int, int) Math.floorDiv} for examples and + * a comparison to the integer division {@code /} operator. + * + * @param x the dividend + * @param y the divisor + * @return the largest (closest to positive infinity) + * {@code int} value that is less than or equal to the algebraic quotient. + * @throws ArithmeticException if the divisor {@code y} is zero + * @see Math#floorDiv(int, int) + * @see Math#floor(double) + * @since 1.8 + */ + public static int floorDiv(int x, int y) { + return Math.floorDiv(x, y); + } + + /** + * Returns the largest (closest to positive infinity) + * {@code long} value that is less than or equal to the algebraic quotient. + * There is one special case, if the dividend is the + * {@linkplain Long#MIN_VALUE Long.MIN_VALUE} and the divisor is {@code -1}, + * then integer overflow occurs and + * the result is equal to the {@code Long.MIN_VALUE}. + *

    + * See {@link Math#floorDiv(int, int) Math.floorDiv} for examples and + * a comparison to the integer division {@code /} operator. + * + * @param x the dividend + * @param y the divisor + * @return the largest (closest to positive infinity) + * {@code long} value that is less than or equal to the algebraic quotient. + * @throws ArithmeticException if the divisor {@code y} is zero + * @see Math#floorDiv(long, long) + * @see Math#floor(double) + * @since 1.8 + */ + public static long floorDiv(long x, long y) { + return Math.floorDiv(x, y); + } + + /** + * Returns the floor modulus of the {@code int} arguments. + *

    + * The floor modulus is {@code x - (floorDiv(x, y) * y)}, + * has the same sign as the divisor {@code y}, and + * is in the range of {@code -abs(y) < r < +abs(y)}. + *

    + * The relationship between {@code floorDiv} and {@code floorMod} is such that: + *

      + *
    • {@code floorDiv(x, y) * y + floorMod(x, y) == x} + *
    + *

    + * See {@link Math#floorMod(int, int) Math.floorMod} for examples and + * a comparison to the {@code %} operator. + * + * @param x the dividend + * @param y the divisor + * @return the floor modulus {@code x - (floorDiv(x, y) * y)} + * @throws ArithmeticException if the divisor {@code y} is zero + * @see Math#floorMod(int, int) + * @see StrictMath#floorDiv(int, int) + * @since 1.8 + */ + public static int floorMod(int x, int y) { + return Math.floorMod(x , y); + } + /** + * Returns the floor modulus of the {@code long} arguments. + *

    + * The floor modulus is {@code x - (floorDiv(x, y) * y)}, + * has the same sign as the divisor {@code y}, and + * is in the range of {@code -abs(y) < r < +abs(y)}. + *

    + * The relationship between {@code floorDiv} and {@code floorMod} is such that: + *

      + *
    • {@code floorDiv(x, y) * y + floorMod(x, y) == x} + *
    + *

    + * See {@link Math#floorMod(int, int) Math.floorMod} for examples and + * a comparison to the {@code %} operator. + * + * @param x the dividend + * @param y the divisor + * @return the floor modulus {@code x - (floorDiv(x, y) * y)} + * @throws ArithmeticException if the divisor {@code y} is zero + * @see Math#floorMod(long, long) + * @see StrictMath#floorDiv(long, long) + * @since 1.8 + */ + public static long floorMod(long x, long y) { + return Math.floorMod(x, y); + } + /** * Returns the absolute value of an {@code int} value. * If the argument is not negative, the argument is returned. @@ -1543,7 +1644,7 @@ public final class StrictMath { } /** - * Return {@code d} × + * Returns {@code d} × * 2{@code scaleFactor} rounded as if performed * by a single correctly rounded floating-point multiply to a * member of the double value set. See the Java @@ -1577,7 +1678,7 @@ public final class StrictMath { } /** - * Return {@code f} × + * Returns {@code f} × * 2{@code scaleFactor} rounded as if performed * by a single correctly rounded floating-point multiply to a * member of the float value set. See the Java diff --git a/jdk/test/java/lang/Math/DivModTests.java b/jdk/test/java/lang/Math/DivModTests.java new file mode 100644 index 00000000000..43e88bdcebb --- /dev/null +++ b/jdk/test/java/lang/Math/DivModTests.java @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * @test Test Math and StrictMath Floor Div / Modulo operations. + * @bug 6282196 + * @summary Basic tests for Floor division and modulo methods for both Math + * and StrictMath for int and long datatypes. + */ +public class DivModTests { + + /** + * The count of test errors. + */ + private static int errors = 0; + + /** + * @param args the command line arguments are unused + */ + public static void main(String[] args) { + errors = 0; + testIntFloorDivMod(); + testLongFloorDivMod(); + + if (errors > 0) { + throw new RuntimeException(errors + " errors found in DivMod methods."); + } + } + + /** + * Report a test failure and increment the error count. + * @param message the formatting string + * @param args the variable number of arguments for the message. + */ + static void fail(String message, Object... args) { + errors++; + System.out.printf(message, args); + } + + /** + * Test the integer floorDiv and floorMod methods. + * Math and StrictMath tested and the same results are expected for both. + */ + static void testIntFloorDivMod() { + testIntFloorDivMod(4, 0, new ArithmeticException("/ by zero"), new ArithmeticException("/ by zero")); // Should throw ArithmeticException + testIntFloorDivMod(4, 3, 1, 1); + testIntFloorDivMod(3, 3, 1, 0); + testIntFloorDivMod(2, 3, 0, 2); + testIntFloorDivMod(1, 3, 0, 1); + testIntFloorDivMod(0, 3, 0, 0); + testIntFloorDivMod(4, -3, -2, -2); + testIntFloorDivMod(3, -3, -1, 0); + testIntFloorDivMod(2, -3, -1, -1); + testIntFloorDivMod(1, -3, -1, -2); + testIntFloorDivMod(0, -3, 0, 0); + testIntFloorDivMod(-1, 3, -1, 2); + testIntFloorDivMod(-2, 3, -1, 1); + testIntFloorDivMod(-3, 3, -1, 0); + testIntFloorDivMod(-4, 3, -2, 2); + testIntFloorDivMod(-1, -3, 0, -1); + testIntFloorDivMod(-2, -3, 0, -2); + testIntFloorDivMod(-3, -3, 1, 0); + testIntFloorDivMod(-4, -3, 1, -1); + testIntFloorDivMod(Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 0); + testIntFloorDivMod(Integer.MAX_VALUE, -1, -Integer.MAX_VALUE, 0); + testIntFloorDivMod(Integer.MAX_VALUE, 3, 715827882, 1); + testIntFloorDivMod(Integer.MAX_VALUE - 1, 3, 715827882, 0); + testIntFloorDivMod(Integer.MIN_VALUE, 3, -715827883, 1); + testIntFloorDivMod(Integer.MIN_VALUE + 1, 3, -715827883, 2); + testIntFloorDivMod(Integer.MIN_VALUE + 1, -1, Integer.MAX_VALUE, 0); + // Special case of integer overflow + testIntFloorDivMod(Integer.MIN_VALUE, -1, Integer.MIN_VALUE, 0); + } + + /** + * Test FloorDiv and then FloorMod with int data. + */ + static void testIntFloorDivMod(int x, int y, Object divExpected, Object modExpected) { + testIntFloorDiv(x, y, divExpected); + testIntFloorMod(x, y, modExpected); + } + + /** + * Test FloorDiv with int data. + */ + static void testIntFloorDiv(int x, int y, Object expected) { + Object result = doFloorDiv(x, y); + if (!resultEquals(result, expected)) { + fail("FAIL: Math.floorDiv(%d, %d) = %s; expected %s%n", x, y, result, expected); + } + + Object strict_result = doStrictFloorDiv(x, y); + if (!resultEquals(strict_result, expected)) { + fail("FAIL: StrictMath.floorDiv(%d, %d) = %s; expected %s%n", x, y, strict_result, expected); + } + } + + /** + * Test FloorMod with int data. + */ + static void testIntFloorMod(int x, int y, Object expected) { + Object result = doFloorMod(x, y); + if (!resultEquals(result, expected)) { + fail("FAIL: Math.floorMod(%d, %d) = %s; expected %s%n", x, y, result, expected); + } + + Object strict_result = doStrictFloorMod(x, y); + if (!resultEquals(strict_result, expected)) { + fail("FAIL: StrictMath.floorMod(%d, %d) = %s; expected %s%n", x, y, strict_result, expected); + } + + try { + // Verify result against double precision floor function + int tmp = x / y; // Force ArithmeticException for divide by zero + double ff = x - Math.floor((double)x / (double)y) * y; + int fr = (int)ff; + if (fr != result) { + fail("FAIL: Math.floorMod(%d, %d) = %s differs from Math.floor(x, y): %d%n", x, y, result, fr); + } + } catch (ArithmeticException ae) { + if (y != 0) { + fail("FAIL: Math.floorMod(%d, %d); unexpected %s%n", x, y, ae); + } + } + } + + /** + * Test the floorDiv and floorMod methods for primitive long. + */ + static void testLongFloorDivMod() { + testLongFloorDivMod(4L, 0L, new ArithmeticException("/ by zero"), new ArithmeticException("/ by zero")); // Should throw ArithmeticException + testLongFloorDivMod(4L, 3L, 1L, 1L); + testLongFloorDivMod(3L, 3L, 1L, 0L); + testLongFloorDivMod(2L, 3L, 0L, 2L); + testLongFloorDivMod(1L, 3L, 0L, 1L); + testLongFloorDivMod(0L, 3L, 0L, 0L); + testLongFloorDivMod(4L, -3L, -2L, -2L); + testLongFloorDivMod(3L, -3L, -1L, 0l); + testLongFloorDivMod(2L, -3L, -1L, -1L); + testLongFloorDivMod(1L, -3L, -1L, -2L); + testLongFloorDivMod(0L, -3L, 0L, 0L); + testLongFloorDivMod(-1L, 3L, -1L, 2L); + testLongFloorDivMod(-2L, 3L, -1L, 1L); + testLongFloorDivMod(-3L, 3L, -1L, 0L); + testLongFloorDivMod(-4L, 3L, -2L, 2L); + testLongFloorDivMod(-1L, -3L, 0L, -1L); + testLongFloorDivMod(-2L, -3L, 0L, -2L); + testLongFloorDivMod(-3L, -3L, 1L, 0L); + testLongFloorDivMod(-4L, -3L, 1L, -1L); + + testLongFloorDivMod(Long.MAX_VALUE, 1, Long.MAX_VALUE, 0L); + testLongFloorDivMod(Long.MAX_VALUE, -1, -Long.MAX_VALUE, 0L); + testLongFloorDivMod(Long.MAX_VALUE, 3L, Long.MAX_VALUE / 3L, 1L); + testLongFloorDivMod(Long.MAX_VALUE - 1L, 3L, (Long.MAX_VALUE - 1L) / 3L, 0L); + testLongFloorDivMod(Long.MIN_VALUE, 3L, Long.MIN_VALUE / 3L - 1L, 1L); + testLongFloorDivMod(Long.MIN_VALUE + 1L, 3L, Long.MIN_VALUE / 3L - 1L, 2L); + testLongFloorDivMod(Long.MIN_VALUE + 1, -1, Long.MAX_VALUE, 0L); + // Special case of integer overflow + testLongFloorDivMod(Long.MIN_VALUE, -1, Long.MIN_VALUE, 0L); + } + + /** + * Test the integer floorDiv and floorMod methods. + * Math and StrictMath are tested and the same results are expected for both. + */ + static void testLongFloorDivMod(long x, long y, Object divExpected, Object modExpected) { + testLongFloorDiv(x, y, divExpected); + testLongFloorMod(x, y, modExpected); + } + + /** + * Test FloorDiv with long arguments against expected value. + * The expected value is usually a Long but in some cases is + * an ArithmeticException. + * + * @param x dividend + * @param y modulus + * @param expected expected value, + */ + static void testLongFloorDiv(long x, long y, Object expected) { + Object result = doFloorDiv(x, y); + if (!resultEquals(result, expected)) { + fail("FAIL: long Math.floorDiv(%d, %d) = %s; expected %s%n", x, y, result, expected); + } + + Object strict_result = doStrictFloorDiv(x, y); + if (!resultEquals(strict_result, expected)) { + fail("FAIL: long StrictMath.floorDiv(%d, %d) = %s; expected %s%n", x, y, strict_result, expected); + } + } + + /** + * Test FloorMod of long arguments against expected value. + * The expected value is usually a Long but in some cases is + * an ArithmeticException. + * + * @param x dividend + * @param y modulus + * @param expected expected value + */ + static void testLongFloorMod(long x, long y, Object expected) { + Object result = doFloorMod(x, y); + if (!resultEquals(result, expected)) { + fail("FAIL: long Math.floorMod(%d, %d) = %s; expected %s%n", x, y, result, expected); + } + + Object strict_result = doStrictFloorMod(x, y); + if (!resultEquals(strict_result, expected)) { + fail("FAIL: long StrictMath.floorMod(%d, %d) = %s; expected %s%n", x, y, strict_result, expected); + } + + try { + // Verify the result against BigDecimal rounding mode. + BigDecimal xD = new BigDecimal(x); + BigDecimal yD = new BigDecimal(y); + BigDecimal resultD = xD.divide(yD, RoundingMode.FLOOR); + resultD = resultD.multiply(yD); + resultD = xD.subtract(resultD); + long fr = resultD.longValue(); + if (fr != result) { + fail("FAIL: Long.floorMod(%d, %d) = %d is different than BigDecimal result: %d%n",x, y, result, fr); + + } + } catch (ArithmeticException ae) { + if (y != 0) { + fail("FAIL: long Math.floorMod(%d, %d); unexpected ArithmeticException from bigdecimal"); + } + } + } + + /** + * Invoke floorDiv and return the result or any exception. + * @param x the x value + * @param y the y value + * @return the result Integer or an exception. + */ + static Object doFloorDiv(int x, int y) { + try { + return Math.floorDiv(x, y); + } catch (ArithmeticException ae) { + return ae; + } + } + + /** + * Invoke floorDiv and return the result or any exception. + * @param x the x value + * @param y the y value + * @return the result Integer or an exception. + */ + static Object doFloorDiv(long x, long y) { + try { + return Math.floorDiv(x, y); + } catch (ArithmeticException ae) { + return ae; + } + } + + /** + * Invoke floorDiv and return the result or any exception. + * @param x the x value + * @param y the y value + * @return the result Integer or an exception. + */ + static Object doFloorMod(int x, int y) { + try { + return Math.floorMod(x, y); + } catch (ArithmeticException ae) { + return ae; + } + } + + /** + * Invoke floorDiv and return the result or any exception. + * @param x the x value + * @param y the y value + * @return the result Integer or an exception. + */ + static Object doFloorMod(long x, long y) { + try { + return Math.floorMod(x, y); + } catch (ArithmeticException ae) { + return ae; + } + } + + /** + * Invoke floorDiv and return the result or any exception. + * @param x the x value + * @param y the y value + * @return the result Integer or an exception. + */ + static Object doStrictFloorDiv(int x, int y) { + try { + return StrictMath.floorDiv(x, y); + } catch (ArithmeticException ae) { + return ae; + } + } + + /** + * Invoke floorDiv and return the result or any exception. + * @param x the x value + * @param y the y value + * @return the result Integer or an exception. + */ + static Object doStrictFloorDiv(long x, long y) { + try { + return StrictMath.floorDiv(x, y); + } catch (ArithmeticException ae) { + return ae; + } + } + + /** + * Invoke floorDiv and return the result or any exception. + * @param x the x value + * @param y the y value + * @return the result Integer or an exception. + */ + static Object doStrictFloorMod(int x, int y) { + try { + return StrictMath.floorMod(x, y); + } catch (ArithmeticException ae) { + return ae; + } + } + + /** + * Invoke floorDiv and return the result or any exception. + * @param x the x value + * @param y the y value + * @return the result Integer or an exception. + */ + static Object doStrictFloorMod(long x, long y) { + try { + return StrictMath.floorMod(x, y); + } catch (ArithmeticException ae) { + return ae; + } + } + + /** + * Returns a boolean by comparing the result and the expected value. + * The equals method is not defined for ArithmeticException but it is + * desirable to have equals return true if the expected and the result + * both threw the same exception (class and message.) + * + * @param result the result from testing the method + * @param expected the expected value + * @return true if the result is equal to the expected values; false otherwise. + */ + static boolean resultEquals(Object result, Object expected) { + if (result.getClass() != expected.getClass()) { + fail("FAIL: Result type mismatch, %s; expected: %s%n", + result.getClass().getName(), expected.getClass().getName()); + return false; + } + + if (result.equals(expected)) { + return true; + } + // Handle special case to compare ArithmeticExceptions + if (result instanceof ArithmeticException && expected instanceof ArithmeticException) { + ArithmeticException ae1 = (ArithmeticException)result; + ArithmeticException ae2 = (ArithmeticException)expected; + return ae1.getMessage().equals(ae2.getMessage()); + } + return false; + } + +} From 556c5ce459ce559c1e7d1fda050501ffcc3ac340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20=C3=96hrstr=C3=B6m?= Date: Thu, 8 Nov 2012 12:24:35 +0100 Subject: [PATCH 205/241] 8003161: small fixes to re-enable new build system Reviewed-by: dholmes, alanb, erikj --- common/makefiles/JavaCompilation.gmk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/makefiles/JavaCompilation.gmk b/common/makefiles/JavaCompilation.gmk index 06726629533..30537403d27 100644 --- a/common/makefiles/JavaCompilation.gmk +++ b/common/makefiles/JavaCompilation.gmk @@ -111,7 +111,7 @@ define SetupArchive ifeq ($$(word 20,$$($1_GREP_INCLUDE_PATTERNS)),) $1_GREP_INCLUDES:=| $(GREP) $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_INCLUDE_PATTERNS)) else - $$(shell $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_include) + $$(shell $(MKDIR) -p $$($1_BIN) && $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_include) $$(eval $$(call ListPathsSafelyNow,$1_GREP_INCLUDE_PATTERNS,\n, \ >> $$($1_BIN)/_the.$$($1_JARNAME)_include)) $1_GREP_INCLUDES:=| $(GREP) -f $$($1_BIN)/_the.$$($1_JARNAME)_include @@ -124,7 +124,7 @@ define SetupArchive ifeq ($$(word 20,$$($1_GREP_EXCLUDE_PATTERNS)),) $1_GREP_EXCLUDES:=| $(GREP) -v $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_EXCLUDE_PATTERNS)) else - $$(shell $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_exclude) + $$(shell $(MKDIR) -p $$($1_BIN) && $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_exclude) $$(eval $$(call ListPathsSafelyNow,$1_GREP_EXCLUDE_PATTERNS,\n, \ >> $$($1_BIN)/_the.$$($1_JARNAME)_exclude)) $1_GREP_EXCLUDES:=| $(GREP) -v -f $$($1_BIN)/_the.$$($1_JARNAME)_exclude From 2d8ab983936252553553d9653fb7990849efffd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20=C3=96hrstr=C3=B6m?= Date: Thu, 8 Nov 2012 12:25:15 +0100 Subject: [PATCH 206/241] 8003161: small fixes to re-enable new build system Reviewed-by: dholmes, alanb, erikj --- jdk/makefiles/CompileNativeLibraries.gmk | 2 +- jdk/makefiles/CreateJars.gmk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jdk/makefiles/CompileNativeLibraries.gmk b/jdk/makefiles/CompileNativeLibraries.gmk index 63b1876c3f6..c23f7d8adc6 100644 --- a/jdk/makefiles/CompileNativeLibraries.gmk +++ b/jdk/makefiles/CompileNativeLibraries.gmk @@ -1242,7 +1242,7 @@ ifdef OPENJDK INCLUDE_FILES:=cmscam02.c cmscgats.c cmscnvrt.c cmserr.c \ cmsgamma.c cmsgmt.c cmsintrp.c cmsio0.c \ cmsio1.c cmslut.c cmsmd5.c cmsmtrx.c \ - cmsnamed.c cmsopt.c cmspack.c cmspcs.c \ + cmsnamed.c cmsopt.c cmshalf.c cmspack.c cmspcs.c \ cmsplugin.c cmsps2.c cmssamp.c cmssm.c \ cmstypes.c cmsvirt.c cmswtpnt.c cmsxform.c \ LCMS.c,\ diff --git a/jdk/makefiles/CreateJars.gmk b/jdk/makefiles/CreateJars.gmk index 94d2d4dc6f8..65b506a0396 100644 --- a/jdk/makefiles/CreateJars.gmk +++ b/jdk/makefiles/CreateJars.gmk @@ -271,7 +271,7 @@ endif ifeq ($(OPENJDK_TARGET_OS), macosx) RT_JAR_EXCLUDES += com/sun/nio/sctp \ - sun/nio/ch/sctp \ + sun/nio/ch/sctp endif # Find all files in the classes dir to use as dependencies. This could be more fine granular. From fdfd7968f776b9849aea06a6f7e3a4da7c92bea0 Mon Sep 17 00:00:00 2001 From: Jason Uh Date: Thu, 8 Nov 2012 12:51:25 -0500 Subject: [PATCH 207/241] 7198416: CertificateIssuerName and CertificateSubjectName are redundant Reviewed-by: mullan --- .../classes/sun/security/pkcs/PKCS7.java | 5 +- .../sun/security/tools/jarsigner/Main.java | 6 +- .../security/tools/keytool/CertAndKeyGen.java | 4 +- .../sun/security/tools/keytool/Main.java | 16 ++-- .../sun/security/x509/X509CertImpl.java | 24 +++--- .../sun/security/x509/X509CertInfo.java | 75 +++++++++---------- .../sun/security/x509/certAttributes.html | 18 ++--- .../sun/security/pkcs11/rsa/GenKeyStore.java | 6 +- .../security/provider/X509Factory/BigCRL.java | 2 +- jdk/test/sun/security/rsa/GenKeyStore.java | 6 +- 10 files changed, 77 insertions(+), 85 deletions(-) diff --git a/jdk/src/share/classes/sun/security/pkcs/PKCS7.java b/jdk/src/share/classes/sun/security/pkcs/PKCS7.java index 523c5d39f8d..fa67e29e738 100644 --- a/jdk/src/share/classes/sun/security/pkcs/PKCS7.java +++ b/jdk/src/share/classes/sun/security/pkcs/PKCS7.java @@ -39,7 +39,6 @@ import java.security.*; import sun.security.timestamp.*; import sun.security.util.*; import sun.security.x509.AlgorithmId; -import sun.security.x509.CertificateIssuerName; import sun.security.x509.X509CertImpl; import sun.security.x509.X509CertInfo; import sun.security.x509.X509CRLImpl; @@ -712,8 +711,8 @@ public class PKCS7 { X509CertInfo tbsCert = new X509CertInfo(cert.getTBSCertificate()); certIssuerName = (Principal) - tbsCert.get(CertificateIssuerName.NAME + "." + - CertificateIssuerName.DN_NAME); + tbsCert.get(X509CertInfo.ISSUER + "." + + X509CertInfo.DN_NAME); } catch (Exception e) { // error generating X500Name object from the cert's // issuer DN, leave name as is. diff --git a/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java index 98f3ec28a20..159de08695a 100644 --- a/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java +++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java @@ -2259,9 +2259,9 @@ class SignatureFile { X509CertInfo tbsCert = new X509CertInfo(certChain[0].getTBSCertificate()); issuerName = (Principal) - tbsCert.get(CertificateIssuerName.NAME + "." + - CertificateIssuerName.DN_NAME); - } + tbsCert.get(X509CertInfo.ISSUER + "." + + X509CertInfo.DN_NAME); + } BigInteger serial = certChain[0].getSerialNumber(); String signatureAlgorithm; diff --git a/jdk/src/share/classes/sun/security/tools/keytool/CertAndKeyGen.java b/jdk/src/share/classes/sun/security/tools/keytool/CertAndKeyGen.java index 6f557b67a65..a8a748cdb14 100644 --- a/jdk/src/share/classes/sun/security/tools/keytool/CertAndKeyGen.java +++ b/jdk/src/share/classes/sun/security/tools/keytool/CertAndKeyGen.java @@ -258,10 +258,10 @@ public final class CertAndKeyGen { AlgorithmId algID = AlgorithmId.get(sigAlg); info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algID)); - info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(myname)); + info.set(X509CertInfo.SUBJECT, myname); info.set(X509CertInfo.KEY, new CertificateX509Key(publicKey)); info.set(X509CertInfo.VALIDITY, interval); - info.set(X509CertInfo.ISSUER, new CertificateIssuerName(myname)); + info.set(X509CertInfo.ISSUER, myname); if (ext != null) info.set(X509CertInfo.EXTENSIONS, ext); cert = new X509CertImpl(info); diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Main.java b/jdk/src/share/classes/sun/security/tools/keytool/Main.java index fd399fca63a..d0a6d6b53c4 100644 --- a/jdk/src/share/classes/sun/security/tools/keytool/Main.java +++ b/jdk/src/share/classes/sun/security/tools/keytool/Main.java @@ -1145,7 +1145,7 @@ public final class Main { X509CertInfo signerCertInfo = (X509CertInfo)signerCertImpl.get( X509CertImpl.NAME + "." + X509CertImpl.INFO); X500Name issuer = (X500Name)signerCertInfo.get(X509CertInfo.SUBJECT + "." + - CertificateSubjectName.DN_NAME); + X509CertInfo.DN_NAME); Date firstDate = getStartDate(startDate); Date lastDate = new Date(); @@ -1170,7 +1170,7 @@ public final class Main { info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId( AlgorithmId.get(sigAlgName))); - info.set(X509CertInfo.ISSUER, new CertificateIssuerName(issuer)); + info.set(X509CertInfo.ISSUER, issuer); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); boolean canRead = false; @@ -1193,8 +1193,8 @@ public final class Main { PKCS10 req = new PKCS10(rawReq); info.set(X509CertInfo.KEY, new CertificateX509Key(req.getSubjectPublicKeyInfo())); - info.set(X509CertInfo.SUBJECT, new CertificateSubjectName( - dname==null?req.getSubjectName():new X500Name(dname))); + info.set(X509CertInfo.SUBJECT, + dname==null?req.getSubjectName():new X500Name(dname)); CertificateExtensions reqex = null; Iterator attrs = req.getAttributes().getAttributes().iterator(); while (attrs.hasNext()) { @@ -1234,7 +1234,7 @@ public final class Main { X509CertInfo signerCertInfo = (X509CertInfo)signerCertImpl.get( X509CertImpl.NAME + "." + X509CertImpl.INFO); X500Name owner = (X500Name)signerCertInfo.get(X509CertInfo.SUBJECT + "." + - CertificateSubjectName.DN_NAME); + X509CertInfo.DN_NAME); Date firstDate = getStartDate(startDate); Date lastDate = (Date) firstDate.clone(); @@ -2405,16 +2405,16 @@ public final class Main { if (dname == null) { // Get the owner name from the certificate owner = (X500Name)certInfo.get(X509CertInfo.SUBJECT + "." + - CertificateSubjectName.DN_NAME); + X509CertInfo.DN_NAME); } else { // Use the owner name specified at the command line owner = new X500Name(dname); certInfo.set(X509CertInfo.SUBJECT + "." + - CertificateSubjectName.DN_NAME, owner); + X509CertInfo.DN_NAME, owner); } // Make issuer same as owner (self-signed!) certInfo.set(X509CertInfo.ISSUER + "." + - CertificateIssuerName.DN_NAME, owner); + X509CertInfo.DN_NAME, owner); // The inner and outer signature algorithms have to match. // The way we achieve that is really ugly, but there seems to be no diff --git a/jdk/src/share/classes/sun/security/x509/X509CertImpl.java b/jdk/src/share/classes/sun/security/x509/X509CertImpl.java index 5c965ff2e47..64e06ceaebf 100644 --- a/jdk/src/share/classes/sun/security/x509/X509CertImpl.java +++ b/jdk/src/share/classes/sun/security/x509/X509CertImpl.java @@ -96,12 +96,10 @@ public class X509CertImpl extends X509Certificate implements DerEncoder { */ // x509.info.subject.dname public static final String SUBJECT_DN = NAME + DOT + INFO + DOT + - X509CertInfo.SUBJECT + DOT + - CertificateSubjectName.DN_NAME; + X509CertInfo.SUBJECT + DOT + X509CertInfo.DN_NAME; // x509.info.issuer.dname public static final String ISSUER_DN = NAME + DOT + INFO + DOT + - X509CertInfo.ISSUER + DOT + - CertificateIssuerName.DN_NAME; + X509CertInfo.ISSUER + DOT + X509CertInfo.DN_NAME; // x509.info.serialNumber.number public static final String SERIAL_ID = NAME + DOT + INFO + DOT + X509CertInfo.SERIAL_NUMBER + DOT + @@ -890,9 +888,8 @@ public class X509CertImpl extends X509Certificate implements DerEncoder { if (info == null) return null; try { - Principal subject = (Principal)info.get( - CertificateSubjectName.NAME + DOT + - CertificateSubjectName.DN_NAME); + Principal subject = (Principal)info.get(X509CertInfo.SUBJECT + DOT + + X509CertInfo.DN_NAME); return subject; } catch (Exception e) { return null; @@ -910,8 +907,8 @@ public class X509CertImpl extends X509Certificate implements DerEncoder { } try { X500Principal subject = (X500Principal)info.get( - CertificateSubjectName.NAME + DOT + - CertificateSubjectName.DN_PRINCIPAL); + X509CertInfo.SUBJECT + DOT + + "x500principal"); return subject; } catch (Exception e) { return null; @@ -927,9 +924,8 @@ public class X509CertImpl extends X509Certificate implements DerEncoder { if (info == null) return null; try { - Principal issuer = (Principal)info.get( - CertificateIssuerName.NAME + DOT + - CertificateIssuerName.DN_NAME); + Principal issuer = (Principal)info.get(X509CertInfo.ISSUER + DOT + + X509CertInfo.DN_NAME); return issuer; } catch (Exception e) { return null; @@ -947,8 +943,8 @@ public class X509CertImpl extends X509Certificate implements DerEncoder { } try { X500Principal issuer = (X500Principal)info.get( - CertificateIssuerName.NAME + DOT + - CertificateIssuerName.DN_PRINCIPAL); + X509CertInfo.ISSUER + DOT + + "x500principal"); return issuer; } catch (Exception e) { return null; diff --git a/jdk/src/share/classes/sun/security/x509/X509CertInfo.java b/jdk/src/share/classes/sun/security/x509/X509CertInfo.java index 7d3bb517975..b7f2dd85bcd 100644 --- a/jdk/src/share/classes/sun/security/x509/X509CertInfo.java +++ b/jdk/src/share/classes/sun/security/x509/X509CertInfo.java @@ -68,12 +68,13 @@ public class X509CertInfo implements CertAttrSet { public static final String IDENT = "x509.info"; // Certificate attribute names public static final String NAME = "info"; + public static final String DN_NAME = "dname"; public static final String VERSION = CertificateVersion.NAME; public static final String SERIAL_NUMBER = CertificateSerialNumber.NAME; public static final String ALGORITHM_ID = CertificateAlgorithmId.NAME; - public static final String ISSUER = CertificateIssuerName.NAME; + public static final String ISSUER = "issuer"; + public static final String SUBJECT = "subject"; public static final String VALIDITY = CertificateValidity.NAME; - public static final String SUBJECT = CertificateSubjectName.NAME; public static final String KEY = CertificateX509Key.NAME; public static final String ISSUER_ID = "issuerID"; public static final String SUBJECT_ID = "subjectID"; @@ -83,9 +84,9 @@ public class X509CertInfo implements CertAttrSet { protected CertificateVersion version = new CertificateVersion(); protected CertificateSerialNumber serialNum = null; protected CertificateAlgorithmId algId = null; - protected CertificateIssuerName issuer = null; + protected X500Name issuer = null; + protected X500Name subject = null; protected CertificateValidity interval = null; - protected CertificateSubjectName subject = null; protected CertificateX509Key pubKey = null; // X509.v2 & v3 extensions @@ -399,11 +400,7 @@ public class X509CertInfo implements CertAttrSet { break; case ATTR_ISSUER: - if (suffix == null) { - setIssuer(val); - } else { - issuer.set(suffix, val); - } + setIssuer(val); break; case ATTR_VALIDITY: @@ -415,11 +412,7 @@ public class X509CertInfo implements CertAttrSet { break; case ATTR_SUBJECT: - if (suffix == null) { - setSubject(val); - } else { - subject.set(suffix, val); - } + setSubject(val); break; case ATTR_KEY: @@ -493,11 +486,7 @@ public class X509CertInfo implements CertAttrSet { } break; case (ATTR_ISSUER): - if (suffix == null) { - issuer = null; - } else { - issuer.delete(suffix); - } + issuer = null; break; case (ATTR_VALIDITY): if (suffix == null) { @@ -507,11 +496,7 @@ public class X509CertInfo implements CertAttrSet { } break; case (ATTR_SUBJECT): - if (suffix == null) { - subject = null; - } else { - subject.delete(suffix); - } + subject = null; break; case (ATTR_KEY): if (suffix == null) { @@ -571,13 +556,13 @@ public class X509CertInfo implements CertAttrSet { if (suffix == null) { return(subject); } else { - return(subject.get(suffix)); + return(getX500Name(suffix, false)); } case (ATTR_ISSUER): if (suffix == null) { return(issuer); } else { - return(issuer.get(suffix)); + return(getX500Name(suffix, true)); } case (ATTR_KEY): if (suffix == null) { @@ -617,6 +602,21 @@ public class X509CertInfo implements CertAttrSet { return null; } + /* + * Get the Issuer or Subject name + */ + private Object getX500Name(String name, boolean getIssuer) + throws IOException { + if (name.equalsIgnoreCase(X509CertInfo.DN_NAME)) { + return getIssuer ? issuer : subject; + } else if (name.equalsIgnoreCase("x500principal")) { + return getIssuer ? issuer.asX500Principal() + : subject.asX500Principal(); + } else { + throw new IOException("Attribute name not recognized."); + } + } + /* * This routine unmarshals the certificate information. */ @@ -646,9 +646,8 @@ public class X509CertInfo implements CertAttrSet { algId = new CertificateAlgorithmId(in); // Issuer name - issuer = new CertificateIssuerName(in); - X500Name issuerDN = (X500Name)issuer.get(CertificateIssuerName.DN_NAME); - if (issuerDN.isEmpty()) { + issuer = new X500Name(in); + if (issuer.isEmpty()) { throw new CertificateParsingException( "Empty issuer DN not allowed in X509Certificates"); } @@ -657,10 +656,9 @@ public class X509CertInfo implements CertAttrSet { interval = new CertificateValidity(in); // subject name - subject = new CertificateSubjectName(in); - X500Name subjectDN = (X500Name)subject.get(CertificateSubjectName.DN_NAME); + subject = new X500Name(in); if ((version.compare(CertificateVersion.V1) == 0) && - subjectDN.isEmpty()) { + subject.isEmpty()) { throw new CertificateParsingException( "Empty subject DN not allowed in v1 certificate"); } @@ -712,13 +710,12 @@ public class X509CertInfo implements CertAttrSet { /* * Verify if X.509 V3 Certificate is compliant with RFC 3280. */ - private void verifyCert(CertificateSubjectName subject, + private void verifyCert(X500Name subject, CertificateExtensions extensions) throws CertificateParsingException, IOException { // if SubjectName is empty, check for SubjectAlternativeNameExtension - X500Name subjectDN = (X500Name)subject.get(CertificateSubjectName.DN_NAME); - if (subjectDN.isEmpty()) { + if (subject.isEmpty()) { if (extensions == null) { throw new CertificateParsingException("X.509 Certificate is " + "incomplete: subject field is empty, and certificate " + @@ -859,11 +856,11 @@ public class X509CertInfo implements CertAttrSet { * @exception CertificateException on invalid data. */ private void setIssuer(Object val) throws CertificateException { - if (!(val instanceof CertificateIssuerName)) { + if (!(val instanceof X500Name)) { throw new CertificateException( "Issuer class type invalid."); } - issuer = (CertificateIssuerName)val; + issuer = (X500Name)val; } /** @@ -887,11 +884,11 @@ public class X509CertInfo implements CertAttrSet { * @exception CertificateException on invalid data. */ private void setSubject(Object val) throws CertificateException { - if (!(val instanceof CertificateSubjectName)) { + if (!(val instanceof X500Name)) { throw new CertificateException( "Subject class type invalid."); } - subject = (CertificateSubjectName)val; + subject = (X500Name)val; } /** diff --git a/jdk/src/share/classes/sun/security/x509/certAttributes.html b/jdk/src/share/classes/sun/security/x509/certAttributes.html index 088538e5cab..79f6b5a1f67 100644 --- a/jdk/src/share/classes/sun/security/x509/certAttributes.html +++ b/jdk/src/share/classes/sun/security/x509/certAttributes.html @@ -6,7 +6,7 @@

    Certificate Attributes

    July 1998

    -In JDK1.2 we provide an implementation of X.509 (version 3). +In JDK1.2 we provide an implementation of X.509 (version 3). The X509CertImpl class supports the following methods to manipulate the various attributes of a certificate:

    @@ -86,9 +86,9 @@ AlgorithmId
     issuer
     x509.info.issuer
    x509.info.issuer.dname -CertificateIssuerName.IDENT
    +none
    X509CertImpl.ISSUER_DN -CertificateIssuerName
    +X500Name
    X500Name @@ -109,9 +109,9 @@ java.util.Date subject x509.info.subject
    x509.info.subject.dname -CertificateSubjectName.IDENT
    +none
    X509CertImpl.SUBJECT_DN -CertificateSubjectName
    +X500Name
    X500Name @@ -127,18 +127,18 @@ X509Key issuerUniqueID x509.info.issuerID
    x509.info.issuerID.id -CertificateIssuerUniqueIdentity.IDENT
    +none
    none -CertificateIssuerUniqueIdentity
    +UniqueIdentity
    UniqueIdentity subjectUniqueID x509.info.subjectID
    x509.info.subjectID.id -CertificateSubjectUniqueIdentity.IDENT
    +none
    none -CertificateSubjectUniqueIdentity
    +UniqueIdentity
    UniqueIdentity diff --git a/jdk/test/sun/security/pkcs11/rsa/GenKeyStore.java b/jdk/test/sun/security/pkcs11/rsa/GenKeyStore.java index 85904a2ebc0..629a504a040 100644 --- a/jdk/test/sun/security/pkcs11/rsa/GenKeyStore.java +++ b/jdk/test/sun/security/pkcs11/rsa/GenKeyStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,8 +54,8 @@ public class GenKeyStore { certInfo.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V1)); certInfo.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(1)); certInfo.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algID)); - certInfo.set(X509CertInfo.SUBJECT, new CertificateSubjectName(name)); - certInfo.set(X509CertInfo.ISSUER, new CertificateIssuerName(name)); + certInfo.set(X509CertInfo.SUBJECT, name); + certInfo.set(X509CertInfo.ISSUER, name); certInfo.set(X509CertInfo.KEY, new CertificateX509Key(publicKey)); certInfo.set(X509CertInfo.VALIDITY, new CertificateValidity(date, date)); diff --git a/jdk/test/sun/security/provider/X509Factory/BigCRL.java b/jdk/test/sun/security/provider/X509Factory/BigCRL.java index bfc6b564ebb..c6e4e07f7dd 100644 --- a/jdk/test/sun/security/provider/X509Factory/BigCRL.java +++ b/jdk/test/sun/security/provider/X509Factory/BigCRL.java @@ -57,7 +57,7 @@ public class BigCRL { X509CertInfo signerCertInfo = (X509CertInfo)signerCertImpl.get( X509CertImpl.NAME + "." + X509CertImpl.INFO); X500Name owner = (X500Name)signerCertInfo.get(X509CertInfo.SUBJECT + "." - + CertificateSubjectName.DN_NAME); + + X509CertInfo.DN_NAME); Date date = new Date(); PrivateKey privateKey = (PrivateKey) diff --git a/jdk/test/sun/security/rsa/GenKeyStore.java b/jdk/test/sun/security/rsa/GenKeyStore.java index 85904a2ebc0..629a504a040 100644 --- a/jdk/test/sun/security/rsa/GenKeyStore.java +++ b/jdk/test/sun/security/rsa/GenKeyStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,8 +54,8 @@ public class GenKeyStore { certInfo.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V1)); certInfo.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(1)); certInfo.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algID)); - certInfo.set(X509CertInfo.SUBJECT, new CertificateSubjectName(name)); - certInfo.set(X509CertInfo.ISSUER, new CertificateIssuerName(name)); + certInfo.set(X509CertInfo.SUBJECT, name); + certInfo.set(X509CertInfo.ISSUER, name); certInfo.set(X509CertInfo.KEY, new CertificateX509Key(publicKey)); certInfo.set(X509CertInfo.VALIDITY, new CertificateValidity(date, date)); From 26d28a3d4fb26bcb2bff791c2089128c0e68bc0b Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 8 Nov 2012 11:50:40 -0800 Subject: [PATCH 208/241] Added tag jdk8-b64 for changeset 2ed7c69fba51 --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index ecd625bae5a..ebbc1b340c4 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -185,3 +185,4 @@ e07f499b9dccb529ecf74172cf6ac11a195ec57a jdk8-b60 20ff117b509075c3aec4ee3a57990ecd5db5df9c jdk8-b61 8a3fe0ae06a8cc21347da5a18384b0aa6c2349f5 jdk8-b62 3229597524cab4239325bc3602df6c486397a511 jdk8-b63 +1c8370a55b305d35353346202bde042ba9e8a9fd jdk8-b64 From 78d4071a34032d597167786a08e79c94add00834 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 8 Nov 2012 11:50:45 -0800 Subject: [PATCH 209/241] Added tag jdk8-b64 for changeset f0b6a25db9f2 --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index ca52a9060f4..ef06cbb8075 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -185,3 +185,4 @@ d54dc53e223ed9ce7d5f4d2cd02ad9d5def3c2db jdk8-b59 0e08ba7648fb3faa0986cb217887d7c4990977f3 jdk8-b61 08afb9c6f44f11c3595b01fd0985db64b29834dd jdk8-b62 6ccbf67b68bfed1ab9c44ab8748a5bdc7df33506 jdk8-b63 +54d599a5b4aad83c235d590652fc81f41c2824fb jdk8-b64 From 25248f528e890be049cae099b84635c0a974eb73 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 8 Nov 2012 11:51:00 -0800 Subject: [PATCH 210/241] Added tag jdk8-b64 for changeset 529fffb2ec02 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 8ea3ed76521..33176b6867e 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -291,3 +291,4 @@ dccd40de8db1fa96f186e6179907818d75320440 jdk8-b62 dc16fe422c535ecd4e9f80fb814a1bb9704da6f5 hs25-b07 acabb5c282f59be7e3238920b2ea06b684ab68f7 jdk8-b63 8cb93eadfb6dcab88d91b8e2cd3e0e07d0ac4048 hs25-b08 +5920f72e799c8133d1066c4a62fa1fafcb729966 jdk8-b64 From a049fb10b2afcb18e7c2eae220678425824ae3fc Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 8 Nov 2012 11:51:20 -0800 Subject: [PATCH 211/241] Added tag jdk8-b64 for changeset 13b36a0b5705 --- jaxp/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 38c1f7d7db2..ab79fb7def4 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -185,3 +185,4 @@ af9e8b0f1900b631a8a0fcccff9f1514fe58c808 jdk8-b59 6b1db0b41d2f6e2a7b3bdbc8a8db823b47752906 jdk8-b61 5d0fa0108d028c05753a47bcf2a598357dabf0c0 jdk8-b62 192d8a244bc36427757866e9fb3a08938c0e674c jdk8-b63 +27ab79568c34abf80958d5fa8c04fd1740d243da jdk8-b64 From c0eb3dd25cb2e3df48cbb19e4e179d11f56f6f65 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 8 Nov 2012 11:51:35 -0800 Subject: [PATCH 212/241] Added tag jdk8-b64 for changeset 20d8f4e5a30b --- jaxws/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxws/.hgtags b/jaxws/.hgtags index bc75165561c..4f03309dc73 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -185,3 +185,4 @@ ae107401be116f9e384d3a23192f543828e03da5 jdk8-b59 97e5e74e2a341d9142ce28043912a3c255e28e03 jdk8-b61 d265b9b4c0f55c23a1c9fda02a8052fd9df2eec5 jdk8-b62 86989f702267debe16d13720d5ae7ae9839796f4 jdk8-b63 +5ded18a14bcc80b2a253f2b84da0073a0ecac665 jdk8-b64 From 9d0e05f86d39146f2526b8700ffb1da58c2526b8 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 8 Nov 2012 11:52:26 -0800 Subject: [PATCH 213/241] Added tag jdk8-b64 for changeset 1cb211602711 --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index 0bdb92a90b7..4171aeb8e83 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -185,3 +185,4 @@ cec8fa02f15634acd7d02d04b0b2d8c044cdbaaa jdk8-b60 61ddb3fd000a09ab05bff1940b0ac211661e94cf jdk8-b61 50b8b17449d200c66bfd68fb4f3a9197432c9e2b jdk8-b62 f117a3e06f78a258074674ad17601f99bcb1ce0d jdk8-b63 +26dbd73fb7662a29b3e47179fdc88a0bfa4e231e jdk8-b64 From 342adcc9f73e40e60e4f4022c3dd1c39c5463a01 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 8 Nov 2012 11:53:23 -0800 Subject: [PATCH 214/241] Added tag jdk8-b64 for changeset 323bf6f14277 --- langtools/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/.hgtags b/langtools/.hgtags index 377c3143f47..284a61930a2 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -185,3 +185,4 @@ f299927fc31689385f67ab7322c18eb41d8bd71e jdk8-b59 26020b247ad3806dbca33e029ee12e1b191f59f9 jdk8-b61 b47bb81ba962ef80bb6f0b863c33a0afcfb0b49e jdk8-b62 92e6f2190ca0567c857f85c3fb7a2be5adf079d0 jdk8-b63 +e6ee43b3e2473798b17a556e9f11eebe25ab81d4 jdk8-b64 From d0e329751f52bcfc095a7c9a017855a52865c32a Mon Sep 17 00:00:00 2001 From: Xue-Lei Andrew Fan Date: Fri, 9 Nov 2012 01:15:04 -0800 Subject: [PATCH 215/241] 8001569: Regression test GetPeerHost uses static port number Reviewed-by: weijun --- .../internal/ssl/ServerHandshaker/GetPeerHost.java | 13 ++++++++----- .../ssl/ServerHandshaker/GetPeerHostClient.java | 6 +++--- .../ssl/ServerHandshaker/GetPeerHostServer.java | 10 ++++++++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHost.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHost.java index b14e5cf3ea2..2e4c9005429 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHost.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHost.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,13 +21,15 @@ * questions. */ +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + /** * @test * @bug 4302026 * @run main/othervm GetPeerHost - * - * SunJSSE does not support dynamic system properties, no way to re-use - * system properties in samevm/agentvm mode. * @summary make sure the server side doesn't do DNS lookup. */ import javax.net.*; @@ -41,7 +43,8 @@ public class GetPeerHost { + "/../../../../../../../etc/truststore"); GetPeerHostServer server = new GetPeerHostServer(); server.start(); - GetPeerHostClient client = new GetPeerHostClient(); + GetPeerHostClient client = + new GetPeerHostClient(server.getServerPort()); client.start(); server.join (); if (!server.getPassStatus ()) { diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHostClient.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHostClient.java index 3b025814cae..3aedfda743e 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHostClient.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHostClient.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,13 +38,13 @@ class GetPeerHostClient extends Thread SSLSocket s; String server; - public GetPeerHostClient () + public GetPeerHostClient (int serverPort) { try { SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory .getDefault(); server = InetAddress.getLocalHost().getHostName(); - s = (SSLSocket) factory.createSocket(server, 9999); + s = (SSLSocket) factory.createSocket(server, serverPort); System.out.println("CLIENT: connected to the server- " + server); } catch (Exception e) { System.err.println("Unexpected exceptions: " + e); diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHostServer.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHostServer.java index 6705651fb6c..5383052d167 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHostServer.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHostServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,6 +42,7 @@ class GetPeerHostServer extends Thread private String host; ServerSocket ss; boolean isHostIPAddr = false; + int serverPort = 0; public GetPeerHostServer () { @@ -57,7 +58,8 @@ class GetPeerHostServer extends Thread kmf.init(ks, passphrase); ctx.init(kmf.getKeyManagers(), null, null); ServerSocketFactory ssf = ctx.getServerSocketFactory(); - ss = ssf.createServerSocket(9999); + ss = ssf.createServerSocket(serverPort); + serverPort = ss.getLocalPort(); }catch (Exception e) { System.err.println("Unexpected exceptions: " + e); e.printStackTrace(); @@ -90,4 +92,8 @@ class GetPeerHostServer extends Thread boolean getPassStatus () { return isHostIPAddr; } + + int getServerPort() { + return serverPort; + } } From 99eb0a76071d082d719d613187c7562d6264c082 Mon Sep 17 00:00:00 2001 From: Alejandro Murillo Date: Fri, 9 Nov 2012 08:20:04 -0800 Subject: [PATCH 216/241] Added tag hs25-b09 for changeset f2d39eb04e60 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 33176b6867e..26548a12d24 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -292,3 +292,4 @@ dc16fe422c535ecd4e9f80fb814a1bb9704da6f5 hs25-b07 acabb5c282f59be7e3238920b2ea06b684ab68f7 jdk8-b63 8cb93eadfb6dcab88d91b8e2cd3e0e07d0ac4048 hs25-b08 5920f72e799c8133d1066c4a62fa1fafcb729966 jdk8-b64 +b4ee7b773144a88af8b6b92e4384dea82cb948d8 hs25-b09 From 86d36e5d55b37512aace2759dfb81effb8e377ab Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Sun, 11 Nov 2012 10:05:37 +0000 Subject: [PATCH 217/241] 8003253: TEST_BUG: java/nio/channels/AsynchronousChannelGroup/Unbounded.java hang intermittently [win] Reviewed-by: chegar --- .../channels/AsynchronousChannelGroup/Unbounded.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java index 0ca96fbbb3d..6e764a2b671 100644 --- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java +++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java @@ -36,6 +36,9 @@ public class Unbounded { // number of concurrent completion handlers static final int CONCURRENCY_COUNT = 256; + // set to true if an I/O operation fails + static volatile boolean failed; + public static void main(String[] args) throws Exception { // all accepted connections are added to a queue final ArrayBlockingQueue queue = @@ -51,6 +54,8 @@ public class Unbounded { listener.accept((Void)null, this); } public void failed(Throwable exc, Void att) { + failed = true; + System.err.println("accept failed: " + exc); } }); System.out.println("Listener created."); @@ -94,6 +99,9 @@ public class Unbounded { } } public void failed(Throwable exc, AsynchronousSocketChannel ch) { + failed = true; + System.err.println("read failed: " + exc); + completed(0, ch); } }); } @@ -104,6 +112,7 @@ public class Unbounded { while (remaining > 0) { AsynchronousSocketChannel ch = queue.take(); ch.write(ByteBuffer.wrap("welcome".getBytes())).get(); + ch.shutdownOutput(); ch.close(); remaining--; } @@ -112,5 +121,7 @@ public class Unbounded { System.out.println("Waiting for all threads to reach barrier"); barrier.await(); listener.close(); + if (failed) + throw new RuntimeException("I/O failed failed, see log for details"); } } From aaa52056e9577bfcdd13e3744510f5a0dbb761af Mon Sep 17 00:00:00 2001 From: Masayoshi Okutsu Date: Mon, 12 Nov 2012 11:12:29 +0900 Subject: [PATCH 218/241] 8000986: Split java.util.spi.CalendarDataProvider into week parameters and field names portions Reviewed-by: naoto --- jdk/make/java/java/FILES_java.gmk | 2 + .../HostLocaleProviderAdapterImpl.java | 35 ++- jdk/src/share/classes/java/util/Calendar.java | 7 +- .../java/util/spi/CalendarDataProvider.java | 224 +-------------- .../java/util/spi/CalendarNameProvider.java | 264 ++++++++++++++++++ .../provider/AuxLocaleProviderAdapter.java | 5 + .../provider/CalendarDataProviderImpl.java | 150 +--------- .../locale/provider/CalendarDataUtility.java | 62 +++- .../provider/CalendarNameProviderImpl.java | 234 ++++++++++++++++ .../provider/JRELocaleProviderAdapter.java | 27 +- .../provider/LocaleProviderAdapter.java | 9 + .../provider/SPILocaleProviderAdapter.java | 59 +++- .../HostLocaleProviderAdapterImpl.java | 52 ++-- .../CalendarDataProviderTest.java | 51 +--- .../CalendarDataProviderTest.sh | 2 +- .../CalendarNameProviderTest.java | 104 +++++++ .../CalendarNameProviderTest.sh | 27 ++ .../util/PluggableLocale/GenericTest.java | 2 + .../java/util/PluggableLocale/barprovider.jar | Bin 13747 -> 14629 bytes .../java/util/PluggableLocale/fooprovider.jar | Bin 16866 -> 16866 bytes .../providersrc/CalendarDataProviderImpl.java | 58 ---- .../providersrc/CalendarNameProviderImpl.java | 102 +++++++ .../util/PluggableLocale/providersrc/Makefile | 9 +- .../java.util.spi.CalendarNameProvider | 7 + 24 files changed, 963 insertions(+), 529 deletions(-) create mode 100644 jdk/src/share/classes/java/util/spi/CalendarNameProvider.java create mode 100644 jdk/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java create mode 100644 jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.java create mode 100644 jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.sh create mode 100644 jdk/test/java/util/PluggableLocale/providersrc/CalendarNameProviderImpl.java create mode 100644 jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CalendarNameProvider diff --git a/jdk/make/java/java/FILES_java.gmk b/jdk/make/java/java/FILES_java.gmk index 246acf3e3aa..c35bb29989c 100644 --- a/jdk/make/java/java/FILES_java.gmk +++ b/jdk/make/java/java/FILES_java.gmk @@ -206,6 +206,7 @@ JAVA_JAVA_java = \ sun/util/locale/provider/BreakIteratorProviderImpl.java \ sun/util/locale/provider/CalendarDataProviderImpl.java \ sun/util/locale/provider/CalendarDataUtility.java \ + sun/util/locale/provider/CalendarNameProviderImpl.java \ sun/util/locale/provider/CollationRules.java \ sun/util/locale/provider/CollatorProviderImpl.java \ sun/util/locale/provider/CurrencyNameProviderImpl.java \ @@ -396,6 +397,7 @@ JAVA_JAVA_java = \ java/util/prefs/Base64.java \ java/util/prefs/XmlSupport.java \ java/util/spi/CalendarDataProvider.java \ + java/util/spi/CalendarNameProvider.java \ java/util/spi/CurrencyNameProvider.java \ java/util/spi/LocaleNameProvider.java \ java/util/spi/LocaleServiceProvider.java \ diff --git a/jdk/src/macosx/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java b/jdk/src/macosx/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java index 6a6aec83b89..f571512d30b 100644 --- a/jdk/src/macosx/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java +++ b/jdk/src/macosx/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java @@ -41,6 +41,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.spi.CalendarDataProvider; +import java.util.spi.CalendarNameProvider; import java.util.spi.CurrencyNameProvider; import java.util.spi.LocaleNameProvider; import java.util.spi.TimeZoneNameProvider; @@ -323,6 +324,30 @@ public class HostLocaleProviderAdapterImpl { return isSupportedCalendarLocale(locale); } + @Override + public int getFirstDayOfWeek(Locale locale) { + return getCalendarInt(locale.toLanguageTag(), CD_FIRSTDAYOFWEEK); + } + + @Override + public int getMinimalDaysInFirstWeek(Locale locale) { + return getCalendarInt(locale.toLanguageTag(), CD_MINIMALDAYSINFIRSTWEEK); + } + }; + } + + public static CalendarNameProvider getCalendarNameProvider() { + return new CalendarNameProvider() { + @Override + public Locale[] getAvailableLocales() { + return getSupportedCalendarLocales(); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return isSupportedCalendarLocale(locale); + } + @Override public String getDisplayName(String calType, int field, int value, int style, Locale locale) { @@ -334,16 +359,6 @@ public class HostLocaleProviderAdapterImpl { int field, int style, Locale locale) { return null; } - - @Override - public int getFirstDayOfWeek(Locale locale) { - return getCalendarInt(locale.toLanguageTag(), CD_FIRSTDAYOFWEEK); - } - - @Override - public int getMinimalDaysInFirstWeek(Locale locale) { - return getCalendarInt(locale.toLanguageTag(), CD_MINIMALDAYSINFIRSTWEEK); - } }; } diff --git a/jdk/src/share/classes/java/util/Calendar.java b/jdk/src/share/classes/java/util/Calendar.java index bae9cacfc60..f641a37e632 100644 --- a/jdk/src/share/classes/java/util/Calendar.java +++ b/jdk/src/share/classes/java/util/Calendar.java @@ -2699,12 +2699,9 @@ public abstract class Calendar implements Serializable, Cloneable, ComparableCalendar Types - * - *

    Calendar types are used to specify calendar systems for which the {@link - * #getDisplayName(String, int, int, int, Locale) getDisplayName} and {@link - * #getDisplayNames(String, int, int, Locale) getDisplayNames} methods provide - * calendar field value names. See {@link Calendar#getCalendarType()} for details. - * - *

    Calendar Fields - * - *

    Calendar fields are specified with the constants defined in {@link - * Calendar}. The following are calendar-common fields and their values to be - * supported for each calendar system. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
    FieldValueDescription
    {@link Calendar#MONTH}{@link Calendar#JANUARY} to {@link Calendar#UNDECIMBER}Month numbering is 0-based (e.g., 0 - January, ..., 11 - - * December). Some calendar systems have 13 months. Month - * names need to be supported in both the formatting and - * stand-alone forms if required by the supported locales. If there's - * no distinction in the two forms, the same names should be returned - * in both of the forms.
    {@link Calendar#DAY_OF_WEEK}{@link Calendar#SUNDAY} to {@link Calendar#SATURDAY}Day-of-week numbering is 1-based starting from Sunday (i.e., 1 - Sunday, - * ..., 7 - Saturday).
    {@link Calendar#AM_PM}{@link Calendar#AM} to {@link Calendar#PM}0 - AM, 1 - PM
    - * - *

    The following are calendar-specific fields and their values to be supported. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
    Calendar TypeFieldValueDescription
    {@code "gregory"}{@link Calendar#ERA}0{@link java.util.GregorianCalendar#BC} (BCE)
    1{@link java.util.GregorianCalendar#AD} (CE)
    {@code "buddhist"}{@link Calendar#ERA}0BC (BCE)
    1B.E. (Buddhist Era)
    {@code "japanese"}{@link Calendar#ERA}0Seireki (Before Meiji)
    1Meiji
    2Taisho
    3Showa
    4Heisei
    {@link Calendar#YEAR}1the first year in each era. It should be returned when a long - * style ({@link Calendar#LONG_FORMAT} or {@link Calendar#LONG_STANDALONE}) is - * specified. See also the - * Year representation in {@code SimpleDateFormat}.
    - * - *

    Calendar field value names for {@code "gregory"} must be consistent with - * the date-time symbols provided by {@link java.text.spi.DateFormatSymbolsProvider}. - * - *

    Time zone names are supported by {@link TimeZoneNameProvider}. + * An abstract class for service providers that provide locale-dependent {@link + * Calendar} parameters. * * @author Masayoshi Okutsu * @since 1.8 - * @see Locale#getUnicodeLocaleType(String) + * @see CalendarNameProvider */ public abstract class CalendarDataProvider extends LocaleServiceProvider { @@ -188,112 +78,4 @@ public abstract class CalendarDataProvider extends LocaleServiceProvider { * @see java.util.Calendar#getMinimalDaysInFirstWeek() */ public abstract int getMinimalDaysInFirstWeek(Locale locale); - - /** - * Returns the string representation (display name) of the calendar - * field value in the given style and - * locale. If no string representation is - * applicable, null is returned. - * - *

    {@code field} is a {@code Calendar} field index, such as {@link - * Calendar#MONTH}. The time zone fields, {@link Calendar#ZONE_OFFSET} and - * {@link Calendar#DST_OFFSET}, are not supported by this - * method. {@code null} must be returned if any time zone fields are - * specified. - * - *

    {@code value} is the numeric representation of the {@code field} value. - * For example, if {@code field} is {@link Calendar#DAY_OF_WEEK}, the valid - * values are {@link Calendar#SUNDAY} to {@link Calendar#SATURDAY} - * (inclusive). - * - *

    {@code style} gives the style of the string representation. It is one - * of {@link Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}), - * {@link Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT} - * ({@link Calendar#LONG LONG}), or {@link Calendar#LONG_STANDALONE}. - * - *

    For example, the following call will return {@code "Sunday"}. - *

    -     * getDisplayName("gregory", Calendar.DAY_OF_WEEK, Calendar.SUNDAY,
    -     *                Calendar.LONG_STANDALONE, Locale.ENGLISH);
    -     * 
    - * - * @param calendarType - * the calendar type. (Any calendar type given by {@code locale} - * is ignored.) - * @param field - * the {@code Calendar} field index, - * such as {@link Calendar#DAY_OF_WEEK} - * @param value - * the value of the {@code Calendar field}, - * such as {@link Calendar#MONDAY} - * @param style - * the string representation style: one of {@link - * Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}), - * {@link Calendar#SHORT_STANDALONE}, {@link - * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or - * {@link Calendar#LONG_STANDALONE} - * @param locale - * the desired locale - * @return the string representation of the {@code field value}, or {@code - * null} if the string representation is not applicable or - * the given calendar type is unknown - * @throws IllegalArgumentException - * if {@code field} or {@code style} is invalid - * @throws NullPointerException if {@code locale} is {@code null} - * @see TimeZoneNameProvider - * @see java.util.Calendar#get(int) - * @see java.util.Calendar#getDisplayName(int, int, Locale) - */ - public abstract String getDisplayName(String calendarType, - int field, int value, - int style, Locale locale); - - /** - * Returns a {@code Map} containing all string representations (display - * names) of the {@code Calendar} {@code field} in the given {@code style} - * and {@code locale} and their corresponding field values. - * - *

    {@code field} is a {@code Calendar} field index, such as {@link - * Calendar#MONTH}. The time zone fields, {@link Calendar#ZONE_OFFSET} and - * {@link Calendar#DST_OFFSET}, are not supported by this - * method. {@code null} must be returned if any time zone fields are specified. - * - *

    {@code style} gives the style of the string representation. It must be - * one of {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} ({@link - * Calendar#SHORT SHORT}), {@link Calendar#SHORT_STANDALONE}, {@link - * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or {@link - * Calendar#LONG_STANDALONE}. - * - *

    For example, the following call will return a {@code Map} containing - * {@code "January"} to {@link Calendar#JANUARY}, {@code "Jan"} to {@link - * Calendar#JANUARY}, {@code "February"} to {@link Calendar#FEBRUARY}, - * {@code "Feb"} to {@link Calendar#FEBRUARY}, and so on. - *

    -     * getDisplayNames("gregory", Calendar.MONTH, Calendar.ALL_STYLES, Locale.ENGLISH);
    -     * 
    - * - * @param calendarType - * the calendar type. (Any calendar type given by {@code locale} - * is ignored.) - * @param field - * the calendar field for which the display names are returned - * @param style - * the style applied to the display names; one of - * {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} - * ({@link Calendar#SHORT SHORT}), {@link - * Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT} - * ({@link Calendar#LONG LONG}), or {@link - * Calendar#LONG_STANDALONE}. - * @param locale - * the desired locale - * @return a {@code Map} containing all display names of {@code field} in - * {@code style} and {@code locale} and their {@code field} values, - * or {@code null} if no display names are defined for {@code field} - * @throws NullPointerException - * if {@code locale} is {@code null} - * @see Calendar#getDisplayNames(int, int, Locale) - */ - public abstract Map getDisplayNames(String calendarType, - int field, int style, - Locale locale); } diff --git a/jdk/src/share/classes/java/util/spi/CalendarNameProvider.java b/jdk/src/share/classes/java/util/spi/CalendarNameProvider.java new file mode 100644 index 00000000000..20122cf5466 --- /dev/null +++ b/jdk/src/share/classes/java/util/spi/CalendarNameProvider.java @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.util.spi; + +import java.util.Calendar; +import java.util.Locale; +import java.util.Map; + +/** + * An abstract class for service providers that provide localized string + * representations (display names) of {@code Calendar} field values. + * + *

    Calendar Types + * + *

    Calendar types are used to specify calendar systems for which the {@link + * #getDisplayName(String, int, int, int, Locale) getDisplayName} and {@link + * #getDisplayNames(String, int, int, Locale) getDisplayNames} methods provide + * calendar field value names. See {@link Calendar#getCalendarType()} for details. + * + *

    Calendar Fields + * + *

    Calendar fields are specified with the constants defined in {@link + * Calendar}. The following are calendar-common fields and their values to be + * supported for each calendar system. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    FieldValueDescription
    {@link Calendar#MONTH}{@link Calendar#JANUARY} to {@link Calendar#UNDECIMBER}Month numbering is 0-based (e.g., 0 - January, ..., 11 - + * December). Some calendar systems have 13 months. Month + * names need to be supported in both the formatting and + * stand-alone forms if required by the supported locales. If there's + * no distinction in the two forms, the same names should be returned + * in both of the forms.
    {@link Calendar#DAY_OF_WEEK}{@link Calendar#SUNDAY} to {@link Calendar#SATURDAY}Day-of-week numbering is 1-based starting from Sunday (i.e., 1 - Sunday, + * ..., 7 - Saturday).
    {@link Calendar#AM_PM}{@link Calendar#AM} to {@link Calendar#PM}0 - AM, 1 - PM
    + * + *

    The following are calendar-specific fields and their values to be supported. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Calendar TypeFieldValueDescription
    {@code "gregory"}{@link Calendar#ERA}0{@link java.util.GregorianCalendar#BC} (BCE)
    1{@link java.util.GregorianCalendar#AD} (CE)
    {@code "buddhist"}{@link Calendar#ERA}0BC (BCE)
    1B.E. (Buddhist Era)
    {@code "japanese"}{@link Calendar#ERA}0Seireki (Before Meiji)
    1Meiji
    2Taisho
    3Showa
    4Heisei
    {@link Calendar#YEAR}1the first year in each era. It should be returned when a long + * style ({@link Calendar#LONG_FORMAT} or {@link Calendar#LONG_STANDALONE}) is + * specified. See also the + * Year representation in {@code SimpleDateFormat}.
    + * + *

    Calendar field value names for {@code "gregory"} must be consistent with + * the date-time symbols provided by {@link java.text.spi.DateFormatSymbolsProvider}. + * + *

    Time zone names are supported by {@link TimeZoneNameProvider}. + * + * @author Masayoshi Okutsu + * @since 1.8 + * @see CalendarDataProvider + * @see Locale#getUnicodeLocaleType(String) + */ +public abstract class CalendarNameProvider extends LocaleServiceProvider { + /** + * Sole constructor. (For invocation by subclass constructors, typically + * implicit.) + */ + protected CalendarNameProvider() { + } + + /** + * Returns the string representation (display name) of the calendar + * field value in the given style and + * locale. If no string representation is + * applicable, null is returned. + * + *

    {@code field} is a {@code Calendar} field index, such as {@link + * Calendar#MONTH}. The time zone fields, {@link Calendar#ZONE_OFFSET} and + * {@link Calendar#DST_OFFSET}, are not supported by this + * method. {@code null} must be returned if any time zone fields are + * specified. + * + *

    {@code value} is the numeric representation of the {@code field} value. + * For example, if {@code field} is {@link Calendar#DAY_OF_WEEK}, the valid + * values are {@link Calendar#SUNDAY} to {@link Calendar#SATURDAY} + * (inclusive). + * + *

    {@code style} gives the style of the string representation. It is one + * of {@link Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}), + * {@link Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT} + * ({@link Calendar#LONG LONG}), or {@link Calendar#LONG_STANDALONE}. + * + *

    For example, the following call will return {@code "Sunday"}. + *

    +     * getDisplayName("gregory", Calendar.DAY_OF_WEEK, Calendar.SUNDAY,
    +     *                Calendar.LONG_STANDALONE, Locale.ENGLISH);
    +     * 
    + * + * @param calendarType + * the calendar type. (Any calendar type given by {@code locale} + * is ignored.) + * @param field + * the {@code Calendar} field index, + * such as {@link Calendar#DAY_OF_WEEK} + * @param value + * the value of the {@code Calendar field}, + * such as {@link Calendar#MONDAY} + * @param style + * the string representation style: one of {@link + * Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}), + * {@link Calendar#SHORT_STANDALONE}, {@link + * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or + * {@link Calendar#LONG_STANDALONE} + * @param locale + * the desired locale + * @return the string representation of the {@code field value}, or {@code + * null} if the string representation is not applicable or + * the given calendar type is unknown + * @throws IllegalArgumentException + * if {@code field} or {@code style} is invalid + * @throws NullPointerException if {@code locale} is {@code null} + * @see TimeZoneNameProvider + * @see java.util.Calendar#get(int) + * @see java.util.Calendar#getDisplayName(int, int, Locale) + */ + public abstract String getDisplayName(String calendarType, + int field, int value, + int style, Locale locale); + + /** + * Returns a {@code Map} containing all string representations (display + * names) of the {@code Calendar} {@code field} in the given {@code style} + * and {@code locale} and their corresponding field values. + * + *

    {@code field} is a {@code Calendar} field index, such as {@link + * Calendar#MONTH}. The time zone fields, {@link Calendar#ZONE_OFFSET} and + * {@link Calendar#DST_OFFSET}, are not supported by this + * method. {@code null} must be returned if any time zone fields are specified. + * + *

    {@code style} gives the style of the string representation. It must be + * one of {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} ({@link + * Calendar#SHORT SHORT}), {@link Calendar#SHORT_STANDALONE}, {@link + * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or {@link + * Calendar#LONG_STANDALONE}. + * + *

    For example, the following call will return a {@code Map} containing + * {@code "January"} to {@link Calendar#JANUARY}, {@code "Jan"} to {@link + * Calendar#JANUARY}, {@code "February"} to {@link Calendar#FEBRUARY}, + * {@code "Feb"} to {@link Calendar#FEBRUARY}, and so on. + *

    +     * getDisplayNames("gregory", Calendar.MONTH, Calendar.ALL_STYLES, Locale.ENGLISH);
    +     * 
    + * + * @param calendarType + * the calendar type. (Any calendar type given by {@code locale} + * is ignored.) + * @param field + * the calendar field for which the display names are returned + * @param style + * the style applied to the display names; one of + * {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} + * ({@link Calendar#SHORT SHORT}), {@link + * Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT} + * ({@link Calendar#LONG LONG}), or {@link + * Calendar#LONG_STANDALONE}. + * @param locale + * the desired locale + * @return a {@code Map} containing all display names of {@code field} in + * {@code style} and {@code locale} and their {@code field} values, + * or {@code null} if no display names are defined for {@code field} + * @throws NullPointerException + * if {@code locale} is {@code null} + * @see Calendar#getDisplayNames(int, int, Locale) + */ + public abstract Map getDisplayNames(String calendarType, + int field, int style, + Locale locale); +} diff --git a/jdk/src/share/classes/sun/util/locale/provider/AuxLocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/AuxLocaleProviderAdapter.java index 9afb8b04b01..a68a8ba956d 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/AuxLocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/AuxLocaleProviderAdapter.java @@ -38,6 +38,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.spi.CalendarDataProvider; +import java.util.spi.CalendarNameProvider; import java.util.spi.CurrencyNameProvider; import java.util.spi.LocaleNameProvider; import java.util.spi.LocaleServiceProvider; @@ -135,6 +136,10 @@ public abstract class AuxLocaleProviderAdapter extends LocaleProviderAdapter { return getLocaleServiceProvider(CalendarDataProvider.class); } + @Override + public CalendarNameProvider getCalendarNameProvider() { + return getLocaleServiceProvider(CalendarNameProvider.class); + } @Override public LocaleResources getLocaleResources(Locale locale) { diff --git a/jdk/src/share/classes/sun/util/locale/provider/CalendarDataProviderImpl.java b/jdk/src/share/classes/sun/util/locale/provider/CalendarDataProviderImpl.java index 48ef4712ee5..16d08b3cbe3 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/CalendarDataProviderImpl.java +++ b/jdk/src/share/classes/sun/util/locale/provider/CalendarDataProviderImpl.java @@ -24,10 +24,9 @@ */ package sun.util.locale.provider; +import java.util.Calendar; import static java.util.Calendar.*; -import java.util.HashMap; import java.util.Locale; -import java.util.Map; import java.util.ResourceBundle; import java.util.Set; import java.util.spi.CalendarDataProvider; @@ -58,115 +57,11 @@ public class CalendarDataProviderImpl extends CalendarDataProvider implements Av return getIntData(CalendarDataUtility.MINIMAL_DAYS_IN_FIRST_WEEK, locale); } - @Override - public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) { - String name = null; - String key = getKey(calendarType, field, style); - if (key != null) { - ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale); - if (rb.containsKey(key)) { - String[] strings = rb.getStringArray(key); - if (strings.length > 0) { - if (field == DAY_OF_WEEK || field == YEAR) { - --value; - } - name = strings[value]; - // If name is empty in standalone, try its `format' style. - if (name.length() == 0 - && (style == SHORT_STANDALONE || style == LONG_STANDALONE)) { - name = getDisplayName(calendarType, field, value, - style == SHORT_STANDALONE ? SHORT_FORMAT : LONG_FORMAT, - locale); - } - } - } - } - return name; - } - - @Override - public Map getDisplayNames(String calendarType, int field, int style, Locale locale) { - Map names; - if (style == ALL_STYLES) { - names = getDisplayNamesImpl(calendarType, field, SHORT_FORMAT, locale); - if (field != AM_PM) { - for (int st : new int[] { SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE }) { - names.putAll(getDisplayNamesImpl(calendarType, field, st, locale)); - } - } - } else { - // specific style - names = getDisplayNamesImpl(calendarType, field, style, locale); - } - return names.isEmpty() ? null : names; - } - - private Map getDisplayNamesImpl(String calendarType, int field, - int style, Locale locale) { - String key = getKey(calendarType, field, style); - Map map = new HashMap<>(); - if (key != null) { - ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale); - if (rb.containsKey(key)) { - String[] strings = rb.getStringArray(key); - if (field == YEAR) { - if (strings.length > 0) { - map.put(strings[0], 1); - } - } else { - int base = (field == DAY_OF_WEEK) ? 1 : 0; - for (int i = 0; i < strings.length; i++) { - String name = strings[i]; - // Ignore any empty string (some standalone month names - // are not defined) - if (name.length() == 0) { - continue; - } - map.put(name, base + i); - } - } - } - } - return map; - } - @Override public Locale[] getAvailableLocales() { return LocaleProviderAdapter.toLocaleArray(langtags); } - @Override - public boolean isSupportedLocale(Locale locale) { - if (Locale.ROOT.equals(locale)) { - return true; - } - String calendarType = null; - if (locale.hasExtensions()) { - calendarType = locale.getUnicodeLocaleType("ca"); - locale = locale.stripExtensions(); - } - - if (calendarType != null) { - switch (calendarType) { - case "buddhist": - case "japanese": - case "gregory": - break; - default: - // Unknown calendar type - return false; - } - } - if (langtags.contains(locale.toLanguageTag())) { - return true; - } - if (type == LocaleProviderAdapter.Type.JRE) { - String oldname = locale.toString().replace('_', '-'); - return langtags.contains(oldname); - } - return false; - } - @Override public Set getAvailableLanguageTags() { return langtags; @@ -178,49 +73,6 @@ public class CalendarDataProviderImpl extends CalendarDataProvider implements Av String firstday = rb.getString(key); return Integer.parseInt(firstday); } - // Note that the base bundle of CLDR doesn't have the Calendar week parameters. return 0; } - - private String getKey(String type, int field, int style) { - boolean standalone = (style & 0x8000) != 0; - style &= ~0x8000; - - if ("gregory".equals(type)) { - type = null; - } - - StringBuilder key = new StringBuilder(); - switch (field) { - case ERA: - if (type != null) { - key.append(type).append('.'); - } - if (style == SHORT) { - key.append("short."); - } - key.append("Eras"); - break; - - case YEAR: - key.append(type).append(".FirstYear"); - break; - - case MONTH: - if (standalone) { - key.append("standalone."); - } - key.append(style == SHORT ? "MonthAbbreviations" : "MonthNames"); - break; - - case DAY_OF_WEEK: - key.append(style == SHORT ? "DayAbbreviations" : "DayNames"); - break; - - case AM_PM: - key.append("AmPmMarkers"); - break; - } - return key.length() > 0 ? key.toString() : null; - } } diff --git a/jdk/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java b/jdk/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java index 274be8e8787..e86e27234bd 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java +++ b/jdk/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java @@ -25,9 +25,12 @@ package sun.util.locale.provider; +import java.util.Calendar; +import static java.util.Calendar.*; import java.util.Locale; import java.util.Map; import java.util.spi.CalendarDataProvider; +import java.util.spi.CalendarNameProvider; /** * {@code CalendarDataUtility} is a utility class for calling the @@ -44,16 +47,32 @@ public class CalendarDataUtility { private CalendarDataUtility() { } - public static String retrieveFieldValueName(String id, int field, int value, int style, Locale locale) { + public static int retrieveFirstDayOfWeek(Locale locale) { LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(CalendarDataProvider.class); + Integer value = pool.getLocalizedObject(CalendarWeekParameterGetter.INSTANCE, + locale, FIRST_DAY_OF_WEEK); + return (value != null && (value >= SUNDAY && value <= SATURDAY)) ? value : SUNDAY; + } + + public static int retrieveMinimalDaysInFirstWeek(Locale locale) { + LocaleServiceProviderPool pool = + LocaleServiceProviderPool.getPool(CalendarDataProvider.class); + Integer value = pool.getLocalizedObject(CalendarWeekParameterGetter.INSTANCE, + locale, MINIMAL_DAYS_IN_FIRST_WEEK); + return (value != null && (value >= 1 && value <= 7)) ? value : 1; + } + + public static String retrieveFieldValueName(String id, int field, int value, int style, Locale locale) { + LocaleServiceProviderPool pool = + LocaleServiceProviderPool.getPool(CalendarNameProvider.class); return pool.getLocalizedObject(CalendarFieldValueNameGetter.INSTANCE, locale, id, field, value, style); } public static Map retrieveFieldValueNames(String id, int field, int style, Locale locale) { LocaleServiceProviderPool pool = - LocaleServiceProviderPool.getPool(CalendarDataProvider.class); + LocaleServiceProviderPool.getPool(CalendarNameProvider.class); return pool.getLocalizedObject(CalendarFieldValueNamesMapGetter.INSTANCE, locale, id, field, style); } @@ -62,13 +81,13 @@ public class CalendarDataUtility { * implementation. */ private static class CalendarFieldValueNameGetter - implements LocaleServiceProviderPool.LocalizedObjectGetter { private static final CalendarFieldValueNameGetter INSTANCE = new CalendarFieldValueNameGetter(); @Override - public String getObject(CalendarDataProvider calendarDataProvider, + public String getObject(CalendarNameProvider calendarNameProvider, Locale locale, String requestID, // calendarType Object... params) { @@ -76,7 +95,7 @@ public class CalendarDataUtility { int field = (int) params[0]; int value = (int) params[1]; int style = (int) params[2]; - return calendarDataProvider.getDisplayName(requestID, field, value, style, locale); + return calendarNameProvider.getDisplayName(requestID, field, value, style, locale); } } @@ -85,20 +104,47 @@ public class CalendarDataUtility { * implementation. */ private static class CalendarFieldValueNamesMapGetter - implements LocaleServiceProviderPool.LocalizedObjectGetter> { private static final CalendarFieldValueNamesMapGetter INSTANCE = new CalendarFieldValueNamesMapGetter(); @Override - public Map getObject(CalendarDataProvider calendarDataProvider, + public Map getObject(CalendarNameProvider calendarNameProvider, Locale locale, String requestID, // calendarType Object... params) { assert params.length == 2; int field = (int) params[0]; int style = (int) params[1]; - return calendarDataProvider.getDisplayNames(requestID, field, style, locale); + return calendarNameProvider.getDisplayNames(requestID, field, style, locale); + } + } + + private static class CalendarWeekParameterGetter + implements LocaleServiceProviderPool.LocalizedObjectGetter { + private static final CalendarWeekParameterGetter INSTANCE = + new CalendarWeekParameterGetter(); + + @Override + public Integer getObject(CalendarDataProvider calendarDataProvider, + Locale locale, + String requestID, // resource key + Object... params) { + assert params.length == 0; + int value; + switch (requestID) { + case FIRST_DAY_OF_WEEK: + value = calendarDataProvider.getFirstDayOfWeek(locale); + break; + case MINIMAL_DAYS_IN_FIRST_WEEK: + value = calendarDataProvider.getMinimalDaysInFirstWeek(locale); + break; + default: + throw new InternalError("invalid requestID: " + requestID); + } + return (value != 0) ? value : null; } } } diff --git a/jdk/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java b/jdk/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java new file mode 100644 index 00000000000..1f262a8445a --- /dev/null +++ b/jdk/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package sun.util.locale.provider; + +import static java.util.Calendar.*; +import java.util.Comparator; +import java.util.Locale; +import java.util.Map; +import java.util.ResourceBundle; +import java.util.Set; +import java.util.TreeMap; +import java.util.spi.CalendarNameProvider; + +/** + * Concrete implementation of the {@link java.util.spi.CalendarDataProvider + * CalendarDataProvider} class for the JRE LocaleProviderAdapter. + * + * @author Masayoshi Okutsu + * @author Naoto Sato + */ +public class CalendarNameProviderImpl extends CalendarNameProvider implements AvailableLanguageTags { + private final LocaleProviderAdapter.Type type; + private final Set langtags; + + public CalendarNameProviderImpl(LocaleProviderAdapter.Type type, Set langtags) { + this.type = type; + this.langtags = langtags; + } + + @Override + public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) { + String name = null; + String key = getKey(calendarType, field, style); + if (key != null) { + ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale); + if (rb.containsKey(key)) { + String[] strings = rb.getStringArray(key); + if (strings.length > 0) { + if (field == DAY_OF_WEEK || field == YEAR) { + --value; + } + name = strings[value]; + // If name is empty in standalone, try its `format' style. + if (name.length() == 0 + && (style == SHORT_STANDALONE || style == LONG_STANDALONE)) { + name = getDisplayName(calendarType, field, value, + style == SHORT_STANDALONE ? SHORT_FORMAT : LONG_FORMAT, + locale); + } + } + } + } + return name; + } + + @Override + public Map getDisplayNames(String calendarType, int field, int style, Locale locale) { + Map names; + if (style == ALL_STYLES) { + names = getDisplayNamesImpl(calendarType, field, SHORT_FORMAT, locale); + if (field != AM_PM) { + for (int st : new int[] { SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE }) { + names.putAll(getDisplayNamesImpl(calendarType, field, st, locale)); + } + } + } else { + // specific style + names = getDisplayNamesImpl(calendarType, field, style, locale); + } + return names.isEmpty() ? null : names; + } + + private Map getDisplayNamesImpl(String calendarType, int field, + int style, Locale locale) { + String key = getKey(calendarType, field, style); + Map map = new TreeMap<>(LengthBasedComparator.INSTANCE); + if (key != null) { + ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale); + if (rb.containsKey(key)) { + String[] strings = rb.getStringArray(key); + if (field == YEAR) { + if (strings.length > 0) { + map.put(strings[0], 1); + } + } else { + int base = (field == DAY_OF_WEEK) ? 1 : 0; + for (int i = 0; i < strings.length; i++) { + String name = strings[i]; + // Ignore any empty string (some standalone month names + // are not defined) + if (name.length() == 0) { + continue; + } + map.put(name, base + i); + } + } + } + } + return map; + } + + /** + * Comparator implementation for TreeMap which iterates keys from longest + * to shortest. + */ + private static class LengthBasedComparator implements Comparator { + private static final LengthBasedComparator INSTANCE = new LengthBasedComparator(); + + private LengthBasedComparator() { + } + + @Override + public int compare(String o1, String o2) { + int n = o2.length() - o1.length(); + return (n == 0) ? o1.compareTo(o2) : n; + } + } + + @Override + public Locale[] getAvailableLocales() { + return LocaleProviderAdapter.toLocaleArray(langtags); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + if (Locale.ROOT.equals(locale)) { + return true; + } + String calendarType = null; + if (locale.hasExtensions()) { + calendarType = locale.getUnicodeLocaleType("ca"); + locale = locale.stripExtensions(); + } + + if (calendarType != null) { + switch (calendarType) { + case "buddhist": + case "japanese": + case "gregory": + break; + default: + // Unknown calendar type + return false; + } + } + if (langtags.contains(locale.toLanguageTag())) { + return true; + } + if (type == LocaleProviderAdapter.Type.JRE) { + String oldname = locale.toString().replace('_', '-'); + return langtags.contains(oldname); + } + return false; + } + + @Override + public Set getAvailableLanguageTags() { + return langtags; + } + + private int getIntData(String key, Locale locale) { + ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getCalendarData(locale); + if (rb.containsKey(key)) { + String firstday = rb.getString(key); + return Integer.parseInt(firstday); + } + // Note that the base bundle of CLDR doesn't have the Calendar week parameters. + return 0; + } + + private String getKey(String type, int field, int style) { + boolean standalone = (style & 0x8000) != 0; + style &= ~0x8000; + + if ("gregory".equals(type)) { + type = null; + } + + StringBuilder key = new StringBuilder(); + switch (field) { + case ERA: + if (type != null) { + key.append(type).append('.'); + } + if (style == SHORT) { + key.append("short."); + } + key.append("Eras"); + break; + + case YEAR: + key.append(type).append(".FirstYear"); + break; + + case MONTH: + if (standalone) { + key.append("standalone."); + } + key.append(style == SHORT ? "MonthAbbreviations" : "MonthNames"); + break; + + case DAY_OF_WEEK: + key.append(style == SHORT ? "DayAbbreviations" : "DayNames"); + break; + + case AM_PM: + key.append("AmPmMarkers"); + break; + } + return key.length() > 0 ? key.toString() : null; + } +} diff --git a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java index e6b3d9e1e32..9f86f7a35ab 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java @@ -41,6 +41,7 @@ import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.spi.CalendarDataProvider; +import java.util.spi.CalendarNameProvider; import java.util.spi.CurrencyNameProvider; import java.util.spi.LocaleNameProvider; import java.util.spi.LocaleServiceProvider; @@ -101,6 +102,8 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { return (P) getTimeZoneNameProvider(); case "CalendarDataProvider": return (P) getCalendarDataProvider(); + case "CalendarNameProvider": + return (P) getCalendarNameProvider(); default: throw new InternalError("should not come down here"); } @@ -117,6 +120,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { private volatile LocaleNameProvider localeNameProvider = null; private volatile TimeZoneNameProvider timeZoneNameProvider = null; private volatile CalendarDataProvider calendarDataProvider = null; + private volatile CalendarNameProvider calendarNameProvider = null; /* * Getter methods for java.text.spi.* providers @@ -252,11 +256,9 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { @Override public CalendarDataProvider getCalendarDataProvider() { if (calendarDataProvider == null) { - Set set = new HashSet<>(); - set.addAll(getLanguageTagSet("FormatData")); - set.addAll(getLanguageTagSet("CalendarData")); - CalendarDataProvider provider = new CalendarDataProviderImpl(getAdapterType(), - set); + CalendarDataProvider provider; + provider = new CalendarDataProviderImpl(getAdapterType(), + getLanguageTagSet("CalendarData")); synchronized (this) { if (calendarDataProvider == null) { calendarDataProvider = provider; @@ -266,6 +268,21 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { return calendarDataProvider; } + @Override + public CalendarNameProvider getCalendarNameProvider() { + if (calendarNameProvider == null) { + CalendarNameProvider provider; + provider = new CalendarNameProviderImpl(getAdapterType(), + getLanguageTagSet("FormatData")); + synchronized (this) { + if (calendarNameProvider == null) { + calendarNameProvider = provider; + } + } + } + return calendarNameProvider; + } + @Override public LocaleResources getLocaleResources(Locale locale) { LocaleResources lr = localeResourcesMap.get(locale); diff --git a/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java index 7db4560f81c..17f5c0999d5 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java @@ -38,6 +38,7 @@ import java.util.Locale; import java.util.ResourceBundle; import java.util.Set; import java.util.spi.CalendarDataProvider; +import java.util.spi.CalendarNameProvider; import java.util.spi.CurrencyNameProvider; import java.util.spi.LocaleNameProvider; import java.util.spi.LocaleServiceProvider; @@ -387,6 +388,14 @@ public abstract class LocaleProviderAdapter { */ public abstract CalendarDataProvider getCalendarDataProvider(); + /** + * Returns a CalendarNameProvider for this LocaleProviderAdapter, or null if no + * CalendarNameProvider is available. + * + * @return a CalendarNameProvider + */ + public abstract CalendarNameProvider getCalendarNameProvider(); + public abstract LocaleResources getLocaleResources(Locale locale); public abstract LocaleData getLocaleData(); diff --git a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java index cb4f9aee7de..1d380e38ac2 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java @@ -28,11 +28,29 @@ package sun.util.locale.provider; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; -import java.text.*; -import java.text.spi.*; -import java.util.*; -import java.util.concurrent.*; -import java.util.spi.*; +import java.text.BreakIterator; +import java.text.Collator; +import java.text.DateFormat; +import java.text.DateFormatSymbols; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.text.spi.BreakIteratorProvider; +import java.text.spi.CollatorProvider; +import java.text.spi.DateFormatProvider; +import java.text.spi.DateFormatSymbolsProvider; +import java.text.spi.DecimalFormatSymbolsProvider; +import java.text.spi.NumberFormatProvider; +import java.util.Locale; +import java.util.Map; +import java.util.ServiceLoader; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.spi.CalendarDataProvider; +import java.util.spi.CalendarNameProvider; +import java.util.spi.CurrencyNameProvider; +import java.util.spi.LocaleNameProvider; +import java.util.spi.LocaleServiceProvider; +import java.util.spi.TimeZoneNameProvider; /** * LocaleProviderAdapter implementation for the installed SPI implementations. @@ -411,12 +429,39 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { assert cdp != null; return cdp.getMinimalDaysInFirstWeek(locale); } + } + + static class CalendarNameProviderDelegate extends CalendarNameProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(CalendarNameProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public CalendarNameProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } @Override public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) { - CalendarDataProvider cdp = getImpl(locale); + CalendarNameProvider cdp = getImpl(locale); assert cdp != null; return cdp.getDisplayName(calendarType, field, value, style, locale); } @@ -425,7 +470,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { public Map getDisplayNames(String calendarType, int field, int style, Locale locale) { - CalendarDataProvider cdp = getImpl(locale); + CalendarNameProvider cdp = getImpl(locale); assert cdp != null; return cdp.getDisplayNames(calendarType, field, style, locale); } diff --git a/jdk/src/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java b/jdk/src/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java index 53875abea44..a5666f6b6a9 100644 --- a/jdk/src/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java +++ b/jdk/src/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java @@ -25,7 +25,12 @@ package sun.util.locale.provider; import java.lang.ref.SoftReference; -import java.text.*; +import java.text.DateFormat; +import java.text.DateFormatSymbols; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; import java.text.spi.DateFormatProvider; import java.text.spi.DateFormatSymbolsProvider; import java.text.spi.DecimalFormatSymbolsProvider; @@ -34,12 +39,13 @@ import java.util.Collections; import java.util.HashSet; import java.util.Locale; import java.util.Map; -import java.util.Set; import java.util.ResourceBundle.Control; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.spi.CalendarDataProvider; +import java.util.spi.CalendarNameProvider; /** * LocaleProviderdapter implementation for the Windows locale data. @@ -88,7 +94,7 @@ public class HostLocaleProviderAdapterImpl { private static final Set supportedLocaleSet; static { - Set tmpSet = new HashSet(); + Set tmpSet = new HashSet<>(); if (initialize()) { // Assuming the default locales do not include any extensions, so // no stripping is needed here. @@ -258,7 +264,7 @@ public class HostLocaleProviderAdapterImpl { if (ref == null || (patterns = ref.get()) == null) { String langtag = locale.toLanguageTag(); - patterns = new AtomicReferenceArray(NF_MAX+1); + patterns = new AtomicReferenceArray<>(NF_MAX+1); for (int i = 0; i <= NF_MAX; i++) { patterns.compareAndSet(i, null, getNumberPattern(i, langtag)); } @@ -329,18 +335,6 @@ public class HostLocaleProviderAdapterImpl { return isSupportedCalendarLocale(locale); } - @Override - public String getDisplayName(String calType, int field, int value, - int style, Locale locale) { - return null; - } - - @Override - public Map getDisplayNames(String calType, - int field, int style, Locale locale) { - return null; - } - @Override public int getFirstDayOfWeek(Locale locale) { int first = getCalendarDataValue( @@ -360,6 +354,32 @@ public class HostLocaleProviderAdapterImpl { }; } + public static CalendarNameProvider getCalendarNameProvider() { + return new CalendarNameProvider() { + @Override + public Locale[] getAvailableLocales() { + return getSupportedCalendarLocales(); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return isSupportedCalendarLocale(locale); + } + + @Override + public String getDisplayName(String calType, int field, int value, + int style, Locale locale) { + return null; + } + + @Override + public Map getDisplayNames(String calType, + int field, int style, Locale locale) { + return null; + } + }; + } + private static String convertDateTimePattern(String winPattern) { String ret = winPattern.replaceAll("dddd", "EEEE"); ret = ret.replaceAll("ddd", "EEE"); diff --git a/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.java b/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.java index 5ee6b4d8306..1ef683b300f 100644 --- a/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.java @@ -36,17 +36,11 @@ import com.bar.CalendarDataProviderImpl; * * Test strategy: * com.bar.CalendarDataProviderImpl supports only ja_JP_kids locale. It returns - * month names only in full-width digits, followed by "gatsu" in Hiragana if - * it's a long style, and also returns unusual week parameter values, WEDNESDAY - * - first day of week, 7 - minimal days in the first week. The standalone - * styles are used because DateFormatSymbols has precedence for the format - * styles. + * unusual week parameter values, WEDNESDAY - first day of week, 7 - minimal + * days in the first week. * * A Calendar instance created with ja_JP_kids should use the week parameters - * provided by com.bar.CalendarDataProviderImpl. Calendar.getDisplayName(s) - * should be called with kids to get the month names provided by - * com.bar.CalendarDataProviderImpl. Other display names should be the same as - * what a Calendar constructed with ja_JP returns. + * provided by com.bar.CalendarDataProviderImpl. */ public class CalendarDataProviderTest { @@ -62,45 +56,6 @@ public class CalendarDataProviderTest { // check the week parameters checkResult("firstDayOfWeek", kcal.getFirstDayOfWeek(), WEDNESDAY); checkResult("minimalDaysInFirstWeek", kcal.getMinimalDaysInFirstWeek(), 7); - - // check month names and week day names - Map mapAllStyles = new HashMap<>(); - for (int style : new int[] { SHORT_STANDALONE, LONG_STANDALONE }) { - // Check month names provided by com.bar.CalendarDataProviderImpl - Map map = new HashMap<>(); - for (int month = JANUARY; month <= DECEMBER; month++) { - kcal.set(DAY_OF_MONTH, 1); - kcal.set(MONTH, month); - kcal.set(HOUR_OF_DAY, 12); // avoid any standard-daylight transitions... - kcal.getTimeInMillis(); - String name = kcal.getDisplayName(MONTH, style, kids); - checkResult("Month name", - name, - CalendarDataProviderImpl.toMonthName(kcal.get(MONTH) + 1, style)); - - // Builds the map with name to its integer value. - map.put(name, kcal.get(MONTH)); - } - checkResult((style == SHORT_STANDALONE ? "Short" : "Long") + " month names map", - kcal.getDisplayNames(MONTH, style, kids), map); - mapAllStyles.putAll(map); - if (style == LONG_STANDALONE) { - checkResult("Short and long month names map", - kcal.getDisplayNames(MONTH, ALL_STYLES, kids), mapAllStyles); - } - - // Check week names: kcal and jcal should return the same names and maps. - for (int dow = SUNDAY; dow <= SATURDAY; dow++) { - kcal.set(DAY_OF_WEEK, dow); - jcal.setTimeInMillis(kcal.getTimeInMillis()); - String name = kcal.getDisplayName(DAY_OF_WEEK, style, kids); - checkResult("Day of week name", name, - jcal.getDisplayName(DAY_OF_WEEK, style, Locale.JAPAN)); - } - checkResult("Short day of week names", kcal.getDisplayNames(DAY_OF_WEEK, style, kids), - jcal.getDisplayNames(DAY_OF_WEEK, style, Locale.JAPAN)); - } - } private void checkResult(String msg, T got, T expected) { diff --git a/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.sh b/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.sh index 2e8f7924c00..c4d1f90d76c 100644 --- a/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.sh +++ b/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.sh @@ -23,6 +23,6 @@ #!/bin/sh # # @test -# @bug 7058206 +# @bug 7058207 8000986 # @summary CalendarDataProvider tests # @run shell ExecTest.sh bar CalendarDataProviderTest true diff --git a/jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.java b/jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.java new file mode 100644 index 00000000000..4910f1596fe --- /dev/null +++ b/jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * + */ + +import java.text.*; +import java.util.*; +import static java.util.Calendar.*; +import sun.util.locale.provider.*; +import sun.util.resources.*; +import com.bar.CalendarNameProviderImpl; + +/** + * Test case for CalendarNameProvider. + * + * Test strategy: + * com.bar.CalendarNameProviderImpl supports only ja_JP_kids locale. It returns + * month names only in full-width digits, followed by "gatsu" in Hiragana if + * it's a long style. The standalone styles are used because DateFormatSymbols + * has precedence for the format styles. + * + * Calendar.getDisplayName(s) should be called with kids to get the month + * names provided by com.bar.CalendarNameProviderImpl. Other display names + * should be the same as what a Calendar constructed with ja_JP returns. + */ +public class CalendarNameProviderTest { + + public static void main(String[] s) { + new CalendarNameProviderTest().test(); + } + + void test() { + Locale kids = new Locale("ja", "JP", "kids"); // test provider's supported locale + Calendar kcal = Calendar.getInstance(kids); + Calendar jcal = Calendar.getInstance(Locale.JAPAN); + + // check month names and week day names + Map mapAllStyles = new HashMap<>(); + for (int style : new int[] { SHORT_STANDALONE, LONG_STANDALONE }) { + // Check month names provided by com.bar.CalendarNameProviderImpl + Map map = new HashMap<>(); + for (int month = JANUARY; month <= DECEMBER; month++) { + kcal.set(DAY_OF_MONTH, 1); + kcal.set(MONTH, month); + kcal.set(HOUR_OF_DAY, 12); // avoid any standard-daylight transitions... + kcal.getTimeInMillis(); + String name = kcal.getDisplayName(MONTH, style, kids); + checkResult("Month name", + name, + CalendarNameProviderImpl.toMonthName(kcal.get(MONTH) + 1, style)); + + // Builds the map with name to its integer value. + map.put(name, kcal.get(MONTH)); + } + checkResult((style == SHORT_STANDALONE ? "Short" : "Long") + " month names map", + kcal.getDisplayNames(MONTH, style, kids), map); + mapAllStyles.putAll(map); + if (style == LONG_STANDALONE) { + checkResult("Short and long month names map", + kcal.getDisplayNames(MONTH, ALL_STYLES, kids), mapAllStyles); + } + + // Check week names: kcal and jcal should return the same names and maps. + for (int dow = SUNDAY; dow <= SATURDAY; dow++) { + kcal.set(DAY_OF_WEEK, dow); + jcal.setTimeInMillis(kcal.getTimeInMillis()); + String name = kcal.getDisplayName(DAY_OF_WEEK, style, kids); + checkResult("Day of week name", name, + jcal.getDisplayName(DAY_OF_WEEK, style, Locale.JAPAN)); + } + checkResult("Short day of week names", kcal.getDisplayNames(DAY_OF_WEEK, style, kids), + jcal.getDisplayNames(DAY_OF_WEEK, style, Locale.JAPAN)); + } + + } + + private void checkResult(String msg, T got, T expected) { + if (!expected.equals(got)) { + String s = String.format("%s: got='%s', expected='%s'", msg, got, expected); + throw new RuntimeException(s); + } + } +} diff --git a/jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.sh b/jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.sh new file mode 100644 index 00000000000..a772292b936 --- /dev/null +++ b/jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.sh @@ -0,0 +1,27 @@ +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @bug 8000986 +# @summary CalendarNameProvider tests +# @run shell ExecTest.sh bar CalendarNameProviderTest true diff --git a/jdk/test/java/util/PluggableLocale/GenericTest.java b/jdk/test/java/util/PluggableLocale/GenericTest.java index 29a49fb3f26..8be74cdca91 100644 --- a/jdk/test/java/util/PluggableLocale/GenericTest.java +++ b/jdk/test/java/util/PluggableLocale/GenericTest.java @@ -42,6 +42,7 @@ public class GenericTest { com.bar.LocaleNameProviderImpl localeNP = new com.bar.LocaleNameProviderImpl(); com.bar.TimeZoneNameProviderImpl tzNP = new com.bar.TimeZoneNameProviderImpl(); com.bar.CalendarDataProviderImpl calDataP = new com.bar.CalendarDataProviderImpl(); + com.bar.CalendarNameProviderImpl calNameP = new com.bar.CalendarNameProviderImpl(); public static void main(String[] s) { new GenericTest(); @@ -73,6 +74,7 @@ public class GenericTest { expected.addAll(Arrays.asList(localeNP.getAvailableLocales())); expected.addAll(Arrays.asList(tzNP.getAvailableLocales())); expected.addAll(Arrays.asList(calDataP.getAvailableLocales())); + expected.addAll(Arrays.asList(calNameP.getAvailableLocales())); if (!result.equals(expected)) { throw new RuntimeException("Locale.getAvailableLocales() does not return the union of locales: diff=" + getDiff(result, expected)); diff --git a/jdk/test/java/util/PluggableLocale/barprovider.jar b/jdk/test/java/util/PluggableLocale/barprovider.jar index 901b2b2b7f6264a4f8fe6b7e4af75f573897e55e..7f621fa3c67efb04fdf6b540bf94461bfdb87d0c 100644 GIT binary patch delta 3146 zcmZ`*2|Sc*7k`amY~$JoBgD02AG@+#T>CO3l%=@HGO~wC%fx7q<>DUSs_>!MY^w8003YKy)+MO z0Kfv!Jb+vBiZmDCih?TWrjSaPTNE4j%pnN29)aGtu;57iDethrq$8YHR5;oqZMhS& z++q@#La!ohOmJ_F49rJv*GN{@eyi9KKki7Tmf%8LGGMy);SQ07j9S);`O;)hQ&~i! zx|Wy4ia<{>vX$I@+t@Ho(9eEyq|bHD$7Hj-Fe6-2%rmWDN1_`MDr1_nvmm(tDq6h;@8*{m4pntorB&Xua4UGJlXd# zgElceMsg zA{e!5-gH@yZ@gce-JX}^Q0T3a3CuDv)5v8Vl*M!8M_~t%r1q=@9waDbrbS41mM;=^ zxz;>Xkn`x})Az|T(t@$~HL#kWokw4hta{F5>s9m#-7D@nZA*4j5S;t&5s}4Le6B6` zPWIQyn_lxi`Zu~xMRu4kjG2jdh-jSkHCJ>P9r_sVeoA|KZs);LkKCus^yPy@f^~mR ziG5Ai=klHDKTg*TYTC4i-*50KB1Fk%nzoGf=u8zm+~VFg*QHvXds0nOc)o`S}3|^CMoI+i$tMJcO1^Yy2c1#2@$I1KQun@bas4$A%aI(4+GjDk7>3I@Kv5$Fh zLLxUdwm^L8Ngjyw6q44kuo7EPYMgT} z^k4tjI`_yuvh3QmJBOCuu5oL@dC_J~jg^A;E^Ms}JImIYw-l_-w965$$G==vQW@uH zD9O*k_~H^?w~U_9=fXZdG``7Jz15;{7Nr$3`==t2U1@d)W#b8pn_<#1!log5wXa30 zh{*T5;BAwwy~Jk!Sh2W$&-r>&Qqx3&MwJ-;$#c6=c$i6CqWxew*-%_BYpur@`4ERiRY z$m7OnIn3mL;Gj#;4BuVqvSg=cKQBC=+HS^mRrI5?dn=0VV%#=iW+?UUgrs_1JU3az zN@vLIB6eVnUBb;eTfVh?K1J^N89+0ITn3d8kYqAL1L`&Fp zdNo;1HpWo~dG!b<^e$elcWE0NuMRFKgtfB@ova=F?#}(j&5glPI?lzoyUuTsMXNI3 zyGC-va&Js)i3QtV`ZySCkBeV0=$ z9@nyXJ%ooc6Kfeesqza-2df59rQS-NSeAzgg$HG<;2;Ol#Y6ONDk-EJ<|W=p*Mz3#273sWO%U)-kNefixT7->f`7KPv$n3d2@ z%_XD;Qb~%&f%(G~g61DeNT-FZNiTbg7T1GHt5=uXC zOudwOa|`#YjZmx|@$p>42)`$pnsk0-z#pRkMkWSyj7UWcf0}5;+omlomBw6ORF`qE zeVs5ko0D>+l+Zu32|nSrDK05~H9Ll0&TE!zIW%AXl z!p1>kxd$;5@ZW2T=P&87IKGY`@pp*5yCgci6BTo3vqN4tRfY|}kTQQ^&9du$VeZ2b z^xNERb8YU3$f2#oMbqdt5_;#UlU|w8cV6*m)fy-GB@#i~CI4nr;hAi0VFr(ce6~gF z>Iaflb>VsEd3`)J<9gDq{7bYlQ(D6A9@+(gy?9>^)B$AZZMu; zOm|OQsiR?y4B&vGI`~eVgM}Ut>Q_Llh5+mm44RjK%vr#G zbwP2OP9!jZ7z_ov1HJ0Bh`Zw#M!Io_x;Wjhr3MW9|3iGd&c_T2v3hNI%>}X8cr=4lt;k;kci=hi7YFyL?h-uk{)c*wsX zMDgH0XciYlMgV*+hTJ97*mXR-3Nr46jOF$j+wnrif?$&nALy?7gZY0BBLM6tE;JV*X3sl(DxEJ<1%I{Xj@4Kq9h+HgvPE^0rf@M`EIy-Gh;%_lhce{I=} m(n*F#koz>qy}-U@SXTlcs|oWlLDT^N1wCj40IXqXe}4hwnCABY delta 2388 zcmZWq4LFl~8-HvwY?c}3V=JbNP0TP`yqs3avTBo$ilsv+nQxj(t$fv?yz$ggokr%X zLv<=-WPPBLk<>|YPRd6SeQ=al3h%RZE-&YOp6kB;_s8$P|Mz|Wuj{@`;wmFBd@dZJ z4`^y?0_g$XIT&ZS^6>Ow50zTr^NNefr%J7NO&VH|2aBn!K|_N9LyMn*>WIJM#^Tff zK37BYQ?u)&Hvj-W5GiA!06-H^#sYg0rpjO-Tz#qPbVZZEKb-JliC;jp-e&AfwtVD; zaD5+(K9F(;0b7Jv#jPb{YMIDE7}761x1sY!m`KtPkW)TUvZ zXHyKkAJ!Zt8}r>134*5ymOe%2=|_ii%L&@mHM!_2Ax&1-kuR>YFE32ALpUdTi*6Ww8|&0U z7PgSn|+PyUW&tqXP`8%~A{~p2+@oN^>Y?uGwoYz_9p20~LHFY9Z!=Eqm?mD;o zL^WvVdOxv%>OAsHQeW6(>J_gqD>7>0w+Z*RR3|$8k;7TmvZg1}<3Xu_QOUaaCd;lu zlp!*Dn0H(}+dZ0}*_X&U9d?29cB^+H+9^GMN_^N^v_JC6vh|x4yZ3k)zTU*`+MjeO zi8^wJxG^r`d4q3V=ata9@sZ^pj$7hFHKq4LPPjO%z1r;ALhUk+ux`yBeP#y<9cwmzV?pR$68liW5l$g*V|s$r?N6+h->-mwGBe7 z$s41yHKDtV{QVgF-U&%%XFil#Hs0JMldHcl)6|Y_RM?lg(4WNZ`1#kn7i&+~-Ps_V z?yA*Cn`iB{{bYu}(o83?1+X#i%Dc}`47Yk)EE`C%3-St0ZSJ?l2(V7X4;Zzl{v3_5o_$WA9_svJ>qA*GGgQ zPjR%*)=wTYzbMA{rnJReYbCymk_X$kc)k+_+eFaBH#+Mw3vC1U3@v?)T`xSD{8d2b zaKGV+lJT|0)vW^^ZFw|onPJQAWQS2{W>nWPwv9hZG@c}`|G43c-*0*fT3~dYZ1tI~ zJ#n%v!D+O;y{JiIQRT;aqdcCtra<1hr!xGD)vZQ2#cOL$B zRXN(?q?WK;%h>W=-5j2&4*9_L;QOi7(cKJ#_umS)WxQX;>%S!JEyHqj1g>Km1IRI+ z&*eMJTGZ@#f!V*(yUg6&UquiFsgAYCGaIQ5Ehs9X$pEqW%1#5{_Wxw*kgmPHV7Hi* zHyldaI@19Ev<=zAR(~i(4#r{)AF&NRm=6NQ^;tEp{8j0{w-ic9TvLs^*}7IAzNBh+ zc40h|Fjhf^7Z_ zr3?;pUQvb*vYY;0C87%RQ7*h67G1IYEuV2TAbdOfbO^2Fg-5s!zdQBhD7Hjm_TE=K z#p^T4pdZ%#^PW}dE++35|ATot&n~+Lm+xw@s}O)!(v^b|EQlYKy8vDnVNd1%76Tf8ph>s}50GsGxu%FFXtZ3MSc zG7J;)Z73hasRf-Bm%vW>t; zYW;5!blZ|uq2RP}7<%4@$a!j`)PqY9ba2*QAM{i^Fee{`OH_P|n*48_45J3q2j(&a z;r1*H^uqPk-BjgW^>7d3Ukr zHqkK~(S*!fP=7cLS0BC~> zrOsugWHOB*FiYhMC6-HsBqH=~M3q~p+fHsctbgq@FvSx)q!pnfihz_3JidGF=XtmgYK`s%juc3R9z@+zTOcTu{S+61PePqBHm3 z{}D1CfXIFUsM-bsnS)=|aLfPkHf*?2=Heg-d>EpIkrQoIPCSG@p3hZ>dIA6j&>sqM IESggKFEwp|b^rhX diff --git a/jdk/test/java/util/PluggableLocale/fooprovider.jar b/jdk/test/java/util/PluggableLocale/fooprovider.jar index 125dbe17756199ab64388fa372f656af7e74440d..cfc6616019c95d85eeef900d50997cec213d4f45 100644 GIT binary patch delta 1012 zcmZ8gUr1AN6h8NEb94R~+FDz;~Oe#C~_mj2T#*goC&i8%yJHNZlXNCE! zP?1jQ^j0vLOfWorFjpb#RM>t-1$@5M&+tTOnqgJ=CBsC^Glnz4NrnsIdu2r~qrv;7 zW&jf~%U3ljC--Bs3i+IQr=ArbDj)K~DeM+m=f;{m@3gw+c+uuu;-g;ABVIImj~Gh} zar52wx11@}ZR3PN-DO_bN(S`*Qs6|u%^vb1@J*}`L@N|b@Ma{ej_^|?UPG9KqEB^E z4e$g;=9d$QhLt+DK4UwTk&svj78!8DibG^Da8SEvuES;dn z^&KbA#2sa3D7+c;$g} z=}&64nX%7qMQ?N?k2D(_|1JPr(*uMxk&G6+CAYJ6Qc+3lsUn>RN1`64yJ)xsCrJ}3 z1!&Uf>^AIldhvI(nh|$3959>~0qQ7fyN0;9o`@ZIeKlNTOcK93u_M;VboTyVPrXKf zzDfYMMmOa`*;`*&YKp?O)KfUW+G5%{|Mb}vS}LOhkThB%t+Y0{tBwAZB9P*_fmZh4_1+yYJ~9`2YHoADi|FcWLh&`PnpH Z;~{(>u-nopLy6jV(AP)*#4+|e`wNXF1Hb?P delta 903 zcmY*WOH30{6n*n%TKb_>v}tIb)CSsuq_v=>(CN^R(S@=QjWKTM#+`^w{49vzro^}~ zn0j}9hznP`=%O1CG)6^@5;y*$5EpDTgdH1F67bHQrgmmBx%Ztp_niCgT`Nj!MaeZX zEGr&nv)S0xgjRB?vK~&}4q?c#hDX8tLSa0n^Bs)Yn9hfm4cQ!Ou`WDr3*ic^7n$S;U@*JTSX_4Z6{+Z%i=?lfMvfz@qht=l+<>Vm! zSx;stzS2beLwynwcd&XdrfK1L8lH6q?jf&!efT&e_#O!+V?l7HI|wRg1s{`PIjhpq zo)g?|MMfuVW%dTJDEDKkI%mNJq?#D(XwYSB+5vWJ5Oy-nM0|1&cCRAwJ^BYt#GfsY zcZ78!ne?UwpWO#HTaUusv;n!Wjk9eCbwS>1tuw30>~DvKbPs64UuVxE+#5hx3*cmP zE78R}yAopsnK5B9ZV5p#dyq^oX9Pdj1up*qcv|aY9wC1Ze9uIj4WooS&fsAm+{pPz z{qLbs={aYtgje&L)R+3;WunbJGHhA}L{!1w#NmV*pskH+f^WuQTN!|jR5L-3Qi9L- zBh&$_sr>|9!lG*lf}W{)+>VqJ5${xxs5Kr U3`o_y9*b4i@ZlT51wAIkf0|wCzW@LL diff --git a/jdk/test/java/util/PluggableLocale/providersrc/CalendarDataProviderImpl.java b/jdk/test/java/util/PluggableLocale/providersrc/CalendarDataProviderImpl.java index 7a8fff62a83..274d468df08 100644 --- a/jdk/test/java/util/PluggableLocale/providersrc/CalendarDataProviderImpl.java +++ b/jdk/test/java/util/PluggableLocale/providersrc/CalendarDataProviderImpl.java @@ -47,66 +47,8 @@ public class CalendarDataProviderImpl extends CalendarDataProvider { return 7; } - @Override - public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) { - if (calendarType == null || locale == null) { - throw new NullPointerException(); - } - if (!Utils.supportsLocale(Arrays.asList(avail), locale)) { - throw new IllegalArgumentException("locale is not one of available locales: "+ locale); - } - if (field != MONTH) { - return null; - } - return toMonthName(value + 1, style); - } - - @Override - public Map getDisplayNames(String calendarType, int field, int style, Locale locale) { - if (calendarType == null || locale == null) { - throw new NullPointerException(); - } - if (!Utils.supportsLocale(Arrays.asList(avail), locale)) { - throw new IllegalArgumentException("locale is not one of available locales: " + locale); - } - if (field != MONTH) { - return null; - } - Map map = new HashMap<>(); - if (style == LONG_STANDALONE) { - style = LONG; - } else if (style == SHORT_STANDALONE) { - style = SHORT; - } - for (int month = JANUARY; month <= DECEMBER; month++) { - if (style == ALL_STYLES || style == LONG) { - map.put(toMonthName(month + 1, LONG), month); - } - if (style == ALL_STYLES || style == SHORT) { - map.put(toMonthName(month + 1, SHORT), month); - } - } - return map; - } - @Override public Locale[] getAvailableLocales() { return avail.clone(); } - - // month is 1-based. - public static String toMonthName(int month, int style) { - StringBuilder sb = new StringBuilder(); - if (month >= 10) { - sb.append((char)(FULLWIDTH_ZERO + 1)); - sb.appendCodePoint((char)(FULLWIDTH_ZERO + (month % 10))); - } else { - sb.appendCodePoint((char)(FULLWIDTH_ZERO + month)); - } - if (style == SHORT || style == SHORT_STANDALONE) { - return sb.toString(); // full-width digit(s) - } - sb.append("\u304c\u3064"); // + "gatsu" in Hiragana - return sb.toString(); - } } diff --git a/jdk/test/java/util/PluggableLocale/providersrc/CalendarNameProviderImpl.java b/jdk/test/java/util/PluggableLocale/providersrc/CalendarNameProviderImpl.java new file mode 100644 index 00000000000..d93ba36229b --- /dev/null +++ b/jdk/test/java/util/PluggableLocale/providersrc/CalendarNameProviderImpl.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.bar; + +import com.foobar.Utils; +import java.util.Arrays; +import static java.util.Calendar.*; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.spi.CalendarNameProvider; + +public class CalendarNameProviderImpl extends CalendarNameProvider { + static final char FULLWIDTH_ZERO = '\uff10'; + static final Locale[] avail = { + new Locale("ja", "JP", "kids"), + }; + + @Override + public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) { + if (calendarType == null || locale == null) { + throw new NullPointerException(); + } + if (!Utils.supportsLocale(Arrays.asList(avail), locale)) { + throw new IllegalArgumentException("locale is not one of available locales: "+ locale); + } + if (field != MONTH) { + return null; + } + return toMonthName(value + 1, style); + } + + @Override + public Map getDisplayNames(String calendarType, int field, int style, Locale locale) { + if (calendarType == null || locale == null) { + throw new NullPointerException(); + } + if (!Utils.supportsLocale(Arrays.asList(avail), locale)) { + throw new IllegalArgumentException("locale is not one of available locales: " + locale); + } + if (field != MONTH) { + return null; + } + Map map = new HashMap<>(); + if (style == LONG_STANDALONE) { + style = LONG; + } else if (style == SHORT_STANDALONE) { + style = SHORT; + } + for (int month = JANUARY; month <= DECEMBER; month++) { + if (style == ALL_STYLES || style == LONG) { + map.put(toMonthName(month + 1, LONG), month); + } + if (style == ALL_STYLES || style == SHORT) { + map.put(toMonthName(month + 1, SHORT), month); + } + } + return map; + } + + @Override + public Locale[] getAvailableLocales() { + return avail.clone(); + } + + // month is 1-based. + public static String toMonthName(int month, int style) { + StringBuilder sb = new StringBuilder(); + if (month >= 10) { + sb.append((char)(FULLWIDTH_ZERO + 1)); + sb.appendCodePoint((char)(FULLWIDTH_ZERO + (month % 10))); + } else { + sb.appendCodePoint((char)(FULLWIDTH_ZERO + month)); + } + if (style == SHORT || style == SHORT_STANDALONE) { + return sb.toString(); // full-width digit(s) + } + sb.append("\u304c\u3064"); // + "gatsu" in Hiragana + return sb.toString(); + } +} diff --git a/jdk/test/java/util/PluggableLocale/providersrc/Makefile b/jdk/test/java/util/PluggableLocale/providersrc/Makefile index 3c550992691..2af60665a36 100644 --- a/jdk/test/java/util/PluggableLocale/providersrc/Makefile +++ b/jdk/test/java/util/PluggableLocale/providersrc/Makefile @@ -20,7 +20,8 @@ BARSERVICES = \ java.util.spi.CurrencyNameProvider \ java.util.spi.TimeZoneNameProvider \ java.util.spi.LocaleNameProvider \ - java.util.spi.CalendarDataProvider + java.util.spi.CalendarDataProvider \ + java.util.spi.CalendarNameProvider FOOFILES_JAVA = \ BreakIteratorProviderImpl.java \ @@ -39,6 +40,7 @@ BARFILES_JAVA = \ TimeZoneNameProviderImpl.java \ LocaleNameProviderImpl.java \ CalendarDataProviderImpl.java \ + CalendarNameProviderImpl.java \ Utils.java BARFILES_PROPERTIES = \ @@ -68,3 +70,8 @@ $(DESTDIR)/barprovider.jar: $(BARSERVICES) $(BARFILES_JAVA) $(BARFILES_PROPERTIE cp $(BARFILES_PROPERTIES) $(BARDIR)/com/bar rm -f $(DESTDIR)/barprovider.jar $(BINDIR)/jar cvf $(DESTDIR)/barprovider.jar -C $(BARDIR) . + +clean: + rm -rf $(BARDIR) $(FOODIR) + +.PHONY: all clean diff --git a/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CalendarNameProvider b/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CalendarNameProvider new file mode 100644 index 00000000000..dd6f8ec9909 --- /dev/null +++ b/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CalendarNameProvider @@ -0,0 +1,7 @@ +# +# +# +# fully-qualified name of the java.util.spi.CalendarNameProvider +# implementation class +# +com.bar.CalendarNameProviderImpl From f56a68e8cb5391b39c81802661e79099eb11f66e Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Mon, 12 Nov 2012 10:20:01 -0800 Subject: [PATCH 219/241] 8002365: build-infra: Build-infra fails on solaris 11.1 on sparc Add '-lc' to LDFLAGS for native libraries in CompileNativeLibraries.gmk Reviewed-by: ohair, tbell --- jdk/makefiles/CompileNativeLibraries.gmk | 44 ++++++++++++------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/jdk/makefiles/CompileNativeLibraries.gmk b/jdk/makefiles/CompileNativeLibraries.gmk index c23f7d8adc6..e898ed294fd 100644 --- a/jdk/makefiles/CompileNativeLibraries.gmk +++ b/jdk/makefiles/CompileNativeLibraries.gmk @@ -300,6 +300,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMLIB_IMAGE,\ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_SUFFIX:=$(BUILD_LIBMLIB_LDLIBS) \ $(LDFLAGS_JDKLIB_SUFFIX),\ + LDFLAGS_SUFFIX_solaris:=-lc, \ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ -D "JDK_FNAME=mlib_image.dll" \ @@ -428,6 +429,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMLIB_IMAGE_V,\ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(BUILD_LIBMLIB_LDLIBS) -ljava -ljvm \ $(call SET_SHARED_LIBRARY_ORIGIN),\ + LDFLAGS_SUFFIX_solaris:=-lc,\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libmlib_image_v)) $(BUILD_LIBMLIB_IMAGE_V): $(BUILD_LIBJAVA) @@ -710,7 +712,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT,\ LDFLAGS:=$(LDFLAGS_JDKLIB) $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_solaris:=-R/usr/dt/lib$(OPENJDK_TARGET_CPU_ISADIR) -R$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR),\ LDFLAGS_SUFFIX_linux:=-ljvm $(LIBM) $(LIBDL) -ljava,\ - LDFLAGS_SUFFIX_solaris:=-ljvm $(LIBM) $(LIBDL) -ljava,\ + LDFLAGS_SUFFIX_solaris:=-ljvm $(LIBM) $(LIBDL) -ljava -lc,\ LDFLAGS_SUFFIX_macosx:=-lmlib_image -ljvm $(LIBM) \ -framework Cocoa \ -framework OpenGL \ @@ -966,7 +968,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBZIP,\ -export:ZIP_ReadEntry -export:ZIP_GetNextEntry jvm.lib \ $(WIN_JAVA_LIB),\ LDFLAGS_SUFFIX_linux:=-ljvm -ljava $(LIBZ),\ - LDFLAGS_SUFFIX_solaris:=-ljvm -ljava $(LIBZ),\ + LDFLAGS_SUFFIX_solaris:=-ljvm -ljava $(LIBZ) -lc,\ LDFLAGS_SUFFIX_macosx:=$(LIBZ) -ljava -ljvm,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ @@ -1144,9 +1146,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJDWP,\ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_SUFFIX_linux:=$(LIBDL),\ - LDFLAGS_SUFFIX_solaris:=$(LIBDL),\ + LDFLAGS_SUFFIX_solaris:=$(LIBDL) -lc,\ LDFLAGS_SUFFIX_windows:=$(LDFLAGS_JDKLIB_SUFFIX),\ - LDFLAGS_SUFFIX:=,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ -D "JDK_FNAME=jdwp.dll" \ @@ -1186,7 +1187,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAAS,\ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_windows:=netapi32.lib user32.lib mpr.lib advapi32.lib,\ LDFLAGS_SUFFIX_windows:=$(LDFLAGS_JDKLIB_SUFFIX),\ - LDFLAGS_SUFFIX:=,\ + LDFLAGS_SUFFIX_solaris:=-lc,\ EXCLUDE_FILES:=$(LIBJAAS_EXCLUDE_FILES),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS) \ @@ -1217,7 +1218,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJSDT,\ LDFLAGS_SUFFIX_linux:=$(LIBDL),\ LDFLAGS_SUFFIX_windows:=$(LDFLAGS_JDKLIB_SUFFIX) $(LIBDL),\ LDFLAGS_SUFFIX_macosx:= $(LIBDL),\ - LDFLAGS_SUFFIX:=,\ + LDFLAGS_SUFFIX_solaris:=-lc,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ -D "JDK_FNAME=jsdt.dll" \ @@ -1259,7 +1260,7 @@ ifdef OPENJDK $(call SET_SHARED_LIBRARY_ORIGIN), \ LDFLAGS_solaris:=/usr/lib$(OPENJDK_TARGET_CPU_ISADIR)/libm.so.2,\ LDFLAGS_windows:=$(WIN_AWT_LIB) $(WIN_JAVA_LIB),\ - LDFLAGS_SUFFIX_solaris:=-lawt -ljava -ljvm,\ + LDFLAGS_SUFFIX_solaris:=-lawt -ljava -ljvm -lc,\ LDFLAGS_SUFFIX_macosx:=$(LIBM) -lawt -ljava -ljvm,\ LDFLAGS_SUFFIX_linux:=-lm -lawt -ljava -ljvm,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ @@ -1626,7 +1627,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBINSTRUMENT,\ -framework Cocoa -framework Security -framework ApplicationServices,\ LDFLAGS_SUFFIX:=$(LIBINSTRUMENT_LDFLAGS_SUFFIX),\ LDFLAGS_SUFFIX_macosx:=-liconv $(LIBZ),\ - LDFLAGS_SUFFIX_solaris:=$(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL),\ + LDFLAGS_SUFFIX_solaris:=$(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL) -lc,\ LDFLAGS_SUFFIX_linux:=$(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL),\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ @@ -1716,10 +1717,6 @@ BUILD_LIBHPROF_CFLAGS:=-I$(JDK_TOPDIR)/src/share/demo/jvmti/hprof \ BUILD_LIBHPROF_LDFLAGS:= -ifeq ($(OPENJDK_TARGET_OS),solaris) - BUILD_LIBHPROF_LDFLAGS += -lsocket -lnsl -lc -endif - LIBHPROF_OPTIMIZATION:=HIGHEST ifneq ($(findstring $(OPENJDK_TARGET_OS),solaris linux),) ifeq ($(ENABLE_DEBUG_SYMBOLS), yes) @@ -1727,10 +1724,6 @@ ifneq ($(findstring $(OPENJDK_TARGET_OS),solaris linux),) endif endif -ifneq ($(OPENJDK_TARGET_OS),windows) - BUILD_LIBHPROF_LDFLAGS += $(LIBDL) -endif - $(eval $(call SetupNativeCompilation,BUILD_LIBHPROF,\ LIBRARY:=hprof, \ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ @@ -1744,7 +1737,9 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBHPROF,\ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_windows:=wsock32.lib winmm.lib advapi32.lib,\ - LDFLAGS_SUFFIX:=$(BUILD_LIBHPROF_LDFLAGS),\ + LDFLAGS_SUFFIX_linux:=$(LIBDL),\ + LDFLAGS_SUFFIX_macosx:=$(LIBDL),\ + LDFLAGS_SUFFIX_solaris:=-lsocket -lnsl $(LIBDL) -lc,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ -D "JDK_FNAME=hprof.dll" \ @@ -1768,6 +1763,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA_CRW_DEMO,\ MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libjava_crw_demo/mapfile-vers, \ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ + LDFLAGS_SUFFIX_solaris:=-lc,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ -D "JDK_FNAME=java_crw_demo.dll" \ @@ -2392,7 +2388,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_HEADLESS,\ LANG:=C,\ OPTIMIZATION:=LOW, \ CFLAGS:=$(CFLAGS_JDKLIB) $(LIBAWT_HEADLESS_CFLAGS),\ - MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libawt_headless/mapfile-vers, \ + MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libawt_headless/mapfile-vers,\ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_linux:=$(call SET_SHARED_LIBRARY_ORIGIN,/..),\ @@ -2402,8 +2398,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_HEADLESS,\ LDFLAGS_macosx:=$(call SET_SHARED_LIBRARY_ORIGIN).,\ REORDER:=$(LIBAWT_HEADLESS_REORDER), \ LDFLAGS_SUFFIX_linux:=-ljvm -lawt -lm $(LIBDL) -ljava,\ - LDFLAGS_SUFFIX_solaris:=$(LIBDL) -ljvm -lawt -lm -ljava $(LIBCXX), \ - LDFLAGS_SUFFIX_macosx:=-ljvm $(LIBCXX) -lawt $(LIBDL) -ljava, \ + LDFLAGS_SUFFIX_solaris:=$(LIBDL) -ljvm -lawt -lm -ljava $(LIBCXX) -lc,\ + LDFLAGS_SUFFIX_macosx:=-ljvm $(LIBCXX) -lawt $(LIBDL) -ljava,\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_headless)) $(BUILD_LIBAWT_HEADLESS) : $(BUILD_LIBAWT) @@ -2572,6 +2568,7 @@ $(eval $(call SetupNativeCompilation,LIBSPLASHSCREEN,\ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_SUFFIX:=$(LIBSPLASHSCREEN_LDFLAGS_SUFFIX) $(LIBZ),\ + LDFLAGS_SUFFIX_solaris:=-lc,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ -D "JDK_FNAME=splashscreen.dll" \ @@ -2647,6 +2644,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2PCSC,\ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_SUFFIX_posix:=$(LIBDL), \ LDFLAGS_SUFFIX_windows:=winscard.lib,\ + LDFLAGS_SUFFIX_solaris:=-lc,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ -D "JDK_FNAME=j2pcsc.dll" \ @@ -2673,7 +2671,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2GSS,\ MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libj2gss/mapfile-vers, \ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ - LDFLAGS_SUFFIX:=$(LIBDL), \ + LDFLAGS_SUFFIX:=$(LIBDL),\ + LDFLAGS_SUFFIX_solaris:=-lc,\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libj2gss)) BUILD_LIBRARIES += $(BUILD_LIBJ2GSS) @@ -2767,7 +2766,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2PKCS11,\ MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libj2pkcs11/mapfile-vers, \ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ - LDFLAGS_SUFFIX_posix:=$(LIBDL), \ + LDFLAGS_SUFFIX_posix:=$(LIBDL),\ + LDFLAGS_SUFFIX_solaris:=-lc,\ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS)\ -D "JDK_FNAME=j2pkcs11.dll" \ From fa30c0d8f21e19926ea573171c749b634d1b7d26 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Mon, 12 Nov 2012 10:49:44 -0800 Subject: [PATCH 220/241] 8003177: build-infra: Compare reports diff in LocaleDataMetaInfo.class Remove spurious space in the locale lists Reviewed-by: naoto, ohair, tbell --- jdk/makefiles/GensrcLocaleDataMetaInfo.gmk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jdk/makefiles/GensrcLocaleDataMetaInfo.gmk b/jdk/makefiles/GensrcLocaleDataMetaInfo.gmk index ab5a39abf99..306276adf59 100644 --- a/jdk/makefiles/GensrcLocaleDataMetaInfo.gmk +++ b/jdk/makefiles/GensrcLocaleDataMetaInfo.gmk @@ -68,8 +68,9 @@ define CaptureLocale ALL_US_LOCALES += $$($1_US_LOCALES) ALL_NON_US_LOCALES += $$($1_NON_US_LOCALES) - SED_ARGS+= -e 's/$$(HASH)$1_USLocales$$(HASH)/ $$($1_US_LOCALES)/g' - SED_ARGS+= -e 's/$$(HASH)$1_NonUSLocales$$(HASH)/ $$($1_NON_US_LOCALES)/g' + # Don't sed in a space if there are no locales. + SED_ARGS+= -e 's/$$(HASH)$1_USLocales$$(HASH)/$$(if $$($1_US_LOCALES),$$(SPACE)$$($1_US_LOCALES),)/g' + SED_ARGS+= -e 's/$$(HASH)$1_NonUSLocales$$(HASH)/$$(if $$($1_NON_US_LOCALES),$$(SPACE)$$($1_NON_US_LOCALES),)/g' endef #sun.text.resources.FormatData From cc66da7e9fda7083f41c0359c4d31415de0d11d6 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Mon, 12 Nov 2012 12:34:11 -0800 Subject: [PATCH 221/241] 8002028: build-infra: need no-hotspot partial build Added configure option --with-import-hotspot=/path/to/j2sdkimage Reviewed-by: dholmes, tbell --- common/autoconf/generated-configure.sh | 11188 ++++++++++++++--------- common/autoconf/source-dirs.m4 | 19 + common/autoconf/spec.gmk.in | 4 +- common/makefiles/Main.gmk | 2 + 4 files changed, 7071 insertions(+), 4142 deletions(-) diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index 160265d6e5a..e8bc95efd4c 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -1,24 +1,20 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.67 for OpenJDK jdk8. +# Generated by GNU Autoconf 2.63 for OpenJDK jdk8. # # Report bugs to . # -# # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -# Foundation, Inc. -# -# +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -26,15 +22,23 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; esac + fi + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + as_nl=' ' export as_nl @@ -42,13 +46,7 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -59,7 +57,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in #( + case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -82,6 +80,13 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -91,15 +96,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in #(( +case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done IFS=$as_save_IFS ;; @@ -111,16 +116,12 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 + { (exit 1); exit 1; } fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' @@ -132,249 +133,7 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: build-dev@openjdk.java.net about your system, including -$0: any error possibly output before this message. Then -$0: install a modern shell, or manually run the script -$0: under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - +# Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -388,12 +147,8 @@ else as_basename=false fi -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -413,19 +168,295 @@ $as_echo X/"$0" | } s/.*/./; q'` -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits +# CDPATH. +$as_unset CDPATH - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= @@ -442,7 +473,8 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the @@ -452,18 +484,29 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( +case `echo -n x` in -n*) - case `echo 'xy\c'` in + case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; + *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -493,7 +536,7 @@ rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' + as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false @@ -512,10 +555,10 @@ else if test -d "$1"; then test -d "$1/."; else - case $1 in #( + case $1 in -*)set "./$1";; esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' @@ -529,11 +572,11 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -test -n "$DJDIR" || exec 7<&0 &1 + +exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -548,6 +591,7 @@ cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='OpenJDK' @@ -555,7 +599,6 @@ PACKAGE_TARNAME='openjdk' PACKAGE_VERSION='jdk8' PACKAGE_STRING='OpenJDK jdk8' PACKAGE_BUGREPORT='build-dev@openjdk.java.net' -PACKAGE_URL='http://openjdk.java.net' # Factoring default headers for most tests. ac_includes_default="\ @@ -730,6 +773,8 @@ AR_OUT_OPTION LD_OUT_OPTION EXE_OUT_OPTION CC_OUT_OPTION +BUILD_HOTSPOT +HOTSPOT_DIST BUILD_OUTPUT OVERRIDE_SRC_ROOT ADD_SRC_ROOT @@ -934,7 +979,6 @@ bindir program_transform_name prefix exec_prefix -PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION @@ -975,6 +1019,7 @@ with_override_jaxp with_override_jaxws with_override_hotspot with_override_jdk +with_import_hotspot with_msvcr_dll with_extra_cflags with_extra_cxxflags @@ -990,7 +1035,7 @@ with_alsa with_alsa_include with_alsa_lib with_zlib -enable_static_link_stdc__ +enable_static_link_stdc++ with_num_cores with_memory_size with_sjavac_server_java @@ -1083,9 +1128,8 @@ do fi case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -1130,7 +1174,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1156,7 +1201,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1360,7 +1406,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1376,7 +1423,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1406,17 +1454,17 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" + -*) { $as_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1433,13 +1481,15 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" + { $as_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1462,7 +1512,8 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" + { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' @@ -1476,8 +1527,8 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used" >&2 + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1492,9 +1543,11 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" + { $as_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } # Find the source files, if location was not specified. @@ -1533,11 +1586,13 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1577,7 +1632,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages + -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1719,6 +1774,9 @@ Optional Packages: --with-override-jaxws use this jaxws dir for the build --with-override-hotspot use this hotspot dir for the build --with-override-jdk use this jdk dir for the build + --with-import-hotspot import hotspot binaries from this jdk image or + hotspot build dist dir instead of building from + source --with-msvcr-dll copy this msvcr100.dll into the built JDK (Windows only) [probed] --with-extra-cflags extra flags to be used when compiling jdk c-files @@ -1757,7 +1815,7 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags @@ -1777,7 +1835,6 @@ Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . -OpenJDK home page: . _ACEOF ac_status=$? fi @@ -1841,698 +1898,21 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF OpenJDK configure jdk8 -generated by GNU Autoconf 2.67 +generated by GNU Autoconf 2.63 -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_objc_try_compile LINENO -# ----------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_objc_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_objc_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_objc_try_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_cxx_try_cpp LINENO -# ------------------------ -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_cpp - -# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES -# --------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_cxx_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval "test \"\${$3+set}\"" = set; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ----------------------------------------- ## -## Report this to build-dev@openjdk.java.net ## -## ----------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_cxx_check_header_mongrel - -# ac_fn_cxx_try_run LINENO -# ------------------------ -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_cxx_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_run - -# ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES -# --------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_cxx_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_cxx_check_header_compile - -# ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES -# ---------------------------------------------- -# Tries to find the compile-time value of EXPR in a program that includes -# INCLUDES, setting VAR accordingly. Returns whether the value could be -# computed -ac_fn_cxx_compute_int () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_lo=0 ac_mid=0 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_hi=$ac_mid; break -else - as_fn_arith $ac_mid + 1 && ac_lo=$as_val - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_hi=-1 ac_mid=-1 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_lo=$ac_mid; break -else - as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - ac_lo= ac_hi= -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_hi=$ac_mid -else - as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in #(( -?*) eval "$3=\$ac_lo"; ac_retval=0 ;; -'') ac_retval=1 ;; -esac - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (($2) < 0) - { - long int i = longval (); - if (i != ($2)) - return 1; - fprintf (f, "%ld", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ($2)) - return 1; - fprintf (f, "%lu", i); - } - /* Do not output a trailing newline, as this causes \r\n confusion - on some platforms. */ - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_run "$LINENO"; then : - echo >>conftest.val; read $3 &5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_link - -# ac_fn_cxx_check_func LINENO FUNC VAR -# ------------------------------------ -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_cxx_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_cxx_check_func - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by OpenJDK $as_me jdk8, which was -generated by GNU Autoconf 2.67. Invocation command line was +generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ @@ -2568,8 +1948,8 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done + $as_echo "PATH: $as_dir" +done IFS=$as_save_IFS } >&5 @@ -2606,9 +1986,9 @@ do ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) - as_fn_append ac_configure_args1 " '$ac_arg'" + ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -2624,13 +2004,13 @@ do -* ) ac_must_keep_next=true ;; esac fi - as_fn_append ac_configure_args " '$ac_arg'" + ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -2642,9 +2022,11 @@ trap 'exit_status=$? { echo - $as_echo "## ---------------- ## + cat <<\_ASBOX +## ---------------- ## ## Cache variables. ## -## ---------------- ##" +## ---------------- ## +_ASBOX echo # The following way of writing the cache mishandles newlines in values, ( @@ -2653,13 +2035,13 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; + *) $as_unset $ac_var ;; esac ;; esac done @@ -2678,9 +2060,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + cat <<\_ASBOX +## ----------------- ## ## Output variables. ## -## ----------------- ##" +## ----------------- ## +_ASBOX echo for ac_var in $ac_subst_vars do @@ -2693,9 +2077,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + cat <<\_ASBOX +## ------------------- ## ## File substitutions. ## -## ------------------- ##" +## ------------------- ## +_ASBOX echo for ac_var in $ac_subst_files do @@ -2709,9 +2095,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; fi if test -s confdefs.h; then - $as_echo "## ----------- ## + cat <<\_ASBOX +## ----------- ## ## confdefs.h. ## -## ----------- ##" +## ----------- ## +_ASBOX echo cat confdefs.h echo @@ -2725,39 +2113,37 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; exit $exit_status ' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h - # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF @@ -2766,12 +2152,7 @@ _ACEOF ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -2782,23 +2163,19 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5 ; } + . "$ac_site_file" fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; @@ -2806,7 +2183,7 @@ $as_echo "$as_me: loading cache $cache_file" >&6;} esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi @@ -2821,11 +2198,11 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; @@ -2835,17 +2212,17 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac @@ -2857,20 +2234,43 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## + + + + + + + + + + + + + + + + + + + + + + + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -2897,7 +2297,9 @@ for ac_dir in build-aux "$srcdir"/build-aux; do fi done if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in build-aux \"$srcdir\"/build-aux" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in build-aux \"$srcdir\"/build-aux" >&2;} + { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, @@ -3428,7 +2830,7 @@ pkgadd_help() { # to create them # Check whether --with-custom-make-dir was given. -if test "${with_custom_make_dir+set}" = set; then : +if test "${with_custom_make_dir+set}" = set; then withval=$with_custom_make_dir; CUSTOM_MAKE_DIR=$with_custom_make_dir fi @@ -3665,7 +3067,7 @@ fi #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1351854415 +DATE_WHEN_GENERATED=1352751880 ############################################################################### # @@ -3682,9 +3084,9 @@ DATE_WHEN_GENERATED=1351854415 DATE_WHEN_CONFIGURED=`LANG=C date` -{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuration created at $DATE_WHEN_CONFIGURED." >&5 +{ $as_echo "$as_me:$LINENO: Configuration created at $DATE_WHEN_CONFIGURED." >&5 $as_echo "$as_me: Configuration created at $DATE_WHEN_CONFIGURED." >&6;} -{ $as_echo "$as_me:${as_lineno-$LINENO}: configure script generated at timestamp $DATE_WHEN_GENERATED." >&5 +{ $as_echo "$as_me:$LINENO: configure script generated at timestamp $DATE_WHEN_GENERATED." >&5 $as_echo "$as_me: configure script generated at timestamp $DATE_WHEN_GENERATED." >&6;} @@ -3701,9 +3103,9 @@ $as_echo "$as_me: configure script generated at timestamp $DATE_WHEN_GENERATED." do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_BASENAME+set}" = set; then : +if test "${ac_cv_path_BASENAME+set}" = set; then $as_echo_n "(cached) " >&6 else case $BASENAME in @@ -3716,14 +3118,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_BASENAME="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -3731,10 +3133,10 @@ esac fi BASENAME=$ac_cv_path_BASENAME if test -n "$BASENAME"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BASENAME" >&5 + { $as_echo "$as_me:$LINENO: result: $BASENAME" >&5 $as_echo "$BASENAME" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3749,9 +3151,11 @@ done else PROG_NAME=basename fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -3760,9 +3164,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_BASH+set}" = set; then : +if test "${ac_cv_path_BASH+set}" = set; then $as_echo_n "(cached) " >&6 else case $BASH in @@ -3775,14 +3179,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_BASH="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -3790,10 +3194,10 @@ esac fi BASH=$ac_cv_path_BASH if test -n "$BASH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BASH" >&5 + { $as_echo "$as_me:$LINENO: result: $BASH" >&5 $as_echo "$BASH" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3808,9 +3212,11 @@ done else PROG_NAME=bash fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -3819,9 +3225,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CAT+set}" = set; then : +if test "${ac_cv_path_CAT+set}" = set; then $as_echo_n "(cached) " >&6 else case $CAT in @@ -3834,14 +3240,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CAT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -3849,10 +3255,10 @@ esac fi CAT=$ac_cv_path_CAT if test -n "$CAT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAT" >&5 + { $as_echo "$as_me:$LINENO: result: $CAT" >&5 $as_echo "$CAT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3867,9 +3273,11 @@ done else PROG_NAME=cat fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -3878,9 +3286,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHMOD+set}" = set; then : +if test "${ac_cv_path_CHMOD+set}" = set; then $as_echo_n "(cached) " >&6 else case $CHMOD in @@ -3893,14 +3301,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CHMOD="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -3908,10 +3316,10 @@ esac fi CHMOD=$ac_cv_path_CHMOD if test -n "$CHMOD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHMOD" >&5 + { $as_echo "$as_me:$LINENO: result: $CHMOD" >&5 $as_echo "$CHMOD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3926,9 +3334,11 @@ done else PROG_NAME=chmod fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -3937,9 +3347,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CMP+set}" = set; then : +if test "${ac_cv_path_CMP+set}" = set; then $as_echo_n "(cached) " >&6 else case $CMP in @@ -3952,14 +3362,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CMP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -3967,10 +3377,10 @@ esac fi CMP=$ac_cv_path_CMP if test -n "$CMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CMP" >&5 + { $as_echo "$as_me:$LINENO: result: $CMP" >&5 $as_echo "$CMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3985,9 +3395,11 @@ done else PROG_NAME=cmp fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -3996,9 +3408,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CP+set}" = set; then : +if test "${ac_cv_path_CP+set}" = set; then $as_echo_n "(cached) " >&6 else case $CP in @@ -4011,14 +3423,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4026,10 +3438,10 @@ esac fi CP=$ac_cv_path_CP if test -n "$CP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CP" >&5 + { $as_echo "$as_me:$LINENO: result: $CP" >&5 $as_echo "$CP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4044,9 +3456,11 @@ done else PROG_NAME=cp fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4055,9 +3469,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CUT+set}" = set; then : +if test "${ac_cv_path_CUT+set}" = set; then $as_echo_n "(cached) " >&6 else case $CUT in @@ -4070,14 +3484,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CUT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4085,10 +3499,10 @@ esac fi CUT=$ac_cv_path_CUT if test -n "$CUT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUT" >&5 + { $as_echo "$as_me:$LINENO: result: $CUT" >&5 $as_echo "$CUT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4103,9 +3517,11 @@ done else PROG_NAME=cut fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4114,9 +3530,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_DATE+set}" = set; then : +if test "${ac_cv_path_DATE+set}" = set; then $as_echo_n "(cached) " >&6 else case $DATE in @@ -4129,14 +3545,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DATE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4144,10 +3560,10 @@ esac fi DATE=$ac_cv_path_DATE if test -n "$DATE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DATE" >&5 + { $as_echo "$as_me:$LINENO: result: $DATE" >&5 $as_echo "$DATE" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4162,9 +3578,11 @@ done else PROG_NAME=date fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4173,9 +3591,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_DIFF+set}" = set; then : +if test "${ac_cv_path_DIFF+set}" = set; then $as_echo_n "(cached) " >&6 else case $DIFF in @@ -4188,14 +3606,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DIFF="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4203,10 +3621,10 @@ esac fi DIFF=$ac_cv_path_DIFF if test -n "$DIFF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DIFF" >&5 + { $as_echo "$as_me:$LINENO: result: $DIFF" >&5 $as_echo "$DIFF" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4221,9 +3639,11 @@ done else PROG_NAME=gdiff diff fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4232,9 +3652,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_DIRNAME+set}" = set; then : +if test "${ac_cv_path_DIRNAME+set}" = set; then $as_echo_n "(cached) " >&6 else case $DIRNAME in @@ -4247,14 +3667,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DIRNAME="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4262,10 +3682,10 @@ esac fi DIRNAME=$ac_cv_path_DIRNAME if test -n "$DIRNAME"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DIRNAME" >&5 + { $as_echo "$as_me:$LINENO: result: $DIRNAME" >&5 $as_echo "$DIRNAME" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4280,9 +3700,11 @@ done else PROG_NAME=dirname fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4291,9 +3713,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ECHO+set}" = set; then : +if test "${ac_cv_path_ECHO+set}" = set; then $as_echo_n "(cached) " >&6 else case $ECHO in @@ -4306,14 +3728,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ECHO="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4321,10 +3743,10 @@ esac fi ECHO=$ac_cv_path_ECHO if test -n "$ECHO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECHO" >&5 + { $as_echo "$as_me:$LINENO: result: $ECHO" >&5 $as_echo "$ECHO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4339,9 +3761,11 @@ done else PROG_NAME=echo fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4350,9 +3774,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_EXPR+set}" = set; then : +if test "${ac_cv_path_EXPR+set}" = set; then $as_echo_n "(cached) " >&6 else case $EXPR in @@ -4365,14 +3789,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_EXPR="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4380,10 +3804,10 @@ esac fi EXPR=$ac_cv_path_EXPR if test -n "$EXPR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXPR" >&5 + { $as_echo "$as_me:$LINENO: result: $EXPR" >&5 $as_echo "$EXPR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4398,9 +3822,11 @@ done else PROG_NAME=expr fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4409,9 +3835,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_FILE+set}" = set; then : +if test "${ac_cv_path_FILE+set}" = set; then $as_echo_n "(cached) " >&6 else case $FILE in @@ -4424,14 +3850,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_FILE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4439,10 +3865,10 @@ esac fi FILE=$ac_cv_path_FILE if test -n "$FILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FILE" >&5 + { $as_echo "$as_me:$LINENO: result: $FILE" >&5 $as_echo "$FILE" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4457,9 +3883,11 @@ done else PROG_NAME=file fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4468,9 +3896,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_FIND+set}" = set; then : +if test "${ac_cv_path_FIND+set}" = set; then $as_echo_n "(cached) " >&6 else case $FIND in @@ -4483,14 +3911,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_FIND="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4498,10 +3926,10 @@ esac fi FIND=$ac_cv_path_FIND if test -n "$FIND"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIND" >&5 + { $as_echo "$as_me:$LINENO: result: $FIND" >&5 $as_echo "$FIND" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4516,9 +3944,11 @@ done else PROG_NAME=find fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4527,9 +3957,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_HEAD+set}" = set; then : +if test "${ac_cv_path_HEAD+set}" = set; then $as_echo_n "(cached) " >&6 else case $HEAD in @@ -4542,14 +3972,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_HEAD="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4557,10 +3987,10 @@ esac fi HEAD=$ac_cv_path_HEAD if test -n "$HEAD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HEAD" >&5 + { $as_echo "$as_me:$LINENO: result: $HEAD" >&5 $as_echo "$HEAD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4575,9 +4005,11 @@ done else PROG_NAME=head fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4586,9 +4018,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_LN+set}" = set; then : +if test "${ac_cv_path_LN+set}" = set; then $as_echo_n "(cached) " >&6 else case $LN in @@ -4601,14 +4033,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LN="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4616,10 +4048,10 @@ esac fi LN=$ac_cv_path_LN if test -n "$LN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LN" >&5 + { $as_echo "$as_me:$LINENO: result: $LN" >&5 $as_echo "$LN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4634,9 +4066,11 @@ done else PROG_NAME=ln fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4645,9 +4079,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_LS+set}" = set; then : +if test "${ac_cv_path_LS+set}" = set; then $as_echo_n "(cached) " >&6 else case $LS in @@ -4660,14 +4094,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4675,10 +4109,10 @@ esac fi LS=$ac_cv_path_LS if test -n "$LS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LS" >&5 + { $as_echo "$as_me:$LINENO: result: $LS" >&5 $as_echo "$LS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4693,9 +4127,11 @@ done else PROG_NAME=ls fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4704,9 +4140,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_MKDIR+set}" = set; then : +if test "${ac_cv_path_MKDIR+set}" = set; then $as_echo_n "(cached) " >&6 else case $MKDIR in @@ -4719,14 +4155,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MKDIR="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4734,10 +4170,10 @@ esac fi MKDIR=$ac_cv_path_MKDIR if test -n "$MKDIR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR" >&5 + { $as_echo "$as_me:$LINENO: result: $MKDIR" >&5 $as_echo "$MKDIR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4752,9 +4188,11 @@ done else PROG_NAME=mkdir fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4763,9 +4201,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_MKTEMP+set}" = set; then : +if test "${ac_cv_path_MKTEMP+set}" = set; then $as_echo_n "(cached) " >&6 else case $MKTEMP in @@ -4778,14 +4216,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MKTEMP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4793,10 +4231,10 @@ esac fi MKTEMP=$ac_cv_path_MKTEMP if test -n "$MKTEMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKTEMP" >&5 + { $as_echo "$as_me:$LINENO: result: $MKTEMP" >&5 $as_echo "$MKTEMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4811,9 +4249,11 @@ done else PROG_NAME=mktemp fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4822,9 +4262,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_MV+set}" = set; then : +if test "${ac_cv_path_MV+set}" = set; then $as_echo_n "(cached) " >&6 else case $MV in @@ -4837,14 +4277,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4852,10 +4292,10 @@ esac fi MV=$ac_cv_path_MV if test -n "$MV"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MV" >&5 + { $as_echo "$as_me:$LINENO: result: $MV" >&5 $as_echo "$MV" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4870,9 +4310,11 @@ done else PROG_NAME=mv fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4881,9 +4323,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PRINTF+set}" = set; then : +if test "${ac_cv_path_PRINTF+set}" = set; then $as_echo_n "(cached) " >&6 else case $PRINTF in @@ -4896,14 +4338,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PRINTF="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4911,10 +4353,10 @@ esac fi PRINTF=$ac_cv_path_PRINTF if test -n "$PRINTF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRINTF" >&5 + { $as_echo "$as_me:$LINENO: result: $PRINTF" >&5 $as_echo "$PRINTF" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4929,9 +4371,11 @@ done else PROG_NAME=printf fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4940,9 +4384,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_THEPWDCMD+set}" = set; then : +if test "${ac_cv_path_THEPWDCMD+set}" = set; then $as_echo_n "(cached) " >&6 else case $THEPWDCMD in @@ -4955,14 +4399,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_THEPWDCMD="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -4970,10 +4414,10 @@ esac fi THEPWDCMD=$ac_cv_path_THEPWDCMD if test -n "$THEPWDCMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $THEPWDCMD" >&5 + { $as_echo "$as_me:$LINENO: result: $THEPWDCMD" >&5 $as_echo "$THEPWDCMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4988,9 +4432,11 @@ done else PROG_NAME=pwd fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -4999,9 +4445,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_RM+set}" = set; then : +if test "${ac_cv_path_RM+set}" = set; then $as_echo_n "(cached) " >&6 else case $RM in @@ -5014,14 +4460,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5029,10 +4475,10 @@ esac fi RM=$ac_cv_path_RM if test -n "$RM"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 + { $as_echo "$as_me:$LINENO: result: $RM" >&5 $as_echo "$RM" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5047,9 +4493,11 @@ done else PROG_NAME=rm fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5058,9 +4506,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_SH+set}" = set; then : +if test "${ac_cv_path_SH+set}" = set; then $as_echo_n "(cached) " >&6 else case $SH in @@ -5073,14 +4521,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SH="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5088,10 +4536,10 @@ esac fi SH=$ac_cv_path_SH if test -n "$SH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SH" >&5 + { $as_echo "$as_me:$LINENO: result: $SH" >&5 $as_echo "$SH" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5106,9 +4554,11 @@ done else PROG_NAME=sh fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5117,9 +4567,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_SORT+set}" = set; then : +if test "${ac_cv_path_SORT+set}" = set; then $as_echo_n "(cached) " >&6 else case $SORT in @@ -5132,14 +4582,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SORT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5147,10 +4597,10 @@ esac fi SORT=$ac_cv_path_SORT if test -n "$SORT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SORT" >&5 + { $as_echo "$as_me:$LINENO: result: $SORT" >&5 $as_echo "$SORT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5165,9 +4615,11 @@ done else PROG_NAME=sort fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5176,9 +4628,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_TAIL+set}" = set; then : +if test "${ac_cv_path_TAIL+set}" = set; then $as_echo_n "(cached) " >&6 else case $TAIL in @@ -5191,14 +4643,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TAIL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5206,10 +4658,10 @@ esac fi TAIL=$ac_cv_path_TAIL if test -n "$TAIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TAIL" >&5 + { $as_echo "$as_me:$LINENO: result: $TAIL" >&5 $as_echo "$TAIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5224,9 +4676,11 @@ done else PROG_NAME=tail fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5235,9 +4689,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_TAR+set}" = set; then : +if test "${ac_cv_path_TAR+set}" = set; then $as_echo_n "(cached) " >&6 else case $TAR in @@ -5250,14 +4704,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TAR="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5265,10 +4719,10 @@ esac fi TAR=$ac_cv_path_TAR if test -n "$TAR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TAR" >&5 + { $as_echo "$as_me:$LINENO: result: $TAR" >&5 $as_echo "$TAR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5283,9 +4737,11 @@ done else PROG_NAME=tar fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5294,9 +4750,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_TEE+set}" = set; then : +if test "${ac_cv_path_TEE+set}" = set; then $as_echo_n "(cached) " >&6 else case $TEE in @@ -5309,14 +4765,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TEE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5324,10 +4780,10 @@ esac fi TEE=$ac_cv_path_TEE if test -n "$TEE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEE" >&5 + { $as_echo "$as_me:$LINENO: result: $TEE" >&5 $as_echo "$TEE" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5342,9 +4798,11 @@ done else PROG_NAME=tee fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5353,9 +4811,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_TOUCH+set}" = set; then : +if test "${ac_cv_path_TOUCH+set}" = set; then $as_echo_n "(cached) " >&6 else case $TOUCH in @@ -5368,14 +4826,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TOUCH="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5383,10 +4841,10 @@ esac fi TOUCH=$ac_cv_path_TOUCH if test -n "$TOUCH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TOUCH" >&5 + { $as_echo "$as_me:$LINENO: result: $TOUCH" >&5 $as_echo "$TOUCH" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5401,9 +4859,11 @@ done else PROG_NAME=touch fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5412,9 +4872,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_TR+set}" = set; then : +if test "${ac_cv_path_TR+set}" = set; then $as_echo_n "(cached) " >&6 else case $TR in @@ -5427,14 +4887,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TR="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5442,10 +4902,10 @@ esac fi TR=$ac_cv_path_TR if test -n "$TR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TR" >&5 + { $as_echo "$as_me:$LINENO: result: $TR" >&5 $as_echo "$TR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5460,9 +4920,11 @@ done else PROG_NAME=tr fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5471,9 +4933,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_UNAME+set}" = set; then : +if test "${ac_cv_path_UNAME+set}" = set; then $as_echo_n "(cached) " >&6 else case $UNAME in @@ -5486,14 +4948,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_UNAME="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5501,10 +4963,10 @@ esac fi UNAME=$ac_cv_path_UNAME if test -n "$UNAME"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNAME" >&5 + { $as_echo "$as_me:$LINENO: result: $UNAME" >&5 $as_echo "$UNAME" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5519,9 +4981,11 @@ done else PROG_NAME=uname fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5530,9 +4994,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_UNIQ+set}" = set; then : +if test "${ac_cv_path_UNIQ+set}" = set; then $as_echo_n "(cached) " >&6 else case $UNIQ in @@ -5545,14 +5009,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_UNIQ="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5560,10 +5024,10 @@ esac fi UNIQ=$ac_cv_path_UNIQ if test -n "$UNIQ"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNIQ" >&5 + { $as_echo "$as_me:$LINENO: result: $UNIQ" >&5 $as_echo "$UNIQ" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5578,9 +5042,11 @@ done else PROG_NAME=uniq fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5589,9 +5055,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_WC+set}" = set; then : +if test "${ac_cv_path_WC+set}" = set; then $as_echo_n "(cached) " >&6 else case $WC in @@ -5604,14 +5070,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_WC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5619,10 +5085,10 @@ esac fi WC=$ac_cv_path_WC if test -n "$WC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WC" >&5 + { $as_echo "$as_me:$LINENO: result: $WC" >&5 $as_echo "$WC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5637,9 +5103,11 @@ done else PROG_NAME=wc fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5648,9 +5116,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_WHICH+set}" = set; then : +if test "${ac_cv_path_WHICH+set}" = set; then $as_echo_n "(cached) " >&6 else case $WHICH in @@ -5663,14 +5131,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_WHICH="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5678,10 +5146,10 @@ esac fi WHICH=$ac_cv_path_WHICH if test -n "$WHICH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WHICH" >&5 + { $as_echo "$as_me:$LINENO: result: $WHICH" >&5 $as_echo "$WHICH" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5696,9 +5164,11 @@ done else PROG_NAME=which fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5707,9 +5177,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_XARGS+set}" = set; then : +if test "${ac_cv_path_XARGS+set}" = set; then $as_echo_n "(cached) " >&6 else case $XARGS in @@ -5722,14 +5192,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XARGS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -5737,10 +5207,10 @@ esac fi XARGS=$ac_cv_path_XARGS if test -n "$XARGS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XARGS" >&5 + { $as_echo "$as_me:$LINENO: result: $XARGS" >&5 $as_echo "$XARGS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5755,9 +5225,11 @@ done else PROG_NAME=xargs fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -5767,9 +5239,9 @@ for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then : +if test "${ac_cv_prog_AWK+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then @@ -5780,24 +5252,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 $as_echo "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -5812,14 +5284,16 @@ done else PROG_NAME= fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then : +if test "${ac_cv_path_GREP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -5830,7 +5304,7 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue @@ -5850,7 +5324,7 @@ case `"$ac_path_GREP" --version 2>&1` in $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" @@ -5865,17 +5339,19 @@ esac $ac_path_GREP_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" @@ -5887,14 +5363,16 @@ $as_echo "$ac_cv_path_GREP" >&6; } else PROG_NAME= fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then : +if test "${ac_cv_path_EGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -5908,7 +5386,7 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue @@ -5928,7 +5406,7 @@ case `"$ac_path_EGREP" --version 2>&1` in $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" @@ -5943,10 +5421,12 @@ esac $ac_path_EGREP_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP @@ -5954,7 +5434,7 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" @@ -5966,14 +5446,16 @@ $as_echo "$ac_cv_path_EGREP" >&6; } else PROG_NAME= fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +{ $as_echo "$as_me:$LINENO: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } -if test "${ac_cv_path_FGREP+set}" = set; then : +if test "${ac_cv_path_FGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 @@ -5987,7 +5469,7 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do + for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue @@ -6007,7 +5489,7 @@ case `"$ac_path_FGREP" --version 2>&1` in $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" @@ -6022,10 +5504,12 @@ esac $ac_path_FGREP_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_FGREP=$FGREP @@ -6033,7 +5517,7 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" @@ -6045,14 +5529,16 @@ $as_echo "$ac_cv_path_FGREP" >&6; } else PROG_NAME= fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } -if test "${ac_cv_path_SED+set}" = set; then : +if test "${ac_cv_path_SED+set}" = set; then $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ @@ -6060,7 +5546,7 @@ else ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} + $as_unset ac_script || ac_script= if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST @@ -6069,7 +5555,7 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue @@ -6089,7 +5575,7 @@ case `"$ac_path_SED" --version 2>&1` in $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" @@ -6104,17 +5590,19 @@ esac $ac_path_SED_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_SED=$SED fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed @@ -6126,9 +5614,11 @@ $as_echo "$ac_cv_path_SED" >&6; } else PROG_NAME= fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -6136,9 +5626,9 @@ for ac_prog in nawk gawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_NAWK+set}" = set; then : +if test "${ac_cv_path_NAWK+set}" = set; then $as_echo_n "(cached) " >&6 else case $NAWK in @@ -6151,14 +5641,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_NAWK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -6166,10 +5656,10 @@ esac fi NAWK=$ac_cv_path_NAWK if test -n "$NAWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NAWK" >&5 + { $as_echo "$as_me:$LINENO: result: $NAWK" >&5 $as_echo "$NAWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -6184,9 +5674,11 @@ done else PROG_NAME= fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -6196,9 +5688,9 @@ RM="$RM -f" # These are not required on all platforms # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CYGPATH+set}" = set; then : +if test "${ac_cv_path_CYGPATH+set}" = set; then $as_echo_n "(cached) " >&6 else case $CYGPATH in @@ -6211,14 +5703,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CYGPATH="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -6226,19 +5718,19 @@ esac fi CYGPATH=$ac_cv_path_CYGPATH if test -n "$CYGPATH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 + { $as_echo "$as_me:$LINENO: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "readlink", so it can be a program name with args. set dummy readlink; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_READLINK+set}" = set; then : +if test "${ac_cv_path_READLINK+set}" = set; then $as_echo_n "(cached) " >&6 else case $READLINK in @@ -6251,14 +5743,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_READLINK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -6266,19 +5758,19 @@ esac fi READLINK=$ac_cv_path_READLINK if test -n "$READLINK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINK" >&5 + { $as_echo "$as_me:$LINENO: result: $READLINK" >&5 $as_echo "$READLINK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "df", so it can be a program name with args. set dummy df; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_DF+set}" = set; then : +if test "${ac_cv_path_DF+set}" = set; then $as_echo_n "(cached) " >&6 else case $DF in @@ -6291,14 +5783,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DF="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -6306,19 +5798,19 @@ esac fi DF=$ac_cv_path_DF if test -n "$DF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DF" >&5 + { $as_echo "$as_me:$LINENO: result: $DF" >&5 $as_echo "$DF" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "SetFile", so it can be a program name with args. set dummy SetFile; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_SETFILE+set}" = set; then : +if test "${ac_cv_path_SETFILE+set}" = set; then $as_echo_n "(cached) " >&6 else case $SETFILE in @@ -6331,14 +5823,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SETFILE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -6346,10 +5838,10 @@ esac fi SETFILE=$ac_cv_path_SETFILE if test -n "$SETFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 + { $as_echo "$as_me:$LINENO: result: $SETFILE" >&5 $as_echo "$SETFILE" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -6358,29 +5850,43 @@ fi # Now we can determine OpenJDK build and target platforms. This is required to # have early on. + +# Figure out the build and target systems. # Note that in autoconf terminology, "build" is obvious, but "target" +# is confusing; it assumes you are cross-compiling a cross-compiler (!) and "target" is thus the target of the +# product you're building. The target of this build is called "host". Since this is confusing to most people, we +# have not adopted that system, but use "target" as the platform we are building for. In some places though we need +# to use the configure naming style. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } -if test "${ac_cv_build+set}" = set; then : +if test "${ac_cv_build+set}" = set; then $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' @@ -6396,24 +5902,28 @@ IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } -if test "${ac_cv_host+set}" = set; then : +if test "${ac_cv_host+set}" = set; then $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' @@ -6429,24 +5939,28 @@ IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +{ $as_echo "$as_me:$LINENO: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } -if test "${ac_cv_target+set}" = set; then : +if test "${ac_cv_target+set}" = set; then $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} + { (exit 1); exit 1; }; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; -*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 +$as_echo "$as_me: error: invalid value of canonical target" >&2;} + { (exit 1); exit 1; }; };; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' @@ -6469,15 +5983,6 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- -# Figure out the build and target systems. # Note that in autoconf terminology, "build" is obvious, but "target" -# is confusing; it assumes you are cross-compiling a cross-compiler (!) and "target" is thus the target of the -# product you're building. The target of this build is called "host". Since this is confusing to most people, we -# have not adopted that system, but use "target" as the platform we are building for. In some places though we need -# to use the configure naming style. - - - - # Copy the autoconf trip/quadruplet verbatim to OPENJDK_TARGET_AUTOCONF_NAME # (from the autoconf "host") and OPENJDK_BUILD_AUTOCONF_NAME @@ -6522,7 +6027,9 @@ test -n "$target_alias" && VAR_OS_ENV=windows.msys ;; *) - as_fn_error $? "unsupported operating system $build_os" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: unsupported operating system $build_os" >&5 +$as_echo "$as_me: error: unsupported operating system $build_os" >&2;} + { (exit 1); exit 1; }; } ;; esac @@ -6572,7 +6079,9 @@ test -n "$target_alias" && VAR_CPU_ENDIAN=big ;; *) - as_fn_error $? "unsupported cpu $build_cpu" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: unsupported cpu $build_cpu" >&5 +$as_echo "$as_me: error: unsupported cpu $build_cpu" >&2;} + { (exit 1); exit 1; }; } ;; esac @@ -6591,9 +6100,9 @@ test -n "$target_alias" && - { $as_echo "$as_me:${as_lineno-$LINENO}: checking openjdk-build os-cpu" >&5 + { $as_echo "$as_me:$LINENO: checking openjdk-build os-cpu" >&5 $as_echo_n "checking openjdk-build os-cpu... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&5 + { $as_echo "$as_me:$LINENO: result: $OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&5 $as_echo "$OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&6; } # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. @@ -6630,7 +6139,9 @@ $as_echo "$OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&6; } VAR_OS_ENV=windows.msys ;; *) - as_fn_error $? "unsupported operating system $host_os" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: unsupported operating system $host_os" >&5 +$as_echo "$as_me: error: unsupported operating system $host_os" >&2;} + { (exit 1); exit 1; }; } ;; esac @@ -6680,7 +6191,9 @@ $as_echo "$OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&6; } VAR_CPU_ENDIAN=big ;; *) - as_fn_error $? "unsupported cpu $host_cpu" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: unsupported cpu $host_cpu" >&5 +$as_echo "$as_me: error: unsupported cpu $host_cpu" >&2;} + { (exit 1); exit 1; }; } ;; esac @@ -6699,15 +6212,15 @@ $as_echo "$OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking openjdk-target os-cpu" >&5 + { $as_echo "$as_me:$LINENO: checking openjdk-target os-cpu" >&5 $as_echo_n "checking openjdk-target os-cpu... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" >&5 + { $as_echo "$as_me:$LINENO: result: $OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" >&5 $as_echo "$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" >&6; } # Check whether --with-target-bits was given. -if test "${with_target_bits+set}" = set; then : +if test "${with_target_bits+set}" = set; then withval=$with_target_bits; fi @@ -6726,7 +6239,9 @@ fi if test "x$with_target_bits" != x; then if test "x$COMPILE_TYPE" = "xcross"; then - as_fn_error $? "It is not possible to combine --with-target-bits=X and proper cross-compilation. Choose either." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: It is not possible to combine --with-target-bits=X and proper cross-compilation. Choose either." >&5 +$as_echo "$as_me: error: It is not possible to combine --with-target-bits=X and proper cross-compilation. Choose either." >&2;} + { (exit 1); exit 1; }; } fi if test "x$with_target_bits" = x32 && test "x$OPENJDK_TARGET_CPU_BITS" = x64; then @@ -6738,22 +6253,28 @@ fi elif test "x$OPENJDK_TARGET_CPU_ARCH" = "xsparc"; then OPENJDK_TARGET_CPU=sparc else - as_fn_error $? "Reduced build (--with-target-bits=32) is only supported on x86_64 and sparcv9" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Reduced build (--with-target-bits=32) is only supported on x86_64 and sparcv9" >&5 +$as_echo "$as_me: error: Reduced build (--with-target-bits=32) is only supported on x86_64 and sparcv9" >&2;} + { (exit 1); exit 1; }; } fi elif test "x$with_target_bits" = x64 && test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - as_fn_error $? "It is not possible to use --with-target-bits=64 on a 32 bit system. Use proper cross-compilation instead." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: It is not possible to use --with-target-bits=64 on a 32 bit system. Use proper cross-compilation instead." >&5 +$as_echo "$as_me: error: It is not possible to use --with-target-bits=64 on a 32 bit system. Use proper cross-compilation instead." >&2;} + { (exit 1); exit 1; }; } elif test "x$with_target_bits" = "x$OPENJDK_TARGET_CPU_BITS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: --with-target-bits are set to build platform address size; argument has no meaning" >&5 + { $as_echo "$as_me:$LINENO: --with-target-bits are set to build platform address size; argument has no meaning" >&5 $as_echo "$as_me: --with-target-bits are set to build platform address size; argument has no meaning" >&6;} else - as_fn_error $? "--with-target-bits can only be 32 or 64, you specified $with_target_bits!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: --with-target-bits can only be 32 or 64, you specified $with_target_bits!" >&5 +$as_echo "$as_me: error: --with-target-bits can only be 32 or 64, you specified $with_target_bits!" >&2;} + { (exit 1); exit 1; }; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compilation type" >&5 +{ $as_echo "$as_me:$LINENO: checking compilation type" >&5 $as_echo_n "checking compilation type... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $COMPILE_TYPE" >&5 +{ $as_echo "$as_me:$LINENO: result: $COMPILE_TYPE" >&5 $as_echo "$COMPILE_TYPE" >&6; } @@ -6944,51 +6465,59 @@ if test "x$OPENJDK_TARGET_OS" = "xwindows"; then SRC_ROOT_LENGTH=`$THEPWDCMD|$WC -m` if test $SRC_ROOT_LENGTH -gt 100; then - as_fn_error $? "Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported" >&5 +$as_echo "$as_me: error: Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported" >&2;} + { (exit 1); exit 1; }; } fi if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking cygwin release" >&5 + { $as_echo "$as_me:$LINENO: checking cygwin release" >&5 $as_echo_n "checking cygwin release... " >&6; } CYGWIN_VERSION=`$UNAME -r` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGWIN_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $CYGWIN_VERSION" >&5 $as_echo "$CYGWIN_VERSION" >&6; } WINDOWS_ENV_VENDOR='cygwin' WINDOWS_ENV_VERSION="$CYGWIN_VERSION" CYGWIN_VERSION_OK=`$ECHO $CYGWIN_VERSION | $GREP ^1.7.` if test "x$CYGWIN_VERSION_OK" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&5 + { $as_echo "$as_me:$LINENO: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&5 $as_echo "$as_me: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi if test "x$CYGPATH" = x; then - as_fn_error $? "Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" >&5 +$as_echo "$as_me: error: Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking cygwin root directory as unix-style path" >&5 + { $as_echo "$as_me:$LINENO: checking cygwin root directory as unix-style path" >&5 $as_echo_n "checking cygwin root directory as unix-style path... " >&6; } # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away cygwin_winpath_root=`cd / ; cmd /c cd | grep ".*"` # Force cygpath to report the proper root by including a trailing space, and then stripping it off again. CYGWIN_ROOT_PATH=`$CYGPATH -u "$cygwin_winpath_root " | $CUT -f 1 -d " "` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGWIN_ROOT_PATH" >&5 + { $as_echo "$as_me:$LINENO: result: $CYGWIN_ROOT_PATH" >&5 $as_echo "$CYGWIN_ROOT_PATH" >&6; } WINDOWS_ENV_ROOT_PATH="$CYGWIN_ROOT_PATH" test_cygdrive_prefix=`$ECHO $CYGWIN_ROOT_PATH | $GREP ^/cygdrive/` if test "x$test_cygdrive_prefix" = x; then - as_fn_error $? "Your cygdrive prefix is not /cygdrive. This is currently not supported. Change with mount -c." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your cygdrive prefix is not /cygdrive. This is currently not supported. Change with mount -c." >&5 +$as_echo "$as_me: error: Your cygdrive prefix is not /cygdrive. This is currently not supported. Change with mount -c." >&2;} + { (exit 1); exit 1; }; } fi elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking msys release" >&5 + { $as_echo "$as_me:$LINENO: checking msys release" >&5 $as_echo_n "checking msys release... " >&6; } MSYS_VERSION=`$UNAME -r` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSYS_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $MSYS_VERSION" >&5 $as_echo "$MSYS_VERSION" >&6; } WINDOWS_ENV_VENDOR='msys' WINDOWS_ENV_VERSION="$MSYS_VERSION" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking msys root directory as unix-style path" >&5 + { $as_echo "$as_me:$LINENO: checking msys root directory as unix-style path" >&5 $as_echo_n "checking msys root directory as unix-style path... " >&6; } # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away MSYS_ROOT_PATH=`cd / ; cmd /c cd | grep ".*"` @@ -7002,32 +6531,36 @@ $as_echo_n "checking msys root directory as unix-style path... " >&6; } MSYS_ROOT_PATH="$unix_path" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSYS_ROOT_PATH" >&5 + { $as_echo "$as_me:$LINENO: result: $MSYS_ROOT_PATH" >&5 $as_echo "$MSYS_ROOT_PATH" >&6; } WINDOWS_ENV_ROOT_PATH="$MSYS_ROOT_PATH" else - as_fn_error $? "Unknown Windows environment. Neither cygwin nor msys was detected." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Unknown Windows environment. Neither cygwin nor msys was detected." >&5 +$as_echo "$as_me: error: Unknown Windows environment. Neither cygwin nor msys was detected." >&2;} + { (exit 1); exit 1; }; } fi # Test if windows or unix (cygwin/msys) find is first in path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking what kind of 'find' is first on the PATH" >&5 + { $as_echo "$as_me:$LINENO: checking what kind of 'find' is first on the PATH" >&5 $as_echo_n "checking what kind of 'find' is first on the PATH... " >&6; } FIND_BINARY_OUTPUT=`find --version 2>&1` if test "x`echo $FIND_BINARY_OUTPUT | $GREP GNU`" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unix style" >&5 + { $as_echo "$as_me:$LINENO: result: unix style" >&5 $as_echo "unix style" >&6; } elif test "x`echo $FIND_BINARY_OUTPUT | $GREP FIND`" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: Windows" >&5 + { $as_echo "$as_me:$LINENO: result: Windows" >&5 $as_echo "Windows" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your path contains Windows tools (C:\Windows\system32) before your unix (cygwin or msys) tools." >&5 + { $as_echo "$as_me:$LINENO: Your path contains Windows tools (C:\Windows\system32) before your unix (cygwin or msys) tools." >&5 $as_echo "$as_me: Your path contains Windows tools (C:\Windows\system32) before your unix (cygwin or msys) tools." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: This will not work. Please correct and make sure /usr/bin (or similar) is first in path." >&5 + { $as_echo "$as_me:$LINENO: This will not work. Please correct and make sure /usr/bin (or similar) is first in path." >&5 $as_echo "$as_me: This will not work. Please correct and make sure /usr/bin (or similar) is first in path." >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 + { $as_echo "$as_me:$LINENO: result: unknown" >&5 $as_echo "unknown" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: It seems that your find utility is non-standard." >&5 + { $as_echo "$as_me:$LINENO: WARNING: It seems that your find utility is non-standard." >&5 $as_echo "$as_me: WARNING: It seems that your find utility is non-standard." >&2;} fi @@ -7056,9 +6589,11 @@ cd "$CURDIR" # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of SRC_ROOT" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of SRC_ROOT" >&5 +$as_echo "$as_me: error: Cannot locate the the path of SRC_ROOT" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -7097,7 +6632,7 @@ $as_echo "$as_me: The path of SRC_ROOT, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then SRC_ROOT="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting SRC_ROOT to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting SRC_ROOT to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting SRC_ROOT to \"$new_path\"" >&6;} fi @@ -7135,7 +6670,7 @@ $as_echo "$as_me: Rewriting SRC_ROOT to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then SRC_ROOT="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting SRC_ROOT to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting SRC_ROOT to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting SRC_ROOT to \"$new_path\"" >&6;} fi @@ -7147,14 +6682,18 @@ $as_echo "$as_me: Rewriting SRC_ROOT to \"$new_path\"" >&6;} path="$SRC_ROOT" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of SRC_ROOT, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of SRC_ROOT, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of SRC_ROOT, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi @@ -7175,9 +6714,11 @@ $as_echo "$as_me: The path of SRC_ROOT, which resolves as \"$path\", is invalid. # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CURDIR, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of CURDIR, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of CURDIR, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of CURDIR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CURDIR" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CURDIR" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -7216,7 +6757,7 @@ $as_echo "$as_me: The path of CURDIR, which resolves as \"$path\", is invalid." if test "x$path" != "x$new_path"; then CURDIR="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CURDIR to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting CURDIR to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting CURDIR to \"$new_path\"" >&6;} fi @@ -7254,7 +6795,7 @@ $as_echo "$as_me: Rewriting CURDIR to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then CURDIR="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CURDIR to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting CURDIR to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting CURDIR to \"$new_path\"" >&6;} fi @@ -7266,14 +6807,18 @@ $as_echo "$as_me: Rewriting CURDIR to \"$new_path\"" >&6;} path="$CURDIR" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of CURDIR, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of CURDIR, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of CURDIR, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CURDIR, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of CURDIR, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of CURDIR, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi @@ -7287,7 +6832,7 @@ fi # is not correct. # Check whether --with-sys-root was given. -if test "${with_sys_root+set}" = set; then : +if test "${with_sys_root+set}" = set; then withval=$with_sys_root; fi @@ -7301,20 +6846,24 @@ fi # Check whether --with-tools-dir was given. -if test "${with_tools_dir+set}" = set; then : +if test "${with_tools_dir+set}" = set; then withval=$with_tools_dir; TOOLS_DIR=$with_tools_dir fi # Check whether --with-devkit was given. -if test "${with_devkit+set}" = set; then : +if test "${with_devkit+set}" = set; then withval=$with_devkit; if test "x$with_sys_root" != x; then - as_fn_error $? "Cannot specify both --with-devkit and --with-sys-root at the same time" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot specify both --with-devkit and --with-sys-root at the same time" >&5 +$as_echo "$as_me: error: Cannot specify both --with-devkit and --with-sys-root at the same time" >&2;} + { (exit 1); exit 1; }; } fi if test "x$with_tools_dir" != x; then - as_fn_error $? "Cannot specify both --with-devkit and --with-tools-dir at the same time" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot specify both --with-devkit and --with-tools-dir at the same time" >&5 +$as_echo "$as_me: error: Cannot specify both --with-devkit and --with-tools-dir at the same time" >&2;} + { (exit 1); exit 1; }; } fi TOOLS_DIR=$with_devkit/bin SYS_ROOT=$with_devkit/$host_alias/libc @@ -7346,11 +6895,11 @@ BUILD_LOG_WRAPPER='$(BASH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)' # modules to compile into the JDK. In the future, these modules # might even be Jigsaw modules. # -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of the JDK to build" >&5 +{ $as_echo "$as_me:$LINENO: checking which variant of the JDK to build" >&5 $as_echo_n "checking which variant of the JDK to build... " >&6; } # Check whether --with-jdk-variant was given. -if test "${with_jdk_variant+set}" = set; then : +if test "${with_jdk_variant+set}" = set; then withval=$with_jdk_variant; fi @@ -7358,12 +6907,14 @@ fi if test "x$with_jdk_variant" = xnormal || test "x$with_jdk_variant" = x; then JDK_VARIANT="normal" else - as_fn_error $? "The available JDK variants are: normal" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The available JDK variants are: normal" >&5 +$as_echo "$as_me: error: The available JDK variants are: normal" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $JDK_VARIANT" >&5 +{ $as_echo "$as_me:$LINENO: result: $JDK_VARIANT" >&5 $as_echo "$JDK_VARIANT" >&6; } @@ -7378,11 +6929,11 @@ $as_echo "$JDK_VARIANT" >&6; } # ie normal interpreter and C1, only the serial GC, kernel jvmti etc # zero: no machine code interpreter, no compiler # zeroshark: zero interpreter and shark/llvm compiler backend -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which variants of the JVM to build" >&5 +{ $as_echo "$as_me:$LINENO: checking which variants of the JVM to build" >&5 $as_echo_n "checking which variants of the JVM to build... " >&6; } # Check whether --with-jvm-variants was given. -if test "${with_jvm_variants+set}" = set; then : +if test "${with_jvm_variants+set}" = set; then withval=$with_jvm_variants; fi @@ -7395,9 +6946,11 @@ JVM_VARIANTS=",$with_jvm_variants," TEST_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/server,//' -e 's/client,//' -e 's/kernel,//' -e 's/zero,//' -e 's/zeroshark,//'` if test "x$TEST_VARIANTS" != "x,"; then - as_fn_error $? "The available JVM variants are: server, client, kernel, zero, zeroshark" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The available JVM variants are: server, client, kernel, zero, zeroshark" >&5 +$as_echo "$as_me: error: The available JVM variants are: server, client, kernel, zero, zeroshark" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_jvm_variants" >&5 +{ $as_echo "$as_me:$LINENO: result: $with_jvm_variants" >&5 $as_echo "$with_jvm_variants" >&6; } JVM_VARIANT_SERVER=`$ECHO "$JVM_VARIANTS" | $SED -e '/,server,/!s/.*/false/g' -e '/,server,/s/.*/true/g'` @@ -7408,12 +6961,16 @@ JVM_VARIANT_ZEROSHARK=`$ECHO "$JVM_VARIANTS" | $SED -e '/,zeroshark,/!s/.*/false if test "x$JVM_VARIANT_CLIENT" = xtrue; then if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - as_fn_error $? "You cannot build a client JVM for a 64-bit machine." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: You cannot build a client JVM for a 64-bit machine." >&5 +$as_echo "$as_me: error: You cannot build a client JVM for a 64-bit machine." >&2;} + { (exit 1); exit 1; }; } fi fi if test "x$JVM_VARIANT_KERNEL" = xtrue; then if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - as_fn_error $? "You cannot build a kernel JVM for a 64-bit machine." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: You cannot build a kernel JVM for a 64-bit machine." >&5 +$as_echo "$as_me: error: You cannot build a kernel JVM for a 64-bit machine." >&2;} + { (exit 1); exit 1; }; } fi fi @@ -7449,10 +7006,10 @@ fi # slowdebug: debug information (-g), no optimizations, all asserts # DEBUG_LEVEL="release" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which debug level to use" >&5 +{ $as_echo "$as_me:$LINENO: checking which debug level to use" >&5 $as_echo_n "checking which debug level to use... " >&6; } # Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : +if test "${enable_debug+set}" = set; then enableval=$enable_debug; ENABLE_DEBUG="${enableval}" DEBUG_LEVEL="fastdebug" @@ -7464,22 +7021,26 @@ fi # Check whether --with-debug-level was given. -if test "${with_debug_level+set}" = set; then : +if test "${with_debug_level+set}" = set; then withval=$with_debug_level; DEBUG_LEVEL="${withval}" if test "x$ENABLE_DEBUG" = xyes; then - as_fn_error $? "You cannot use both --enable-debug and --with-debug-level at the same time." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: You cannot use both --enable-debug and --with-debug-level at the same time." >&5 +$as_echo "$as_me: error: You cannot use both --enable-debug and --with-debug-level at the same time." >&2;} + { (exit 1); exit 1; }; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DEBUG_LEVEL" >&5 +{ $as_echo "$as_me:$LINENO: result: $DEBUG_LEVEL" >&5 $as_echo "$DEBUG_LEVEL" >&6; } if test "x$DEBUG_LEVEL" != xrelease && \ test "x$DEBUG_LEVEL" != xfastdebug && \ test "x$DEBUG_LEVEL" != xslowdebug; then - as_fn_error $? "Allowed debug levels are: release, fastdebug and slowdebug" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Allowed debug levels are: release, fastdebug and slowdebug" >&5 +$as_echo "$as_me: error: Allowed debug levels are: release, fastdebug and slowdebug" >&2;} + { (exit 1); exit 1; }; } fi @@ -7569,7 +7130,7 @@ fi # Check whether --with-conf-name was given. -if test "${with_conf_name+set}" = set; then : +if test "${with_conf_name+set}" = set; then withval=$with_conf_name; CONF_NAME=${with_conf_name} fi @@ -7584,7 +7145,9 @@ if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" || te OUTPUT_ROOT="$SRC_ROOT/build/${CONF_NAME}" $MKDIR -p "$OUTPUT_ROOT" if test ! -d "$OUTPUT_ROOT"; then - as_fn_error $? "Could not create build directory $OUTPUT_ROOT" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create build directory $OUTPUT_ROOT" >&5 +$as_echo "$as_me: error: Could not create build directory $OUTPUT_ROOT" >&2;} + { (exit 1); exit 1; }; } fi else # We are running configure from outside of the src dir. @@ -7608,27 +7171,29 @@ else filtered_files=`$ECHO "$files_present" | $SED -e 's/config.log//g' -e 's/confdefs.h//g' -e 's/ //g' \ | $TR -d '\n'` if test "x$filtered_files" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Current directory is $CURDIR." >&5 + { $as_echo "$as_me:$LINENO: Current directory is $CURDIR." >&5 $as_echo "$as_me: Current directory is $CURDIR." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Since this is not the source root, configure will output the configuration here" >&5 + { $as_echo "$as_me:$LINENO: Since this is not the source root, configure will output the configuration here" >&5 $as_echo "$as_me: Since this is not the source root, configure will output the configuration here" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (as opposed to creating a configuration in /build/)." >&5 + { $as_echo "$as_me:$LINENO: (as opposed to creating a configuration in /build/)." >&5 $as_echo "$as_me: (as opposed to creating a configuration in /build/)." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: However, this directory is not empty. This is not allowed, since it could" >&5 + { $as_echo "$as_me:$LINENO: However, this directory is not empty. This is not allowed, since it could" >&5 $as_echo "$as_me: However, this directory is not empty. This is not allowed, since it could" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: seriously mess up just about everything." >&5 + { $as_echo "$as_me:$LINENO: seriously mess up just about everything." >&5 $as_echo "$as_me: seriously mess up just about everything." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Try 'cd $SRC_ROOT' and restart configure" >&5 + { $as_echo "$as_me:$LINENO: Try 'cd $SRC_ROOT' and restart configure" >&5 $as_echo "$as_me: Try 'cd $SRC_ROOT' and restart configure" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (or create a new empty directory and cd to it)." >&5 + { $as_echo "$as_me:$LINENO: (or create a new empty directory and cd to it)." >&5 $as_echo "$as_me: (or create a new empty directory and cd to it)." >&6;} - as_fn_error $? "Will not continue creating configuration in $CURDIR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Will not continue creating configuration in $CURDIR" >&5 +$as_echo "$as_me: error: Will not continue creating configuration in $CURDIR" >&2;} + { (exit 1); exit 1; }; } fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what configuration name to use" >&5 +{ $as_echo "$as_me:$LINENO: checking what configuration name to use" >&5 $as_echo_n "checking what configuration name to use... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CONF_NAME" >&5 +{ $as_echo "$as_me:$LINENO: result: $CONF_NAME" >&5 $as_echo "$CONF_NAME" >&6; } @@ -7648,9 +7213,11 @@ $as_echo "$CONF_NAME" >&6; } # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of OUTPUT_ROOT" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OUTPUT_ROOT" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OUTPUT_ROOT" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -7689,7 +7256,7 @@ $as_echo "$as_me: The path of OUTPUT_ROOT, which resolves as \"$path\", is inval if test "x$path" != "x$new_path"; then OUTPUT_ROOT="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OUTPUT_ROOT to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting OUTPUT_ROOT to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting OUTPUT_ROOT to \"$new_path\"" >&6;} fi @@ -7727,7 +7294,7 @@ $as_echo "$as_me: Rewriting OUTPUT_ROOT to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then OUTPUT_ROOT="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OUTPUT_ROOT to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting OUTPUT_ROOT to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting OUTPUT_ROOT to \"$new_path\"" >&6;} fi @@ -7739,14 +7306,18 @@ $as_echo "$as_me: Rewriting OUTPUT_ROOT to \"$new_path\"" >&6;} path="$OUTPUT_ROOT" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of OUTPUT_ROOT, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of OUTPUT_ROOT, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of OUTPUT_ROOT, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi @@ -7792,9 +7363,9 @@ echo "$CONFIGURE_COMMAND_LINE" > $OUTPUT_ROOT/configure-arguments do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_PKGHANDLER+set}" = set; then : +if test "${ac_cv_prog_PKGHANDLER+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$PKGHANDLER"; then @@ -7805,24 +7376,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PKGHANDLER="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi PKGHANDLER=$ac_cv_prog_PKGHANDLER if test -n "$PKGHANDLER"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGHANDLER" >&5 + { $as_echo "$as_me:$LINENO: result: $PKGHANDLER" >&5 $as_echo "$PKGHANDLER" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -7839,23 +7410,25 @@ done if test "x$MAKE" != x; then # User has supplied a make, test it. if test ! -f "$MAKE"; then - as_fn_error $? "The specified make (by MAKE=$MAKE) is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The specified make (by MAKE=$MAKE) is not found." >&5 +$as_echo "$as_me: error: The specified make (by MAKE=$MAKE) is not found." >&2;} + { (exit 1); exit 1; }; } fi MAKE_CANDIDATE=""$MAKE"" DESCRIPTION="user supplied MAKE=$MAKE" if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 + { $as_echo "$as_me:$LINENO: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 $as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 $as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} else IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} else if test "x$OPENJDK_BUILD_OS" = "xwindows"; then @@ -7864,7 +7437,9 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then MAKE_EXPECTED_ENV='msys' else - as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Unknown Windows environment" >&5 +$as_echo "$as_me: error: Unknown Windows environment" >&2;} + { (exit 1); exit 1; }; } fi MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` @@ -7873,7 +7448,7 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version IS_MAKE_CORRECT_ENV=true fi if test "x$IS_MAKE_CORRECT_ENV" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} else FOUND_MAKE=$MAKE_CANDIDATE @@ -7918,14 +7493,16 @@ $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -7945,11 +7522,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -8041,14 +7620,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -8103,18 +7684,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -8128,7 +7711,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then FOUND_MAKE="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} fi @@ -8138,7 +7721,9 @@ $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} fi if test "x$FOUND_MAKE" = x; then - as_fn_error $? "The specified make (by MAKE=$MAKE) is not GNU make 3.81 or newer." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The specified make (by MAKE=$MAKE) is not GNU make 3.81 or newer." >&5 +$as_echo "$as_me: error: The specified make (by MAKE=$MAKE) is not GNU make 3.81 or newer." >&2;} + { (exit 1); exit 1; }; } fi else # Try our hardest to locate a correct version of GNU make @@ -8146,9 +7731,9 @@ $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_GMAKE+set}" = set; then : +if test "${ac_cv_path_CHECK_GMAKE+set}" = set; then $as_echo_n "(cached) " >&6 else case $CHECK_GMAKE in @@ -8161,14 +7746,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CHECK_GMAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -8176,10 +7761,10 @@ esac fi CHECK_GMAKE=$ac_cv_path_CHECK_GMAKE if test -n "$CHECK_GMAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_GMAKE" >&5 + { $as_echo "$as_me:$LINENO: result: $CHECK_GMAKE" >&5 $as_echo "$CHECK_GMAKE" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -8191,17 +7776,17 @@ done MAKE_CANDIDATE=""$CHECK_GMAKE"" DESCRIPTION="gmake in PATH" if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 + { $as_echo "$as_me:$LINENO: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 $as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 $as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} else IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} else if test "x$OPENJDK_BUILD_OS" = "xwindows"; then @@ -8210,7 +7795,9 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then MAKE_EXPECTED_ENV='msys' else - as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Unknown Windows environment" >&5 +$as_echo "$as_me: error: Unknown Windows environment" >&2;} + { (exit 1); exit 1; }; } fi MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` @@ -8219,7 +7806,7 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version IS_MAKE_CORRECT_ENV=true fi if test "x$IS_MAKE_CORRECT_ENV" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} else FOUND_MAKE=$MAKE_CANDIDATE @@ -8264,14 +7851,16 @@ $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -8291,11 +7880,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -8387,14 +7978,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -8449,18 +8042,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -8474,7 +8069,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then FOUND_MAKE="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} fi @@ -8489,9 +8084,9 @@ $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_MAKE+set}" = set; then : +if test "${ac_cv_path_CHECK_MAKE+set}" = set; then $as_echo_n "(cached) " >&6 else case $CHECK_MAKE in @@ -8504,14 +8099,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CHECK_MAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -8519,10 +8114,10 @@ esac fi CHECK_MAKE=$ac_cv_path_CHECK_MAKE if test -n "$CHECK_MAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_MAKE" >&5 + { $as_echo "$as_me:$LINENO: result: $CHECK_MAKE" >&5 $as_echo "$CHECK_MAKE" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -8534,17 +8129,17 @@ done MAKE_CANDIDATE=""$CHECK_MAKE"" DESCRIPTION="make in PATH" if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 + { $as_echo "$as_me:$LINENO: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 $as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 $as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} else IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} else if test "x$OPENJDK_BUILD_OS" = "xwindows"; then @@ -8553,7 +8148,9 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then MAKE_EXPECTED_ENV='msys' else - as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Unknown Windows environment" >&5 +$as_echo "$as_me: error: Unknown Windows environment" >&2;} + { (exit 1); exit 1; }; } fi MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` @@ -8562,7 +8159,7 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version IS_MAKE_CORRECT_ENV=true fi if test "x$IS_MAKE_CORRECT_ENV" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} else FOUND_MAKE=$MAKE_CANDIDATE @@ -8607,14 +8204,16 @@ $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -8634,11 +8233,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -8730,14 +8331,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -8792,18 +8395,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -8817,7 +8422,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then FOUND_MAKE="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} fi @@ -8837,9 +8442,9 @@ $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_TOOLSDIR_GMAKE+set}" = set; then : +if test "${ac_cv_path_CHECK_TOOLSDIR_GMAKE+set}" = set; then $as_echo_n "(cached) " >&6 else case $CHECK_TOOLSDIR_GMAKE in @@ -8852,14 +8457,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CHECK_TOOLSDIR_GMAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -8867,10 +8472,10 @@ esac fi CHECK_TOOLSDIR_GMAKE=$ac_cv_path_CHECK_TOOLSDIR_GMAKE if test -n "$CHECK_TOOLSDIR_GMAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_GMAKE" >&5 + { $as_echo "$as_me:$LINENO: result: $CHECK_TOOLSDIR_GMAKE" >&5 $as_echo "$CHECK_TOOLSDIR_GMAKE" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -8882,17 +8487,17 @@ done MAKE_CANDIDATE=""$CHECK_TOOLSDIR_GMAKE"" DESCRIPTION="gmake in tools-dir" if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 + { $as_echo "$as_me:$LINENO: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 $as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 $as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} else IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} else if test "x$OPENJDK_BUILD_OS" = "xwindows"; then @@ -8901,7 +8506,9 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then MAKE_EXPECTED_ENV='msys' else - as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Unknown Windows environment" >&5 +$as_echo "$as_me: error: Unknown Windows environment" >&2;} + { (exit 1); exit 1; }; } fi MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` @@ -8910,7 +8517,7 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version IS_MAKE_CORRECT_ENV=true fi if test "x$IS_MAKE_CORRECT_ENV" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} else FOUND_MAKE=$MAKE_CANDIDATE @@ -8955,14 +8562,16 @@ $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -8982,11 +8591,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -9078,14 +8689,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -9140,18 +8753,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -9165,7 +8780,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then FOUND_MAKE="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} fi @@ -9179,9 +8794,9 @@ $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_TOOLSDIR_MAKE+set}" = set; then : +if test "${ac_cv_path_CHECK_TOOLSDIR_MAKE+set}" = set; then $as_echo_n "(cached) " >&6 else case $CHECK_TOOLSDIR_MAKE in @@ -9194,14 +8809,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CHECK_TOOLSDIR_MAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9209,10 +8824,10 @@ esac fi CHECK_TOOLSDIR_MAKE=$ac_cv_path_CHECK_TOOLSDIR_MAKE if test -n "$CHECK_TOOLSDIR_MAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_MAKE" >&5 + { $as_echo "$as_me:$LINENO: result: $CHECK_TOOLSDIR_MAKE" >&5 $as_echo "$CHECK_TOOLSDIR_MAKE" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -9224,17 +8839,17 @@ done MAKE_CANDIDATE=""$CHECK_TOOLSDIR_MAKE"" DESCRIPTION="make in tools-dir" if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 + { $as_echo "$as_me:$LINENO: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 $as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 $as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} else IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} else if test "x$OPENJDK_BUILD_OS" = "xwindows"; then @@ -9243,7 +8858,9 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then MAKE_EXPECTED_ENV='msys' else - as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Unknown Windows environment" >&5 +$as_echo "$as_me: error: Unknown Windows environment" >&2;} + { (exit 1); exit 1; }; } fi MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` @@ -9252,7 +8869,7 @@ $as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version IS_MAKE_CORRECT_ENV=true fi if test "x$IS_MAKE_CORRECT_ENV" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 + { $as_echo "$as_me:$LINENO: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} else FOUND_MAKE=$MAKE_CANDIDATE @@ -9297,14 +8914,16 @@ $as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -9324,11 +8943,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -9420,14 +9041,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -9482,18 +9105,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FOUND_MAKE" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FOUND_MAKE" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -9507,7 +9132,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then FOUND_MAKE="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} fi @@ -9522,19 +9147,21 @@ $as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} fi if test "x$FOUND_MAKE" = x; then - as_fn_error $? "Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure." >&5 +$as_echo "$as_me: error: Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure." >&2;} + { (exit 1); exit 1; }; } fi fi MAKE=$FOUND_MAKE - { $as_echo "$as_me:${as_lineno-$LINENO}: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&5 + { $as_echo "$as_me:$LINENO: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&5 $as_echo "$as_me: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&6;} # Test if find supports -delete - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if find supports -delete" >&5 + { $as_echo "$as_me:$LINENO: checking if find supports -delete" >&5 $as_echo_n "checking if find supports -delete... " >&6; } FIND_DELETE="-delete" @@ -9547,10 +9174,10 @@ $as_echo_n "checking if find supports -delete... " >&6; } # No, it does not. rm $DELETEDIR/TestIfFindSupportsDelete FIND_DELETE="-exec rm \{\} \+" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } fi rmdir $DELETEDIR @@ -9564,9 +9191,9 @@ $as_echo "yes" >&6; } do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_UNZIP+set}" = set; then : +if test "${ac_cv_path_UNZIP+set}" = set; then $as_echo_n "(cached) " >&6 else case $UNZIP in @@ -9579,14 +9206,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_UNZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9594,10 +9221,10 @@ esac fi UNZIP=$ac_cv_path_UNZIP if test -n "$UNZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNZIP" >&5 + { $as_echo "$as_me:$LINENO: result: $UNZIP" >&5 $as_echo "$UNZIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -9612,9 +9239,11 @@ done else PROG_NAME=unzip fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -9623,9 +9252,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ZIP+set}" = set; then : +if test "${ac_cv_path_ZIP+set}" = set; then $as_echo_n "(cached) " >&6 else case $ZIP in @@ -9638,14 +9267,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9653,10 +9282,10 @@ esac fi ZIP=$ac_cv_path_ZIP if test -n "$ZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 + { $as_echo "$as_me:$LINENO: result: $ZIP" >&5 $as_echo "$ZIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -9671,9 +9300,11 @@ done else PROG_NAME=zip fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -9682,9 +9313,9 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} # Extract the first word of "ldd", so it can be a program name with args. set dummy ldd; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_LDD+set}" = set; then : +if test "${ac_cv_path_LDD+set}" = set; then $as_echo_n "(cached) " >&6 else case $LDD in @@ -9697,14 +9328,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LDD="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9712,10 +9343,10 @@ esac fi LDD=$ac_cv_path_LDD if test -n "$LDD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDD" >&5 + { $as_echo "$as_me:$LINENO: result: $LDD" >&5 $as_echo "$LDD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -9728,9 +9359,9 @@ if test "x$LDD" = "x"; then fi # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_OTOOL+set}" = set; then : +if test "${ac_cv_path_OTOOL+set}" = set; then $as_echo_n "(cached) " >&6 else case $OTOOL in @@ -9743,14 +9374,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_OTOOL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9758,10 +9389,10 @@ esac fi OTOOL=$ac_cv_path_OTOOL if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 + { $as_echo "$as_me:$LINENO: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -9773,9 +9404,9 @@ for ac_prog in readelf greadelf do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_READELF+set}" = set; then : +if test "${ac_cv_path_READELF+set}" = set; then $as_echo_n "(cached) " >&6 else case $READELF in @@ -9788,14 +9419,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_READELF="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9803,10 +9434,10 @@ esac fi READELF=$ac_cv_path_READELF if test -n "$READELF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5 + { $as_echo "$as_me:$LINENO: result: $READELF" >&5 $as_echo "$READELF" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -9816,9 +9447,9 @@ done # Extract the first word of "hg", so it can be a program name with args. set dummy hg; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_HG+set}" = set; then : +if test "${ac_cv_path_HG+set}" = set; then $as_echo_n "(cached) " >&6 else case $HG in @@ -9831,14 +9462,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_HG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9846,19 +9477,19 @@ esac fi HG=$ac_cv_path_HG if test -n "$HG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HG" >&5 + { $as_echo "$as_me:$LINENO: result: $HG" >&5 $as_echo "$HG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "stat", so it can be a program name with args. set dummy stat; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_STAT+set}" = set; then : +if test "${ac_cv_path_STAT+set}" = set; then $as_echo_n "(cached) " >&6 else case $STAT in @@ -9871,14 +9502,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_STAT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9886,19 +9517,19 @@ esac fi STAT=$ac_cv_path_STAT if test -n "$STAT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STAT" >&5 + { $as_echo "$as_me:$LINENO: result: $STAT" >&5 $as_echo "$STAT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "time", so it can be a program name with args. set dummy time; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_TIME+set}" = set; then : +if test "${ac_cv_path_TIME+set}" = set; then $as_echo_n "(cached) " >&6 else case $TIME in @@ -9911,14 +9542,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TIME="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9926,10 +9557,10 @@ esac fi TIME=$ac_cv_path_TIME if test -n "$TIME"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TIME" >&5 + { $as_echo "$as_me:$LINENO: result: $TIME" >&5 $as_echo "$TIME" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -9941,9 +9572,9 @@ if test "x$OPENJDK_TARGET_OS" = "xwindows"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_COMM+set}" = set; then : +if test "${ac_cv_path_COMM+set}" = set; then $as_echo_n "(cached) " >&6 else case $COMM in @@ -9956,14 +9587,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_COMM="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -9971,10 +9602,10 @@ esac fi COMM=$ac_cv_path_COMM if test -n "$COMM"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $COMM" >&5 + { $as_echo "$as_me:$LINENO: result: $COMM" >&5 $as_echo "$COMM" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -9989,9 +9620,11 @@ done else PROG_NAME=comm fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 + { $as_echo "$as_me:$LINENO: Could not find $PROG_NAME!" >&5 $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi @@ -10005,9 +9638,9 @@ if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in @@ -10020,14 +9653,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -10035,10 +9668,10 @@ esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 + { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -10048,9 +9681,9 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : +if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in @@ -10063,14 +9696,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -10078,10 +9711,10 @@ esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -10090,7 +9723,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -10103,13 +9736,13 @@ fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 + { $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi @@ -10137,21 +9770,21 @@ OS_VERSION_MICRO="`${ECHO} ${OS_VERSION} | ${CUT} -f 3 -d ' '`" # Check whether --with-builddeps-conf was given. -if test "${with_builddeps_conf+set}" = set; then : +if test "${with_builddeps_conf+set}" = set; then withval=$with_builddeps_conf; fi # Check whether --with-builddeps-server was given. -if test "${with_builddeps_server+set}" = set; then : +if test "${with_builddeps_server+set}" = set; then withval=$with_builddeps_server; fi # Check whether --with-builddeps-dir was given. -if test "${with_builddeps_dir+set}" = set; then : +if test "${with_builddeps_dir+set}" = set; then withval=$with_builddeps_dir; else with_builddeps_dir=/localhome/builddeps @@ -10160,7 +9793,7 @@ fi # Check whether --with-builddeps-group was given. -if test "${with_builddeps_group+set}" = set; then : +if test "${with_builddeps_group+set}" = set; then withval=$with_builddeps_group; fi @@ -10169,18 +9802,20 @@ fi if test "x$with_builddeps_server" != x || test "x$with_builddeps_conf" != x; then if test "x$with_builddeps_conf" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for supplied builddeps configuration file" >&5 + { $as_echo "$as_me:$LINENO: checking for supplied builddeps configuration file" >&5 $as_echo_n "checking for supplied builddeps configuration file... " >&6; } builddepsfile=$with_builddeps_conf if test -s $builddepsfile; then . $builddepsfile - { $as_echo "$as_me:${as_lineno-$LINENO}: result: loaded!" >&5 + { $as_echo "$as_me:$LINENO: result: loaded!" >&5 $as_echo "loaded!" >&6; } else - as_fn_error $? "The given builddeps conf file $with_builddeps_conf could not be loaded!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The given builddeps conf file $with_builddeps_conf could not be loaded!" >&5 +$as_echo "$as_me: error: The given builddeps conf file $with_builddeps_conf could not be loaded!" >&2;} + { (exit 1); exit 1; }; } fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for builddeps.conf files in sources..." >&5 + { $as_echo "$as_me:$LINENO: checking for builddeps.conf files in sources..." >&5 $as_echo_n "checking for builddeps.conf files in sources...... " >&6; } builddepsfile=`mktemp` touch $builddepsfile @@ -10189,10 +9824,12 @@ $as_echo_n "checking for builddeps.conf files in sources...... " >&6; } # Source the file to acquire the variables if test -s $builddepsfile; then . $builddepsfile - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found at least one!" >&5 + { $as_echo "$as_me:$LINENO: result: found at least one!" >&5 $as_echo "found at least one!" >&6; } else - as_fn_error $? "Could not find any builddeps.conf at all!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find any builddeps.conf at all!" >&5 +$as_echo "$as_me: error: Could not find any builddeps.conf at all!" >&2;} + { (exit 1); exit 1; }; } fi fi # Create build and target names that use _ instead of "-" and ".". @@ -10221,9 +9858,9 @@ $as_echo "found at least one!" >&6; } do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_BDEPS_UNZIP+set}" = set; then : +if test "${ac_cv_prog_BDEPS_UNZIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$BDEPS_UNZIP"; then @@ -10234,24 +9871,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_BDEPS_UNZIP="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi BDEPS_UNZIP=$ac_cv_prog_BDEPS_UNZIP if test -n "$BDEPS_UNZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_UNZIP" >&5 + { $as_echo "$as_me:$LINENO: result: $BDEPS_UNZIP" >&5 $as_echo "$BDEPS_UNZIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -10267,9 +9904,9 @@ done do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_BDEPS_FTP+set}" = set; then : +if test "${ac_cv_prog_BDEPS_FTP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$BDEPS_FTP"; then @@ -10280,24 +9917,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_BDEPS_FTP="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi BDEPS_FTP=$ac_cv_prog_BDEPS_FTP if test -n "$BDEPS_FTP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_FTP" >&5 + { $as_echo "$as_me:$LINENO: result: $BDEPS_FTP" >&5 $as_echo "$BDEPS_FTP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -10321,33 +9958,33 @@ done # Should we build only OpenJDK even if closed sources are present? # # Check whether --enable-openjdk-only was given. -if test "${enable_openjdk_only+set}" = set; then : +if test "${enable_openjdk_only+set}" = set; then enableval=$enable_openjdk_only; else enable_openjdk_only="no" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for presence of closed sources" >&5 +{ $as_echo "$as_me:$LINENO: checking for presence of closed sources" >&5 $as_echo_n "checking for presence of closed sources... " >&6; } if test -d "$SRC_ROOT/jdk/src/closed"; then CLOSED_SOURCE_PRESENT=yes else CLOSED_SOURCE_PRESENT=no fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CLOSED_SOURCE_PRESENT" >&5 +{ $as_echo "$as_me:$LINENO: result: $CLOSED_SOURCE_PRESENT" >&5 $as_echo "$CLOSED_SOURCE_PRESENT" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if closed source is supressed (openjdk-only)" >&5 +{ $as_echo "$as_me:$LINENO: checking if closed source is supressed (openjdk-only)" >&5 $as_echo_n "checking if closed source is supressed (openjdk-only)... " >&6; } SUPRESS_CLOSED_SOURCE="$enable_openjdk_only" -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SUPRESS_CLOSED_SOURCE" >&5 +{ $as_echo "$as_me:$LINENO: result: $SUPRESS_CLOSED_SOURCE" >&5 $as_echo "$SUPRESS_CLOSED_SOURCE" >&6; } if test "x$CLOSED_SOURCE_PRESENT" = xno; then OPENJDK=true if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No closed source present, --enable-openjdk-only makes no sense" >&5 + { $as_echo "$as_me:$LINENO: WARNING: No closed source present, --enable-openjdk-only makes no sense" >&5 $as_echo "$as_me: WARNING: No closed source present, --enable-openjdk-only makes no sense" >&2;} fi else @@ -10369,10 +10006,10 @@ fi # Should we build a JDK/JVM with headful support (ie a graphical ui)? # We always build headless support. # -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking headful support" >&5 +{ $as_echo "$as_me:$LINENO: checking headful support" >&5 $as_echo_n "checking headful support... " >&6; } # Check whether --enable-headful was given. -if test "${enable_headful+set}" = set; then : +if test "${enable_headful+set}" = set; then enableval=$enable_headful; SUPPORT_HEADFUL=${enable_headful} else SUPPORT_HEADFUL=yes @@ -10393,7 +10030,7 @@ if test "x$SUPPORT_HEADFUL" = xno; then headful_msg="headless only" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $headful_msg" >&5 +{ $as_echo "$as_me:$LINENO: result: $headful_msg" >&5 $as_echo "$headful_msg" >&6; } @@ -10402,7 +10039,7 @@ $as_echo "$headful_msg" >&6; } # Control wether Hotspot runs Queens test after build. # Check whether --enable-hotspot-test-in-build was given. -if test "${enable_hotspot_test_in_build+set}" = set; then : +if test "${enable_hotspot_test_in_build+set}" = set; then enableval=$enable_hotspot_test_in_build; else enable_hotspot_test_in_build=no @@ -10421,7 +10058,7 @@ fi # # Check whether --with-cacerts-file was given. -if test "${with_cacerts_file+set}" = set; then : +if test "${with_cacerts_file+set}" = set; then withval=$with_cacerts_file; fi @@ -10441,7 +10078,7 @@ fi # Enable or disable unlimited crypto # # Check whether --enable-unlimited-crypto was given. -if test "${enable_unlimited_crypto+set}" = set; then : +if test "${enable_unlimited_crypto+set}" = set; then enableval=$enable_unlimited_crypto; else enable_unlimited_crypto=no @@ -10528,7 +10165,7 @@ COOKED_BUILD_NUMBER=`$ECHO $JDK_BUILD_NUMBER | $SED -e 's/^b//' -e 's/^0//'` BOOT_JDK_FOUND=no # Check whether --with-boot-jdk was given. -if test "${with_boot_jdk+set}" = set; then : +if test "${with_boot_jdk+set}" = set; then withval=$with_boot_jdk; fi @@ -10546,7 +10183,7 @@ fi if test "x$with_boot_jdk" != x; then BOOT_JDK=$with_boot_jdk BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using configure arguments" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using configure arguments" >&5 $as_echo "$as_me: Found potential Boot JDK using configure arguments" >&6;} fi @@ -10555,21 +10192,21 @@ fi if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -10579,9 +10216,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -10604,9 +10241,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -10645,7 +10284,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -10683,7 +10322,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -10695,25 +10334,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -10725,7 +10368,9 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$with_boot_jdk" != x && test "x$BOOT_JDK_FOUND" = xno; then # Having specified an argument which is incorrect will produce an instant failure; # we should not go on looking - as_fn_error $? "The path given by --with-boot-jdk does not contain a valid Boot JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path given by --with-boot-jdk does not contain a valid Boot JDK" >&5 +$as_echo "$as_me: error: The path given by --with-boot-jdk does not contain a valid Boot JDK" >&2;} + { (exit 1); exit 1; }; } fi # Test: Is bootjdk available from builddeps? @@ -10754,7 +10399,7 @@ fi resource=${builddep_bootjdk} fi if test "x$resource" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Using builddeps $resource for bootjdk" >&5 + { $as_echo "$as_me:$LINENO: Using builddeps $resource for bootjdk" >&5 $as_echo "$as_me: Using builddeps $resource for bootjdk" >&6;} # If the resource in the builddeps.conf file is an existing directory, # for example /java/linux/cups @@ -10775,18 +10420,22 @@ $as_echo "$as_me: Using builddeps $resource for bootjdk" >&6;} extension=${filename#*.} installdir=$with_builddeps_dir/$filebase if test ! -f $installdir/$filename.unpacked; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Downloading build dependency bootjdk from $with_builddeps_server/$resource and installing into $installdir" >&5 + { $as_echo "$as_me:$LINENO: Downloading build dependency bootjdk from $with_builddeps_server/$resource and installing into $installdir" >&5 $as_echo "$as_me: Downloading build dependency bootjdk from $with_builddeps_server/$resource and installing into $installdir" >&6;} if test ! -d $installdir; then mkdir -p $installdir fi if test ! -d $installdir; then - as_fn_error $? "Could not create directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create directory $installdir" >&5 +$as_echo "$as_me: error: Could not create directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi tmpfile=`mktemp $installdir/bootjdk.XXXXXXXXX` touch $tmpfile if test ! -f $tmpfile; then - as_fn_error $? "Could not create files in directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create files in directory $installdir" >&5 +$as_echo "$as_me: error: Could not create files in directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi # $with_builddeps_server/$resource is the ftp://abuilddeps.server.com/libs/cups.zip @@ -10824,12 +10473,16 @@ $as_echo "$as_me: Downloading build dependency bootjdk from $with_builddeps_serv ) | ftp -in $FTPSERVER fi if test "x$VALID_TOOL" != xyes; then - as_fn_error $? "I do not know how to use the tool: $BDEPS_FTP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: I do not know how to use the tool: $BDEPS_FTP" >&5 +$as_echo "$as_me: error: I do not know how to use the tool: $BDEPS_FTP" >&2;} + { (exit 1); exit 1; }; } fi mv $tmpfile $installdir/$filename if test ! -s $installdir/$filename; then - as_fn_error $? "Could not download $with_builddeps_server/$resource" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download $with_builddeps_server/$resource" >&5 +$as_echo "$as_me: error: Could not download $with_builddeps_server/$resource" >&2;} + { (exit 1); exit 1; }; } fi case "$extension" in zip) echo "Unzipping $installdir/$filename..." @@ -10841,7 +10494,9 @@ $as_echo "$as_me: Downloading build dependency bootjdk from $with_builddeps_serv tgz) echo "Untaring $installdir/$filename..." (cd $installdir ; rm -f $installdir/$filename.unpacked ; tar xzf $installdir/$filename && touch $installdir/$filename.unpacked) ;; - *) as_fn_error $? "Cannot handle build depency archive with extension $extension" "$LINENO" 5 + *) { { $as_echo "$as_me:$LINENO: error: Cannot handle build depency archive with extension $extension" >&5 +$as_echo "$as_me: error: Cannot handle build depency archive with extension $extension" >&2;} + { (exit 1); exit 1; }; } ;; esac fi @@ -10858,7 +10513,9 @@ $as_echo "$as_me: Downloading build dependency bootjdk from $with_builddeps_serv thecflags=${builddep_bootjdk_CFLAGS} thelibs=${builddep_bootjdk_LIBS} if test "x$depdir" = x; then - as_fn_error $? "Could not download build dependency bootjdk" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download build dependency bootjdk" >&5 +$as_echo "$as_me: error: Could not download build dependency bootjdk" >&2;} + { (exit 1); exit 1; }; } fi BOOT_JDK=$depdir if test "x$theroot" != x; then @@ -10884,21 +10541,21 @@ $as_echo "$as_me: Downloading build dependency bootjdk from $with_builddeps_serv if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -10908,9 +10565,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -10933,9 +10590,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -10974,7 +10633,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -11012,7 +10671,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -11024,25 +10683,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -11076,9 +10739,11 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of JAVA_HOME_PROCESSED" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of JAVA_HOME_PROCESSED" >&5 +$as_echo "$as_me: error: Cannot locate the the path of JAVA_HOME_PROCESSED" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -11117,7 +10782,7 @@ $as_echo "$as_me: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", if test "x$path" != "x$new_path"; then JAVA_HOME_PROCESSED="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&6;} fi @@ -11155,7 +10820,7 @@ $as_echo "$as_me: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then JAVA_HOME_PROCESSED="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&6;} fi @@ -11167,26 +10832,30 @@ $as_echo "$as_me: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&6;} path="$JAVA_HOME_PROCESSED" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi if test ! -d "$JAVA_HOME_PROCESSED"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Your JAVA_HOME points to a non-existing directory!" >&5 + { $as_echo "$as_me:$LINENO: Your JAVA_HOME points to a non-existing directory!" >&5 $as_echo "$as_me: Your JAVA_HOME points to a non-existing directory!" >&6;} else # Aha, the user has set a JAVA_HOME # let us use that as the Boot JDK. BOOT_JDK="$JAVA_HOME_PROCESSED" BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using JAVA_HOME" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using JAVA_HOME" >&5 $as_echo "$as_me: Found potential Boot JDK using JAVA_HOME" >&6;} fi fi @@ -11196,21 +10865,21 @@ $as_echo "$as_me: Found potential Boot JDK using JAVA_HOME" >&6;} if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -11220,9 +10889,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -11245,9 +10914,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -11286,7 +10957,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -11324,7 +10995,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -11336,25 +11007,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -11372,7 +11047,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test -x /usr/libexec/java_home; then BOOT_JDK=`/usr/libexec/java_home` BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using /usr/libexec/java_home" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using /usr/libexec/java_home" >&5 $as_echo "$as_me: Found potential Boot JDK using /usr/libexec/java_home" >&6;} fi @@ -11381,21 +11056,21 @@ $as_echo "$as_me: Found potential Boot JDK using /usr/libexec/java_home" >&6;} if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -11405,9 +11080,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -11430,9 +11105,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -11471,7 +11148,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -11509,7 +11186,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -11521,25 +11198,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -11556,9 +11237,9 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } # Extract the first word of "javac", so it can be a program name with args. set dummy javac; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_JAVAC_CHECK+set}" = set; then : +if test "${ac_cv_path_JAVAC_CHECK+set}" = set; then $as_echo_n "(cached) " >&6 else case $JAVAC_CHECK in @@ -11571,14 +11252,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_JAVAC_CHECK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -11586,19 +11267,19 @@ esac fi JAVAC_CHECK=$ac_cv_path_JAVAC_CHECK if test -n "$JAVAC_CHECK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC_CHECK" >&5 + { $as_echo "$as_me:$LINENO: result: $JAVAC_CHECK" >&5 $as_echo "$JAVAC_CHECK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "java", so it can be a program name with args. set dummy java; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_JAVA_CHECK+set}" = set; then : +if test "${ac_cv_path_JAVA_CHECK+set}" = set; then $as_echo_n "(cached) " >&6 else case $JAVA_CHECK in @@ -11611,14 +11292,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_JAVA_CHECK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -11626,10 +11307,10 @@ esac fi JAVA_CHECK=$ac_cv_path_JAVA_CHECK if test -n "$JAVA_CHECK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA_CHECK" >&5 + { $as_echo "$as_me:$LINENO: result: $JAVA_CHECK" >&5 $as_echo "$JAVA_CHECK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -11692,7 +11373,7 @@ fi if test -x "$BOOT_JDK/bin/javac" && test -x "$BOOT_JDK/bin/java"; then # Looks like we found ourselves an JDK BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using java(c) in PATH" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using java(c) in PATH" >&5 $as_echo "$as_me: Found potential Boot JDK using java(c) in PATH" >&6;} fi fi @@ -11702,21 +11383,21 @@ $as_echo "$as_me: Found potential Boot JDK using java(c) in PATH" >&6;} if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -11726,9 +11407,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -11751,9 +11432,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -11792,7 +11475,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -11830,7 +11513,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -11842,25 +11525,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -11905,7 +11592,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" if test -d "$BOOT_JDK"; then BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} fi @@ -11914,21 +11601,21 @@ $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_ if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -11938,9 +11625,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -11963,9 +11650,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -12004,7 +11693,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12042,7 +11731,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12054,25 +11743,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -12091,21 +11784,21 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -12115,9 +11808,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -12140,9 +11833,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -12181,7 +11876,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12219,7 +11914,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12231,25 +11926,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -12287,7 +11986,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" if test -d "$BOOT_JDK"; then BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} fi @@ -12296,21 +11995,21 @@ $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_ if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -12320,9 +12019,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -12345,9 +12044,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -12386,7 +12087,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12424,7 +12125,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12436,25 +12137,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -12473,21 +12178,21 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -12497,9 +12202,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -12522,9 +12227,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -12563,7 +12270,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12601,7 +12308,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12613,25 +12320,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -12669,7 +12380,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" if test -d "$BOOT_JDK"; then BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} fi @@ -12678,21 +12389,21 @@ $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_ if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -12702,9 +12413,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -12727,9 +12438,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -12768,7 +12481,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12806,7 +12519,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12818,25 +12531,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -12855,21 +12572,21 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -12879,9 +12596,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -12904,9 +12621,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -12945,7 +12664,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12983,7 +12702,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -12995,25 +12714,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -13051,7 +12774,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" if test -d "$BOOT_JDK"; then BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} fi @@ -13060,21 +12783,21 @@ $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_ if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -13084,9 +12807,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -13109,9 +12832,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -13150,7 +12875,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13188,7 +12913,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13200,25 +12925,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -13237,21 +12966,21 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -13261,9 +12990,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -13286,9 +13015,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -13327,7 +13058,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13365,7 +13096,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13377,25 +13108,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -13420,7 +13155,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" if test -d "$BOOT_JDK"; then BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} fi @@ -13429,21 +13164,21 @@ $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_ if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -13453,9 +13188,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -13478,9 +13213,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -13519,7 +13256,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13557,7 +13294,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13569,25 +13306,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -13604,21 +13345,21 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -13628,9 +13369,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -13653,9 +13394,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -13694,7 +13437,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13732,7 +13475,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13744,25 +13487,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -13788,7 +13535,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" if test -d "$BOOT_JDK"; then BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} fi @@ -13797,21 +13544,21 @@ $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_ if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -13821,9 +13568,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -13846,9 +13593,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -13887,7 +13636,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13925,7 +13674,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -13937,25 +13686,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -13972,21 +13725,21 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -13996,9 +13749,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -14021,9 +13774,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -14062,7 +13817,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14100,7 +13855,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14112,25 +13867,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -14155,7 +13914,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" if test -d "$BOOT_JDK"; then BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} fi @@ -14164,21 +13923,21 @@ $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_ if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -14188,9 +13947,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -14213,9 +13972,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -14254,7 +14015,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14292,7 +14053,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14304,25 +14065,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -14339,21 +14104,21 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -14363,9 +14128,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -14388,9 +14153,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -14429,7 +14196,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14467,7 +14234,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14479,25 +14246,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -14523,7 +14294,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" if test -d "$BOOT_JDK"; then BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 + { $as_echo "$as_me:$LINENO: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} fi @@ -14532,21 +14303,21 @@ $as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_ if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -14556,9 +14327,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -14581,9 +14352,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -14622,7 +14395,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14660,7 +14433,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14672,25 +14445,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -14707,21 +14484,21 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -14731,9 +14508,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -14756,9 +14533,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -14797,7 +14576,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14835,7 +14614,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -14847,25 +14626,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -14881,21 +14664,21 @@ $as_echo "$BOOT_JDK_VERSION" >&6; } if test "x$BOOT_JDK_FOUND" = xmaybe; then # Do we have a bin/java? if test ! -x "$BOOT_JDK/bin/java"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} BOOT_JDK_FOUND=no else # Do we have a bin/javac? if test ! -x "$BOOT_JDK/bin/javac"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 + { $as_echo "$as_me:$LINENO: (This might be an JRE instead of an JDK)" >&5 $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else # Do we have an rt.jar? (On MacOSX it is called classes.jar) if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} BOOT_JDK_FOUND=no else @@ -14905,9 +14688,9 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.ja # Extra M4 quote needed to protect [] in grep expression. FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` if test "x$FOUND_VERSION_78" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 + { $as_echo "$as_me:$LINENO: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 + { $as_echo "$as_me:$LINENO: (Your Boot JDK must be version 7 or 8)" >&5 $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} BOOT_JDK_FOUND=no else @@ -14930,9 +14713,11 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BOOT_JDK" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BOOT_JDK" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -14971,7 +14756,7 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -15009,7 +14794,7 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then BOOT_JDK="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BOOT_JDK to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} fi @@ -15021,25 +14806,29 @@ $as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} path="$BOOT_JDK" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of BOOT_JDK, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:$LINENO: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + { $as_echo "$as_me:$LINENO: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar @@ -15076,11 +14865,13 @@ if test "x$BOOT_JDK_FOUND" = xno; then HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find a valid Boot JDK. $HELP_MSG" >&5 + { $as_echo "$as_me:$LINENO: Could not find a valid Boot JDK. $HELP_MSG" >&5 $as_echo "$as_me: Could not find a valid Boot JDK. $HELP_MSG" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be fixed by explicitely setting --with-boot-jdk" >&5 + { $as_echo "$as_me:$LINENO: This might be fixed by explicitely setting --with-boot-jdk" >&5 $as_echo "$as_me: This might be fixed by explicitely setting --with-boot-jdk" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi # Setup proper paths for what we found @@ -15101,101 +14892,115 @@ BOOT_JDK="$BOOT_JDK" # Setup tools from the Boot JDK. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java in Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for java in Boot JDK" >&5 $as_echo_n "checking for java in Boot JDK... " >&6; } JAVA=$BOOT_JDK/bin/java if test ! -x $JAVA; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + { $as_echo "$as_me:$LINENO: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 + { $as_echo "$as_me:$LINENO: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 $as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} - as_fn_error $? "Could not find java in the Boot JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find java in the Boot JDK" >&5 +$as_echo "$as_me: error: Could not find java in the Boot JDK" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for javac in Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for javac in Boot JDK" >&5 $as_echo_n "checking for javac in Boot JDK... " >&6; } JAVAC=$BOOT_JDK/bin/javac if test ! -x $JAVAC; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + { $as_echo "$as_me:$LINENO: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 + { $as_echo "$as_me:$LINENO: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 $as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} - as_fn_error $? "Could not find javac in the Boot JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find javac in the Boot JDK" >&5 +$as_echo "$as_me: error: Could not find javac in the Boot JDK" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for javah in Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for javah in Boot JDK" >&5 $as_echo_n "checking for javah in Boot JDK... " >&6; } JAVAH=$BOOT_JDK/bin/javah if test ! -x $JAVAH; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + { $as_echo "$as_me:$LINENO: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 + { $as_echo "$as_me:$LINENO: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 $as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} - as_fn_error $? "Could not find javah in the Boot JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find javah in the Boot JDK" >&5 +$as_echo "$as_me: error: Could not find javah in the Boot JDK" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for javap in Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for javap in Boot JDK" >&5 $as_echo_n "checking for javap in Boot JDK... " >&6; } JAVAP=$BOOT_JDK/bin/javap if test ! -x $JAVAP; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + { $as_echo "$as_me:$LINENO: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 + { $as_echo "$as_me:$LINENO: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 $as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} - as_fn_error $? "Could not find javap in the Boot JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find javap in the Boot JDK" >&5 +$as_echo "$as_me: error: Could not find javap in the Boot JDK" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jar in Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for jar in Boot JDK" >&5 $as_echo_n "checking for jar in Boot JDK... " >&6; } JAR=$BOOT_JDK/bin/jar if test ! -x $JAR; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + { $as_echo "$as_me:$LINENO: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 + { $as_echo "$as_me:$LINENO: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 $as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} - as_fn_error $? "Could not find jar in the Boot JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find jar in the Boot JDK" >&5 +$as_echo "$as_me: error: Could not find jar in the Boot JDK" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rmic in Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for rmic in Boot JDK" >&5 $as_echo_n "checking for rmic in Boot JDK... " >&6; } RMIC=$BOOT_JDK/bin/rmic if test ! -x $RMIC; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + { $as_echo "$as_me:$LINENO: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 + { $as_echo "$as_me:$LINENO: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 $as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} - as_fn_error $? "Could not find rmic in the Boot JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find rmic in the Boot JDK" >&5 +$as_echo "$as_me: error: Could not find rmic in the Boot JDK" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for native2ascii in Boot JDK" >&5 + { $as_echo "$as_me:$LINENO: checking for native2ascii in Boot JDK" >&5 $as_echo_n "checking for native2ascii in Boot JDK... " >&6; } NATIVE2ASCII=$BOOT_JDK/bin/native2ascii if test ! -x $NATIVE2ASCII; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + { $as_echo "$as_me:$LINENO: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 + { $as_echo "$as_me:$LINENO: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 $as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} - as_fn_error $? "Could not find native2ascii in the Boot JDK" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find native2ascii in the Boot JDK" >&5 +$as_echo "$as_me: error: Could not find native2ascii in the Boot JDK" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } @@ -15213,7 +15018,7 @@ BOOT_JDK_SOURCETARGET="-source 7 -target 7" # # Check whether --with-boot-jdk-jvmargs was given. -if test "${with_boot_jdk_jvmargs+set}" = set; then : +if test "${with_boot_jdk_jvmargs+set}" = set; then withval=$with_boot_jdk_jvmargs; fi @@ -15340,21 +15145,21 @@ JDK_TOPDIR="$SRC_ROOT/jdk" # # Check whether --with-add-source-root was given. -if test "${with_add_source_root+set}" = set; then : +if test "${with_add_source_root+set}" = set; then withval=$with_add_source_root; fi # Check whether --with-override-source-root was given. -if test "${with_override_source_root+set}" = set; then : +if test "${with_override_source_root+set}" = set; then withval=$with_override_source_root; fi # Check whether --with-adds-and-overrides was given. -if test "${with_adds_and_overrides+set}" = set; then : +if test "${with_adds_and_overrides+set}" = set; then withval=$with_adds_and_overrides; fi @@ -15366,7 +15171,9 @@ fi if test "x$with_add_source_root" != x; then if ! test -d $with_add_source_root; then - as_fn_error $? "Trying to use a non-existant add-source-root $with_add_source_root" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Trying to use a non-existant add-source-root $with_add_source_root" >&5 +$as_echo "$as_me: error: Trying to use a non-existant add-source-root $with_add_source_root" >&2;} + { (exit 1); exit 1; }; } fi CURDIR="$PWD" cd "$with_add_source_root" @@ -15376,34 +15183,48 @@ if test "x$with_add_source_root" != x; then # If it does, then it is usually an error, prevent this. if test -f $with_add_source_root/langtools/makefiles/Makefile || \ test -f $with_add_source_root/langtools/make/Makefile; then - as_fn_error $? "Your add source root seems to contain a full langtools repo! An add source root should only contain additional sources." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your add source root seems to contain a full langtools repo! An add source root should only contain additional sources." >&5 +$as_echo "$as_me: error: Your add source root seems to contain a full langtools repo! An add source root should only contain additional sources." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_add_source_root/corba/makefiles/Makefile || \ test -f $with_add_source_root/corba/make/Makefile; then - as_fn_error $? "Your add source root seems to contain a full corba repo! An add source root should only contain additional sources." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your add source root seems to contain a full corba repo! An add source root should only contain additional sources." >&5 +$as_echo "$as_me: error: Your add source root seems to contain a full corba repo! An add source root should only contain additional sources." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_add_source_root/jaxp/makefiles/Makefile || \ test -f $with_add_source_root/jaxp/make/Makefile; then - as_fn_error $? "Your add source root seems to contain a full jaxp repo! An add source root should only contain additional sources." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your add source root seems to contain a full jaxp repo! An add source root should only contain additional sources." >&5 +$as_echo "$as_me: error: Your add source root seems to contain a full jaxp repo! An add source root should only contain additional sources." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_add_source_root/jaxws/makefiles/Makefile || \ test -f $with_add_source_root/jaxws/make/Makefile; then - as_fn_error $? "Your add source root seems to contain a full jaxws repo! An add source root should only contain additional sources." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your add source root seems to contain a full jaxws repo! An add source root should only contain additional sources." >&5 +$as_echo "$as_me: error: Your add source root seems to contain a full jaxws repo! An add source root should only contain additional sources." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_add_source_root/hotspot/makefiles/Makefile || \ test -f $with_add_source_root/hotspot/make/Makefile; then - as_fn_error $? "Your add source root seems to contain a full hotspot repo! An add source root should only contain additional sources." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your add source root seems to contain a full hotspot repo! An add source root should only contain additional sources." >&5 +$as_echo "$as_me: error: Your add source root seems to contain a full hotspot repo! An add source root should only contain additional sources." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_add_source_root/jdk/makefiles/Makefile || \ test -f $with_add_source_root/jdk/make/Makefile; then - as_fn_error $? "Your add source root seems to contain a full JDK repo! An add source root should only contain additional sources." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your add source root seems to contain a full JDK repo! An add source root should only contain additional sources." >&5 +$as_echo "$as_me: error: Your add source root seems to contain a full JDK repo! An add source root should only contain additional sources." >&2;} + { (exit 1); exit 1; }; } fi fi if test "x$with_override_source_root" != x; then if ! test -d $with_override_source_root; then - as_fn_error $? "Trying to use a non-existant override-source-root $with_override_source_root" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Trying to use a non-existant override-source-root $with_override_source_root" >&5 +$as_echo "$as_me: error: Trying to use a non-existant override-source-root $with_override_source_root" >&2;} + { (exit 1); exit 1; }; } fi CURDIR="$PWD" cd "$with_override_source_root" @@ -15411,27 +15232,39 @@ if test "x$with_override_source_root" != x; then cd "$CURDIR" if test -f $with_override_source_root/langtools/makefiles/Makefile || \ test -f $with_override_source_root/langtools/make/Makefile; then - as_fn_error $? "Your override source root seems to contain a full langtools repo! An override source root should only contain sources that override." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your override source root seems to contain a full langtools repo! An override source root should only contain sources that override." >&5 +$as_echo "$as_me: error: Your override source root seems to contain a full langtools repo! An override source root should only contain sources that override." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_override_source_root/corba/makefiles/Makefile || \ test -f $with_override_source_root/corba/make/Makefile; then - as_fn_error $? "Your override source root seems to contain a full corba repo! An override source root should only contain sources that override." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your override source root seems to contain a full corba repo! An override source root should only contain sources that override." >&5 +$as_echo "$as_me: error: Your override source root seems to contain a full corba repo! An override source root should only contain sources that override." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_override_source_root/jaxp/makefiles/Makefile || \ test -f $with_override_source_root/jaxp/make/Makefile; then - as_fn_error $? "Your override source root seems to contain a full jaxp repo! An override source root should only contain sources that override." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your override source root seems to contain a full jaxp repo! An override source root should only contain sources that override." >&5 +$as_echo "$as_me: error: Your override source root seems to contain a full jaxp repo! An override source root should only contain sources that override." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_override_source_root/jaxws/makefiles/Makefile || \ test -f $with_override_source_root/jaxws/make/Makefile; then - as_fn_error $? "Your override source root seems to contain a full jaxws repo! An override source root should only contain sources that override." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your override source root seems to contain a full jaxws repo! An override source root should only contain sources that override." >&5 +$as_echo "$as_me: error: Your override source root seems to contain a full jaxws repo! An override source root should only contain sources that override." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_override_source_root/hotspot/makefiles/Makefile || \ test -f $with_override_source_root/hotspot/make/Makefile; then - as_fn_error $? "Your override source root seems to contain a full hotspot repo! An override source root should only contain sources that override." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your override source root seems to contain a full hotspot repo! An override source root should only contain sources that override." >&5 +$as_echo "$as_me: error: Your override source root seems to contain a full hotspot repo! An override source root should only contain sources that override." >&2;} + { (exit 1); exit 1; }; } fi if test -f $with_override_source_root/jdk/makefiles/Makefile || \ test -f $with_override_source_root/jdk/make/Makefile; then - as_fn_error $? "Your override source root seems to contain a full JDK repo! An override source root should only contain sources that override." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your override source root seems to contain a full JDK repo! An override source root should only contain sources that override." >&5 +$as_echo "$as_me: error: Your override source root seems to contain a full JDK repo! An override source root should only contain sources that override." >&2;} + { (exit 1); exit 1; }; } fi fi @@ -15457,42 +15290,42 @@ fi # Check whether --with-override-langtools was given. -if test "${with_override_langtools+set}" = set; then : +if test "${with_override_langtools+set}" = set; then withval=$with_override_langtools; fi # Check whether --with-override-corba was given. -if test "${with_override_corba+set}" = set; then : +if test "${with_override_corba+set}" = set; then withval=$with_override_corba; fi # Check whether --with-override-jaxp was given. -if test "${with_override_jaxp+set}" = set; then : +if test "${with_override_jaxp+set}" = set; then withval=$with_override_jaxp; fi # Check whether --with-override-jaxws was given. -if test "${with_override_jaxws+set}" = set; then : +if test "${with_override_jaxws+set}" = set; then withval=$with_override_jaxws; fi # Check whether --with-override-hotspot was given. -if test "${with_override_hotspot+set}" = set; then : +if test "${with_override_hotspot+set}" = set; then withval=$with_override_hotspot; fi # Check whether --with-override-jdk was given. -if test "${with_override_jdk+set}" = set; then : +if test "${with_override_jdk+set}" = set; then withval=$with_override_jdk; fi @@ -15503,11 +15336,13 @@ if test "x$with_override_langtools" != x; then LANGTOOLS_TOPDIR="`pwd`" cd "$CURDIR" if ! test -f $LANGTOOLS_TOPDIR/makefiles/Makefile; then - as_fn_error $? "You have to override langtools with a full langtools repo!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: You have to override langtools with a full langtools repo!" >&5 +$as_echo "$as_me: error: You have to override langtools with a full langtools repo!" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if langtools should be overridden" >&5 + { $as_echo "$as_me:$LINENO: checking if langtools should be overridden" >&5 $as_echo_n "checking if langtools should be overridden... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes with $LANGTOOLS_TOPDIR" >&5 + { $as_echo "$as_me:$LINENO: result: yes with $LANGTOOLS_TOPDIR" >&5 $as_echo "yes with $LANGTOOLS_TOPDIR" >&6; } fi if test "x$with_override_corba" != x; then @@ -15516,11 +15351,13 @@ if test "x$with_override_corba" != x; then CORBA_TOPDIR="`pwd`" cd "$CURDIR" if ! test -f $CORBA_TOPDIR/makefiles/Makefile; then - as_fn_error $? "You have to override corba with a full corba repo!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: You have to override corba with a full corba repo!" >&5 +$as_echo "$as_me: error: You have to override corba with a full corba repo!" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if corba should be overridden" >&5 + { $as_echo "$as_me:$LINENO: checking if corba should be overridden" >&5 $as_echo_n "checking if corba should be overridden... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes with $CORBA_TOPDIR" >&5 + { $as_echo "$as_me:$LINENO: result: yes with $CORBA_TOPDIR" >&5 $as_echo "yes with $CORBA_TOPDIR" >&6; } fi if test "x$with_override_jaxp" != x; then @@ -15529,11 +15366,13 @@ if test "x$with_override_jaxp" != x; then JAXP_TOPDIR="`pwd`" cd "$CURDIR" if ! test -f $JAXP_TOPDIR/makefiles/Makefile; then - as_fn_error $? "You have to override jaxp with a full jaxp repo!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: You have to override jaxp with a full jaxp repo!" >&5 +$as_echo "$as_me: error: You have to override jaxp with a full jaxp repo!" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if jaxp should be overridden" >&5 + { $as_echo "$as_me:$LINENO: checking if jaxp should be overridden" >&5 $as_echo_n "checking if jaxp should be overridden... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes with $JAXP_TOPDIR" >&5 + { $as_echo "$as_me:$LINENO: result: yes with $JAXP_TOPDIR" >&5 $as_echo "yes with $JAXP_TOPDIR" >&6; } fi if test "x$with_override_jaxws" != x; then @@ -15542,11 +15381,13 @@ if test "x$with_override_jaxws" != x; then JAXWS_TOPDIR="`pwd`" cd "$CURDIR" if ! test -f $JAXWS_TOPDIR/makefiles/Makefile; then - as_fn_error $? "You have to override jaxws with a full jaxws repo!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: You have to override jaxws with a full jaxws repo!" >&5 +$as_echo "$as_me: error: You have to override jaxws with a full jaxws repo!" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if jaxws should be overridden" >&5 + { $as_echo "$as_me:$LINENO: checking if jaxws should be overridden" >&5 $as_echo_n "checking if jaxws should be overridden... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes with $JAXWS_TOPDIR" >&5 + { $as_echo "$as_me:$LINENO: result: yes with $JAXWS_TOPDIR" >&5 $as_echo "yes with $JAXWS_TOPDIR" >&6; } fi if test "x$with_override_hotspot" != x; then @@ -15556,11 +15397,13 @@ if test "x$with_override_hotspot" != x; then cd "$CURDIR" if ! test -f $HOTSPOT_TOPDIR/make/Makefile && \ ! test -f $HOTSPOT_TOPDIR/makefiles/Makefile; then - as_fn_error $? "You have to override hotspot with a full hotspot repo!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: You have to override hotspot with a full hotspot repo!" >&5 +$as_echo "$as_me: error: You have to override hotspot with a full hotspot repo!" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if hotspot should be overridden" >&5 + { $as_echo "$as_me:$LINENO: checking if hotspot should be overridden" >&5 $as_echo_n "checking if hotspot should be overridden... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes with $HOTSPOT_TOPDIR" >&5 + { $as_echo "$as_me:$LINENO: result: yes with $HOTSPOT_TOPDIR" >&5 $as_echo "yes with $HOTSPOT_TOPDIR" >&6; } fi if test "x$with_override_jdk" != x; then @@ -15569,11 +15412,13 @@ if test "x$with_override_jdk" != x; then JDK_TOPDIR="`pwd`" cd "$CURDIR" if ! test -f $JDK_TOPDIR/makefiles/Makefile; then - as_fn_error $? "You have to override JDK with a full JDK repo!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: You have to override JDK with a full JDK repo!" >&5 +$as_echo "$as_me: error: You have to override JDK with a full JDK repo!" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if JDK should be overridden" >&5 + { $as_echo "$as_me:$LINENO: checking if JDK should be overridden" >&5 $as_echo_n "checking if JDK should be overridden... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes with $JDK_TOPDIR" >&5 + { $as_echo "$as_me:$LINENO: result: yes with $JDK_TOPDIR" >&5 $as_echo "yes with $JDK_TOPDIR" >&6; } fi @@ -15582,6 +15427,33 @@ fi BUILD_OUTPUT="$OUTPUT_ROOT" +HOTSPOT_DIST="$OUTPUT_ROOT/hotspot/dist" +BUILD_HOTSPOT=true + + + +# Check whether --with-import-hotspot was given. +if test "${with_import_hotspot+set}" = set; then + withval=$with_import_hotspot; +fi + +if test "x$with_import_hotspot" != x; then + CURDIR="$PWD" + cd "$with_import_hotspot" + HOTSPOT_DIST="`pwd`" + cd "$CURDIR" + if ! (test -d $HOTSPOT_DIST/lib && test -d $HOTSPOT_DIST/jre/lib); then + { { $as_echo "$as_me:$LINENO: error: You have to import hotspot from a full jdk image or hotspot build dist dir!" >&5 +$as_echo "$as_me: error: You have to import hotspot from a full jdk image or hotspot build dist dir!" >&2;} + { (exit 1); exit 1; }; } + fi + { $as_echo "$as_me:$LINENO: checking if hotspot should be imported" >&5 +$as_echo_n "checking if hotspot should be imported... " >&6; } + { $as_echo "$as_me:$LINENO: result: yes from $HOTSPOT_DIST" >&5 +$as_echo "yes from $HOTSPOT_DIST" >&6; } + BUILD_HOTSPOT=false +fi + JDK_OUTPUTDIR="$OUTPUT_ROOT/jdk" @@ -15626,9 +15498,9 @@ if test "x$OPENJDK_TARGET_OS" = "xwindows"; then # VS linker. This must be done before changing the PATH when looking for VS. # Extract the first word of "link", so it can be a program name with args. set dummy link; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CYGWIN_LINK+set}" = set; then : +if test "${ac_cv_path_CYGWIN_LINK+set}" = set; then $as_echo_n "(cached) " >&6 else case $CYGWIN_LINK in @@ -15641,14 +15513,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CYGWIN_LINK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -15656,23 +15528,23 @@ esac fi CYGWIN_LINK=$ac_cv_path_CYGWIN_LINK if test -n "$CYGWIN_LINK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGWIN_LINK" >&5 + { $as_echo "$as_me:$LINENO: result: $CYGWIN_LINK" >&5 $as_echo "$CYGWIN_LINK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$CYGWIN_LINK" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the first found link.exe is actually the Cygwin link tool" >&5 + { $as_echo "$as_me:$LINENO: checking if the first found link.exe is actually the Cygwin link tool" >&5 $as_echo_n "checking if the first found link.exe is actually the Cygwin link tool... " >&6; } "$CYGWIN_LINK" --version > /dev/null if test $? -eq 0 ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } # This might be the VS linker. Don't exclude it later on. CYGWIN_LINK="" @@ -15706,13 +15578,13 @@ $as_echo "no" >&6; } if test -d "$VS100BASE"; then if test -f "$VS100BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} VS_ENV_CMD="$VS100BASE/$VCVARSFILE" else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi @@ -15723,11 +15595,13 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi if test "x$with_toolsdir" != x && test "x$VS_ENV_CMD" = x; then # Having specified an argument which is incorrect will produce an instant failure; # we should not go on looking - { $as_echo "$as_me:${as_lineno-$LINENO}: The path given by --with-tools-dir does not contain a valid Visual Studio installation" >&5 + { $as_echo "$as_me:$LINENO: The path given by --with-tools-dir does not contain a valid Visual Studio installation" >&5 $as_echo "$as_me: The path given by --with-tools-dir does not contain a valid Visual Studio installation" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Please point to the VC/bin directory within the Visual Studio installation" >&5 + { $as_echo "$as_me:$LINENO: Please point to the VC/bin directory within the Visual Studio installation" >&5 $as_echo "$as_me: Please point to the VC/bin directory within the Visual Studio installation" >&6;} - as_fn_error $? "Cannot locate a valid Visual Studio installation" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate a valid Visual Studio installation" >&5 +$as_echo "$as_me: error: Cannot locate a valid Visual Studio installation" >&2;} + { (exit 1); exit 1; }; } fi if test "x$ProgramW6432" != x; then @@ -15747,7 +15621,7 @@ $as_echo "$as_me: Please point to the VC/bin directory within the Visual Studio if test -d "$WIN_SDK_BASE"; then if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then @@ -15756,9 +15630,9 @@ $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" VS_ENV_ARGS="/x64" fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} fi fi @@ -15782,7 +15656,7 @@ $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignori if test -d "$WIN_SDK_BASE"; then if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then @@ -15791,9 +15665,9 @@ $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" VS_ENV_ARGS="/x64" fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} fi fi @@ -15817,7 +15691,7 @@ $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignori if test -d "$WIN_SDK_BASE"; then if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then @@ -15826,9 +15700,9 @@ $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" VS_ENV_ARGS="/x64" fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} fi fi @@ -15851,7 +15725,7 @@ $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignori if test -d "$WIN_SDK_BASE"; then if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then @@ -15860,9 +15734,9 @@ $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" VS_ENV_ARGS="/x64" fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} fi fi @@ -15884,7 +15758,7 @@ $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignori if test -d "$WIN_SDK_BASE"; then if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then @@ -15893,9 +15767,9 @@ $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" VS_ENV_ARGS="/x64" fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 $as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} fi fi @@ -15919,13 +15793,13 @@ $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignori if test -d "$VS100BASE"; then if test -f "$VS100BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} VS_ENV_CMD="$VS100BASE/$VCVARSFILE" else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi @@ -15949,13 +15823,13 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi if test -d "$VS100BASE"; then if test -f "$VS100BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} VS_ENV_CMD="$VS100BASE/$VCVARSFILE" else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi @@ -15978,13 +15852,13 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi if test -d "$VS100BASE"; then if test -f "$VS100BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} VS_ENV_CMD="$VS100BASE/$VCVARSFILE" else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi @@ -16006,13 +15880,13 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi if test -d "$VS100BASE"; then if test -f "$VS100BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} VS_ENV_CMD="$VS100BASE/$VCVARSFILE" else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 + { $as_echo "$as_me:$LINENO: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 + { $as_echo "$as_me:$LINENO: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi @@ -16062,14 +15936,16 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of VS_ENV_CMD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of VS_ENV_CMD" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -16089,11 +15965,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of VS_ENV_CMD, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of VS_ENV_CMD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of VS_ENV_CMD" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -16185,14 +16063,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of VS_ENV_CMD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of VS_ENV_CMD" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -16247,18 +16127,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving VS_ENV_CMD (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving VS_ENV_CMD (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving VS_ENV_CMD (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of VS_ENV_CMD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of VS_ENV_CMD" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -16272,13 +16154,13 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then VS_ENV_CMD="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting VS_ENV_CMD to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting VS_ENV_CMD to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting VS_ENV_CMD to \"$new_complete\"" >&6;} fi # Lets extract the variables that are set by vcvarsall.bat/vsvars32.bat/vsvars64.bat - { $as_echo "$as_me:${as_lineno-$LINENO}: Trying to extract Visual Studio environment variables" >&5 + { $as_echo "$as_me:$LINENO: Trying to extract Visual Studio environment variables" >&5 $as_echo "$as_me: Trying to extract Visual Studio environment variables" >&6;} cd $OUTPUT_ROOT # FIXME: The code betweeen ---- was inlined from a separate script and is not properly adapted @@ -16319,39 +16201,43 @@ $as_echo "$as_me: Trying to extract Visual Studio environment variables" >&6;} #---- cd $CURDIR if test ! -s $OUTPUT_ROOT/localdevenv.sh; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not succesfully extract the envionment variables needed for the VS setup." >&5 + { $as_echo "$as_me:$LINENO: Could not succesfully extract the envionment variables needed for the VS setup." >&5 $as_echo "$as_me: Could not succesfully extract the envionment variables needed for the VS setup." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&5 + { $as_echo "$as_me:$LINENO: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&5 $as_echo "$as_me: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&5 + { $as_echo "$as_me:$LINENO: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&5 $as_echo "$as_me: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi # Now set all paths and other env variables. This will allow the rest of # the configure script to find and run the compiler in the proper way. - { $as_echo "$as_me:${as_lineno-$LINENO}: Setting extracted environment variables" >&5 + { $as_echo "$as_me:$LINENO: Setting extracted environment variables" >&5 $as_echo "$as_me: Setting extracted environment variables" >&6;} . $OUTPUT_ROOT/localdevenv.sh else # We did not find a vsvars bat file, let's hope we are run from a VS command prompt. - { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot locate a valid Visual Studio installation, checking current environment" >&5 + { $as_echo "$as_me:$LINENO: Cannot locate a valid Visual Studio installation, checking current environment" >&5 $as_echo "$as_me: Cannot locate a valid Visual Studio installation, checking current environment" >&6;} fi # At this point, we should have corrent variables in the environment, or we can't continue. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Visual Studio variables" >&5 + { $as_echo "$as_me:$LINENO: checking for Visual Studio variables" >&5 $as_echo_n "checking for Visual Studio variables... " >&6; } if test "x$VCINSTALLDIR" != x || test "x$WindowsSDKDir" != x || test "x$WINDOWSSDKDIR" != x; then if test "x$INCLUDE" = x || test "x$LIB" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: present but broken" >&5 + { $as_echo "$as_me:$LINENO: result: present but broken" >&5 $as_echo "present but broken" >&6; } - as_fn_error $? "Your VC command prompt seems broken, INCLUDE and/or LIB is missing." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Your VC command prompt seems broken, INCLUDE and/or LIB is missing." >&5 +$as_echo "$as_me: error: Your VC command prompt seems broken, INCLUDE and/or LIB is missing." >&2;} + { (exit 1); exit 1; }; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } VS_INCLUDE="$INCLUDE" VS_LIB="$LIB" @@ -16361,30 +16247,32 @@ $as_echo "ok" >&6; } fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + { $as_echo "$as_me:$LINENO: result: not found" >&5 $as_echo "not found" >&6; } if test "x$VS_ENV_CMD" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot locate a valid Visual Studio or Windows SDK installation on disk," >&5 + { $as_echo "$as_me:$LINENO: Cannot locate a valid Visual Studio or Windows SDK installation on disk," >&5 $as_echo "$as_me: Cannot locate a valid Visual Studio or Windows SDK installation on disk," >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: nor is this script run from a Visual Studio command prompt." >&5 + { $as_echo "$as_me:$LINENO: nor is this script run from a Visual Studio command prompt." >&5 $as_echo "$as_me: nor is this script run from a Visual Studio command prompt." >&6;} else - { $as_echo "$as_me:${as_lineno-$LINENO}: Running the extraction script failed." >&5 + { $as_echo "$as_me:$LINENO: Running the extraction script failed." >&5 $as_echo "$as_me: Running the extraction script failed." >&6;} fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&5 + { $as_echo "$as_me:$LINENO: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&5 $as_echo "$as_me: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&5 + { $as_echo "$as_me:$LINENO: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&5 $as_echo "$as_me: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue" >&5 +$as_echo "$as_me: error: Cannot continue" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for msvcr100.dll" >&5 + { $as_echo "$as_me:$LINENO: checking for msvcr100.dll" >&5 $as_echo_n "checking for msvcr100.dll... " >&6; } # Check whether --with-msvcr-dll was given. -if test "${with_msvcr_dll+set}" = set; then : +if test "${with_msvcr_dll+set}" = set; then withval=$with_msvcr_dll; fi @@ -16401,27 +16289,29 @@ fi fi fi if test "x$MSVCR_DLL" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: msvcr100.dll found in VCINSTALLDIR: $VCINSTALLDIR" >&5 + { $as_echo "$as_me:$LINENO: msvcr100.dll found in VCINSTALLDIR: $VCINSTALLDIR" >&5 $as_echo "$as_me: msvcr100.dll found in VCINSTALLDIR: $VCINSTALLDIR" >&6;} else - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: msvcr100.dll not found in VCINSTALLDIR: $VCINSTALLDIR" >&5 + { $as_echo "$as_me:$LINENO: Warning: msvcr100.dll not found in VCINSTALLDIR: $VCINSTALLDIR" >&5 $as_echo "$as_me: Warning: msvcr100.dll not found in VCINSTALLDIR: $VCINSTALLDIR" >&6;} fi fi if test "x$MSVCR_DLL" = x; then if test -f "$SYSTEMROOT/system32/msvcr100.dll"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: msvcr100.dll found in $SYSTEMROOT/system32" >&5 + { $as_echo "$as_me:$LINENO: msvcr100.dll found in $SYSTEMROOT/system32" >&5 $as_echo "$as_me: msvcr100.dll found in $SYSTEMROOT/system32" >&6;} MSVCR_DLL="$SYSTEMROOT/system32/msvcr100.dll" fi fi fi if test "x$MSVCR_DLL" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } - as_fn_error $? "Could not find msvcr100.dll !" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find msvcr100.dll !" >&5 +$as_echo "$as_me: error: Could not find msvcr100.dll !" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSVCR_DLL" >&5 + { $as_echo "$as_me:$LINENO: result: $MSVCR_DLL" >&5 $as_echo "$MSVCR_DLL" >&6; } if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -16440,9 +16330,11 @@ $as_echo "$MSVCR_DLL" >&6; } # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of MSVCR_DLL" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of MSVCR_DLL" >&5 +$as_echo "$as_me: error: Cannot locate the the path of MSVCR_DLL" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -16481,7 +16373,7 @@ $as_echo "$as_me: The path of MSVCR_DLL, which resolves as \"$path\", is invalid if test "x$path" != "x$new_path"; then MSVCR_DLL="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MSVCR_DLL to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting MSVCR_DLL to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting MSVCR_DLL to \"$new_path\"" >&6;} fi @@ -16519,7 +16411,7 @@ $as_echo "$as_me: Rewriting MSVCR_DLL to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then MSVCR_DLL="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MSVCR_DLL to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting MSVCR_DLL to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting MSVCR_DLL to \"$new_path\"" >&6;} fi @@ -16531,14 +16423,18 @@ $as_echo "$as_me: Rewriting MSVCR_DLL to \"$new_path\"" >&6;} path="$MSVCR_DLL" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of MSVCR_DLL, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of MSVCR_DLL, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of MSVCR_DLL, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi @@ -16568,9 +16464,9 @@ if test "x$COMPILE_TYPE" = "xcross"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_BUILD_CC+set}" = set; then : +if test "${ac_cv_path_BUILD_CC+set}" = set; then $as_echo_n "(cached) " >&6 else case $BUILD_CC in @@ -16583,14 +16479,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_BUILD_CC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -16598,10 +16494,10 @@ esac fi BUILD_CC=$ac_cv_path_BUILD_CC if test -n "$BUILD_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUILD_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $BUILD_CC" >&5 $as_echo "$BUILD_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -16650,14 +16546,16 @@ done fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_CC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -16677,11 +16575,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_CC, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of BUILD_CC, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_CC" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -16773,14 +16673,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_CC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -16835,18 +16737,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving BUILD_CC (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving BUILD_CC (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving BUILD_CC (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_CC" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -16860,7 +16764,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then BUILD_CC="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BUILD_CC to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BUILD_CC to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting BUILD_CC to \"$new_complete\"" >&6;} fi @@ -16868,9 +16772,9 @@ $as_echo "$as_me: Rewriting BUILD_CC to \"$new_complete\"" >&6;} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_BUILD_CXX+set}" = set; then : +if test "${ac_cv_path_BUILD_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else case $BUILD_CXX in @@ -16883,14 +16787,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_BUILD_CXX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -16898,10 +16802,10 @@ esac fi BUILD_CXX=$ac_cv_path_BUILD_CXX if test -n "$BUILD_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUILD_CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $BUILD_CXX" >&5 $as_echo "$BUILD_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -16950,14 +16854,16 @@ done fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_CXX" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -16977,11 +16883,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_CXX, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_CXX" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -17073,14 +16981,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_CXX" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -17135,18 +17045,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving BUILD_CXX (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving BUILD_CXX (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving BUILD_CXX (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_CXX" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -17160,15 +17072,15 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then BUILD_CXX="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BUILD_CXX to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BUILD_CXX to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting BUILD_CXX to \"$new_complete\"" >&6;} fi # Extract the first word of "ld", so it can be a program name with args. set dummy ld; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_BUILD_LD+set}" = set; then : +if test "${ac_cv_path_BUILD_LD+set}" = set; then $as_echo_n "(cached) " >&6 else case $BUILD_LD in @@ -17181,14 +17093,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_BUILD_LD="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -17196,10 +17108,10 @@ esac fi BUILD_LD=$ac_cv_path_BUILD_LD if test -n "$BUILD_LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUILD_LD" >&5 + { $as_echo "$as_me:$LINENO: result: $BUILD_LD" >&5 $as_echo "$BUILD_LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -17245,14 +17157,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_LD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_LD" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -17272,11 +17186,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_LD, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of BUILD_LD, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_LD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_LD" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -17368,14 +17284,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_LD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_LD" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -17430,18 +17348,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving BUILD_LD (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving BUILD_LD (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving BUILD_LD (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of BUILD_LD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of BUILD_LD" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -17455,7 +17375,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then BUILD_LD="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BUILD_LD to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting BUILD_LD to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting BUILD_LD to \"$new_complete\"" >&6;} fi @@ -17489,7 +17409,7 @@ DEVKIT= resource=${builddep_devkit} fi if test "x$resource" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Using builddeps $resource for devkit" >&5 + { $as_echo "$as_me:$LINENO: Using builddeps $resource for devkit" >&5 $as_echo "$as_me: Using builddeps $resource for devkit" >&6;} # If the resource in the builddeps.conf file is an existing directory, # for example /java/linux/cups @@ -17510,18 +17430,22 @@ $as_echo "$as_me: Using builddeps $resource for devkit" >&6;} extension=${filename#*.} installdir=$with_builddeps_dir/$filebase if test ! -f $installdir/$filename.unpacked; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Downloading build dependency devkit from $with_builddeps_server/$resource and installing into $installdir" >&5 + { $as_echo "$as_me:$LINENO: Downloading build dependency devkit from $with_builddeps_server/$resource and installing into $installdir" >&5 $as_echo "$as_me: Downloading build dependency devkit from $with_builddeps_server/$resource and installing into $installdir" >&6;} if test ! -d $installdir; then mkdir -p $installdir fi if test ! -d $installdir; then - as_fn_error $? "Could not create directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create directory $installdir" >&5 +$as_echo "$as_me: error: Could not create directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi tmpfile=`mktemp $installdir/devkit.XXXXXXXXX` touch $tmpfile if test ! -f $tmpfile; then - as_fn_error $? "Could not create files in directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create files in directory $installdir" >&5 +$as_echo "$as_me: error: Could not create files in directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi # $with_builddeps_server/$resource is the ftp://abuilddeps.server.com/libs/cups.zip @@ -17559,12 +17483,16 @@ $as_echo "$as_me: Downloading build dependency devkit from $with_builddeps_serve ) | ftp -in $FTPSERVER fi if test "x$VALID_TOOL" != xyes; then - as_fn_error $? "I do not know how to use the tool: $BDEPS_FTP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: I do not know how to use the tool: $BDEPS_FTP" >&5 +$as_echo "$as_me: error: I do not know how to use the tool: $BDEPS_FTP" >&2;} + { (exit 1); exit 1; }; } fi mv $tmpfile $installdir/$filename if test ! -s $installdir/$filename; then - as_fn_error $? "Could not download $with_builddeps_server/$resource" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download $with_builddeps_server/$resource" >&5 +$as_echo "$as_me: error: Could not download $with_builddeps_server/$resource" >&2;} + { (exit 1); exit 1; }; } fi case "$extension" in zip) echo "Unzipping $installdir/$filename..." @@ -17576,7 +17504,9 @@ $as_echo "$as_me: Downloading build dependency devkit from $with_builddeps_serve tgz) echo "Untaring $installdir/$filename..." (cd $installdir ; rm -f $installdir/$filename.unpacked ; tar xzf $installdir/$filename && touch $installdir/$filename.unpacked) ;; - *) as_fn_error $? "Cannot handle build depency archive with extension $extension" "$LINENO" 5 + *) { { $as_echo "$as_me:$LINENO: error: Cannot handle build depency archive with extension $extension" >&5 +$as_echo "$as_me: error: Cannot handle build depency archive with extension $extension" >&2;} + { (exit 1); exit 1; }; } ;; esac fi @@ -17593,7 +17523,9 @@ $as_echo "$as_me: Downloading build dependency devkit from $with_builddeps_serve thecflags=${builddep_devkit_CFLAGS} thelibs=${builddep_devkit_LIBS} if test "x$depdir" = x; then - as_fn_error $? "Could not download build dependency devkit" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download build dependency devkit" >&5 +$as_echo "$as_me: error: Could not download build dependency devkit" >&2;} + { (exit 1); exit 1; }; } fi DEVKIT=$depdir if test "x$theroot" != x; then @@ -17664,9 +17596,9 @@ fi do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_POTENTIAL_CC+set}" = set; then : +if test "${ac_cv_path_POTENTIAL_CC+set}" = set; then $as_echo_n "(cached) " >&6 else case $POTENTIAL_CC in @@ -17679,14 +17611,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_POTENTIAL_CC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -17694,10 +17626,10 @@ esac fi POTENTIAL_CC=$ac_cv_path_POTENTIAL_CC if test -n "$POTENTIAL_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POTENTIAL_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $POTENTIAL_CC" >&5 $as_echo "$POTENTIAL_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -17733,7 +17665,9 @@ done HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - as_fn_error $? "Could not find a $COMPILER_NAME compiler. $HELP_MSG" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find a $COMPILER_NAME compiler. $HELP_MSG" >&5 +$as_echo "$as_me: error: Could not find a $COMPILER_NAME compiler. $HELP_MSG" >&2;} + { (exit 1); exit 1; }; } fi if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -17776,14 +17710,16 @@ done fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -17803,11 +17739,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of CC, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of CC, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CC" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -17899,14 +17837,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -17961,18 +17901,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CC (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving CC (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving CC (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CC" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -17986,11 +17928,11 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then CC="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CC to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting CC to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting CC to \"$new_complete\"" >&6;} fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CC" >&5 + { $as_echo "$as_me:$LINENO: checking resolved symbolic links for CC" >&5 $as_echo_n "checking resolved symbolic links for CC... " >&6; } TEST_COMPILER="$CC" @@ -18037,14 +17979,14 @@ $as_echo_n "checking resolved symbolic links for CC... " >&6; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 + { $as_echo "$as_me:$LINENO: result: $TEST_COMPILER" >&5 $as_echo "$TEST_COMPILER" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if CC is disguised ccache" >&5 + { $as_echo "$as_me:$LINENO: checking if CC is disguised ccache" >&5 $as_echo_n "checking if CC is disguised ccache... " >&6; } COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` if test "x$COMPILER_BASENAME" = "xccache"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, trying to find proper $COMPILER_NAME compiler" >&5 + { $as_echo "$as_me:$LINENO: result: yes, trying to find proper $COMPILER_NAME compiler" >&5 $as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; } # We /usr/lib/ccache in the path, so cc is a symlink to /usr/bin/ccache. # We want to control ccache invocation ourselves, so ignore this cc and try @@ -18061,9 +18003,9 @@ $as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; } do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_PROPER_COMPILER_CC+set}" = set; then : +if test "${ac_cv_prog_PROPER_COMPILER_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$PROPER_COMPILER_CC"; then @@ -18074,24 +18016,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PROPER_COMPILER_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi PROPER_COMPILER_CC=$ac_cv_prog_PROPER_COMPILER_CC if test -n "$PROPER_COMPILER_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $PROPER_COMPILER_CC" >&5 $as_echo "$PROPER_COMPILER_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -18105,9 +18047,9 @@ if test -z "$PROPER_COMPILER_CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CC+set}" = set; then : +if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_PROPER_COMPILER_CC"; then @@ -18118,24 +18060,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_PROPER_COMPILER_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_PROPER_COMPILER_CC=$ac_cv_prog_ac_ct_PROPER_COMPILER_CC if test -n "$ac_ct_PROPER_COMPILER_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PROPER_COMPILER_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_PROPER_COMPILER_CC" >&5 $as_echo "$ac_ct_PROPER_COMPILER_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -18148,7 +18090,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -18197,14 +18139,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of PROPER_COMPILER_CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of PROPER_COMPILER_CC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -18224,11 +18168,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of PROPER_COMPILER_CC, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of PROPER_COMPILER_CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of PROPER_COMPILER_CC" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -18320,14 +18266,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of PROPER_COMPILER_CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of PROPER_COMPILER_CC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -18382,18 +18330,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving PROPER_COMPILER_CC (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving PROPER_COMPILER_CC (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving PROPER_COMPILER_CC (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of PROPER_COMPILER_CC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of PROPER_COMPILER_CC" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -18407,13 +18357,13 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then PROPER_COMPILER_CC="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting PROPER_COMPILER_CC to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting PROPER_COMPILER_CC to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting PROPER_COMPILER_CC to \"$new_complete\"" >&6;} fi PATH="$RETRY_COMPILER_SAVED_PATH" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for resolved symbolic links for CC" >&5 + { $as_echo "$as_me:$LINENO: checking for resolved symbolic links for CC" >&5 $as_echo_n "checking for resolved symbolic links for CC... " >&6; } if test "x$OPENJDK_BUILD_OS" != xwindows; then @@ -18459,11 +18409,11 @@ $as_echo_n "checking for resolved symbolic links for CC... " >&6; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $PROPER_COMPILER_CC" >&5 $as_echo "$PROPER_COMPILER_CC" >&6; } CC="$PROPER_COMPILER_CC" else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, keeping CC" >&5 + { $as_echo "$as_me:$LINENO: result: no, keeping CC" >&5 $as_echo "no, keeping CC" >&6; } CC="$TEST_COMPILER" fi @@ -18478,11 +18428,13 @@ $as_echo "no, keeping CC" >&6; } if test $? -ne 0; then GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` - { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&5 + { $as_echo "$as_me:$LINENO: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&5 $as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&5 + { $as_echo "$as_me:$LINENO: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&5 $as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&6;} - as_fn_error $? "Sun Studio compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Sun Studio compiler is required. Try setting --with-tools-dir." >&5 +$as_echo "$as_me: error: Sun Studio compiler is required. Try setting --with-tools-dir." >&2;} + { (exit 1); exit 1; }; } else COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/p"` COMPILER_VENDOR="Sun Studio" @@ -18496,11 +18448,15 @@ $as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\ COMPILER_CPU_TEST=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* for \(.*\)$/\1/p"` if test "x$OPENJDK_TARGET_CPU" = "xx86"; then if test "x$COMPILER_CPU_TEST" != "x80x86"; then - as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." >&5 +$as_echo "$as_me: error: Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." >&2;} + { (exit 1); exit 1; }; } fi elif test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then if test "x$COMPILER_CPU_TEST" != "xx64"; then - as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." >&5 +$as_echo "$as_me: error: Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." >&2;} + { (exit 1); exit 1; }; } fi fi else @@ -18508,11 +18464,13 @@ $as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\ # Check that this is likely to be GCC. $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null if test $? -ne 0; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 + { $as_echo "$as_me:$LINENO: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 $as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5 + { $as_echo "$as_me:$LINENO: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5 $as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&6;} - as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: GCC compiler is required. Try setting --with-tools-dir." >&5 +$as_echo "$as_me: error: GCC compiler is required. Try setting --with-tools-dir." >&2;} + { (exit 1); exit 1; }; } fi # First line typically looks something like: @@ -18525,7 +18483,7 @@ $as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSIO # This sets CC_VENDOR or CXX_VENDOR. (This comment is a grep marker) CC_VENDOR="$COMPILER_VENDOR" - { $as_echo "$as_me:${as_lineno-$LINENO}: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&5 + { $as_echo "$as_me:$LINENO: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&5 $as_echo "$as_me: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&6;} @@ -18540,9 +18498,9 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -18553,24 +18511,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -18584,9 +18542,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -18597,24 +18555,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -18627,7 +18585,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -18636,37 +18594,57 @@ esac fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5 ; } +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" +{ (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -18682,8 +18660,8 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } +{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -18699,17 +18677,17 @@ do done rm -f $ac_rmfiles -if { { ac_try="$ac_link_default" +if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -18726,7 +18704,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -18745,41 +18723,84 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5 ; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } + ac_exeext=$ac_cv_exeext +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" +if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -18794,83 +18815,32 @@ for ac_file in conftest.exe conftest conftest.*; do esac done else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5 ; } +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5 ; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then : +if test "${ac_cv_objext+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -18882,17 +18852,17 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" +if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -18905,23 +18875,31 @@ else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5 ; } +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi + rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then : +if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -18935,16 +18913,37 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - ac_compiler_gnu=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes @@ -18953,16 +18952,20 @@ else fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then : +if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -18973,11 +18976,35 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -18988,12 +19015,36 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else - ac_c_werror_flag=$ac_save_c_werror_flag + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -19004,17 +19055,42 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS @@ -19031,14 +19107,18 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then : +if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -19095,9 +19175,32 @@ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done @@ -19108,19 +19211,17 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 + { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac -if test "x$ac_cv_prog_cc_c89" != xno; then : -fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' @@ -19147,9 +19248,9 @@ fi do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_POTENTIAL_CXX+set}" = set; then : +if test "${ac_cv_path_POTENTIAL_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else case $POTENTIAL_CXX in @@ -19162,14 +19263,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_POTENTIAL_CXX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -19177,10 +19278,10 @@ esac fi POTENTIAL_CXX=$ac_cv_path_POTENTIAL_CXX if test -n "$POTENTIAL_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POTENTIAL_CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $POTENTIAL_CXX" >&5 $as_echo "$POTENTIAL_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -19216,7 +19317,9 @@ done HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - as_fn_error $? "Could not find a $COMPILER_NAME compiler. $HELP_MSG" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find a $COMPILER_NAME compiler. $HELP_MSG" >&5 +$as_echo "$as_me: error: Could not find a $COMPILER_NAME compiler. $HELP_MSG" >&2;} + { (exit 1); exit 1; }; } fi if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -19259,14 +19362,16 @@ done fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CXX, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CXX, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CXX" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -19286,11 +19391,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of CXX, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of CXX, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CXX" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -19382,14 +19489,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CXX, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CXX, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CXX" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -19444,18 +19553,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CXX (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving CXX (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving CXX (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CXX, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CXX, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CXX" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -19469,11 +19580,11 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then CXX="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CXX to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting CXX to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting CXX to \"$new_complete\"" >&6;} fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CXX" >&5 + { $as_echo "$as_me:$LINENO: checking resolved symbolic links for CXX" >&5 $as_echo_n "checking resolved symbolic links for CXX... " >&6; } TEST_COMPILER="$CXX" @@ -19520,14 +19631,14 @@ $as_echo_n "checking resolved symbolic links for CXX... " >&6; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 + { $as_echo "$as_me:$LINENO: result: $TEST_COMPILER" >&5 $as_echo "$TEST_COMPILER" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if CXX is disguised ccache" >&5 + { $as_echo "$as_me:$LINENO: checking if CXX is disguised ccache" >&5 $as_echo_n "checking if CXX is disguised ccache... " >&6; } COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` if test "x$COMPILER_BASENAME" = "xccache"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, trying to find proper $COMPILER_NAME compiler" >&5 + { $as_echo "$as_me:$LINENO: result: yes, trying to find proper $COMPILER_NAME compiler" >&5 $as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; } # We /usr/lib/ccache in the path, so cc is a symlink to /usr/bin/ccache. # We want to control ccache invocation ourselves, so ignore this cc and try @@ -19544,9 +19655,9 @@ $as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; } do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_PROPER_COMPILER_CXX+set}" = set; then : +if test "${ac_cv_prog_PROPER_COMPILER_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$PROPER_COMPILER_CXX"; then @@ -19557,24 +19668,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PROPER_COMPILER_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi PROPER_COMPILER_CXX=$ac_cv_prog_PROPER_COMPILER_CXX if test -n "$PROPER_COMPILER_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $PROPER_COMPILER_CXX" >&5 $as_echo "$PROPER_COMPILER_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -19588,9 +19699,9 @@ if test -z "$PROPER_COMPILER_CXX"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CXX+set}" = set; then : +if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_PROPER_COMPILER_CXX"; then @@ -19601,24 +19712,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_PROPER_COMPILER_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_PROPER_COMPILER_CXX=$ac_cv_prog_ac_ct_PROPER_COMPILER_CXX if test -n "$ac_ct_PROPER_COMPILER_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PROPER_COMPILER_CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_PROPER_COMPILER_CXX" >&5 $as_echo "$ac_ct_PROPER_COMPILER_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -19631,7 +19742,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -19680,14 +19791,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of PROPER_COMPILER_CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of PROPER_COMPILER_CXX" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -19707,11 +19820,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of PROPER_COMPILER_CXX, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of PROPER_COMPILER_CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of PROPER_COMPILER_CXX" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -19803,14 +19918,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of PROPER_COMPILER_CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of PROPER_COMPILER_CXX" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -19865,18 +19982,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving PROPER_COMPILER_CXX (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving PROPER_COMPILER_CXX (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving PROPER_COMPILER_CXX (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of PROPER_COMPILER_CXX" >&5 +$as_echo "$as_me: error: Cannot locate the the path of PROPER_COMPILER_CXX" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -19890,13 +20009,13 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then PROPER_COMPILER_CXX="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting PROPER_COMPILER_CXX to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting PROPER_COMPILER_CXX to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting PROPER_COMPILER_CXX to \"$new_complete\"" >&6;} fi PATH="$RETRY_COMPILER_SAVED_PATH" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for resolved symbolic links for CXX" >&5 + { $as_echo "$as_me:$LINENO: checking for resolved symbolic links for CXX" >&5 $as_echo_n "checking for resolved symbolic links for CXX... " >&6; } if test "x$OPENJDK_BUILD_OS" != xwindows; then @@ -19942,11 +20061,11 @@ $as_echo_n "checking for resolved symbolic links for CXX... " >&6; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $PROPER_COMPILER_CXX" >&5 $as_echo "$PROPER_COMPILER_CXX" >&6; } CXX="$PROPER_COMPILER_CXX" else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, keeping CXX" >&5 + { $as_echo "$as_me:$LINENO: result: no, keeping CXX" >&5 $as_echo "no, keeping CXX" >&6; } CXX="$TEST_COMPILER" fi @@ -19961,11 +20080,13 @@ $as_echo "no, keeping CXX" >&6; } if test $? -ne 0; then GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` - { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&5 + { $as_echo "$as_me:$LINENO: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&5 $as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&5 + { $as_echo "$as_me:$LINENO: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&5 $as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&6;} - as_fn_error $? "Sun Studio compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Sun Studio compiler is required. Try setting --with-tools-dir." >&5 +$as_echo "$as_me: error: Sun Studio compiler is required. Try setting --with-tools-dir." >&2;} + { (exit 1); exit 1; }; } else COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/p"` COMPILER_VENDOR="Sun Studio" @@ -19979,11 +20100,15 @@ $as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\ COMPILER_CPU_TEST=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* for \(.*\)$/\1/p"` if test "x$OPENJDK_TARGET_CPU" = "xx86"; then if test "x$COMPILER_CPU_TEST" != "x80x86"; then - as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." >&5 +$as_echo "$as_me: error: Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." >&2;} + { (exit 1); exit 1; }; } fi elif test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then if test "x$COMPILER_CPU_TEST" != "xx64"; then - as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." >&5 +$as_echo "$as_me: error: Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." >&2;} + { (exit 1); exit 1; }; } fi fi else @@ -19991,11 +20116,13 @@ $as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\ # Check that this is likely to be GCC. $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null if test $? -ne 0; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 + { $as_echo "$as_me:$LINENO: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 $as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5 + { $as_echo "$as_me:$LINENO: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5 $as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&6;} - as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: GCC compiler is required. Try setting --with-tools-dir." >&5 +$as_echo "$as_me: error: GCC compiler is required. Try setting --with-tools-dir." >&2;} + { (exit 1); exit 1; }; } fi # First line typically looks something like: @@ -20008,7 +20135,7 @@ $as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSIO # This sets CC_VENDOR or CXX_VENDOR. (This comment is a grep marker) CXX_VENDOR="$COMPILER_VENDOR" - { $as_echo "$as_me:${as_lineno-$LINENO}: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&5 + { $as_echo "$as_me:$LINENO: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&5 $as_echo "$as_me: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&6;} @@ -20027,9 +20154,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CXX+set}" = set; then : +if test "${ac_cv_prog_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then @@ -20040,24 +20167,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $CXX" >&5 $as_echo "$CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -20071,9 +20198,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then @@ -20084,24 +20211,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -20114,7 +20241,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -20125,36 +20252,53 @@ fi fi fi # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" +{ (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -20168,16 +20312,37 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - ac_compiler_gnu=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes @@ -20186,16 +20351,20 @@ else fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } -if test "${ac_cv_prog_cxx_g+set}" = set; then : +if test "${ac_cv_prog_cxx_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -20206,11 +20375,35 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -20221,12 +20414,36 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -20237,17 +20454,42 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS @@ -20284,9 +20526,9 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OBJC+set}" = set; then : +if test "${ac_cv_prog_OBJC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OBJC"; then @@ -20297,24 +20539,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi OBJC=$ac_cv_prog_OBJC if test -n "$OBJC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJC" >&5 + { $as_echo "$as_me:$LINENO: result: $OBJC" >&5 $as_echo "$OBJC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -20328,9 +20570,9 @@ if test -z "$OBJC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OBJC+set}" = set; then : +if test "${ac_cv_prog_ac_ct_OBJC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJC"; then @@ -20341,24 +20583,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_OBJC=$ac_cv_prog_ac_ct_OBJC if test -n "$ac_ct_OBJC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJC" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJC" >&5 $as_echo "$ac_ct_OBJC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -20371,7 +20613,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -20380,36 +20622,53 @@ esac fi # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for Objective C compiler version" >&5 +$as_echo "$as_me:$LINENO: checking for Objective C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" +{ (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Objective C compiler" >&5 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU Objective C compiler" >&5 $as_echo_n "checking whether we are using the GNU Objective C compiler... " >&6; } -if test "${ac_cv_objc_compiler_gnu+set}" = set; then : +if test "${ac_cv_objc_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -20423,16 +20682,37 @@ main () return 0; } _ACEOF -if ac_fn_objc_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_objc_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - ac_compiler_gnu=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_objc_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objc_compiler_gnu" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objc_compiler_gnu" >&5 $as_echo "$ac_cv_objc_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GOBJC=yes @@ -20441,16 +20721,20 @@ else fi ac_test_OBJCFLAGS=${OBJCFLAGS+set} ac_save_OBJCFLAGS=$OBJCFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $OBJC accepts -g" >&5 +{ $as_echo "$as_me:$LINENO: checking whether $OBJC accepts -g" >&5 $as_echo_n "checking whether $OBJC accepts -g... " >&6; } -if test "${ac_cv_prog_objc_g+set}" = set; then : +if test "${ac_cv_prog_objc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_objc_werror_flag=$ac_objc_werror_flag ac_objc_werror_flag=yes ac_cv_prog_objc_g=no OBJCFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -20461,11 +20745,35 @@ main () return 0; } _ACEOF -if ac_fn_objc_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_objc_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_objc_g=yes else - OBJCFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + OBJCFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -20476,12 +20784,36 @@ main () return 0; } _ACEOF -if ac_fn_objc_try_compile "$LINENO"; then : - +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_objc_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else - ac_objc_werror_flag=$ac_save_objc_werror_flag + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_objc_werror_flag=$ac_save_objc_werror_flag OBJCFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -20492,17 +20824,42 @@ main () return 0; } _ACEOF -if ac_fn_objc_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_objc_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_objc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_objc_werror_flag=$ac_save_objc_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_objc_g" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_objc_g" >&5 $as_echo "$ac_cv_prog_objc_g" >&6; } if test "$ac_test_OBJCFLAGS" = set; then OBJCFLAGS=$ac_save_OBJCFLAGS @@ -20566,14 +20923,16 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of OBJC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -20593,11 +20952,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJC, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of OBJC, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJC" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -20689,14 +21050,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of OBJC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -20751,18 +21114,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving OBJC (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving OBJC (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving OBJC (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of OBJC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJC" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -20776,7 +21141,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then OBJC="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OBJC to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting OBJC to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting OBJC to \"$new_complete\"" >&6;} fi @@ -20806,9 +21171,9 @@ if test "x$OPENJDK_TARGET_OS" != xwindows; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AR+set}" = set; then : +if test "${ac_cv_prog_AR+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$AR"; then @@ -20819,24 +21184,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 + { $as_echo "$as_me:$LINENO: result: $AR" >&5 $as_echo "$AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -20846,9 +21211,9 @@ if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then @@ -20859,24 +21224,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -20885,7 +21250,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -20936,14 +21301,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of AR, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of AR, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of AR" >&5 +$as_echo "$as_me: error: Cannot locate the the path of AR" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -20963,11 +21330,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of AR, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of AR, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of AR" >&5 +$as_echo "$as_me: error: Cannot locate the the path of AR" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -21059,14 +21428,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of AR, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of AR, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of AR" >&5 +$as_echo "$as_me: error: Cannot locate the the path of AR" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -21121,18 +21492,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving AR (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving AR (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving AR (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of AR, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of AR, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of AR" >&5 +$as_echo "$as_me: error: Cannot locate the the path of AR" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -21146,7 +21519,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then AR="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting AR to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting AR to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting AR to \"$new_complete\"" >&6;} fi @@ -21166,7 +21539,7 @@ HOTSPOT_LD="$LD" COMPILER_NAME=gcc COMPILER_TYPE=CC -if test "x$OPENJDK_TARGET_OS" = xwindows; then : +if test "x$OPENJDK_TARGET_OS" = xwindows; then # For now, assume that we are always compiling using cl.exe. CC_OUT_OPTION=-Fo @@ -21177,9 +21550,9 @@ if test "x$OPENJDK_TARGET_OS" = xwindows; then : # program for something completely different. # Extract the first word of "link", so it can be a program name with args. set dummy link; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_WINLD+set}" = set; then : +if test "${ac_cv_prog_WINLD+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$WINLD"; then @@ -21191,18 +21564,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "$CYGWIN_LINK"; then ac_prog_rejected=yes continue fi ac_cv_prog_WINLD="link" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -21221,10 +21594,10 @@ fi fi WINLD=$ac_cv_prog_WINLD if test -n "$WINLD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINLD" >&5 + { $as_echo "$as_me:$LINENO: result: $WINLD" >&5 $as_echo "$WINLD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -21272,14 +21645,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of WINLD, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of WINLD, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of WINLD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of WINLD" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -21299,11 +21674,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of WINLD, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of WINLD, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of WINLD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of WINLD" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -21395,14 +21772,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of WINLD, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of WINLD, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of WINLD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of WINLD" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -21457,18 +21836,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving WINLD (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving WINLD (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving WINLD (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of WINLD, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of WINLD, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of WINLD" >&5 +$as_echo "$as_me: error: Cannot locate the the path of WINLD" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -21482,20 +21863,22 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then WINLD="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting WINLD to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting WINLD to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting WINLD to \"$new_complete\"" >&6;} fi printf "Windows linker was found at $WINLD\n" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the found link.exe is actually the Visual Studio linker" >&5 + { $as_echo "$as_me:$LINENO: checking if the found link.exe is actually the Visual Studio linker" >&5 $as_echo_n "checking if the found link.exe is actually the Visual Studio linker... " >&6; } "$WINLD" --version > /dev/null if test $? -eq 0 ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } - as_fn_error $? "This is the Cygwin link tool. Please check your PATH and rerun configure." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: This is the Cygwin link tool. Please check your PATH and rerun configure." >&5 +$as_echo "$as_me: error: This is the Cygwin link tool. Please check your PATH and rerun configure." >&2;} + { (exit 1); exit 1; }; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } fi LD="$WINLD" @@ -21505,9 +21888,9 @@ $as_echo "yes" >&6; } # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_MT+set}" = set; then : +if test "${ac_cv_prog_MT+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$MT"; then @@ -21519,18 +21902,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/bin/mt"; then ac_prog_rejected=yes continue fi ac_cv_prog_MT="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -21549,10 +21932,10 @@ fi fi MT=$ac_cv_prog_MT if test -n "$MT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MT" >&5 + { $as_echo "$as_me:$LINENO: result: $MT" >&5 $as_echo "$MT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -21598,14 +21981,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of MT, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of MT, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of MT" >&5 +$as_echo "$as_me: error: Cannot locate the the path of MT" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -21625,11 +22010,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of MT, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of MT, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of MT" >&5 +$as_echo "$as_me: error: Cannot locate the the path of MT" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -21721,14 +22108,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of MT, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of MT, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of MT" >&5 +$as_echo "$as_me: error: Cannot locate the the path of MT" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -21783,18 +22172,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving MT (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving MT (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving MT (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of MT, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of MT, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of MT" >&5 +$as_echo "$as_me: error: Cannot locate the the path of MT" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -21808,16 +22199,16 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then MT="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MT to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting MT to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting MT to \"$new_complete\"" >&6;} fi # The resource compiler # Extract the first word of "rc", so it can be a program name with args. set dummy rc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RC+set}" = set; then : +if test "${ac_cv_prog_RC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$RC"; then @@ -21829,18 +22220,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/bin/rc"; then ac_prog_rejected=yes continue fi ac_cv_prog_RC="rc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -21859,10 +22250,10 @@ fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 + { $as_echo "$as_me:$LINENO: result: $RC" >&5 $as_echo "$RC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -21908,14 +22299,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of RC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of RC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of RC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of RC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -21935,11 +22328,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of RC, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of RC, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of RC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of RC" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -22031,14 +22426,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of RC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of RC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of RC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of RC" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -22093,18 +22490,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving RC (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving RC (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving RC (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of RC, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of RC, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of RC" >&5 +$as_echo "$as_me: error: Cannot locate the the path of RC" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -22118,7 +22517,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then RC="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting RC to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting RC to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting RC to \"$new_complete\"" >&6;} fi @@ -22173,17 +22572,19 @@ $as_echo "$as_me: Rewriting RC to \"$new_complete\"" >&6;} RC_FLAGS="-nologo -l 0x409 -r" - if test "x$VARIANT" = xOPT; then : + if test "x$VARIANT" = xOPT; then RC_FLAGS="$RC_FLAGS -d NDEBUG" fi + JDK_UPDATE_VERSION_NOTNULL=$JDK_UPDATE_VERSION - if test "x$JDK_UPDATE_VERSION" = x; then : + if test "x$JDK_UPDATE_VERSION" = x; then JDK_UPDATE_VERSION_NOTNULL=0 fi + RC_FLAGS="$RC_FLAGS -d \"JDK_BUILD_ID=$FULL_VERSION\"" RC_FLAGS="$RC_FLAGS -d \"JDK_COMPANY=$COMPANY_NAME\"" RC_FLAGS="$RC_FLAGS -d \"JDK_COMPONENT=$PRODUCT_NAME $JDK_RC_PLATFORM_NAME binary\"" @@ -22195,9 +22596,9 @@ fi # lib.exe is used to create static libraries. # Extract the first word of "lib", so it can be a program name with args. set dummy lib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_WINAR+set}" = set; then : +if test "${ac_cv_prog_WINAR+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$WINAR"; then @@ -22208,24 +22609,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_WINAR="lib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi WINAR=$ac_cv_prog_WINAR if test -n "$WINAR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINAR" >&5 + { $as_echo "$as_me:$LINENO: result: $WINAR" >&5 $as_echo "$WINAR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -22271,14 +22672,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of WINAR, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of WINAR, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of WINAR" >&5 +$as_echo "$as_me: error: Cannot locate the the path of WINAR" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -22298,11 +22701,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of WINAR, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of WINAR, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of WINAR" >&5 +$as_echo "$as_me: error: Cannot locate the the path of WINAR" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -22394,14 +22799,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of WINAR, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of WINAR, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of WINAR" >&5 +$as_echo "$as_me: error: Cannot locate the the path of WINAR" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -22456,18 +22863,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving WINAR (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving WINAR (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving WINAR (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of WINAR, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of WINAR, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of WINAR" >&5 +$as_echo "$as_me: error: Cannot locate the the path of WINAR" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -22481,7 +22890,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then WINAR="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting WINAR to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting WINAR to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting WINAR to \"$new_complete\"" >&6;} fi @@ -22490,9 +22899,9 @@ $as_echo "$as_me: Rewriting WINAR to \"$new_complete\"" >&6;} # Extract the first word of "dumpbin", so it can be a program name with args. set dummy dumpbin; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DUMPBIN+set}" = set; then : +if test "${ac_cv_prog_DUMPBIN+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then @@ -22503,24 +22912,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="dumpbin" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 + { $as_echo "$as_me:$LINENO: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -22566,14 +22975,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of DUMPBIN" >&5 +$as_echo "$as_me: error: Cannot locate the the path of DUMPBIN" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -22593,11 +23004,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of DUMPBIN, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of DUMPBIN, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of DUMPBIN" >&5 +$as_echo "$as_me: error: Cannot locate the the path of DUMPBIN" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -22689,14 +23102,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of DUMPBIN" >&5 +$as_echo "$as_me: error: Cannot locate the the path of DUMPBIN" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -22751,18 +23166,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving DUMPBIN (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving DUMPBIN (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving DUMPBIN (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of DUMPBIN" >&5 +$as_echo "$as_me: error: Cannot locate the the path of DUMPBIN" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -22776,7 +23193,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then DUMPBIN="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting DUMPBIN to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting DUMPBIN to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting DUMPBIN to \"$new_complete\"" >&6;} fi @@ -22788,19 +23205,20 @@ fi + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then : + if test "${ac_cv_prog_CPP+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -22815,7 +23233,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -22824,34 +23246,78 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then break fi @@ -22863,7 +23329,7 @@ fi else ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes @@ -22874,7 +23340,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -22883,40 +23353,87 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5 ; } +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi ac_ext=cpp @@ -22966,14 +23483,16 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CPP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CPP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CPP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CPP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -22993,11 +23512,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of CPP, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of CPP, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CPP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CPP" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -23089,14 +23610,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CPP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CPP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CPP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CPP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -23151,18 +23674,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CPP (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving CPP (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving CPP (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CPP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CPP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CPP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CPP" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -23176,7 +23701,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then CPP="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CPP to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting CPP to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting CPP to \"$new_complete\"" >&6;} fi @@ -23186,10 +23711,10 @@ ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +{ $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then - if test "${ac_cv_prog_CXXCPP+set}" = set; then : + if test "${ac_cv_prog_CXXCPP+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded @@ -23204,7 +23729,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -23213,34 +23742,78 @@ do #endif Syntax error _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then break fi @@ -23252,7 +23825,7 @@ fi else ac_cv_prog_CXXCPP=$CXXCPP fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +{ $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes @@ -23263,7 +23836,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -23272,40 +23849,87 @@ do #endif Syntax error _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5 ; } +{ { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi ac_ext=cpp @@ -23355,14 +23979,16 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CXXCPP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CXXCPP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CXXCPP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -23382,11 +24008,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of CXXCPP, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of CXXCPP, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CXXCPP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CXXCPP" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -23478,14 +24106,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CXXCPP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CXXCPP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CXXCPP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -23540,18 +24170,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CXXCPP (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving CXXCPP (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving CXXCPP (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of CXXCPP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of CXXCPP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of CXXCPP" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -23565,7 +24197,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then CXXCPP="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CXXCPP to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting CXXCPP to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting CXXCPP to \"$new_complete\"" >&6;} fi @@ -23594,9 +24226,9 @@ fi if test "x$OPENJDK_TARGET_OS" = xsolaris; then # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_AS+set}" = set; then : +if test "${ac_cv_path_AS+set}" = set; then $as_echo_n "(cached) " >&6 else case $AS in @@ -23609,14 +24241,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_AS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -23624,10 +24256,10 @@ esac fi AS=$ac_cv_path_AS if test -n "$AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 + { $as_echo "$as_me:$LINENO: result: $AS" >&5 $as_echo "$AS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -23673,14 +24305,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of AS, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of AS, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of AS" >&5 +$as_echo "$as_me: error: Cannot locate the the path of AS" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -23700,11 +24334,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of AS, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of AS, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of AS" >&5 +$as_echo "$as_me: error: Cannot locate the the path of AS" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -23796,14 +24432,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of AS, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of AS, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of AS" >&5 +$as_echo "$as_me: error: Cannot locate the the path of AS" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -23858,18 +24496,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving AS (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving AS (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving AS (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of AS, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of AS, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of AS" >&5 +$as_echo "$as_me: error: Cannot locate the the path of AS" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -23883,7 +24523,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then AS="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting AS to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting AS to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting AS to \"$new_complete\"" >&6;} fi @@ -23897,9 +24537,9 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_NM+set}" = set; then : +if test "${ac_cv_path_NM+set}" = set; then $as_echo_n "(cached) " >&6 else case $NM in @@ -23912,14 +24552,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_NM="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -23927,10 +24567,10 @@ esac fi NM=$ac_cv_path_NM if test -n "$NM"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5 + { $as_echo "$as_me:$LINENO: result: $NM" >&5 $as_echo "$NM" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -23979,14 +24619,16 @@ done fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of NM, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of NM" >&5 +$as_echo "$as_me: error: Cannot locate the the path of NM" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -24006,11 +24648,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of NM, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of NM, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of NM" >&5 +$as_echo "$as_me: error: Cannot locate the the path of NM" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -24102,14 +24746,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of NM, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of NM" >&5 +$as_echo "$as_me: error: Cannot locate the the path of NM" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -24164,18 +24810,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving NM (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving NM (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving NM (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of NM, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of NM" >&5 +$as_echo "$as_me: error: Cannot locate the the path of NM" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -24189,15 +24837,15 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then NM="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting NM to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting NM to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting NM to \"$new_complete\"" >&6;} fi # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_STRIP+set}" = set; then : +if test "${ac_cv_path_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else case $STRIP in @@ -24210,14 +24858,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_STRIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -24225,10 +24873,10 @@ esac fi STRIP=$ac_cv_path_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -24274,14 +24922,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of STRIP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of STRIP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of STRIP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -24301,11 +24951,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of STRIP, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of STRIP, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of STRIP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of STRIP" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -24397,14 +25049,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of STRIP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of STRIP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of STRIP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -24459,18 +25113,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of STRIP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of STRIP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of STRIP" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -24484,15 +25140,15 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then STRIP="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting STRIP to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting STRIP to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting STRIP to \"$new_complete\"" >&6;} fi # Extract the first word of "mcs", so it can be a program name with args. set dummy mcs; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_MCS+set}" = set; then : +if test "${ac_cv_path_MCS+set}" = set; then $as_echo_n "(cached) " >&6 else case $MCS in @@ -24505,14 +25161,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MCS="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -24520,10 +25176,10 @@ esac fi MCS=$ac_cv_path_MCS if test -n "$MCS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MCS" >&5 + { $as_echo "$as_me:$LINENO: result: $MCS" >&5 $as_echo "$MCS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -24569,14 +25225,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of MCS, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of MCS, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of MCS" >&5 +$as_echo "$as_me: error: Cannot locate the the path of MCS" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -24596,11 +25254,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of MCS, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of MCS, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of MCS" >&5 +$as_echo "$as_me: error: Cannot locate the the path of MCS" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -24692,14 +25352,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of MCS, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of MCS, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of MCS" >&5 +$as_echo "$as_me: error: Cannot locate the the path of MCS" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -24754,18 +25416,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving MCS (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving MCS (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving MCS (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of MCS, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of MCS, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of MCS" >&5 +$as_echo "$as_me: error: Cannot locate the the path of MCS" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -24779,7 +25443,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then MCS="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MCS to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting MCS to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting MCS to \"$new_complete\"" >&6;} fi @@ -24787,9 +25451,9 @@ elif test "x$OPENJDK_TARGET_OS" != xwindows; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. set dummy ${ac_tool_prefix}nm; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_NM+set}" = set; then : +if test "${ac_cv_prog_NM+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$NM"; then @@ -24800,24 +25464,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NM="${ac_tool_prefix}nm" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi NM=$ac_cv_prog_NM if test -n "$NM"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5 + { $as_echo "$as_me:$LINENO: result: $NM" >&5 $as_echo "$NM" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -24827,9 +25491,9 @@ if test -z "$ac_cv_prog_NM"; then ac_ct_NM=$NM # Extract the first word of "nm", so it can be a program name with args. set dummy nm; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_NM+set}" = set; then : +if test "${ac_cv_prog_ac_ct_NM+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NM"; then @@ -24840,24 +25504,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NM="nm" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_NM=$ac_cv_prog_ac_ct_NM if test -n "$ac_ct_NM"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NM" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_NM" >&5 $as_echo "$ac_ct_NM" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -24866,7 +25530,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -24917,14 +25581,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of NM, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of NM" >&5 +$as_echo "$as_me: error: Cannot locate the the path of NM" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -24944,11 +25610,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of NM, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of NM, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of NM" >&5 +$as_echo "$as_me: error: Cannot locate the the path of NM" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -25040,14 +25708,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of NM, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of NM" >&5 +$as_echo "$as_me: error: Cannot locate the the path of NM" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -25102,18 +25772,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving NM (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving NM (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving NM (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of NM, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of NM" >&5 +$as_echo "$as_me: error: Cannot locate the the path of NM" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -25127,16 +25799,16 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then NM="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting NM to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting NM to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting NM to \"$new_complete\"" >&6;} fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then : +if test "${ac_cv_prog_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -25147,24 +25819,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -25174,9 +25846,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -25187,24 +25859,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -25213,7 +25885,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -25264,14 +25936,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of STRIP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of STRIP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of STRIP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -25291,11 +25965,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of STRIP, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of STRIP, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of STRIP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of STRIP" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -25387,14 +26063,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of STRIP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of STRIP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of STRIP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -25449,18 +26127,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of STRIP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of STRIP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of STRIP" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -25474,7 +26154,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then STRIP="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting STRIP to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting STRIP to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting STRIP to \"$new_complete\"" >&6;} fi @@ -25488,9 +26168,9 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux; do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OBJCOPY+set}" = set; then : +if test "${ac_cv_prog_OBJCOPY+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OBJCOPY"; then @@ -25501,24 +26181,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJCOPY="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi OBJCOPY=$ac_cv_prog_OBJCOPY if test -n "$OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCOPY" >&5 + { $as_echo "$as_me:$LINENO: result: $OBJCOPY" >&5 $as_echo "$OBJCOPY" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -25532,9 +26212,9 @@ if test -z "$OBJCOPY"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OBJCOPY+set}" = set; then : +if test "${ac_cv_prog_ac_ct_OBJCOPY+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJCOPY"; then @@ -25545,24 +26225,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJCOPY="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_OBJCOPY=$ac_cv_prog_ac_ct_OBJCOPY if test -n "$ac_ct_OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJCOPY" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJCOPY" >&5 $as_echo "$ac_ct_OBJCOPY" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -25575,7 +26255,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -25624,14 +26304,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJCOPY" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJCOPY" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -25651,11 +26333,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJCOPY, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of OBJCOPY, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJCOPY" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJCOPY" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -25747,14 +26431,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJCOPY" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJCOPY" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -25809,18 +26495,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving OBJCOPY (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving OBJCOPY (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving OBJCOPY (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJCOPY" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJCOPY" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -25834,7 +26522,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then OBJCOPY="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OBJCOPY to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting OBJCOPY to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting OBJCOPY to \"$new_complete\"" >&6;} fi @@ -25845,9 +26533,9 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OBJDUMP+set}" = set; then : +if test "${ac_cv_prog_OBJDUMP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then @@ -25858,24 +26546,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 + { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -25889,9 +26577,9 @@ if test -z "$OBJDUMP"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then @@ -25902,24 +26590,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -25932,7 +26620,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -25983,14 +26671,16 @@ if test "x$OBJDUMP" != x; then fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJDUMP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJDUMP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -26010,11 +26700,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJDUMP, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of OBJDUMP, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJDUMP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJDUMP" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -26106,14 +26798,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJDUMP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJDUMP" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -26168,18 +26862,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving OBJDUMP (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving OBJDUMP (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving OBJDUMP (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of OBJDUMP" >&5 +$as_echo "$as_me: error: Cannot locate the the path of OBJDUMP" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -26193,7 +26889,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then OBJDUMP="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OBJDUMP to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting OBJDUMP to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting OBJDUMP to \"$new_complete\"" >&6;} fi @@ -26202,9 +26898,9 @@ fi if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_LIPO+set}" = set; then : +if test "${ac_cv_path_LIPO+set}" = set; then $as_echo_n "(cached) " >&6 else case $LIPO in @@ -26217,14 +26913,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LIPO="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -26232,10 +26928,10 @@ esac fi LIPO=$ac_cv_path_LIPO if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 + { $as_echo "$as_me:$LINENO: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -26281,14 +26977,16 @@ fi fi if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of LIPO, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of LIPO, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of LIPO" >&5 +$as_echo "$as_me: error: Cannot locate the the path of LIPO" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -26308,11 +27006,13 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh elif test -f "${new_path}.cmd"; then input_to_shortpath="${new_path}.cmd" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$new_path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of LIPO, which resolves as \"$new_path\", is invalid." >&5 $as_echo "$as_me: The path of LIPO, which resolves as \"$new_path\", is invalid." >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 + { $as_echo "$as_me:$LINENO: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} - as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of LIPO" >&5 +$as_echo "$as_me: error: Cannot locate the the path of LIPO" >&2;} + { (exit 1); exit 1; }; } fi else input_to_shortpath="$new_path" @@ -26404,14 +27104,16 @@ $as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" if test "x$new_path" = x; then # It's still not found. Now this is an unrecoverable error. - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of LIPO, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of LIPO, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of LIPO" >&5 +$as_echo "$as_me: error: Cannot locate the the path of LIPO" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -26466,18 +27168,20 @@ $as_echo "$as_me: You might be mixing spaces in the path and extra arguments, wh if test "x$new_path" = x; then is_absolute_path=`$ECHO "$path" | $GREP ^/` if test "x$is_absolute_path" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving LIPO (as $path) with 'which' failed, using $path directly." >&5 + { $as_echo "$as_me:$LINENO: Resolving LIPO (as $path) with 'which' failed, using $path directly." >&5 $as_echo "$as_me: Resolving LIPO (as $path) with 'which' failed, using $path directly." >&6;} new_path="$path" else - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$complete\", is not found." >&5 + { $as_echo "$as_me:$LINENO: The path of LIPO, which resolves as \"$complete\", is not found." >&5 $as_echo "$as_me: The path of LIPO, which resolves as \"$complete\", is not found." >&6;} has_space=`$ECHO "$complete" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 + { $as_echo "$as_me:$LINENO: This might be caused by spaces in the path, which is not allowed." >&5 $as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of LIPO" >&5 +$as_echo "$as_me: error: Cannot locate the the path of LIPO" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -26491,7 +27195,7 @@ $as_echo "$as_me: This might be caused by spaces in the path, which is not allow if test "x$complete" != "x$new_complete"; then LIPO="$new_complete" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting LIPO to \"$new_complete\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting LIPO to \"$new_complete\"" >&5 $as_echo "$as_me: Rewriting LIPO to \"$new_complete\"" >&6;} fi @@ -26506,12 +27210,16 @@ PATH="$OLD_PATH" # And we can test some aspects on the target using configure macros. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then : +if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -26526,23 +27234,48 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else - ac_cv_header_stdc=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - + $EGREP "memchr" >/dev/null 2>&1; then + : else ac_cv_header_stdc=no fi @@ -26552,14 +27285,18 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - + $EGREP "free" >/dev/null 2>&1; then + : else ac_cv_header_stdc=no fi @@ -26569,10 +27306,14 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes; then : else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -26599,33 +27340,118 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_run "$LINENO"; then : - +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : else - ac_cv_header_stdc=no + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -$as_echo "#define STDC_HEADERS 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -26681,26 +27507,167 @@ elif test "x$COMPILE_TYPE" = xreduced; then fi # Make compilation sanity check + for ac_header in stdio.h -do : - ac_fn_cxx_check_header_mongrel "$LINENO" "stdio.h" "ac_cv_header_stdio_h" "$ac_includes_default" -if test "x$ac_cv_header_stdio_h" = x""yes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ----------------------------------------- ## +## Report this to build-dev@openjdk.java.net ## +## ----------------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_STDIO_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else - { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to compile stdio.h. This likely implies missing compile dependencies." >&5 + { $as_echo "$as_me:$LINENO: Failed to compile stdio.h. This likely implies missing compile dependencies." >&5 $as_echo "$as_me: Failed to compile stdio.h. This likely implies missing compile dependencies." >&6;} if test "x$COMPILE_TYPE" = xreduced; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You are doing a reduced build. Check that you have 32-bit libraries installed." >&5 + { $as_echo "$as_me:$LINENO: You are doing a reduced build. Check that you have 32-bit libraries installed." >&5 $as_echo "$as_me: You are doing a reduced build. Check that you have 32-bit libraries installed." >&6;} elif test "x$COMPILE_TYPE" = xcross; then - { $as_echo "$as_me:${as_lineno-$LINENO}: You are doing a cross-compilation. Check that you have all target platform libraries installed." >&5 + { $as_echo "$as_me:$LINENO: You are doing a cross-compilation. Check that you have all target platform libraries installed." >&5 $as_echo "$as_me: You are doing a cross-compilation. Check that you have all target platform libraries installed." >&6;} fi - as_fn_error $? "Cannot continue." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot continue." >&5 +$as_echo "$as_me: error: Cannot continue." >&2;} + { (exit 1); exit 1; }; } fi @@ -26711,26 +27678,352 @@ done # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int *" >&5 +{ $as_echo "$as_me:$LINENO: checking size of int *" >&5 $as_echo_n "checking size of int *... " >&6; } -if test "${ac_cv_sizeof_int_p+set}" = set; then : +if test "${ac_cv_sizeof_int_p+set}" = set; then $as_echo_n "(cached) " >&6 else - if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (int *))" "ac_cv_sizeof_int_p" "$ac_includes_default"; then : + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int *))) >= 0)]; +test_array [0] = 0 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int *))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break else - if test "$ac_cv_type_int_p" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int *))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int *))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int *))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_int_p=$ac_lo;; +'') if test "$ac_cv_type_int_p" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (int *) -See \`config.log' for more details" "$LINENO" 5 ; } +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int *) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int *) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_int_p=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (int *)); } +static unsigned long int ulongval () { return (long int) (sizeof (int *)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (int *))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (int *)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (int *)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_int_p=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_int_p" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int *) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int *) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } else ac_cv_sizeof_int_p=0 fi fi - +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int_p" >&5 +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_int_p" >&5 $as_echo "$ac_cv_sizeof_int_p" >&6; } @@ -26748,19 +28041,21 @@ fi if test "x$SIZEOF_INT_P" = x; then # The test failed, lets stick to the assumed value. - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The number of bits in the target could not be determined, using $OPENJDK_TARGET_CPU_BITS." >&5 + { $as_echo "$as_me:$LINENO: WARNING: The number of bits in the target could not be determined, using $OPENJDK_TARGET_CPU_BITS." >&5 $as_echo "$as_me: WARNING: The number of bits in the target could not be determined, using $OPENJDK_TARGET_CPU_BITS." >&2;} else TESTED_TARGET_CPU_BITS=`expr 8 \* $SIZEOF_INT_P` if test "x$TESTED_TARGET_CPU_BITS" != "x$OPENJDK_TARGET_CPU_BITS"; then - as_fn_error $? "The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS)" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS)" >&5 +$as_echo "$as_me: error: The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS)" >&2;} + { (exit 1); exit 1; }; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for target address size" >&5 +{ $as_echo "$as_me:$LINENO: checking for target address size" >&5 $as_echo_n "checking for target address size... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENJDK_TARGET_CPU_BITS bits" >&5 +{ $as_echo "$as_me:$LINENO: result: $OPENJDK_TARGET_CPU_BITS bits" >&5 $as_echo "$OPENJDK_TARGET_CPU_BITS bits" >&6; } @@ -26768,14 +28063,19 @@ $as_echo "$OPENJDK_TARGET_CPU_BITS bits" >&6; } # # Is the target little of big endian? # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 + + { $as_echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if test "${ac_cv_c_bigendian+set}" = set; then : +if test "${ac_cv_c_bigendian+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler @@ -26783,34 +28083,46 @@ else typedef int dummy; _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then # Check for potential -arch flags. It is not universal unless - # there are at least two -arch flags with different values. - ac_arch= - ac_prev= - for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do - if test -n "$ac_prev"; then - case $ac_word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then - ac_arch=$ac_word - else - ac_cv_c_bigendian=universal - break - fi - ;; - esac - ac_prev= - elif test "x$ac_word" = "x-arch"; then - ac_prev=arch - fi - done + # there are some -arch flags. Note that *ppc* also matches + # ppc64. This check is also rather less than ideal. + case "${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}" in #( + *-arch*ppc*|*-arch*i386*|*-arch*x86_64*) ac_cv_c_bigendian=universal;; + esac +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -26828,9 +28140,30 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then # It does; now see whether it defined to BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -26846,18 +28179,49 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_c_bigendian=yes else - ac_cv_c_bigendian=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include @@ -26872,9 +28236,30 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then # It does; now see whether it defined to _BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include @@ -26889,20 +28274,51 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_c_bigendian=yes else - ac_cv_c_bigendian=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes; then # Try to guess by grepping values from an object file. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; @@ -26928,7 +28344,24 @@ return use_ascii (foo) == use_ebcdic (foo); return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi @@ -26940,10 +28373,20 @@ if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_c_bigendian=unknown fi fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int @@ -26963,18 +28406,45 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_run "$LINENO"; then : +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then ac_cv_c_bigendian=no else - ac_cv_c_bigendian=yes + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_bigendian=yes fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) @@ -26990,10 +28460,14 @@ $as_echo "$ac_cv_c_bigendian" >&6; } if test "x$ENDIAN" = xuniversal_endianness; then - as_fn_error $? "Building with both big and little endianness is not supported" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Building with both big and little endianness is not supported" >&5 +$as_echo "$as_me: error: Building with both big and little endianness is not supported" >&2;} + { (exit 1); exit 1; }; } fi if test "x$ENDIAN" != "x$OPENJDK_TARGET_CPU_ENDIAN"; then - as_fn_error $? "The tested endian in the target ($ENDIAN) differs from the endian expected to be found in the target ($OPENJDK_TARGET_CPU_ENDIAN)" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The tested endian in the target ($ENDIAN) differs from the endian expected to be found in the target ($OPENJDK_TARGET_CPU_ENDIAN)" >&5 +$as_echo "$as_me: error: The tested endian in the target ($ENDIAN) differs from the endian expected to be found in the target ($OPENJDK_TARGET_CPU_ENDIAN)" >&2;} + { (exit 1); exit 1; }; } fi @@ -27121,26 +28595,57 @@ if test "x$OPENJDK_TARGET_CPU_BITS" = x32 && test "x$OPENJDK_TARGET_OS" = xmacos # On 32-bit MacOSX the OS requires C-entry points to be 16 byte aligned. # While waiting for a better solution, the current workaround is to use -mstackrealign. CFLAGS="$CFLAGS -mstackrealign" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 32-bit compiler supports -mstackrealign" >&5 + { $as_echo "$as_me:$LINENO: checking if 32-bit compiler supports -mstackrealign" >&5 $as_echo_n "checking if 32-bit compiler supports -mstackrealign... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main() { return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } - as_fn_error $? "The selected compiler $CXX does not support -mstackrealign! Try to put another compiler in the path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The selected compiler $CXX does not support -mstackrealign! Try to put another compiler in the path." >&5 +$as_echo "$as_me: error: The selected compiler $CXX does not support -mstackrealign! Try to put another compiler in the path." >&2;} + { (exit 1); exit 1; }; } fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext fi C_FLAG_DEPS="-MMD -MF" @@ -27288,37 +28793,37 @@ fi if test "x$CFLAGS" != "x${ADDED_CFLAGS}"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring CFLAGS($CFLAGS) found in environment. Use --with-extra-cflags" >&5 + { $as_echo "$as_me:$LINENO: WARNING: Ignoring CFLAGS($CFLAGS) found in environment. Use --with-extra-cflags" >&5 $as_echo "$as_me: WARNING: Ignoring CFLAGS($CFLAGS) found in environment. Use --with-extra-cflags" >&2;} fi if test "x$CXXFLAGS" != "x${ADDED_CXXFLAGS}"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring CXXFLAGS($CXXFLAGS) found in environment. Use --with-extra-cxxflags" >&5 + { $as_echo "$as_me:$LINENO: WARNING: Ignoring CXXFLAGS($CXXFLAGS) found in environment. Use --with-extra-cxxflags" >&5 $as_echo "$as_me: WARNING: Ignoring CXXFLAGS($CXXFLAGS) found in environment. Use --with-extra-cxxflags" >&2;} fi if test "x$LDFLAGS" != "x${ADDED_LDFLAGS}"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring LDFLAGS($LDFLAGS) found in environment. Use --with-extra-ldflags" >&5 + { $as_echo "$as_me:$LINENO: WARNING: Ignoring LDFLAGS($LDFLAGS) found in environment. Use --with-extra-ldflags" >&5 $as_echo "$as_me: WARNING: Ignoring LDFLAGS($LDFLAGS) found in environment. Use --with-extra-ldflags" >&2;} fi # Check whether --with-extra-cflags was given. -if test "${with_extra_cflags+set}" = set; then : +if test "${with_extra_cflags+set}" = set; then withval=$with_extra_cflags; fi # Check whether --with-extra-cxxflags was given. -if test "${with_extra_cxxflags+set}" = set; then : +if test "${with_extra_cxxflags+set}" = set; then withval=$with_extra_cxxflags; fi # Check whether --with-extra-ldflags was given. -if test "${with_extra_ldflags+set}" = set; then : +if test "${with_extra_ldflags+set}" = set; then withval=$with_extra_ldflags; fi @@ -27557,18 +29062,20 @@ if test "x$OPENJDK_TARGET_OS" = xmacosx; then fi # Check whether --enable-debug-symbols was given. -if test "${enable_debug_symbols+set}" = set; then : +if test "${enable_debug_symbols+set}" = set; then enableval=$enable_debug_symbols; ENABLE_DEBUG_SYMBOLS=${enable_debug_symbols} fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should generate debug symbols" >&5 +{ $as_echo "$as_me:$LINENO: checking if we should generate debug symbols" >&5 $as_echo_n "checking if we should generate debug symbols... " >&6; } if test "x$ENABLE_DEBUG_SYMBOLS" = "xyes" && test "x$OBJCOPY" = x; then # explicit enabling of enable-debug-symbols and can't find objcopy # this is an error - as_fn_error $? "Unable to find objcopy, cannot enable debug-symbols" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Unable to find objcopy, cannot enable debug-symbols" >&5 +$as_echo "$as_me: error: Unable to find objcopy, cannot enable debug-symbols" >&2;} + { (exit 1); exit 1; }; } fi if test "x$ENABLE_DEBUG_SYMBOLS" = "xdefault"; then @@ -27580,7 +29087,7 @@ if test "x$ENABLE_DEBUG_SYMBOLS" = "xdefault"; then fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ENABLE_DEBUG_SYMBOLS" >&5 +{ $as_echo "$as_me:$LINENO: result: $ENABLE_DEBUG_SYMBOLS" >&5 $as_echo "$ENABLE_DEBUG_SYMBOLS" >&6; } # @@ -27589,14 +29096,14 @@ $as_echo "$ENABLE_DEBUG_SYMBOLS" >&6; } ZIP_DEBUGINFO_FILES=yes # Check whether --enable-zip-debug-info was given. -if test "${enable_zip_debug_info+set}" = set; then : +if test "${enable_zip_debug_info+set}" = set; then enableval=$enable_zip_debug_info; ZIP_DEBUGINFO_FILES=${enable_zip_debug_info} fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should zip debug-info files" >&5 +{ $as_echo "$as_me:$LINENO: checking if we should zip debug-info files" >&5 $as_echo_n "checking if we should zip debug-info files... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP_DEBUGINFO_FILES" >&5 +{ $as_echo "$as_me:$LINENO: result: $ZIP_DEBUGINFO_FILES" >&5 $as_echo "$ZIP_DEBUGINFO_FILES" >&6; } # Hotspot wants ZIP_DEBUGINFO_FILES to be 1 for yes @@ -27626,35 +29133,35 @@ fi # OS specific settings that we never will need to probe. # if test "x$OPENJDK_TARGET_OS" = xlinux; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on Linux?" >&5 + { $as_echo "$as_me:$LINENO: checking what is not needed on Linux?" >&5 $as_echo_n "checking what is not needed on Linux?... " >&6; } PULSE_NOT_NEEDED=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: pulse" >&5 + { $as_echo "$as_me:$LINENO: result: pulse" >&5 $as_echo "pulse" >&6; } fi if test "x$OPENJDK_TARGET_OS" = xsolaris; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on Solaris?" >&5 + { $as_echo "$as_me:$LINENO: checking what is not needed on Solaris?" >&5 $as_echo_n "checking what is not needed on Solaris?... " >&6; } ALSA_NOT_NEEDED=yes PULSE_NOT_NEEDED=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: alsa pulse" >&5 + { $as_echo "$as_me:$LINENO: result: alsa pulse" >&5 $as_echo "alsa pulse" >&6; } fi if test "x$OPENJDK_TARGET_OS" = xwindows; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on Windows?" >&5 + { $as_echo "$as_me:$LINENO: checking what is not needed on Windows?" >&5 $as_echo_n "checking what is not needed on Windows?... " >&6; } CUPS_NOT_NEEDED=yes ALSA_NOT_NEEDED=yes PULSE_NOT_NEEDED=yes X11_NOT_NEEDED=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: alsa cups pulse x11" >&5 + { $as_echo "$as_me:$LINENO: result: alsa cups pulse x11" >&5 $as_echo "alsa cups pulse x11" >&6; } fi if test "x$OPENJDK_TARGET_OS" = xmacosx; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on MacOSX?" >&5 + { $as_echo "$as_me:$LINENO: checking what is not needed on MacOSX?" >&5 $as_echo_n "checking what is not needed on MacOSX?... " >&6; } ALSA_NOT_NEEDED=yes PULSE_NOT_NEEDED=yes @@ -27662,15 +29169,15 @@ $as_echo_n "checking what is not needed on MacOSX?... " >&6; } FREETYPE2_NOT_NEEDED=yes # If the java runtime framework is disabled, then we need X11. # This will be adjusted below. - { $as_echo "$as_me:${as_lineno-$LINENO}: result: alsa pulse x11" >&5 + { $as_echo "$as_me:$LINENO: result: alsa pulse x11" >&5 $as_echo "alsa pulse x11" >&6; } fi if test "x$OPENJDK_TARGET_OS" = xbsd; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on bsd?" >&5 + { $as_echo "$as_me:$LINENO: checking what is not needed on bsd?" >&5 $as_echo_n "checking what is not needed on bsd?... " >&6; } ALSA_NOT_NEEDED=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: alsa" >&5 + { $as_echo "$as_me:$LINENO: result: alsa" >&5 $as_echo "alsa" >&6; } fi @@ -27688,7 +29195,7 @@ fi # that uses this API. # # Check whether --enable-macosx-runtime-support was given. -if test "${enable_macosx_runtime_support+set}" = set; then : +if test "${enable_macosx_runtime_support+set}" = set; then enableval=$enable_macosx_runtime_support; MACOSX_RUNTIME_SUPPORT="${enableval}" else MACOSX_RUNTIME_SUPPORT="no" @@ -27696,29 +29203,29 @@ fi USE_MACOSX_RUNTIME_SUPPORT=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for explicit Java runtime support in the OS" >&5 +{ $as_echo "$as_me:$LINENO: checking for explicit Java runtime support in the OS" >&5 $as_echo_n "checking for explicit Java runtime support in the OS... " >&6; } if test -f /System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Headers/JavaRuntimeSupport.h; then if test "x$MACOSX_RUNTIME_SUPPORT" != xno; then MACOSX_RUNTIME_SUPPORT=yes USE_MACOSX_RUNTIME_SUPPORT=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, does not need alsa freetype2 pulse and X11" >&5 + { $as_echo "$as_me:$LINENO: result: yes, does not need alsa freetype2 pulse and X11" >&5 $as_echo "yes, does not need alsa freetype2 pulse and X11" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, but explicitly disabled." >&5 + { $as_echo "$as_me:$LINENO: result: yes, but explicitly disabled." >&5 $as_echo "yes, but explicitly disabled." >&6; } fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$OPENJDK_TARGET_OS" = xmacosx && test "x$USE_MACOSX_RUNTIME_SUPPORT" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on an X11 build on MacOSX?" >&5 + { $as_echo "$as_me:$LINENO: checking what is not needed on an X11 build on MacOSX?" >&5 $as_echo_n "checking what is not needed on an X11 build on MacOSX?... " >&6; } X11_NOT_NEEDED= FREETYPE2_NOT_NEEDED= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: alsa pulse" >&5 + { $as_echo "$as_me:$LINENO: result: alsa pulse" >&5 $as_echo "alsa pulse" >&6; } fi @@ -27747,12 +29254,12 @@ if test "x$SYS_ROOT" != "x/"; then fi # Now let autoconf do it's magic -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +{ $as_echo "$as_me:$LINENO: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. -if test "${with_x+set}" = set; then : +if test "${with_x+set}" = set; then withval=$with_x; fi @@ -27762,8 +29269,10 @@ if test "x$with_x" = xno; then have_x=disabled else case $x_includes,$x_libraries in #( - *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5 ;; #( - *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then : + *\'*) { { $as_echo "$as_me:$LINENO: error: cannot use X directory names containing '" >&5 +$as_echo "$as_me: error: cannot use X directory names containing '" >&2;} + { (exit 1); exit 1; }; };; #( + *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. @@ -27780,7 +29289,7 @@ libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then - # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done @@ -27811,25 +29320,21 @@ fi # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include -/usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 -/usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include -/usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 -/usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 @@ -27851,14 +29356,37 @@ ac_x_header_dirs=' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then # We can compile using X headers with no special include directory. ac_x_includes= else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir @@ -27866,7 +29394,8 @@ else fi done fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then @@ -27875,7 +29404,11 @@ if test "$ac_x_libraries" = no; then # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int @@ -27886,12 +29419,35 @@ XrmInitialize () return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else - LIBS=$ac_save_LIBS + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! @@ -27903,8 +29459,10 @@ do done done fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( @@ -27925,7 +29483,7 @@ fi fi # $with_x != no if test "$have_x" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 + { $as_echo "$as_me:$LINENO: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else @@ -27936,14 +29494,16 @@ else ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 + { $as_echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. -$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define X_DISPLAY_MISSING 1 +_ACEOF X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else @@ -27956,12 +29516,16 @@ else X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 + { $as_echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -27972,13 +29536,40 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else - LIBS="$ac_xsave_LIBS -R $x_libraries" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -27989,19 +29580,46 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: neither works" >&5 $as_echo "neither works" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext ac_cxx_werror_flag=$ac_xsave_cxx_werror_flag LIBS=$ac_xsave_LIBS fi @@ -28017,7 +29635,11 @@ rm -f core conftest.err conftest.$ac_objext \ # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -28035,17 +29657,44 @@ return XOpenDisplay (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + : else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } -if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then : +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -28063,30 +29712,59 @@ return dnet_ntoa (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_dnet_dnet_ntoa=yes else - ac_cv_lib_dnet_dnet_ntoa=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dnet_dnet_ntoa=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } -if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then : +if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 + { $as_echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } -if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then : +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -28104,25 +29782,52 @@ return dnet_ntoa (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_dnet_stub_dnet_ntoa=yes else - ac_cv_lib_dnet_stub_dnet_ntoa=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dnet_stub_dnet_ntoa=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } -if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then : +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, @@ -28133,20 +29838,105 @@ rm -f core conftest.err conftest.$ac_objext \ # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. - ac_fn_cxx_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" -if test "x$ac_cv_func_gethostbyname" = x""yes; then : + { $as_echo "$as_me:$LINENO: checking for gethostbyname" >&5 +$as_echo_n "checking for gethostbyname... " >&6; } +if test "${ac_cv_func_gethostbyname+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define gethostbyname to an innocuous variant, in case declares gethostbyname. + For example, HP-UX 11i declares gettimeofday. */ +#define gethostbyname innocuous_gethostbyname +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef gethostbyname + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_gethostbyname || defined __stub___gethostbyname +choke me +#endif + +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_gethostbyname=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_gethostbyname=no fi +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 +$as_echo "$ac_cv_func_gethostbyname" >&6; } + if test $ac_cv_func_gethostbyname = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 + { $as_echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } -if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -28164,30 +29954,59 @@ return gethostbyname (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_nsl_gethostbyname=yes else - ac_cv_lib_nsl_gethostbyname=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_nsl_gethostbyname=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } -if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : +if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 + { $as_echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } -if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then : +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -28205,18 +30024,43 @@ return gethostbyname (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_bsd_gethostbyname=yes else - ac_cv_lib_bsd_gethostbyname=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_bsd_gethostbyname=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } -if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then : +if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi @@ -28230,20 +30074,105 @@ fi # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. - ac_fn_cxx_check_func "$LINENO" "connect" "ac_cv_func_connect" -if test "x$ac_cv_func_connect" = x""yes; then : + { $as_echo "$as_me:$LINENO: checking for connect" >&5 +$as_echo_n "checking for connect... " >&6; } +if test "${ac_cv_func_connect+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define connect to an innocuous variant, in case declares connect. + For example, HP-UX 11i declares gettimeofday. */ +#define connect innocuous_connect +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef connect + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_connect || defined __stub___connect +choke me +#endif + +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_connect=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_connect=no fi +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 +$as_echo "$ac_cv_func_connect" >&6; } + if test $ac_cv_func_connect = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 + { $as_echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } -if test "${ac_cv_lib_socket_connect+set}" = set; then : +if test "${ac_cv_lib_socket_connect+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -28261,38 +30190,148 @@ return connect (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_socket_connect=yes else - ac_cv_lib_socket_connect=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_socket_connect=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } -if test "x$ac_cv_lib_socket_connect" = x""yes; then : +if test "x$ac_cv_lib_socket_connect" = x""yes; then X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. - ac_fn_cxx_check_func "$LINENO" "remove" "ac_cv_func_remove" -if test "x$ac_cv_func_remove" = x""yes; then : + { $as_echo "$as_me:$LINENO: checking for remove" >&5 +$as_echo_n "checking for remove... " >&6; } +if test "${ac_cv_func_remove+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define remove to an innocuous variant, in case declares remove. + For example, HP-UX 11i declares gettimeofday. */ +#define remove innocuous_remove +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char remove (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef remove + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char remove (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_remove || defined __stub___remove +choke me +#endif + +int +main () +{ +return remove (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_remove=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_remove=no fi +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 +$as_echo "$ac_cv_func_remove" >&6; } + if test $ac_cv_func_remove = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 + { $as_echo "$as_me:$LINENO: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } -if test "${ac_cv_lib_posix_remove+set}" = set; then : +if test "${ac_cv_lib_posix_remove+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -28310,38 +30349,148 @@ return remove (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_posix_remove=yes else - ac_cv_lib_posix_remove=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_posix_remove=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } -if test "x$ac_cv_lib_posix_remove" = x""yes; then : +if test "x$ac_cv_lib_posix_remove" = x""yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. - ac_fn_cxx_check_func "$LINENO" "shmat" "ac_cv_func_shmat" -if test "x$ac_cv_func_shmat" = x""yes; then : + { $as_echo "$as_me:$LINENO: checking for shmat" >&5 +$as_echo_n "checking for shmat... " >&6; } +if test "${ac_cv_func_shmat+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shmat to an innocuous variant, in case declares shmat. + For example, HP-UX 11i declares gettimeofday. */ +#define shmat innocuous_shmat +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shmat (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shmat + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmat (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_shmat || defined __stub___shmat +choke me +#endif + +int +main () +{ +return shmat (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_shmat=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shmat=no fi +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 +$as_echo "$ac_cv_func_shmat" >&6; } + if test $ac_cv_func_shmat = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 + { $as_echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } -if test "${ac_cv_lib_ipc_shmat+set}" = set; then : +if test "${ac_cv_lib_ipc_shmat+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -28359,18 +30508,43 @@ return shmat (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_ipc_shmat=yes else - ac_cv_lib_ipc_shmat=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_ipc_shmat=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } -if test "x$ac_cv_lib_ipc_shmat" = x""yes; then : +if test "x$ac_cv_lib_ipc_shmat" = x""yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi @@ -28386,14 +30560,18 @@ fi # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 + { $as_echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } -if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then : +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -28411,18 +30589,43 @@ return IceConnectionNumber (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_ICE_IceConnectionNumber=yes else - ac_cv_lib_ICE_IceConnectionNumber=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_ICE_IceConnectionNumber=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } -if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then : +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi @@ -28457,7 +30660,9 @@ if test "x$no_x" = xyes && test "x$X11_NOT_NEEDED" != xyes; then HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - as_fn_error $? "Could not find X11 libraries. $HELP_MSG" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find X11 libraries. $HELP_MSG" >&5 +$as_echo "$as_me: error: Could not find X11 libraries. $HELP_MSG" >&2;} + { (exit 1); exit 1; }; } fi # Some of the old makefiles require a setting of OPENWIN_HOME @@ -28498,14 +30703,64 @@ OLD_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" # Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10 + + + for ac_header in X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " # include +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + # include # include -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -28551,7 +30806,9 @@ if test "x$X11_A_OK" = xno && test "x$X11_NOT_NEEDED" != xyes; then HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - as_fn_error $? "Could not find all X11 headers (shape.h Xrender.h XTest.h). $HELP_MSG" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find all X11 headers (shape.h Xrender.h XTest.h). $HELP_MSG" >&5 +$as_echo "$as_me: error: Could not find all X11 headers (shape.h Xrender.h XTest.h). $HELP_MSG" >&2;} + { (exit 1); exit 1; }; } fi @@ -28565,20 +30822,20 @@ fi # # Check whether --with-cups was given. -if test "${with_cups+set}" = set; then : +if test "${with_cups+set}" = set; then withval=$with_cups; fi # Check whether --with-cups-include was given. -if test "${with_cups_include+set}" = set; then : +if test "${with_cups_include+set}" = set; then withval=$with_cups_include; fi if test "x$CUPS_NOT_NEEDED" = xyes; then if test "x${with_cups}" != x || test "x${with_cups_include}" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cups not used, so --with-cups is ignored" >&5 + { $as_echo "$as_me:$LINENO: WARNING: cups not used, so --with-cups is ignored" >&5 $as_echo "$as_me: WARNING: cups not used, so --with-cups is ignored" >&2;} fi CUPS_CFLAGS= @@ -28586,7 +30843,9 @@ else CUPS_FOUND=no if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno; then - as_fn_error $? "It is not possible to disable the use of cups. Remove the --without-cups option." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: It is not possible to disable the use of cups. Remove the --without-cups option." >&5 +$as_echo "$as_me: error: It is not possible to disable the use of cups. Remove the --without-cups option." >&2;} + { (exit 1); exit 1; }; } fi if test "x${with_cups}" != x; then @@ -28619,7 +30878,7 @@ else resource=${builddep_cups} fi if test "x$resource" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Using builddeps $resource for cups" >&5 + { $as_echo "$as_me:$LINENO: Using builddeps $resource for cups" >&5 $as_echo "$as_me: Using builddeps $resource for cups" >&6;} # If the resource in the builddeps.conf file is an existing directory, # for example /java/linux/cups @@ -28640,18 +30899,22 @@ $as_echo "$as_me: Using builddeps $resource for cups" >&6;} extension=${filename#*.} installdir=$with_builddeps_dir/$filebase if test ! -f $installdir/$filename.unpacked; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Downloading build dependency cups from $with_builddeps_server/$resource and installing into $installdir" >&5 + { $as_echo "$as_me:$LINENO: Downloading build dependency cups from $with_builddeps_server/$resource and installing into $installdir" >&5 $as_echo "$as_me: Downloading build dependency cups from $with_builddeps_server/$resource and installing into $installdir" >&6;} if test ! -d $installdir; then mkdir -p $installdir fi if test ! -d $installdir; then - as_fn_error $? "Could not create directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create directory $installdir" >&5 +$as_echo "$as_me: error: Could not create directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi tmpfile=`mktemp $installdir/cups.XXXXXXXXX` touch $tmpfile if test ! -f $tmpfile; then - as_fn_error $? "Could not create files in directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create files in directory $installdir" >&5 +$as_echo "$as_me: error: Could not create files in directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi # $with_builddeps_server/$resource is the ftp://abuilddeps.server.com/libs/cups.zip @@ -28689,12 +30952,16 @@ $as_echo "$as_me: Downloading build dependency cups from $with_builddeps_server/ ) | ftp -in $FTPSERVER fi if test "x$VALID_TOOL" != xyes; then - as_fn_error $? "I do not know how to use the tool: $BDEPS_FTP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: I do not know how to use the tool: $BDEPS_FTP" >&5 +$as_echo "$as_me: error: I do not know how to use the tool: $BDEPS_FTP" >&2;} + { (exit 1); exit 1; }; } fi mv $tmpfile $installdir/$filename if test ! -s $installdir/$filename; then - as_fn_error $? "Could not download $with_builddeps_server/$resource" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download $with_builddeps_server/$resource" >&5 +$as_echo "$as_me: error: Could not download $with_builddeps_server/$resource" >&2;} + { (exit 1); exit 1; }; } fi case "$extension" in zip) echo "Unzipping $installdir/$filename..." @@ -28706,7 +30973,9 @@ $as_echo "$as_me: Downloading build dependency cups from $with_builddeps_server/ tgz) echo "Untaring $installdir/$filename..." (cd $installdir ; rm -f $installdir/$filename.unpacked ; tar xzf $installdir/$filename && touch $installdir/$filename.unpacked) ;; - *) as_fn_error $? "Cannot handle build depency archive with extension $extension" "$LINENO" 5 + *) { { $as_echo "$as_me:$LINENO: error: Cannot handle build depency archive with extension $extension" >&5 +$as_echo "$as_me: error: Cannot handle build depency archive with extension $extension" >&2;} + { (exit 1); exit 1; }; } ;; esac fi @@ -28723,7 +30992,9 @@ $as_echo "$as_me: Downloading build dependency cups from $with_builddeps_server/ thecflags=${builddep_cups_CFLAGS} thelibs=${builddep_cups_LIBS} if test "x$depdir" = x; then - as_fn_error $? "Could not download build dependency cups" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download build dependency cups" >&5 +$as_echo "$as_me: error: Could not download build dependency cups" >&2;} + { (exit 1); exit 1; }; } fi CUPS=$depdir if test "x$theroot" != x; then @@ -28744,11 +31015,150 @@ $as_echo "$as_me: Downloading build dependency cups from $with_builddeps_server/ fi if test "x$CUPS_FOUND" = xno; then # Are the cups headers installed in the default /usr/include location? - for ac_header in cups/cups.h cups/ppd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + + +for ac_header in cups/cups.h cups/ppd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ----------------------------------------- ## +## Report this to build-dev@openjdk.java.net ## +## ----------------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -28763,7 +31173,7 @@ done if test "x$CUPS_FOUND" = xno; then # Getting nervous now? Lets poke around for standard Solaris third-party # package installation locations. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cups headers" >&5 + { $as_echo "$as_me:$LINENO: checking for cups headers" >&5 $as_echo_n "checking for cups headers... " >&6; } if test -s /opt/sfw/cups/include/cups/cups.h; then # An SFW package seems to be installed! @@ -28774,7 +31184,7 @@ $as_echo_n "checking for cups headers... " >&6; } CUPS_FOUND=yes CUPS_CFLAGS="-I/opt/csw/include" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_FOUND" >&5 + { $as_echo "$as_me:$LINENO: result: $CUPS_FOUND" >&5 $as_echo "$CUPS_FOUND" >&6; } fi if test "x$CUPS_FOUND" = xno; then @@ -28803,7 +31213,9 @@ $as_echo "$CUPS_FOUND" >&6; } HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - as_fn_error $? "Could not find cups! $HELP_MSG " "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find cups! $HELP_MSG " >&5 +$as_echo "$as_me: error: Could not find cups! $HELP_MSG " >&2;} + { (exit 1); exit 1; }; } fi fi @@ -28818,7 +31230,7 @@ fi # # Check whether --with-freetype was given. -if test "${with_freetype+set}" = set; then : +if test "${with_freetype+set}" = set; then withval=$with_freetype; fi @@ -28828,7 +31240,7 @@ USING_SYSTEM_FT_LIB=false if test "x$FREETYPE2_NOT_NEEDED" = xyes; then if test "x$with_freetype" != x || test "x$with_freetype_include" != x || test "x$with_freetype_lib" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: freetype not used, so --with-freetype is ignored" >&5 + { $as_echo "$as_me:$LINENO: WARNING: freetype not used, so --with-freetype is ignored" >&5 $as_echo "$as_me: WARNING: freetype not used, so --with-freetype is ignored" >&2;} fi FREETYPE2_CFLAGS= @@ -28855,9 +31267,11 @@ else # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of with_freetype, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of with_freetype, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of with_freetype, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of with_freetype" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of with_freetype" >&5 +$as_echo "$as_me: error: Cannot locate the the path of with_freetype" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -28896,7 +31310,7 @@ $as_echo "$as_me: The path of with_freetype, which resolves as \"$path\", is inv if test "x$path" != "x$new_path"; then with_freetype="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting with_freetype to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting with_freetype to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting with_freetype to \"$new_path\"" >&6;} fi @@ -28934,7 +31348,7 @@ $as_echo "$as_me: Rewriting with_freetype to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then with_freetype="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting with_freetype to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting with_freetype to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting with_freetype to \"$new_path\"" >&6;} fi @@ -28946,14 +31360,18 @@ $as_echo "$as_me: Rewriting with_freetype to \"$new_path\"" >&6;} path="$with_freetype" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of with_freetype, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of with_freetype, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of with_freetype, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of with_freetype, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of with_freetype, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of with_freetype, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi @@ -28974,16 +31392,22 @@ $as_echo "$as_me: The path of with_freetype, which resolves as \"$path\", is inv if test "x$FREETYPE2_FOUND" = xyes; then # Verify that the directories exist if ! test -d "$with_freetype/lib" || ! test -d "$with_freetype/include"; then - as_fn_error $? "Could not find the expected directories $with_freetype/lib and $with_freetype/include" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find the expected directories $with_freetype/lib and $with_freetype/include" >&5 +$as_echo "$as_me: error: Could not find the expected directories $with_freetype/lib and $with_freetype/include" >&2;} + { (exit 1); exit 1; }; } fi # List the contents of the lib. FREETYPELIB=`ls $with_freetype/lib/libfreetype.so $with_freetype/lib/freetype.dll 2> /dev/null` if test "x$FREETYPELIB" = x; then - as_fn_error $? "Could not find libfreetype.so nor freetype.dll in $with_freetype/lib" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find libfreetype.so nor freetype.dll in $with_freetype/lib" >&5 +$as_echo "$as_me: error: Could not find libfreetype.so nor freetype.dll in $with_freetype/lib" >&2;} + { (exit 1); exit 1; }; } fi # Check one h-file if ! test -s "$with_freetype/include/ft2build.h"; then - as_fn_error $? "Could not find $with_freetype/include/ft2build.h" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find $with_freetype/include/ft2build.h" >&5 +$as_echo "$as_me: error: Could not find $with_freetype/include/ft2build.h" >&2;} + { (exit 1); exit 1; }; } fi fi fi @@ -29009,7 +31433,7 @@ $as_echo "$as_me: The path of with_freetype, which resolves as \"$path\", is inv resource=${builddep_freetype2} fi if test "x$resource" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Using builddeps $resource for freetype2" >&5 + { $as_echo "$as_me:$LINENO: Using builddeps $resource for freetype2" >&5 $as_echo "$as_me: Using builddeps $resource for freetype2" >&6;} # If the resource in the builddeps.conf file is an existing directory, # for example /java/linux/cups @@ -29030,18 +31454,22 @@ $as_echo "$as_me: Using builddeps $resource for freetype2" >&6;} extension=${filename#*.} installdir=$with_builddeps_dir/$filebase if test ! -f $installdir/$filename.unpacked; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Downloading build dependency freetype2 from $with_builddeps_server/$resource and installing into $installdir" >&5 + { $as_echo "$as_me:$LINENO: Downloading build dependency freetype2 from $with_builddeps_server/$resource and installing into $installdir" >&5 $as_echo "$as_me: Downloading build dependency freetype2 from $with_builddeps_server/$resource and installing into $installdir" >&6;} if test ! -d $installdir; then mkdir -p $installdir fi if test ! -d $installdir; then - as_fn_error $? "Could not create directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create directory $installdir" >&5 +$as_echo "$as_me: error: Could not create directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi tmpfile=`mktemp $installdir/freetype2.XXXXXXXXX` touch $tmpfile if test ! -f $tmpfile; then - as_fn_error $? "Could not create files in directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create files in directory $installdir" >&5 +$as_echo "$as_me: error: Could not create files in directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi # $with_builddeps_server/$resource is the ftp://abuilddeps.server.com/libs/cups.zip @@ -29079,12 +31507,16 @@ $as_echo "$as_me: Downloading build dependency freetype2 from $with_builddeps_se ) | ftp -in $FTPSERVER fi if test "x$VALID_TOOL" != xyes; then - as_fn_error $? "I do not know how to use the tool: $BDEPS_FTP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: I do not know how to use the tool: $BDEPS_FTP" >&5 +$as_echo "$as_me: error: I do not know how to use the tool: $BDEPS_FTP" >&2;} + { (exit 1); exit 1; }; } fi mv $tmpfile $installdir/$filename if test ! -s $installdir/$filename; then - as_fn_error $? "Could not download $with_builddeps_server/$resource" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download $with_builddeps_server/$resource" >&5 +$as_echo "$as_me: error: Could not download $with_builddeps_server/$resource" >&2;} + { (exit 1); exit 1; }; } fi case "$extension" in zip) echo "Unzipping $installdir/$filename..." @@ -29096,7 +31528,9 @@ $as_echo "$as_me: Downloading build dependency freetype2 from $with_builddeps_se tgz) echo "Untaring $installdir/$filename..." (cd $installdir ; rm -f $installdir/$filename.unpacked ; tar xzf $installdir/$filename && touch $installdir/$filename.unpacked) ;; - *) as_fn_error $? "Cannot handle build depency archive with extension $extension" "$LINENO" 5 + *) { { $as_echo "$as_me:$LINENO: error: Cannot handle build depency archive with extension $extension" >&5 +$as_echo "$as_me: error: Cannot handle build depency archive with extension $extension" >&2;} + { (exit 1); exit 1; }; } ;; esac fi @@ -29113,7 +31547,9 @@ $as_echo "$as_me: Downloading build dependency freetype2 from $with_builddeps_se thecflags=${builddep_freetype2_CFLAGS} thelibs=${builddep_freetype2_LIBS} if test "x$depdir" = x; then - as_fn_error $? "Could not download build dependency freetype2" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download build dependency freetype2" >&5 +$as_echo "$as_me: error: Could not download build dependency freetype2" >&2;} + { (exit 1); exit 1; }; } fi FREETYPE2=$depdir if test "x$theroot" != x; then @@ -29154,9 +31590,11 @@ $as_echo "$as_me: Downloading build dependency freetype2 from $with_builddeps_se # It is also a way to make sure we got the proper file name for the real test later on. test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of FREETYPELOCATION" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Cannot locate the the path of FREETYPELOCATION" >&5 +$as_echo "$as_me: error: Cannot locate the the path of FREETYPELOCATION" >&2;} + { (exit 1); exit 1; }; } fi # Call helper function which possibly converts this using DOS-style short mode. @@ -29195,7 +31633,7 @@ $as_echo "$as_me: The path of FREETYPELOCATION, which resolves as \"$path\", is if test "x$path" != "x$new_path"; then FREETYPELOCATION="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FREETYPELOCATION to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting FREETYPELOCATION to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting FREETYPELOCATION to \"$new_path\"" >&6;} fi @@ -29233,7 +31671,7 @@ $as_echo "$as_me: Rewriting FREETYPELOCATION to \"$new_path\"" >&6;} if test "x$path" != "x$new_path"; then FREETYPELOCATION="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FREETYPELOCATION to \"$new_path\"" >&5 + { $as_echo "$as_me:$LINENO: Rewriting FREETYPELOCATION to \"$new_path\"" >&5 $as_echo "$as_me: Rewriting FREETYPELOCATION to \"$new_path\"" >&6;} fi @@ -29245,50 +31683,58 @@ $as_echo "$as_me: Rewriting FREETYPELOCATION to \"$new_path\"" >&6;} path="$FREETYPELOCATION" if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of FREETYPELOCATION, which resolves as \"$path\", is not found." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: The path of FREETYPELOCATION, which resolves as \"$path\", is not found." >&5 +$as_echo "$as_me: error: The path of FREETYPELOCATION, which resolves as \"$path\", is not found." >&2;} + { (exit 1); exit 1; }; } fi has_space=`$ECHO "$path" | $GREP " "` if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&5 + { $as_echo "$as_me:$LINENO: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&5 $as_echo "$as_me: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Spaces are not allowed in this path." >&5 +$as_echo "$as_me: error: Spaces are not allowed in this path." >&2;} + { (exit 1); exit 1; }; } fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype in some standard windows locations" >&5 + { $as_echo "$as_me:$LINENO: checking for freetype in some standard windows locations" >&5 $as_echo_n "checking for freetype in some standard windows locations... " >&6; } if test -s "$FREETYPELOCATION/include/ft2build.h" && test -d "$FREETYPELOCATION/include/freetype2/freetype"; then FREETYPE2_CFLAGS="-I$FREETYPELOCATION/include/freetype2 -I$FREETYPELOCATION/include" FREETYPE2_LIBS="$FREETYPELOCATION/lib/freetype.lib" FREETYPE2_LIB_PATH="$FREETYPELOCATION/lib" if ! test -s "$FREETYPE2_LIBS"; then - as_fn_error $? "Could not find $FREETYPE2_LIBS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find $FREETYPE2_LIBS" >&5 +$as_echo "$as_me: error: Could not find $FREETYPE2_LIBS" >&2;} + { (exit 1); exit 1; }; } fi if ! test -s "$FREETYPE2_LIB_PATH/freetype.dll"; then - as_fn_error $? "Could not find $FREETYPE2_LIB_PATH/freetype.dll" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find $FREETYPE2_LIB_PATH/freetype.dll" >&5 +$as_echo "$as_me: error: Could not find $FREETYPE2_LIB_PATH/freetype.dll" >&2;} + { (exit 1); exit 1; }; } fi USING_SYSTEM_FT_LIB=true FREETYPE2_FOUND=yes fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE2_FOUND" >&5 + { $as_echo "$as_me:$LINENO: result: $FREETYPE2_FOUND" >&5 $as_echo "$FREETYPE2_FOUND" >&6; } fi if test "x$FREETYPE2_FOUND" = xno; then pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE2" >&5 +{ $as_echo "$as_me:$LINENO: checking for FREETYPE2" >&5 $as_echo_n "checking for FREETYPE2... " >&6; } if test -n "$FREETYPE2_CFLAGS"; then pkg_cv_FREETYPE2_CFLAGS="$FREETYPE2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 + { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"freetype2\"") >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then pkg_cv_FREETYPE2_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null` else pkg_failed=yes @@ -29300,11 +31746,11 @@ if test -n "$FREETYPE2_LIBS"; then pkg_cv_FREETYPE2_LIBS="$FREETYPE2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 + { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"freetype2\"") >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then pkg_cv_FREETYPE2_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null` else pkg_failed=yes @@ -29330,7 +31776,7 @@ fi # Put the nasty error message in config.log where it belongs echo "$FREETYPE2_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } FREETYPE2_FOUND=no elif test $pkg_failed = untried; then @@ -29338,7 +31784,7 @@ elif test $pkg_failed = untried; then else FREETYPE2_CFLAGS=$pkg_cv_FREETYPE2_CFLAGS FREETYPE2_LIBS=$pkg_cv_FREETYPE2_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } FREETYPE2_FOUND=yes fi @@ -29351,7 +31797,7 @@ fi fi fi if test "x$FREETYPE2_FOUND" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype in some standard locations" >&5 + { $as_echo "$as_me:$LINENO: checking for freetype in some standard locations" >&5 $as_echo_n "checking for freetype in some standard locations... " >&6; } if test -s /usr/X11/include/ft2build.h && test -d /usr/X11/include/freetype2/freetype; then @@ -29367,14 +31813,38 @@ $as_echo_n "checking for freetype in some standard locations... " >&6; } PREV_LDFLAGS="$LDFLAGS" CXXFLAGS="$CXXFLAGS $DEFAULT_FREETYPE_CFLAGS" LDFLAGS="$LDFLAGS $DEFAULT_FREETYPE_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include FT_FREETYPE_H int main() { return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then # Yes, the default cflags and libs did the trick. FREETYPE2_FOUND=yes @@ -29382,15 +31852,20 @@ if ac_fn_cxx_try_link "$LINENO"; then : FREETYPE2_LIBS="$DEFAULT_FREETYPE_LIBS" else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + FREETYPE2_FOUND=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext CXXCFLAGS="$PREV_CXXFLAGS" LDFLAGS="$PREV_LDFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE2_FOUND" >&5 + { $as_echo "$as_me:$LINENO: result: $FREETYPE2_FOUND" >&5 $as_echo "$FREETYPE2_FOUND" >&6; } USING_SYSTEM_FT_LIB=true fi @@ -29420,21 +31895,27 @@ $as_echo "$FREETYPE2_FOUND" >&6; } HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - as_fn_error $? "Could not find freetype2! $HELP_MSG " "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find freetype2! $HELP_MSG " >&5 +$as_echo "$as_me: error: Could not find freetype2! $HELP_MSG " >&2;} + { (exit 1); exit 1; }; } fi if test "x$OPENJDK_TARGET_OS" != xwindows; then # AC_CHECK_LIB does not support use of cl.exe PREV_LDFLAGS="$LDFLAGS" LDFLAGS="$FREETYPE2_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT_Init_FreeType in -lfreetype" >&5 + { $as_echo "$as_me:$LINENO: checking for FT_Init_FreeType in -lfreetype" >&5 $as_echo_n "checking for FT_Init_FreeType in -lfreetype... " >&6; } -if test "${ac_cv_lib_freetype_FT_Init_FreeType+set}" = set; then : +if test "${ac_cv_lib_freetype_FT_Init_FreeType+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreetype $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -29452,21 +31933,48 @@ return FT_Init_FreeType (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_freetype_FT_Init_FreeType=yes else - ac_cv_lib_freetype_FT_Init_FreeType=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_freetype_FT_Init_FreeType=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freetype_FT_Init_FreeType" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_FT_Init_FreeType" >&5 $as_echo "$ac_cv_lib_freetype_FT_Init_FreeType" >&6; } -if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = x""yes; then : +if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = x""yes; then FREETYPE2_FOUND=true else - as_fn_error $? "Could not find freetype2! $HELP_MSG " "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find freetype2! $HELP_MSG " >&5 +$as_echo "$as_me: error: Could not find freetype2! $HELP_MSG " >&2;} + { (exit 1); exit 1; }; } fi LDFLAGS="$PREV_LDFLAGS" @@ -29487,26 +31995,26 @@ fi # # Check whether --with-alsa was given. -if test "${with_alsa+set}" = set; then : +if test "${with_alsa+set}" = set; then withval=$with_alsa; fi # Check whether --with-alsa-include was given. -if test "${with_alsa_include+set}" = set; then : +if test "${with_alsa_include+set}" = set; then withval=$with_alsa_include; fi # Check whether --with-alsa-lib was given. -if test "${with_alsa_lib+set}" = set; then : +if test "${with_alsa_lib+set}" = set; then withval=$with_alsa_lib; fi if test "x$ALSA_NOT_NEEDED" = xyes; then if test "x${with_alsa}" != x || test "x${with_alsa_include}" != x || test "x${with_alsa_lib}" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: alsa not used, so --with-alsa is ignored" >&5 + { $as_echo "$as_me:$LINENO: WARNING: alsa not used, so --with-alsa is ignored" >&5 $as_echo "$as_me: WARNING: alsa not used, so --with-alsa is ignored" >&2;} fi ALSA_CFLAGS= @@ -29515,7 +32023,9 @@ else ALSA_FOUND=no if test "x${with_alsa}" = xno || test "x${with_alsa_include}" = xno || test "x${with_alsa_lib}" = xno; then - as_fn_error $? "It is not possible to disable the use of alsa. Remove the --without-alsa option." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: It is not possible to disable the use of alsa. Remove the --without-alsa option." >&5 +$as_echo "$as_me: error: It is not possible to disable the use of alsa. Remove the --without-alsa option." >&2;} + { (exit 1); exit 1; }; } fi if test "x${with_alsa}" != x; then @@ -29553,7 +32063,7 @@ else resource=${builddep_alsa} fi if test "x$resource" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Using builddeps $resource for alsa" >&5 + { $as_echo "$as_me:$LINENO: Using builddeps $resource for alsa" >&5 $as_echo "$as_me: Using builddeps $resource for alsa" >&6;} # If the resource in the builddeps.conf file is an existing directory, # for example /java/linux/cups @@ -29574,18 +32084,22 @@ $as_echo "$as_me: Using builddeps $resource for alsa" >&6;} extension=${filename#*.} installdir=$with_builddeps_dir/$filebase if test ! -f $installdir/$filename.unpacked; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Downloading build dependency alsa from $with_builddeps_server/$resource and installing into $installdir" >&5 + { $as_echo "$as_me:$LINENO: Downloading build dependency alsa from $with_builddeps_server/$resource and installing into $installdir" >&5 $as_echo "$as_me: Downloading build dependency alsa from $with_builddeps_server/$resource and installing into $installdir" >&6;} if test ! -d $installdir; then mkdir -p $installdir fi if test ! -d $installdir; then - as_fn_error $? "Could not create directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create directory $installdir" >&5 +$as_echo "$as_me: error: Could not create directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi tmpfile=`mktemp $installdir/alsa.XXXXXXXXX` touch $tmpfile if test ! -f $tmpfile; then - as_fn_error $? "Could not create files in directory $installdir" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create files in directory $installdir" >&5 +$as_echo "$as_me: error: Could not create files in directory $installdir" >&2;} + { (exit 1); exit 1; }; } fi # $with_builddeps_server/$resource is the ftp://abuilddeps.server.com/libs/cups.zip @@ -29623,12 +32137,16 @@ $as_echo "$as_me: Downloading build dependency alsa from $with_builddeps_server/ ) | ftp -in $FTPSERVER fi if test "x$VALID_TOOL" != xyes; then - as_fn_error $? "I do not know how to use the tool: $BDEPS_FTP" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: I do not know how to use the tool: $BDEPS_FTP" >&5 +$as_echo "$as_me: error: I do not know how to use the tool: $BDEPS_FTP" >&2;} + { (exit 1); exit 1; }; } fi mv $tmpfile $installdir/$filename if test ! -s $installdir/$filename; then - as_fn_error $? "Could not download $with_builddeps_server/$resource" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download $with_builddeps_server/$resource" >&5 +$as_echo "$as_me: error: Could not download $with_builddeps_server/$resource" >&2;} + { (exit 1); exit 1; }; } fi case "$extension" in zip) echo "Unzipping $installdir/$filename..." @@ -29640,7 +32158,9 @@ $as_echo "$as_me: Downloading build dependency alsa from $with_builddeps_server/ tgz) echo "Untaring $installdir/$filename..." (cd $installdir ; rm -f $installdir/$filename.unpacked ; tar xzf $installdir/$filename && touch $installdir/$filename.unpacked) ;; - *) as_fn_error $? "Cannot handle build depency archive with extension $extension" "$LINENO" 5 + *) { { $as_echo "$as_me:$LINENO: error: Cannot handle build depency archive with extension $extension" >&5 +$as_echo "$as_me: error: Cannot handle build depency archive with extension $extension" >&2;} + { (exit 1); exit 1; }; } ;; esac fi @@ -29657,7 +32177,9 @@ $as_echo "$as_me: Downloading build dependency alsa from $with_builddeps_server/ thecflags=${builddep_alsa_CFLAGS} thelibs=${builddep_alsa_LIBS} if test "x$depdir" = x; then - as_fn_error $? "Could not download build dependency alsa" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not download build dependency alsa" >&5 +$as_echo "$as_me: error: Could not download build dependency alsa" >&2;} + { (exit 1); exit 1; }; } fi ALSA=$depdir if test "x$theroot" != x; then @@ -29681,18 +32203,18 @@ $as_echo "$as_me: Downloading build dependency alsa from $with_builddeps_server/ if test "x$ALSA_FOUND" = xno; then pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA" >&5 +{ $as_echo "$as_me:$LINENO: checking for ALSA" >&5 $as_echo_n "checking for ALSA... " >&6; } if test -n "$ALSA_CFLAGS"; then pkg_cv_ALSA_CFLAGS="$ALSA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa\""; } >&5 + { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"alsa\"") >&5 ($PKG_CONFIG --exists --print-errors "alsa") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then pkg_cv_ALSA_CFLAGS=`$PKG_CONFIG --cflags "alsa" 2>/dev/null` else pkg_failed=yes @@ -29704,11 +32226,11 @@ if test -n "$ALSA_LIBS"; then pkg_cv_ALSA_LIBS="$ALSA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa\""; } >&5 + { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"alsa\"") >&5 ($PKG_CONFIG --exists --print-errors "alsa") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then pkg_cv_ALSA_LIBS=`$PKG_CONFIG --libs "alsa" 2>/dev/null` else pkg_failed=yes @@ -29734,7 +32256,7 @@ fi # Put the nasty error message in config.log where it belongs echo "$ALSA_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } ALSA_FOUND=no elif test $pkg_failed = untried; then @@ -29742,18 +32264,157 @@ elif test $pkg_failed = untried; then else ALSA_CFLAGS=$pkg_cv_ALSA_CFLAGS ALSA_LIBS=$pkg_cv_ALSA_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } ALSA_FOUND=yes fi fi if test "x$ALSA_FOUND" = xno; then - for ac_header in alsa/asoundlib.h -do : - ac_fn_cxx_check_header_mongrel "$LINENO" "alsa/asoundlib.h" "ac_cv_header_alsa_asoundlib_h" "$ac_includes_default" -if test "x$ac_cv_header_alsa_asoundlib_h" = x""yes; then : + +for ac_header in alsa/asoundlib.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ----------------------------------------- ## +## Report this to build-dev@openjdk.java.net ## +## ----------------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_ALSA_ASOUNDLIB_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF ALSA_FOUND=yes ALSA_CFLAGS=-Iignoreme @@ -29792,7 +32453,9 @@ done HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - as_fn_error $? "Could not find alsa! $HELP_MSG " "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not find alsa! $HELP_MSG " >&5 +$as_echo "$as_me: error: Could not find alsa! $HELP_MSG " >&2;} + { (exit 1); exit 1; }; } fi fi @@ -29808,14 +32471,19 @@ fi # USE_EXTERNAL_LIBJPEG=true -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ljpeg" >&5 + +{ $as_echo "$as_me:$LINENO: checking for main in -ljpeg" >&5 $as_echo_n "checking for main in -ljpeg... " >&6; } -if test "${ac_cv_lib_jpeg_main+set}" = set; then : +if test "${ac_cv_lib_jpeg_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ @@ -29827,18 +32495,43 @@ return main (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_jpeg_main=yes else - ac_cv_lib_jpeg_main=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_jpeg_main=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_main" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_jpeg_main" >&5 $as_echo "$ac_cv_lib_jpeg_main" >&6; } -if test "x$ac_cv_lib_jpeg_main" = x""yes; then : +if test "x$ac_cv_lib_jpeg_main" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBJPEG 1 _ACEOF @@ -29847,7 +32540,7 @@ _ACEOF else USE_EXTERNAL_LIBJPEG=false - { $as_echo "$as_me:${as_lineno-$LINENO}: Will use jpeg decoder bundled with the OpenJDK source" >&5 + { $as_echo "$as_me:$LINENO: Will use jpeg decoder bundled with the OpenJDK source" >&5 $as_echo "$as_me: Will use jpeg decoder bundled with the OpenJDK source" >&6;} fi @@ -29860,14 +32553,19 @@ fi # USE_EXTERNAL_LIBJPEG=true -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lgif" >&5 + +{ $as_echo "$as_me:$LINENO: checking for main in -lgif" >&5 $as_echo_n "checking for main in -lgif... " >&6; } -if test "${ac_cv_lib_gif_main+set}" = set; then : +if test "${ac_cv_lib_gif_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgif $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ @@ -29879,18 +32577,43 @@ return main (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_gif_main=yes else - ac_cv_lib_gif_main=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_gif_main=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gif_main" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gif_main" >&5 $as_echo "$ac_cv_lib_gif_main" >&6; } -if test "x$ac_cv_lib_gif_main" = x""yes; then : +if test "x$ac_cv_lib_gif_main" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGIF 1 _ACEOF @@ -29899,7 +32622,7 @@ _ACEOF else USE_EXTERNAL_LIBGIF=false - { $as_echo "$as_me:${as_lineno-$LINENO}: Will use gif decoder bundled with the OpenJDK source" >&5 + { $as_echo "$as_me:$LINENO: Will use gif decoder bundled with the OpenJDK source" >&5 $as_echo "$as_me: Will use gif decoder bundled with the OpenJDK source" >&6;} fi @@ -29913,19 +32636,23 @@ fi # Check whether --with-zlib was given. -if test "${with_zlib+set}" = set; then : +if test "${with_zlib+set}" = set; then withval=$with_zlib; fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compress in -lz" >&5 +{ $as_echo "$as_me:$LINENO: checking for compress in -lz" >&5 $as_echo_n "checking for compress in -lz... " >&6; } -if test "${ac_cv_lib_z_compress+set}" = set; then : +if test "${ac_cv_lib_z_compress+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -29943,25 +32670,50 @@ return compress (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_z_compress=yes else - ac_cv_lib_z_compress=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_z_compress=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_z_compress" >&5 $as_echo "$ac_cv_lib_z_compress" >&6; } -if test "x$ac_cv_lib_z_compress" = x""yes; then : +if test "x$ac_cv_lib_z_compress" = x""yes; then ZLIB_FOUND=yes else ZLIB_FOUND=no fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for which zlib to use" >&5 +{ $as_echo "$as_me:$LINENO: checking for which zlib to use" >&5 $as_echo_n "checking for which zlib to use... " >&6; } DEFAULT_ZLIB=bundled @@ -29988,20 +32740,24 @@ fi if test "x${with_zlib}" = "xbundled"; then USE_EXTERNAL_LIBZ=false - { $as_echo "$as_me:${as_lineno-$LINENO}: result: bundled" >&5 + { $as_echo "$as_me:$LINENO: result: bundled" >&5 $as_echo "bundled" >&6; } elif test "x${with_zlib}" = "xsystem"; then if test "x${ZLIB_FOUND}" = "xyes"; then USE_EXTERNAL_LIBZ=true - { $as_echo "$as_me:${as_lineno-$LINENO}: result: system" >&5 + { $as_echo "$as_me:$LINENO: result: system" >&5 $as_echo "system" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: system not found" >&5 + { $as_echo "$as_me:$LINENO: result: system not found" >&5 $as_echo "system not found" >&6; } - as_fn_error $? "--with-zlib=system specified, but no zlib found!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: --with-zlib=system specified, but no zlib found!" >&5 +$as_echo "$as_me: error: --with-zlib=system specified, but no zlib found!" >&2;} + { (exit 1); exit 1; }; } fi else - as_fn_error $? "Invalid value for --with-zlib: ${with_zlib}, use 'system' or 'bundled'" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Invalid value for --with-zlib: ${with_zlib}, use 'system' or 'bundled'" >&5 +$as_echo "$as_me: error: Invalid value for --with-zlib: ${with_zlib}, use 'system' or 'bundled'" >&2;} + { (exit 1); exit 1; }; } fi @@ -30016,7 +32772,11 @@ LIBZIP_CAN_USE_MMAP=true # Check if altzone exists in time.h # -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int @@ -30027,16 +32787,43 @@ return (int)altzone; return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then has_altzone=yes else - has_altzone=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + has_altzone=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext if test "x$has_altzone" = xyes; then -$as_echo "#define HAVE_ALTZONE 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALTZONE 1 +_ACEOF fi @@ -30045,14 +32832,19 @@ fi # Check the maths library # -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 + +{ $as_echo "$as_me:$LINENO: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } -if test "${ac_cv_lib_m_cos+set}" = set; then : +if test "${ac_cv_lib_m_cos+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -30070,18 +32862,43 @@ return cos (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_m_cos=yes else - ac_cv_lib_m_cos=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_m_cos=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } -if test "x$ac_cv_lib_m_cos" = x""yes; then : +if test "x$ac_cv_lib_m_cos" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF @@ -30090,7 +32907,7 @@ _ACEOF else - { $as_echo "$as_me:${as_lineno-$LINENO}: Maths library was not found" >&5 + { $as_echo "$as_me:$LINENO: Maths library was not found" >&5 $as_echo "$as_me: Maths library was not found" >&6;} fi @@ -30103,14 +32920,19 @@ fi save_LIBS="$LIBS" LIBS="" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 + +{ $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then : +if test "${ac_cv_lib_dl_dlopen+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -30128,18 +32950,43 @@ return dlopen (); return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_lib_dl_dlopen=yes else - ac_cv_lib_dl_dlopen=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF @@ -30160,8 +33007,8 @@ LIBS="$save_LIBS" # dynamic build is configured on command line. # # Check whether --enable-static-link-stdc++ was given. -if test "${enable_static_link_stdc__+set}" = set; then : - enableval=$enable_static_link_stdc__; +if test "${enable_static_link_stdc+++set}" = set; then + enableval=$enable_static_link_stdc++; else enable_static_link_stdc__=yes @@ -30171,7 +33018,7 @@ fi if test "x$OPENJDK_TARGET_OS" = xlinux; then # Test if -lstdc++ works. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if dynamic link of stdc++ is possible" >&5 + { $as_echo "$as_me:$LINENO: checking if dynamic link of stdc++ is possible" >&5 $as_echo_n "checking if dynamic link of stdc++ is possible... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' @@ -30181,7 +33028,11 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu OLD_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -lstdc++" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -30192,13 +33043,38 @@ return 0; return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then has_dynamic_libstdcxx=yes else - has_dynamic_libstdcxx=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + has_dynamic_libstdcxx=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext CXXFLAGS="$OLD_CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' @@ -30206,11 +33082,11 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_dynamic_libstdcxx" >&5 + { $as_echo "$as_me:$LINENO: result: $has_dynamic_libstdcxx" >&5 $as_echo "$has_dynamic_libstdcxx" >&6; } # Test if stdc++ can be linked statically. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if static link of stdc++ is possible" >&5 + { $as_echo "$as_me:$LINENO: checking if static link of stdc++ is possible" >&5 $as_echo_n "checking if static link of stdc++ is possible... " >&6; } STATIC_STDCXX_FLAGS="-Wl,-Bstatic -lstdc++ -lgcc -Wl,-Bdynamic" ac_ext=cpp @@ -30223,7 +33099,11 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu OLD_CXX="$CXX" LIBS="$STATIC_STDCXX_FLAGS" CXX="$CC" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -30234,13 +33114,38 @@ return 0; return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then has_static_libstdcxx=yes else - has_static_libstdcxx=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + has_static_libstdcxx=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext LIBS="$OLD_LIBS" CXX="$OLD_CXX" ac_ext=cpp @@ -30249,38 +33154,40 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_static_libstdcxx" >&5 + { $as_echo "$as_me:$LINENO: result: $has_static_libstdcxx" >&5 $as_echo "$has_static_libstdcxx" >&6; } if test "x$has_static_libcxx" = xno && test "x$has_dynamic_libcxx" = xno; then - as_fn_error $? "I cannot link to stdc++! Neither dynamically nor statically." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: I cannot link to stdc++! Neither dynamically nor statically." >&5 +$as_echo "$as_me: error: I cannot link to stdc++! Neither dynamically nor statically." >&2;} + { (exit 1); exit 1; }; } fi if test "x$enable_static_link_stdc__" = xyes && test "x$has_static_libstdcxx" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Static linking of libstdc++ was not possible reverting to dynamic linking." >&5 + { $as_echo "$as_me:$LINENO: Static linking of libstdc++ was not possible reverting to dynamic linking." >&5 $as_echo "$as_me: Static linking of libstdc++ was not possible reverting to dynamic linking." >&6;} enable_static_link_stdc__=no fi if test "x$enable_static_link_stdc__" = xno && test "x$has_dynamic_libstdcxx" = xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Dynamic linking of libstdc++ was not possible reverting to static linking." >&5 + { $as_echo "$as_me:$LINENO: Dynamic linking of libstdc++ was not possible reverting to static linking." >&5 $as_echo "$as_me: Dynamic linking of libstdc++ was not possible reverting to static linking." >&6;} enable_static_link_stdc__=yes fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libstdc++" >&5 + { $as_echo "$as_me:$LINENO: checking how to link with libstdc++" >&5 $as_echo_n "checking how to link with libstdc++... " >&6; } if test "x$enable_static_link_stdc__" = xyes; then LIBCXX="$LIBCXX $STATIC_STDCXX_FLAGS" LDCXX="$CC" STATIC_CXX_SETTING="STATIC_CXX=true" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 + { $as_echo "$as_me:$LINENO: result: static" >&5 $as_echo "static" >&6; } else LIBCXX="$LIBCXX -lstdc++" LDCXX="$CXX" STATIC_CXX_SETTING="STATIC_CXX=false" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: dynamic" >&5 + { $as_echo "$as_me:$LINENO: result: dynamic" >&5 $as_echo "dynamic" >&6; } fi fi @@ -30308,7 +33215,7 @@ fi # called fixpath. FIXPATH= if test "x$OPENJDK_BUILD_OS" = xwindows; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fixpath can be created" >&5 + { $as_echo "$as_me:$LINENO: checking if fixpath can be created" >&5 $as_echo_n "checking if fixpath can be created... " >&6; } FIXPATH_SRC="$SRC_ROOT/common/src/fixpath.c" FIXPATH_BIN="$OUTPUT_ROOT/fixpath.exe" @@ -30334,25 +33241,29 @@ $as_echo_n "checking if fixpath can be created... " >&6; } cd $CURDIR if test ! -x $OUTPUT_ROOT/fixpath.exe; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } cat $OUTPUT_ROOT/fixpath1.log - as_fn_error $? "Could not create $OUTPUT_ROOT/fixpath.exe" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not create $OUTPUT_ROOT/fixpath.exe" >&5 +$as_echo "$as_me: error: Could not create $OUTPUT_ROOT/fixpath.exe" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fixpath.exe works" >&5 + { $as_echo "$as_me:$LINENO: checking if fixpath.exe works" >&5 $as_echo_n "checking if fixpath.exe works... " >&6; } cd $OUTPUT_ROOT $FIXPATH $CC $SRC_ROOT/common/src/fixpath.c -Fe$OUTPUT_ROOT/fixpath2.exe > $OUTPUT_ROOT/fixpath2.log 2>&1 cd $CURDIR if test ! -x $OUTPUT_ROOT/fixpath2.exe; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } cat $OUTPUT_ROOT/fixpath2.log - as_fn_error $? "fixpath did not work!" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: fixpath did not work!" >&5 +$as_echo "$as_me: error: fixpath did not work!" >&2;} + { (exit 1); exit 1; }; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } rm -f $OUTPUT_ROOT/fixpath?.??? $OUTPUT_ROOT/fixpath.obj fi @@ -30390,14 +33301,14 @@ fi # How many cores do we have on this build system? # Check whether --with-num-cores was given. -if test "${with_num_cores+set}" = set; then : +if test "${with_num_cores+set}" = set; then withval=$with_num_cores; fi if test "x$with_num_cores" = x; then # The number of cores were not specified, try to probe them. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for number of cores" >&5 + { $as_echo "$as_me:$LINENO: checking for number of cores" >&5 $as_echo_n "checking for number of cores... " >&6; } NUM_CORES=1 FOUND_CORES=no @@ -30425,12 +33336,12 @@ $as_echo_n "checking for number of cores... " >&6; } CONCURRENT_BUILD_JOBS=`expr $NUM_CORES \* 2` if test "x$FOUND_CORES" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NUM_CORES" >&5 + { $as_echo "$as_me:$LINENO: result: $NUM_CORES" >&5 $as_echo "$NUM_CORES" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect number of cores, defaulting to 1" >&5 + { $as_echo "$as_me:$LINENO: result: could not detect number of cores, defaulting to 1" >&5 $as_echo "could not detect number of cores, defaulting to 1" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This will disable all parallelism from build!" >&5 + { $as_echo "$as_me:$LINENO: WARNING: This will disable all parallelism from build!" >&5 $as_echo "$as_me: WARNING: This will disable all parallelism from build!" >&2;} fi @@ -30446,14 +33357,14 @@ fi # How much memory do we have on this build system? # Check whether --with-memory-size was given. -if test "${with_memory_size+set}" = set; then : +if test "${with_memory_size+set}" = set; then withval=$with_memory_size; fi if test "x$with_memory_size" = x; then # The memory size was not specified, try to probe it. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for memory size" >&5 + { $as_echo "$as_me:$LINENO: checking for memory size" >&5 $as_echo_n "checking for memory size... " >&6; } # Default to 1024 MB MEMORY_SIZE=1024 @@ -30481,12 +33392,12 @@ $as_echo_n "checking for memory size... " >&6; } fi if test "x$FOUND_MEM" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MEMORY_SIZE MB" >&5 + { $as_echo "$as_me:$LINENO: result: $MEMORY_SIZE MB" >&5 $as_echo "$MEMORY_SIZE MB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect memory size, defaulting to 1024 MB" >&5 + { $as_echo "$as_me:$LINENO: result: could not detect memory size, defaulting to 1024 MB" >&5 $as_echo "could not detect memory size, defaulting to 1024 MB" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This might seriously impact build performance!" >&5 + { $as_echo "$as_me:$LINENO: WARNING: This might seriously impact build performance!" >&5 $as_echo "$as_me: WARNING: This might seriously impact build performance!" >&2;} fi @@ -30500,7 +33411,7 @@ fi # Check whether --with-sjavac-server-java was given. -if test "${with_sjavac_server_java+set}" = set; then : +if test "${with_sjavac_server_java+set}" = set; then withval=$with_sjavac_server_java; fi @@ -30509,7 +33420,9 @@ if test "x$with_sjavac_server_java" != x; then SJAVAC_SERVER_JAVA="$with_sjavac_server_java" FOUND_VERSION=`$SJAVAC_SERVER_JAVA -version 2>&1 | grep " version \""` if test "x$FOUND_VERSION" = x; then - as_fn_error $? "Could not execute server java: $SJAVAC_SERVER_JAVA" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: Could not execute server java: $SJAVAC_SERVER_JAVA" >&5 +$as_echo "$as_me: error: Could not execute server java: $SJAVAC_SERVER_JAVA" >&2;} + { (exit 1); exit 1; }; } fi else SJAVAC_SERVER_JAVA="" @@ -30539,7 +33452,7 @@ fi # Check whether --with-sjavac-server-cores was given. -if test "${with_sjavac_server_cores+set}" = set; then : +if test "${with_sjavac_server_cores+set}" = set; then withval=$with_sjavac_server_cores; fi @@ -30693,25 +33606,25 @@ else MAX_COMPILERS_IN_HEAP=`expr $MAX_HEAP_MEM / 501` if test "$SJAVAC_SERVER_CORES" -gt "$MAX_COMPILERS_IN_HEAP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if number of server cores must be reduced" >&5 + { $as_echo "$as_me:$LINENO: checking if number of server cores must be reduced" >&5 $as_echo_n "checking if number of server cores must be reduced... " >&6; } SJAVAC_SERVER_CORES="$MAX_COMPILERS_IN_HEAP" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, to $SJAVAC_SERVER_CORES with max heap size $MAX_HEAP_MEM MB" >&5 + { $as_echo "$as_me:$LINENO: result: yes, to $SJAVAC_SERVER_CORES with max heap size $MAX_HEAP_MEM MB" >&5 $as_echo "yes, to $SJAVAC_SERVER_CORES with max heap size $MAX_HEAP_MEM MB" >&6; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use sjavac" >&5 +{ $as_echo "$as_me:$LINENO: checking whether to use sjavac" >&5 $as_echo_n "checking whether to use sjavac... " >&6; } # Check whether --enable-sjavac was given. -if test "${enable_sjavac+set}" = set; then : +if test "${enable_sjavac+set}" = set; then enableval=$enable_sjavac; ENABLE_SJAVAC="${enableval}" else ENABLE_SJAVAC='no' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ENABLE_SJAVAC" >&5 +{ $as_echo "$as_me:$LINENO: result: $ENABLE_SJAVAC" >&5 $as_echo "$ENABLE_SJAVAC" >&6; } @@ -30732,7 +33645,7 @@ fi # Can the C/C++ compiler use precompiled headers? # # Check whether --enable-precompiled-headers was given. -if test "${enable_precompiled_headers+set}" = set; then : +if test "${enable_precompiled_headers+set}" = set; then enableval=$enable_precompiled_headers; ENABLE_PRECOMPH=${enable_precompiled-headers} else ENABLE_PRECOMPH=yes @@ -30747,17 +33660,17 @@ fi if test "x$ENABLE_PRECOMPH" = xyes; then # Check that the compiler actually supports precomp headers. if test "x$GCC" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking that precompiled headers work" >&5 + { $as_echo "$as_me:$LINENO: checking that precompiled headers work" >&5 $as_echo_n "checking that precompiled headers work... " >&6; } echo "int alfa();" > conftest.h $CXX -x c++-header conftest.h -o conftest.hpp.gch if test ! -f conftest.hpp.gch; then echo Precompiled header is not working! USE_PRECOMPILED_HEADER=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } fi rm -f conftest.h @@ -30770,7 +33683,7 @@ fi # Setup use of ccache, if available # Check whether --enable-ccache was given. -if test "${enable_ccache+set}" = set; then : +if test "${enable_ccache+set}" = set; then enableval=$enable_ccache; ENABLE_CCACHE=${enable_ccache} else ENABLE_CCACHE=yes @@ -30779,9 +33692,9 @@ fi if test "x$ENABLE_CCACHE" = xyes; then # Extract the first word of "ccache", so it can be a program name with args. set dummy ccache; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CCACHE+set}" = set; then : +if test "${ac_cv_path_CCACHE+set}" = set; then $as_echo_n "(cached) " >&6 else case $CCACHE in @@ -30794,14 +33707,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CCACHE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS ;; @@ -30809,18 +33722,18 @@ esac fi CCACHE=$ac_cv_path_CCACHE if test -n "$CCACHE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCACHE" >&5 + { $as_echo "$as_me:$LINENO: result: $CCACHE" >&5 $as_echo "$CCACHE" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ccache" >&5 + { $as_echo "$as_me:$LINENO: checking for ccache" >&5 $as_echo_n "checking for ccache... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicitly disabled" >&5 + { $as_echo "$as_me:$LINENO: result: explicitly disabled" >&5 $as_echo "explicitly disabled" >&6; } CCACHE= fi @@ -30828,7 +33741,7 @@ $as_echo "explicitly disabled" >&6; } # Check whether --with-ccache-dir was given. -if test "${with_ccache_dir+set}" = set; then : +if test "${with_ccache_dir+set}" = set; then withval=$with_ccache_dir; fi @@ -30845,21 +33758,25 @@ fi CCACHE_FOUND="true" # Only use ccache if it is 3.1.4 or later, which supports # precompiled headers. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ccache supports precompiled headers" >&5 + { $as_echo "$as_me:$LINENO: checking if ccache supports precompiled headers" >&5 $as_echo_n "checking if ccache supports precompiled headers... " >&6; } HAS_GOOD_CCACHE=`($CCACHE --version | head -n 1 | grep -E 3.1.[456789]) 2> /dev/null` if test "x$HAS_GOOD_CCACHE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, disabling ccache" >&5 + { $as_echo "$as_me:$LINENO: result: no, disabling ccache" >&5 $as_echo "no, disabling ccache" >&6; } CCACHE= else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if C-compiler supports ccache precompiled headers" >&5 + { $as_echo "$as_me:$LINENO: checking if C-compiler supports ccache precompiled headers" >&5 $as_echo_n "checking if C-compiler supports ccache precompiled headers... " >&6; } PUSHED_FLAGS="$CXXFLAGS" CXXFLAGS="-fpch-preprocess $CXXFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -30870,18 +33787,39 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then CC_KNOWS_CCACHE_TRICK=yes else - CC_KNOWS_CCACHE_TRICK=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CC_KNOWS_CCACHE_TRICK=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$PUSHED_FLAGS" if test "x$CC_KNOWS_CCACHE_TRICK" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, disabling ccaching of precompiled headers" >&5 + { $as_echo "$as_me:$LINENO: result: no, disabling ccaching of precompiled headers" >&5 $as_echo "no, disabling ccaching of precompiled headers" >&6; } CCACHE= fi @@ -30911,7 +33849,7 @@ $as_echo "no, disabling ccaching of precompiled headers" >&6; } # Check for some common pitfalls -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if build directory is on local disk" >&5 +{ $as_echo "$as_me:$LINENO: checking if build directory is on local disk" >&5 $as_echo_n "checking if build directory is on local disk... " >&6; } # df -l lists only local disks; if the given directory is not found then @@ -30937,7 +33875,7 @@ $as_echo_n "checking if build directory is on local disk... " >&6; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OUTPUT_DIR_IS_LOCAL" >&5 +{ $as_echo "$as_me:$LINENO: result: $OUTPUT_DIR_IS_LOCAL" >&5 $as_echo "$OUTPUT_DIR_IS_LOCAL" >&6; } # Check if the user has any old-style ALT_ variables set. @@ -30995,13 +33933,13 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; + *) $as_unset $ac_var ;; esac ;; esac done @@ -31009,8 +33947,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" @@ -31033,11 +33971,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi @@ -31051,15 +33989,14 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= -U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs @@ -31071,10 +34008,9 @@ LTLIBOBJS=$ac_ltlibobjs ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -31084,18 +34020,17 @@ cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 debug=false ac_cs_recheck=false ac_cs_silent=false - SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -31103,15 +34038,23 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; esac + fi + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + as_nl=' ' export as_nl @@ -31119,13 +34062,7 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -31136,7 +34073,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in #( + case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -31159,6 +34096,13 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -31168,15 +34112,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in #(( +case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done IFS=$as_save_IFS ;; @@ -31188,16 +34132,12 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 + { (exit 1); exit 1; } fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' @@ -31209,89 +34149,7 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - +# Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -31305,12 +34163,8 @@ else as_basename=false fi -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -31330,25 +34184,76 @@ $as_echo X/"$0" | } s/.*/./; q'` -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( +case `echo -n x` in -n*) - case `echo 'xy\c'` in + case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; + *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -31377,56 +34282,8 @@ fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' + as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false @@ -31445,10 +34302,10 @@ else if test -d "$1"; then test -d "$1/."; else - case $1 in #( + case $1 in -*)set "./$1";; esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' @@ -31463,19 +34320,13 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to +# Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by OpenJDK $as_me jdk8, which was -generated by GNU Autoconf 2.67. Invocation command line was +generated by GNU Autoconf 2.63. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -31506,15 +34357,13 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. +\`$as_me' instantiates files from templates according to the +current configuration. -Usage: $0 [OPTION]... [TAG]... +Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit - --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -31530,18 +34379,16 @@ $config_files Configuration headers: $config_headers -Report bugs to . -OpenJDK home page: ." +Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ OpenJDK config.status jdk8 -configured by $0, generated by GNU Autoconf 2.67, - with options \\"\$ac_cs_config\\" +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2008 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -31557,16 +34404,11 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=?*) + --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; *) ac_option=$1 ac_optarg=$2 @@ -31580,29 +34422,27 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; esac - as_fn_append CONFIG_FILES " '$ac_optarg'" + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -31610,10 +34450,11 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; + -*) { $as_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; - *) as_fn_append ac_config_targets " $1" + *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac @@ -31667,7 +34508,9 @@ do "$OUTPUT_ROOT/spec.sh") CONFIG_FILES="$CONFIG_FILES $OUTPUT_ROOT/spec.sh:$AUTOCONF_DIR/spec.sh.in" ;; "$OUTPUT_ROOT/Makefile") CONFIG_FILES="$CONFIG_FILES $OUTPUT_ROOT/Makefile:$AUTOCONF_DIR/Makefile.in" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; esac done @@ -31693,7 +34536,7 @@ $debug || trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 - trap 'as_fn_exit 1' 1 2 13 15 + trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. @@ -31704,7 +34547,11 @@ $debug || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -31712,13 +34559,7 @@ $debug || if test -n "$CONFIG_FILES"; then -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi +ac_cr=' ' ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' @@ -31735,18 +34576,24 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -31768,7 +34615,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\)..*/\1/ +s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -31782,7 +34629,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\)..*/\1/ +s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -31835,28 +34682,22 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } _ACEOF -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// s/^[^=]*=[ ]*$// }' fi @@ -31884,7 +34725,9 @@ for ac_last_try in false false :; do if test -z "$ac_t"; then break elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -31969,7 +34812,9 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } fi # test -n "$CONFIG_HEADERS" @@ -31982,7 +34827,9 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; + :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -32010,10 +34857,12 @@ do [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; + { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" + ac_file_inputs="$ac_file_inputs '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't @@ -32024,7 +34873,7 @@ do `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. @@ -32037,7 +34886,9 @@ $as_echo "$as_me: creating $ac_file" >&6;} case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; esac ;; esac @@ -32065,7 +34916,47 @@ $as_echo X"$ac_file" | q } s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in @@ -32113,6 +35004,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= + ac_sed_dataroot=' /datarootdir/ { p @@ -32122,11 +35014,12 @@ ac_sed_dataroot=' /@docdir@/p /@infodir@/p /@localedir@/p -/@mandir@/p' +/@mandir@/p +' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -32136,7 +35029,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; + s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF @@ -32163,22 +35056,26 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} +which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; :H) # @@ -32189,19 +35086,25 @@ which seems to be undefined. Please make sure it is defined" >&2;} $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } fi ;; @@ -32211,12 +35114,15 @@ $as_echo "$as_me: $ac_file is unchanged" >&6;} done # for ac_tag -as_fn_exit 0 +{ (exit 0); exit 0; } _ACEOF +chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } # configure is writing to config.log, and then calls config.status. @@ -32237,10 +35143,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 + $ac_cs_success || { (exit 1); exit 1; } fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/common/autoconf/source-dirs.m4 b/common/autoconf/source-dirs.m4 index 2ede34d280b..eacd056066b 100644 --- a/common/autoconf/source-dirs.m4 +++ b/common/autoconf/source-dirs.m4 @@ -253,5 +253,24 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_OUTPUT_DIRS], BUILD_OUTPUT="$OUTPUT_ROOT" AC_SUBST(BUILD_OUTPUT) +HOTSPOT_DIST="$OUTPUT_ROOT/hotspot/dist" +BUILD_HOTSPOT=true +AC_SUBST(HOTSPOT_DIST) +AC_SUBST(BUILD_HOTSPOT) +AC_ARG_WITH(import-hotspot, [AS_HELP_STRING([--with-import-hotspot], + [import hotspot binaries from this jdk image or hotspot build dist dir instead of building from source])]) +if test "x$with_import_hotspot" != x; then + CURDIR="$PWD" + cd "$with_import_hotspot" + HOTSPOT_DIST="`pwd`" + cd "$CURDIR" + if ! (test -d $HOTSPOT_DIST/lib && test -d $HOTSPOT_DIST/jre/lib); then + AC_MSG_ERROR([You have to import hotspot from a full jdk image or hotspot build dist dir!]) + fi + AC_MSG_CHECKING([if hotspot should be imported]) + AC_MSG_RESULT([yes from $HOTSPOT_DIST]) + BUILD_HOTSPOT=false +fi + JDK_OUTPUTDIR="$OUTPUT_ROOT/jdk" ]) diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in index b8d3e104b79..13cac27d264 100644 --- a/common/autoconf/spec.gmk.in +++ b/common/autoconf/spec.gmk.in @@ -224,7 +224,9 @@ LANGTOOLS_DIST=$(LANGTOOLS_OUTPUTDIR)/dist CORBA_DIST=$(CORBA_OUTPUTDIR)/dist JAXP_DIST=$(JAXP_OUTPUTDIR)/dist JAXWS_DIST=$(JAXWS_OUTPUTDIR)/dist -HOTSPOT_DIST=$(HOTSPOT_OUTPUTDIR)/dist +HOTSPOT_DIST=@HOTSPOT_DIST@ + +BUILD_HOTSPOT=@BUILD_HOTSPOT@ # The boot jdk to use BOOT_JDK:=@BOOT_JDK@ diff --git a/common/makefiles/Main.gmk b/common/makefiles/Main.gmk index b9322aba81a..7e0baaee52b 100644 --- a/common/makefiles/Main.gmk +++ b/common/makefiles/Main.gmk @@ -94,11 +94,13 @@ jaxws-only: start-make @($(CD) $(JAXWS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJaxws.gmk) @$(call TargetExit) +ifeq ($(BUILD_HOTSPOT),true) hotspot: hotspot-only hotspot-only: start-make @$(call TargetEnter) @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f HotspotWrapper.gmk) @$(call TargetExit) +endif jdk: langtools hotspot corba jaxp jaxws jdk-only jdk-only: start-make From 32808622c6208f40733df683f88efac006734440 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Mon, 12 Nov 2012 12:35:20 -0800 Subject: [PATCH 222/241] 8002028: build-infra: need no-hotspot partial build Added configure option --with-import-hotspot=/path/to/j2sdkimage Reviewed-by: dholmes, tbell --- jdk/makefiles/Import.gmk | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jdk/makefiles/Import.gmk b/jdk/makefiles/Import.gmk index 76272da7368..692c6ee2a9c 100644 --- a/jdk/makefiles/Import.gmk +++ b/jdk/makefiles/Import.gmk @@ -121,7 +121,7 @@ endef endif define CopyDir - $1_SRC_FILES := $(shell $(FIND) $2 -type f -a ! -name "wb.jar") + $1_SRC_FILES := $(shell $(FIND) $2 -type f -a \( -name DUMMY $(addprefix -o$(SPACE)-name$(SPACE),$4) \)) $1_DST_FILES := $$(patsubst $2/%,$3/%,$$($1_SRC_FILES)) IMPORT_TARGET_FILES += $$($1_DST_FILES) $3/% : $2/% @@ -134,9 +134,10 @@ endef # # Import hotspot # - -$(eval $(call CopyDir,HOTSPOT0, $(HOTSPOT_LIB_DIR), $(INSTALL_LIBRARIES_HERE))) -$(eval $(call CopyDir,HOTSPOT1, $(HOTSPOT_DIST)/lib, $(JDK_OUTPUTDIR)/lib)) +HOTSPOT_IMPORT_FILES:=$(addprefix $(LIBRARY_PREFIX), jvm.* saproc.* jsig.* sawindbg.* jvm_db.* jvm_dtrace.*) \ + Xusage.txt sa-jdi.jar +$(eval $(call CopyDir,HOTSPOT0, $(HOTSPOT_LIB_DIR), $(INSTALL_LIBRARIES_HERE), $(HOTSPOT_IMPORT_FILES))) +$(eval $(call CopyDir,HOTSPOT1, $(HOTSPOT_DIST)/lib, $(JDK_OUTPUTDIR)/lib, $(HOTSPOT_IMPORT_FILES))) JSIG_DEBUGINFO := $(strip $(wildcard $(HOTSPOT_DIST)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR)/libjsig.debuginfo) \ $(wildcard $(HOTSPOT_DIST)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR)/libjsig.diz) ) From 3fba7a43f2d54abaa94a995c4d8aa1e51372fe1f Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Tue, 13 Nov 2012 13:46:25 -0800 Subject: [PATCH 223/241] 8001965: build-infra: Large compare diffs between new and old on mac The wrong icon source file was used when building closed Reviewed-by: ohair, tbell --- jdk/makefiles/GensrcIcons.gmk | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/jdk/makefiles/GensrcIcons.gmk b/jdk/makefiles/GensrcIcons.gmk index a6a8a016758..5f1aed7b00a 100644 --- a/jdk/makefiles/GensrcIcons.gmk +++ b/jdk/makefiles/GensrcIcons.gmk @@ -109,13 +109,17 @@ $(foreach I,$(GENSRC_X11_ICONS_SRC), $(eval $(call SetupGensrcX11Icon,$(notdir $ ifeq ($(OPENJDK_TARGET_OS),macosx) - GENSRC_OSX_ICONS = $(GENSRC_OSX_ICONS_DST)/AWTIconData.h - GENSRC_OSX_ICONS_SRC = - GENSRC_OSX_ICONS_TMP = $(JDK_OUTPUTDIR)/gensrc - GENSRC_OSX_ICONS_DST = $(GENSRC_OSX_ICONS_TMP)/sun/osxapp - -$(GENSRC_OSX_ICONS_DST)/AWTIconData.h: \ - $(JDK_TOPDIR)/src/macosx/native/sun/osxapp/resource/icons/JavaApp.icns + GENSRC_OSX_ICONS_TMP := $(JDK_OUTPUTDIR)/gensrc + GENSRC_OSX_ICONS_DST := $(GENSRC_OSX_ICONS_TMP)/sun/osxapp + GENSRC_OSX_ICONS := $(GENSRC_OSX_ICONS_DST)/AWTIconData.h + + ifdef OPENJDK + GENSRC_OSX_ICONS_SRC := $(JDK_TOPDIR)/src/macosx/native/sun/osxapp/resource/icons/JavaApp.icns + else + GENSRC_OSX_ICONS_SRC := $(JDK_TOPDIR)/src/closed/macosx/native/sun/osxapp/resource/icons/JavaApp.icns + endif + +$(GENSRC_OSX_ICONS_DST)/AWTIconData.h: $(GENSRC_OSX_ICONS_SRC) $(RM) $@ $@.tmp $(MKDIR) -p $(dir $@) $(ECHO) "static unsigned char sAWTIconData[] = { " >> $@.tmp From 415574536ecdba743b67ae4e0a68456f1f10af32 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Tue, 13 Nov 2012 15:54:33 -0800 Subject: [PATCH 224/241] 8003274: build-infra: Makefile changes needed for sjavac Changes left in build-infra that are related to sjavac Co-authored-by: Fredrik Ohrstrom Reviewed-by: ohair, tbell --- common/autoconf/spec.gmk.in | 15 ++++++++------- common/makefiles/JavaCompilation.gmk | 3 ++- common/makefiles/MakeHelpers.gmk | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in index 13cac27d264..1cdd2660623 100644 --- a/common/autoconf/spec.gmk.in +++ b/common/autoconf/spec.gmk.in @@ -246,12 +246,6 @@ ENABLE_SJAVAC:=@ENABLE_SJAVAC@ # Store sjavac server synchronization files here, and # the sjavac server log files. SJAVAC_SERVER_DIR:=@SJAVAC_SERVER_DIR@ -# We can block the Javac server to never use more cores than this. -# This is not for performance reasons, but for memory usage, since each -# core requires its own JavaCompiler. We might have 64 cores and 4GB -# of memory, 64 JavaCompilers will currently not fit in a 3GB heap. -# Since there is no sharing of data between the JavaCompilers. -SJAVAC_SERVER_CORES:=@SJAVAC_SERVER_CORES@ # The OpenJDK makefiles should be changed to using the standard # configure output ..._CFLAGS and ..._LIBS. In the meantime we @@ -496,7 +490,14 @@ FIXPATH:=@FIXPATH@ # Where the build output is stored for your convenience. BUILD_LOG:=@BUILD_LOG@ BUILD_LOG_PREVIOUS:=@BUILD_LOG_PREVIOUS@ -BUILD_LOG_WRAPPER:=@BUILD_LOG_WRAPPER@ +# Disable the build log wrapper on sjavac+winapi until +# we have solved how to prevent the log wrapper to wait +# for the background sjavac server process. +ifeq (@ENABLE_SJAVAC@X@OPENJDK_BUILD_OS_API@,yesXwinapi) + BUILD_LOG_WRAPPER:= +else + BUILD_LOG_WRAPPER:=@BUILD_LOG_WRAPPER@ +endif # Build setup ENABLE_JFR=@ENABLE_JFR@ diff --git a/common/makefiles/JavaCompilation.gmk b/common/makefiles/JavaCompilation.gmk index 30537403d27..c5eef3b0a70 100644 --- a/common/makefiles/JavaCompilation.gmk +++ b/common/makefiles/JavaCompilation.gmk @@ -170,9 +170,10 @@ define SetupArchive # tells us what to remove from the jar-file. $1_CAPTURE_DELETES=$$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name _the.package.deleted -newer $$@ -exec $(SED) 's|$$(src)||g' \{\} >> $$($1_DELETES_FILE) \;) $$(NEWLINE)) # The update contents macro updates the jar file with the previously capture contents. + # xargs is used to trim the whitespace from the contents file, to see if it is empty. $1_UPDATE_CONTENTS=$$(foreach src,$$($1_SRCS),\ (cd $$(src) && \ - if [ -s _the.$$($1_JARNAME)_contents ]; then \ + if [ -n "`$(CAT) _the.$$($1_JARNAME)_contents | $(XARGS)`" ]; then \ $(ECHO) " updating" `$(WC) -l _the.$$($1_JARNAME)_contents | $(AWK) '{ print $$$$1 }'` files && \ $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @_the.$$($1_JARNAME)_contents; \ fi) $$(NEWLINE)) diff --git a/common/makefiles/MakeHelpers.gmk b/common/makefiles/MakeHelpers.gmk index 99103116311..0a441f88cff 100644 --- a/common/makefiles/MakeHelpers.gmk +++ b/common/makefiles/MakeHelpers.gmk @@ -157,7 +157,7 @@ endef # Hook to be called as the very last thing for targets that are "top level" targets define AtMakeEnd - $(if $(SJAVAC_SERVER_DIR),@$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) + [ -f $(SJAVAC_SERVER_DIR)/server.port ] && echo Stopping sjavac server && $(TOUCH) $(SJAVAC_SERVER_DIR)/server.port.stop; true $(call StopGlobalTimer) $(call ReportBuildTimes) @$(PRINTF) "Finished building $(PRODUCT_NAME) for target '$(call GetRealTarget)'\n" @@ -174,8 +174,8 @@ endef define ParseLogLevel ifeq ($$(origin VERBOSE),undefined) # Setup logging according to LOG (but only if VERBOSE is not given) - - # If the "nofile" argument is given, act on it and strip it away + + # If the "nofile" argument is given, act on it and strip it away ifneq ($$(findstring nofile,$$(LOG)),) # Reset the build log wrapper, regardless of other values override BUILD_LOG_WRAPPER= From 96aa3fad5ae48b22c2aabee8b261efa690a288a5 Mon Sep 17 00:00:00 2001 From: Mike Duigou Date: Tue, 13 Nov 2012 20:02:48 -0800 Subject: [PATCH 225/241] 7088913: Add compatible static hashCode(primitive) to primitive wrapper classes Adds static utility methods to each primitive wrapper class to allow calculation of a hashCode value from an unboxed primitive. Reviewed-by: darcy, smarks, dholmes --- jdk/src/share/classes/java/lang/Boolean.java | 15 +++- jdk/src/share/classes/java/lang/Byte.java | 13 ++++ .../share/classes/java/lang/Character.java | 13 ++++ jdk/src/share/classes/java/lang/Double.java | 13 ++++ jdk/src/share/classes/java/lang/Float.java | 13 ++++ jdk/src/share/classes/java/lang/Integer.java | 13 ++++ jdk/src/share/classes/java/lang/Long.java | 13 ++++ jdk/src/share/classes/java/lang/Short.java | 13 ++++ jdk/test/java/lang/HashCode.java | 75 +++++++++++++++++-- 9 files changed, 172 insertions(+), 9 deletions(-) diff --git a/jdk/src/share/classes/java/lang/Boolean.java b/jdk/src/share/classes/java/lang/Boolean.java index feb199465ec..2c4754c8a61 100644 --- a/jdk/src/share/classes/java/lang/Boolean.java +++ b/jdk/src/share/classes/java/lang/Boolean.java @@ -196,11 +196,24 @@ public final class Boolean implements java.io.Serializable, * {@code true}; returns the integer {@code 1237} if this * object represents {@code false}. */ + @Override public int hashCode() { - return value ? 1231 : 1237; + return Boolean.hashCode(value); } /** + * Returns a hash code for a {@code boolean} value; compatible with + * {@code Boolean.hashCode()}. + * + * @since 1.8 + * + * @return a hash code value for a {@code boolean} value. + */ + public static int hashCode(boolean value) { + return value ? 1231 : 1237; + } + + /** * Returns {@code true} if and only if the argument is not * {@code null} and is a {@code Boolean} object that * represents the same {@code boolean} value as this object. diff --git a/jdk/src/share/classes/java/lang/Byte.java b/jdk/src/share/classes/java/lang/Byte.java index 799936f4a44..c4dd62ecf6d 100644 --- a/jdk/src/share/classes/java/lang/Byte.java +++ b/jdk/src/share/classes/java/lang/Byte.java @@ -389,7 +389,20 @@ public final class Byte extends Number implements Comparable { * * @return a hash code value for this {@code Byte} */ + @Override public int hashCode() { + return Byte.hashCode(value); + } + + /** + * Returns a hash code for a {@code byte} value; compatible with + * {@code Byte.hashCode()}. + * + * @since 1.8 + * + * @return a hash code value for a {@code byte} value. + */ + public static int hashCode(byte value) { return (int)value; } diff --git a/jdk/src/share/classes/java/lang/Character.java b/jdk/src/share/classes/java/lang/Character.java index 53bb738ea02..03134d06dbd 100644 --- a/jdk/src/share/classes/java/lang/Character.java +++ b/jdk/src/share/classes/java/lang/Character.java @@ -4588,7 +4588,20 @@ class Character implements java.io.Serializable, Comparable { * * @return a hash code value for this {@code Character} */ + @Override public int hashCode() { + return Character.hashCode(value); + } + + /** + * Returns a hash code for a {@code char} value; compatible with + * {@code Character.hashCode()}. + * + * @since 1.8 + * + * @return a hash code value for a {@code char} value. + */ + public static int hashCode(char value) { return (int)value; } diff --git a/jdk/src/share/classes/java/lang/Double.java b/jdk/src/share/classes/java/lang/Double.java index 5e1afaea747..040cca70033 100644 --- a/jdk/src/share/classes/java/lang/Double.java +++ b/jdk/src/share/classes/java/lang/Double.java @@ -740,7 +740,20 @@ public final class Double extends Number implements Comparable { * * @return a {@code hash code} value for this object. */ + @Override public int hashCode() { + return Double.hashCode(value); + } + + /** + * Returns a hash code for a {@code double} value; compatible with + * {@code Double.hashCode()}. + * + * @since 1.8 + * + * @return a hash code value for a {@code double} value. + */ + public static int hashCode(double value) { long bits = doubleToLongBits(value); return (int)(bits ^ (bits >>> 32)); } diff --git a/jdk/src/share/classes/java/lang/Float.java b/jdk/src/share/classes/java/lang/Float.java index 4e73507911b..1e8f6e354a9 100644 --- a/jdk/src/share/classes/java/lang/Float.java +++ b/jdk/src/share/classes/java/lang/Float.java @@ -648,7 +648,20 @@ public final class Float extends Number implements Comparable { * * @return a hash code value for this object. */ + @Override public int hashCode() { + return Float.hashCode(value); + } + + /** + * Returns a hash code for a {@code float} value; compatible with + * {@code Float.hashCode()}. + * + * @since 1.8 + * + * @return a hash code value for a {@code float} value. + */ + public static int hashCode(float value) { return floatToIntBits(value); } diff --git a/jdk/src/share/classes/java/lang/Integer.java b/jdk/src/share/classes/java/lang/Integer.java index 0943a347368..50627e99133 100644 --- a/jdk/src/share/classes/java/lang/Integer.java +++ b/jdk/src/share/classes/java/lang/Integer.java @@ -918,7 +918,20 @@ public final class Integer extends Number implements Comparable { * primitive {@code int} value represented by this * {@code Integer} object. */ + @Override public int hashCode() { + return Integer.hashCode(value); + } + + /** + * Returns a hash code for a {@code int} value; compatible with + * {@code Integer.hashCode()}. + * + * @since 1.8 + * + * @return a hash code value for a {@code int} value. + */ + public static int hashCode(int value) { return value; } diff --git a/jdk/src/share/classes/java/lang/Long.java b/jdk/src/share/classes/java/lang/Long.java index 55f7b1a7e9d..9197a6d1e26 100644 --- a/jdk/src/share/classes/java/lang/Long.java +++ b/jdk/src/share/classes/java/lang/Long.java @@ -1021,7 +1021,20 @@ public final class Long extends Number implements Comparable { * * @return a hash code value for this object. */ + @Override public int hashCode() { + return Long.hashCode(value); + } + + /** + * Returns a hash code for a {@code long} value; compatible with + * {@code Long.hashCode()}. + * + * @since 1.8 + * + * @return a hash code value for a {@code long} value. + */ + public static int hashCode(long value) { return (int)(value ^ (value >>> 32)); } diff --git a/jdk/src/share/classes/java/lang/Short.java b/jdk/src/share/classes/java/lang/Short.java index 2a1d8b5502d..f117095abe2 100644 --- a/jdk/src/share/classes/java/lang/Short.java +++ b/jdk/src/share/classes/java/lang/Short.java @@ -394,7 +394,20 @@ public final class Short extends Number implements Comparable { * * @return a hash code value for this {@code Short} */ + @Override public int hashCode() { + return Short.hashCode(value); + } + + /** + * Returns a hash code for a {@code short} value; compatible with + * {@code Short.hashCode()}. + * + * @since 1.8 + * + * @return a hash code value for a {@code short} value. + */ + public static int hashCode(short value) { return (int)value; } diff --git a/jdk/test/java/lang/HashCode.java b/jdk/test/java/lang/HashCode.java index adf773090c5..d113cb0d0fd 100644 --- a/jdk/test/java/lang/HashCode.java +++ b/jdk/test/java/lang/HashCode.java @@ -23,18 +23,20 @@ /* * @test - * @bug 4245470 + * @bug 4245470 7088913 * @summary Test the primitive wrappers hashCode() */ +import java.util.Objects; import java.util.Random; public class HashCode { final Random rnd = new Random(); - void test(String args[]) throws Exception { - int[] ints = { + void testOrdinals(String args[]) throws Exception { + long[] longs = { + Long.MIN_VALUE, Integer.MIN_VALUE, Short.MIN_VALUE, Character.MIN_VALUE, @@ -44,20 +46,73 @@ public class HashCode { Character.MAX_VALUE, Short.MAX_VALUE, Integer.MAX_VALUE, + Long.MAX_VALUE, rnd.nextInt(), }; - for (int x : ints) { + for (long x : longs) { check( new Long(x).hashCode() == (int)((long)x ^ (long)x>>>32)); check(Long.valueOf(x).hashCode() == (int)((long)x ^ (long)x>>>32)); - check( new Integer(x).hashCode() == x); - check(Integer.valueOf(x).hashCode() == x); + check( (new Long(x)).hashCode() == Long.hashCode(x)); + check( new Integer((int)x).hashCode() == (int) x); + check(Integer.valueOf((int)x).hashCode() == (int) x); + check( (new Integer((int)x)).hashCode() == Integer.hashCode((int)x)); check( new Short((short)x).hashCode() == (short) x); check(Short.valueOf((short)x).hashCode() == (short) x); + check( (new Short((short)x)).hashCode() == Short.hashCode((short)x)); check( new Character((char) x).hashCode() == (char) x); check(Character.valueOf((char) x).hashCode() == (char) x); + check( (new Character((char)x)).hashCode() == Character.hashCode((char)x)); check( new Byte((byte) x).hashCode() == (byte) x); check(Byte.valueOf((byte) x).hashCode() == (byte) x); + check( (new Byte((byte)x)).hashCode() == Byte.hashCode((byte)x)); + } + } + + void testBoolean() { + check( Boolean.FALSE.hashCode() == 1237); + check( Boolean.TRUE.hashCode() == 1231); + check( Boolean.valueOf(false).hashCode() == 1237); + check( Boolean.valueOf(true).hashCode() == 1231); + check( (new Boolean(false)).hashCode() == 1237); + check( (new Boolean(true)).hashCode() == 1231); + check( Boolean.hashCode(false) == 1237); + check( Boolean.hashCode(true) == 1231); + } + + void testFloat() { + float[] floats = { + Float.NaN, + Float.NEGATIVE_INFINITY, + -1f, + 0f, + 1f, + Float.POSITIVE_INFINITY + }; + + for(float f : floats) { + check( Float.hashCode(f) == Float.floatToIntBits(f)); + check( Float.valueOf(f).hashCode() == Float.floatToIntBits(f)); + check( (new Float(f)).hashCode() == Float.floatToIntBits(f)); + } + } + + void testDouble() { + double[] doubles = { + Double.NaN, + Double.NEGATIVE_INFINITY, + -1f, + 0f, + 1f, + Double.POSITIVE_INFINITY + }; + + for(double d : doubles) { + long bits = Double.doubleToLongBits(d); + int bitsHash = (int)(bits^(bits>>>32)); + check( Double.hashCode(d) == bitsHash); + check( Double.valueOf(d).hashCode() == bitsHash); + check( (new Double(d)).hashCode() == bitsHash); } } @@ -69,12 +124,16 @@ public class HashCode { 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(); + if (Objects.equals(x,y)) pass(); else fail(x + " not equal to " + y);} public static void main(String[] args) throws Throwable { new HashCode().instanceMain(args);} public void instanceMain(String[] args) throws Throwable { - try {test(args);} catch (Throwable t) {unexpected(t);} + try { testOrdinals(args); + testBoolean(); + testFloat(); + testDouble(); + } 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 6bb3dd6ea2ec75946f0e974a88497d1cc98d96cf Mon Sep 17 00:00:00 2001 From: Sean Chou Date: Wed, 14 Nov 2012 13:26:55 +0800 Subject: [PATCH 226/241] 7201156: jar tool fails to convert file separation characters for list and extract Reviewed-by: alanb, chegar, sherman --- jdk/src/share/classes/sun/tools/jar/Main.java | 4 +- jdk/test/tools/jar/JarBackSlash.java | 135 ++++++++++++++++++ 2 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 jdk/test/tools/jar/JarBackSlash.java diff --git a/jdk/src/share/classes/sun/tools/jar/Main.java b/jdk/src/share/classes/sun/tools/jar/Main.java index 54f4deab1e8..73a3d0e1502 100644 --- a/jdk/src/share/classes/sun/tools/jar/Main.java +++ b/jdk/src/share/classes/sun/tools/jar/Main.java @@ -839,8 +839,8 @@ class Main { void replaceFSC(String files[]) { if (files != null) { - for (String file : files) { - file = file.replace(File.separatorChar, '/'); + for (int i = 0; i < files.length; i++) { + files[i] = files[i].replace(File.separatorChar, '/'); } } } diff --git a/jdk/test/tools/jar/JarBackSlash.java b/jdk/test/tools/jar/JarBackSlash.java new file mode 100644 index 00000000000..40629131738 --- /dev/null +++ b/jdk/test/tools/jar/JarBackSlash.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * Portions Copyright (c) 2012 IBM Corporation + */ + +/* + * @test + * @bug 7201156 + * @summary jar tool fails to convert file separation characters for list and extract + * @author Sean Chou + */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; + +import sun.tools.jar.Main; + +public class JarBackSlash { + + // used construct an entry JarBackSlash/dir/file.txt + private static String JARBACKSLASH = "JarBackSlash"; + private static String DIR = "dir"; + private static String FILENAME = "file.txt"; + + private static File createJarFile() throws IOException { + File jarFile = File.createTempFile("JarBackSlashTest", ".jar"); + jarFile.deleteOnExit(); + + try (JarOutputStream output = new JarOutputStream(new FileOutputStream(jarFile))) { + JarEntry entry = new JarEntry(JARBACKSLASH + "/" + DIR + "/" + FILENAME); + output.putNextEntry(entry); + } + + return jarFile; + } + + private static void testJarList(String jarFile) throws IOException { + List argList = new ArrayList(); + argList.add("-tvf"); + argList.add(jarFile); + argList.add(JARBACKSLASH + File.separatorChar + DIR + File.separatorChar + FILENAME); + + String jarArgs[] = new String[argList.size()]; + jarArgs = argList.toArray(jarArgs); + + PipedOutputStream pipedOutput = new PipedOutputStream(); + PipedInputStream pipedInput = new PipedInputStream(pipedOutput); + PrintStream out = new PrintStream(pipedOutput); + + Main jarTool = new Main(out, System.err, "jar"); + if (!jarTool.run(jarArgs)) { + fail("Could not list jar file."); + } + + out.flush(); + check(pipedInput.available() > 0); + } + + + private static void testJarExtract(String jarFile) throws IOException { + List argList = new ArrayList(); + argList.add("-xvf"); + argList.add(jarFile); + argList.add(JARBACKSLASH + File.separatorChar + DIR + File.separatorChar + FILENAME); + + String jarArgs[] = new String[argList.size()]; + jarArgs = argList.toArray(jarArgs); + + PipedOutputStream pipedOutput = new PipedOutputStream(); + PipedInputStream pipedInput = new PipedInputStream(pipedOutput); + PrintStream out = new PrintStream(pipedOutput); + + Main jarTool = new Main(out, System.err, "jar"); + if (!jarTool.run(jarArgs)) { + fail("Could not list jar file."); + } + + out.flush(); + check(pipedInput.available() > 0); + } + + public static void realMain(String[] args) throws Throwable { + File tmpJarFile = createJarFile(); + String tmpJarFilePath = tmpJarFile.getAbsolutePath(); + + testJarList(tmpJarFilePath); + testJarExtract(tmpJarFilePath); + } + + + //--------------------- 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 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");} +} From 8c308db5795fbd085cb5c4481d4b2eae224b8aa0 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Wed, 14 Nov 2012 12:56:26 +0000 Subject: [PATCH 227/241] 8003285: TEST_BUG: java/nio/channels/AsynchronousChannelGroup/Unbounded.java fails again [macosx] Reviewed-by: chegar --- .../AsynchronousChannelGroup/Unbounded.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java index 6e764a2b671..cc1d71e1beb 100644 --- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java +++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java @@ -39,6 +39,9 @@ public class Unbounded { // set to true if an I/O operation fails static volatile boolean failed; + // set to true when the test is done + static volatile boolean finished; + public static void main(String[] args) throws Exception { // all accepted connections are added to a queue final ArrayBlockingQueue queue = @@ -54,8 +57,10 @@ public class Unbounded { listener.accept((Void)null, this); } public void failed(Throwable exc, Void att) { - failed = true; - System.err.println("accept failed: " + exc); + if (!finished) { + failed = true; + System.err.println("accept failed: " + exc); + } } }); System.out.println("Listener created."); @@ -120,8 +125,11 @@ public class Unbounded { // wait for all threads to reach the barrier System.out.println("Waiting for all threads to reach barrier"); barrier.await(); + + // finish up + finished = true; listener.close(); if (failed) - throw new RuntimeException("I/O failed failed, see log for details"); + throw new RuntimeException("I/O operation failed, see log for details"); } } From 78499292e16691ac15574a05b8882546173608d3 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Wed, 14 Nov 2012 07:08:50 -0800 Subject: [PATCH 228/241] 8000404: rename javax.tools.GenerateNativeHeader to java.lang.annotation.Native Reviewed-by: alanb --- .../classes/java/lang/annotation/Native.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 jdk/src/share/classes/java/lang/annotation/Native.java diff --git a/jdk/src/share/classes/java/lang/annotation/Native.java b/jdk/src/share/classes/java/lang/annotation/Native.java new file mode 100644 index 00000000000..861c1ffb996 --- /dev/null +++ b/jdk/src/share/classes/java/lang/annotation/Native.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.lang.annotation; + + +/** + * Indicates that a field defining a constant value may be referenced + * from native code. + * + * The annotation may be used as a hint by tools that generate native + * header files to determine whether a header file is required, and + * if so, what declarations it should contain. + * + * @since 1.8 + */ +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.SOURCE) +public @interface Native { +} From b2926d97241829807228a4dd24a59bd499152dec Mon Sep 17 00:00:00 2001 From: Mike Duigou Date: Tue, 13 Nov 2012 20:02:39 -0800 Subject: [PATCH 229/241] 7088952: Add size in bytes constant "BYTES" to primitive type wrapper types Adds a constant BYTES to each of the primitive wrapper classes (Byte, Character, Double, Float, Integer, Long, Short) with the calculation Primitive.SIZE / Byte.SIZE already made. Reviewed-by: dholmes --- jdk/src/share/classes/java/lang/Byte.java | 8 ++++++++ jdk/src/share/classes/java/lang/Character.java | 8 ++++++++ jdk/src/share/classes/java/lang/Double.java | 7 +++++++ jdk/src/share/classes/java/lang/Float.java | 7 +++++++ jdk/src/share/classes/java/lang/Integer.java | 8 ++++++++ jdk/src/share/classes/java/lang/Long.java | 8 ++++++++ jdk/src/share/classes/java/lang/Short.java | 8 ++++++++ 7 files changed, 54 insertions(+) diff --git a/jdk/src/share/classes/java/lang/Byte.java b/jdk/src/share/classes/java/lang/Byte.java index c4dd62ecf6d..43a558ade43 100644 --- a/jdk/src/share/classes/java/lang/Byte.java +++ b/jdk/src/share/classes/java/lang/Byte.java @@ -507,6 +507,14 @@ public final class Byte extends Number implements Comparable { */ public static final int SIZE = 8; + /** + * The number of bytes used to represent a {@code byte} value in two's + * complement binary form. + * + * @since 1.8 + */ + public static final int BYTES = SIZE / Byte.SIZE; + /** use serialVersionUID from JDK 1.1. for interoperability */ private static final long serialVersionUID = -7183698231559129828L; } diff --git a/jdk/src/share/classes/java/lang/Character.java b/jdk/src/share/classes/java/lang/Character.java index 03134d06dbd..0f440067b45 100644 --- a/jdk/src/share/classes/java/lang/Character.java +++ b/jdk/src/share/classes/java/lang/Character.java @@ -7170,6 +7170,14 @@ class Character implements java.io.Serializable, Comparable { */ public static final int SIZE = 16; + /** + * The number of bytes used to represent a {@code char} value in unsigned + * binary form. + * + * @since 1.8 + */ + public static final int BYTES = SIZE / Byte.SIZE; + /** * Returns the value obtained by reversing the order of the bytes in the * specified char value. diff --git a/jdk/src/share/classes/java/lang/Double.java b/jdk/src/share/classes/java/lang/Double.java index 040cca70033..a20f79e6cb3 100644 --- a/jdk/src/share/classes/java/lang/Double.java +++ b/jdk/src/share/classes/java/lang/Double.java @@ -122,6 +122,13 @@ public final class Double extends Number implements Comparable { */ public static final int SIZE = 64; + /** + * The number of bytes used to represent a {@code double} value. + * + * @since 1.8 + */ + public static final int BYTES = SIZE / Byte.SIZE; + /** * The {@code Class} instance representing the primitive type * {@code double}. diff --git a/jdk/src/share/classes/java/lang/Float.java b/jdk/src/share/classes/java/lang/Float.java index 1e8f6e354a9..0c071e2b0f4 100644 --- a/jdk/src/share/classes/java/lang/Float.java +++ b/jdk/src/share/classes/java/lang/Float.java @@ -120,6 +120,13 @@ public final class Float extends Number implements Comparable { */ public static final int SIZE = 32; + /** + * The number of bytes used to represent a {@code float} value. + * + * @since 1.8 + */ + public static final int BYTES = SIZE / Byte.SIZE; + /** * The {@code Class} instance representing the primitive type * {@code float}. diff --git a/jdk/src/share/classes/java/lang/Integer.java b/jdk/src/share/classes/java/lang/Integer.java index 50627e99133..3496d039c1c 100644 --- a/jdk/src/share/classes/java/lang/Integer.java +++ b/jdk/src/share/classes/java/lang/Integer.java @@ -1297,6 +1297,14 @@ public final class Integer extends Number implements Comparable { */ public static final int SIZE = 32; + /** + * The number of bytes used to represent a {@code int} value in two's + * complement binary form. + * + * @since 1.8 + */ + public static final int BYTES = SIZE / Byte.SIZE; + /** * Returns an {@code int} value with at most a single one-bit, in the * position of the highest-order ("leftmost") one-bit in the specified diff --git a/jdk/src/share/classes/java/lang/Long.java b/jdk/src/share/classes/java/lang/Long.java index 9197a6d1e26..6509f88f177 100644 --- a/jdk/src/share/classes/java/lang/Long.java +++ b/jdk/src/share/classes/java/lang/Long.java @@ -1319,6 +1319,14 @@ public final class Long extends Number implements Comparable { */ public static final int SIZE = 64; + /** + * The number of bytes used to represent a {@code long} value in two's + * complement binary form. + * + * @since 1.8 + */ + public static final int BYTES = SIZE / Byte.SIZE; + /** * Returns a {@code long} value with at most a single one-bit, in the * position of the highest-order ("leftmost") one-bit in the specified diff --git a/jdk/src/share/classes/java/lang/Short.java b/jdk/src/share/classes/java/lang/Short.java index f117095abe2..6042b13f905 100644 --- a/jdk/src/share/classes/java/lang/Short.java +++ b/jdk/src/share/classes/java/lang/Short.java @@ -470,6 +470,14 @@ public final class Short extends Number implements Comparable { */ public static final int SIZE = 16; + /** + * The number of bytes used to represent a {@code short} value in two's + * complement binary form. + * + * @since 1.8 + */ + public static final int BYTES = SIZE / Byte.SIZE; + /** * Returns the value obtained by reversing the order of the bytes in the * two's complement representation of the specified {@code short} value. From 919df15706b94e44d261ee1ee6f09f5de33cd71a Mon Sep 17 00:00:00 2001 From: "J. Duke" Date: Wed, 5 Jul 2017 18:26:11 +0200 Subject: [PATCH 230/241] Added tag jdk8-b61 for changeset cdaa6122185f --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index fde585f8bbb..bf173376ee4 100644 --- a/.hgtags +++ b/.hgtags @@ -182,3 +182,4 @@ ffe6bce5a521be40146af2ac03c509b7bac30595 jdk8-b56 479d3302a26d7607ba271d66973e59ebf58825b6 jdk8-b58 3bd874584fc01aae92fbc8827e2bd04d8b6ace04 jdk8-b59 5e3adc681779037a2d33b7be6f75680619085492 jdk8-b60 +cdaa6122185f9bf512dcd6600f56bfccc4824e8c jdk8-b61 From 2ccd6e0dcd4060498ec60e3826cdb7ddec5ed0de Mon Sep 17 00:00:00 2001 From: "J. Duke" Date: Wed, 5 Jul 2017 18:26:51 +0200 Subject: [PATCH 231/241] Added tag jdk8-b62 for changeset 8d9d430b4244 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index bf173376ee4..0cdae530028 100644 --- a/.hgtags +++ b/.hgtags @@ -183,3 +183,4 @@ ffe6bce5a521be40146af2ac03c509b7bac30595 jdk8-b56 3bd874584fc01aae92fbc8827e2bd04d8b6ace04 jdk8-b59 5e3adc681779037a2d33b7be6f75680619085492 jdk8-b60 cdaa6122185f9bf512dcd6600f56bfccc4824e8c jdk8-b61 +8d9d430b4244b95f5cf1ebe719f834a1ac5d6cd5 jdk8-b62 From 3672cc8983af1a652d41a4e1bdee4b500a8b84de Mon Sep 17 00:00:00 2001 From: "J. Duke" Date: Wed, 5 Jul 2017 18:28:05 +0200 Subject: [PATCH 232/241] Added tag jdk8-b63 for changeset 21ee1dd7b809 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 0cdae530028..5c56fcd1b39 100644 --- a/.hgtags +++ b/.hgtags @@ -184,3 +184,4 @@ ffe6bce5a521be40146af2ac03c509b7bac30595 jdk8-b56 5e3adc681779037a2d33b7be6f75680619085492 jdk8-b60 cdaa6122185f9bf512dcd6600f56bfccc4824e8c jdk8-b61 8d9d430b4244b95f5cf1ebe719f834a1ac5d6cd5 jdk8-b62 +21ee1dd7b809639284900a128b9b656a592ebc7a jdk8-b63 From ccba13a936f8af8f746d1c87e1cb15d24c1d6eac Mon Sep 17 00:00:00 2001 From: "J. Duke" Date: Wed, 5 Jul 2017 18:29:06 +0200 Subject: [PATCH 233/241] Added tag jdk8-b64 for changeset 70fa4b11f265 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 5c56fcd1b39..412216e3cd1 100644 --- a/.hgtags +++ b/.hgtags @@ -185,3 +185,4 @@ ffe6bce5a521be40146af2ac03c509b7bac30595 jdk8-b56 cdaa6122185f9bf512dcd6600f56bfccc4824e8c jdk8-b61 8d9d430b4244b95f5cf1ebe719f834a1ac5d6cd5 jdk8-b62 21ee1dd7b809639284900a128b9b656a592ebc7a jdk8-b63 +70fa4b11f26522e69b51fd652215f60ce350bac3 jdk8-b64 From f439018255b1d56a37c42b7637a5779ca1ed1a99 Mon Sep 17 00:00:00 2001 From: Jim Gish Date: Thu, 15 Nov 2012 13:46:45 +0000 Subject: [PATCH 234/241] 6244047: impossible to specify directories to logging FileHandler unless they exist Reviewed-by: alanb --- .../java/util/logging/FileHandler.java | 85 ++++--- .../util/logging/CheckLockLocationTest.java | 210 ++++++++++++++++++ 2 files changed, 266 insertions(+), 29 deletions(-) create mode 100644 jdk/test/java/util/logging/CheckLockLocationTest.java diff --git a/jdk/src/share/classes/java/util/logging/FileHandler.java b/jdk/src/share/classes/java/util/logging/FileHandler.java index 6bb88f78d63..8d3b28d8d52 100644 --- a/jdk/src/share/classes/java/util/logging/FileHandler.java +++ b/jdk/src/share/classes/java/util/logging/FileHandler.java @@ -25,10 +25,19 @@ package java.util.logging; -import java.io.*; +import static java.nio.file.StandardOpenOption.CREATE_NEW; +import static java.nio.file.StandardOpenOption.WRITE; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; import java.nio.channels.FileChannel; -import java.nio.channels.FileLock; -import java.security.*; +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.Paths; +import java.security.AccessController; +import java.security.PrivilegedAction; /** * Simple file logging Handler. @@ -137,14 +146,16 @@ public class FileHandler extends StreamHandler { private int count; private String pattern; private String lockFileName; - private FileOutputStream lockStream; + private FileChannel lockFileChannel; private File files[]; private static final int MAX_LOCKS = 100; private static java.util.HashMap locks = new java.util.HashMap<>(); - // A metered stream is a subclass of OutputStream that - // (a) forwards all its output to a target stream - // (b) keeps track of how many bytes have been written + /** + * A metered stream is a subclass of OutputStream that + * (a) forwards all its output to a target stream + * (b) keeps track of how many bytes have been written + */ private class MeteredStream extends OutputStream { OutputStream out; int written; @@ -189,9 +200,10 @@ public class FileHandler extends StreamHandler { setOutputStream(meter); } - // Private method to configure a FileHandler from LogManager - // properties and/or default values as specified in the class - // javadoc. + /** + * Configure a FileHandler from LogManager properties and/or default values + * as specified in the class javadoc. + */ private void configure() { LogManager manager = LogManager.getLogManager(); @@ -287,7 +299,8 @@ public class FileHandler extends StreamHandler { * the caller does not have LoggingPermission("control"). * @exception IllegalArgumentException if pattern is an empty string */ - public FileHandler(String pattern, boolean append) throws IOException, SecurityException { + public FileHandler(String pattern, boolean append) throws IOException, + SecurityException { if (pattern.length() < 1 ) { throw new IllegalArgumentException(); } @@ -376,8 +389,10 @@ public class FileHandler extends StreamHandler { openFiles(); } - // Private method to open the set of output files, based on the - // configured instance variables. + /** + * Open the set of output files, based on the configured + * instance variables. + */ private void openFiles() throws IOException { LogManager manager = LogManager.getLogManager(); manager.checkPermission(); @@ -413,18 +428,18 @@ public class FileHandler extends StreamHandler { // object. Try again. continue; } - FileChannel fc; + try { - lockStream = new FileOutputStream(lockFileName); - fc = lockStream.getChannel(); - } catch (IOException ix) { - // We got an IOException while trying to open the file. - // Try the next file. + lockFileChannel = FileChannel.open(Paths.get(lockFileName), + CREATE_NEW, WRITE); + } catch (FileAlreadyExistsException ix) { + // try the next lock file name in the sequence continue; } + boolean available; try { - available = fc.tryLock() != null; + available = lockFileChannel.tryLock() != null; // We got the lock OK. } catch (IOException ix) { // We got an IOException while trying to get the lock. @@ -440,7 +455,7 @@ public class FileHandler extends StreamHandler { } // We failed to get the lock. Try next file. - fc.close(); + lockFileChannel.close(); } } @@ -472,8 +487,17 @@ public class FileHandler extends StreamHandler { setErrorManager(new ErrorManager()); } - // Generate a filename from a pattern. - private File generate(String pattern, int generation, int unique) throws IOException { + /** + * Generate a file based on a user-supplied pattern, generation number, + * and an integer uniqueness suffix + * @param pattern the pattern for naming the output file + * @param generation the generation number to distinguish rotated logs + * @param unique a unique number to resolve conflicts + * @return the generated File + * @throws IOException + */ + private File generate(String pattern, int generation, int unique) + throws IOException { File file = null; String word = ""; int ix = 0; @@ -548,7 +572,9 @@ public class FileHandler extends StreamHandler { return file; } - // Rotate the set of output files + /** + * Rotate the set of output files + */ private synchronized void rotate() { Level oldLevel = getLevel(); setLevel(Level.OFF); @@ -615,9 +641,8 @@ public class FileHandler extends StreamHandler { return; } try { - // Closing the lock file's FileOutputStream will close - // the underlying channel and free any locks. - lockStream.close(); + // Close the lock file channel (which also will free any locks) + lockFileChannel.close(); } catch (Exception ex) { // Problems closing the stream. Punt. } @@ -626,7 +651,7 @@ public class FileHandler extends StreamHandler { } new File(lockFileName).delete(); lockFileName = null; - lockStream = null; + lockFileChannel = null; } private static class InitializationErrorManager extends ErrorManager { @@ -636,6 +661,8 @@ public class FileHandler extends StreamHandler { } } - // Private native method to check if we are in a set UID program. + /** + * check if we are in a set UID program. + */ private static native boolean isSetUID(); } diff --git a/jdk/test/java/util/logging/CheckLockLocationTest.java b/jdk/test/java/util/logging/CheckLockLocationTest.java new file mode 100644 index 00000000000..0eb98c0d4a0 --- /dev/null +++ b/jdk/test/java/util/logging/CheckLockLocationTest.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6244047 + * @author Jim Gish + * @summary throw more precise IOException when pattern specifies invalid directory + * + * @run main/othervm CheckLockLocationTest + */ +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.AccessDeniedException; +import java.nio.file.FileSystemException; +import java.nio.file.NoSuchFileException; +import java.util.logging.FileHandler; +public class CheckLockLocationTest { + + private static final String NON_WRITABLE_DIR = "non-writable-dir"; + private static final String NOT_A_DIR = "not-a-dir"; + private static final String WRITABLE_DIR = "writable-dir"; + private static final String NON_EXISTENT_DIR = "non-existent-dir"; + + public static void main(String... args) throws IOException { + // we'll base all file creation attempts on the system temp directory, + // %t and also try specifying non-existent directories and plain files + // that should be directories, and non-writable directories, + // to exercise all code paths of checking the lock location + File writableDir = setup(); + // we now have three files/directories to work with: + // writableDir + // notAdir + // nonWritableDir + // nonExistentDir (which doesn't exist) + runTests(writableDir); + } + + /** + * @param writableDir in which log and lock file are created + * @throws SecurityException + * @throws RuntimeException + * @throws IOException + */ + private static void runTests(File writableDir) throws SecurityException, + RuntimeException, IOException { + // Test 1: make sure we can create FileHandler in writable directory + try { + new FileHandler("%t/" + WRITABLE_DIR + "/log.log"); + } catch (IOException ex) { + throw new RuntimeException("Test failed: should have been able" + + " to create FileHandler for " + "%t/" + WRITABLE_DIR + + "/log.log in writable directory.", ex); + } finally { + // the above test leaves files in the directory. Get rid of the + // files created and the directory + delete(writableDir); + } + + // Test 2: creating FileHandler in non-writable directory should fail + try { + new FileHandler("%t/" + NON_WRITABLE_DIR + "/log.log"); + throw new RuntimeException("Test failed: should not have been able" + + " to create FileHandler for " + "%t/" + NON_WRITABLE_DIR + + "/log.log in non-writable directory."); + } catch (IOException ex) { + // check for the right exception + if (!(ex instanceof AccessDeniedException)) { + throw new RuntimeException("Test failed: Expected exception was not an AccessDeniedException", ex); + } + } + + // Test 3: creating FileHandler in non-directory should fail + try { + new FileHandler("%t/" + NOT_A_DIR + "/log.log"); + throw new RuntimeException("Test failed: should not have been able" + + " to create FileHandler for " + "%t/" + NOT_A_DIR + + "/log.log in non-directory."); + } catch (IOException ex) { + // check for the right exception + if (!(ex instanceof FileSystemException && ex.getMessage().contains("Not a directory"))) { + throw new RuntimeException("Test failed: Expected exception was not a FileSystemException", ex); + } + } + + // Test 4: make sure we can't create a FileHandler in a non-existent dir + try { + new FileHandler("%t/" + NON_EXISTENT_DIR + "/log.log"); + throw new RuntimeException("Test failed: should not have been able" + + " to create FileHandler for " + "%t/" + NON_EXISTENT_DIR + + "/log.log in a non-existent directory."); + } catch (IOException ex) { + // check for the right exception + if (!(ex instanceof NoSuchFileException)) { + throw new RuntimeException("Test failed: Expected exception was not a NoSuchFileException", ex); + } + } + } + + /** + * Setup all the files and directories needed for the tests + * + * @return writable directory created that needs to be deleted when done + * @throws RuntimeException + */ + private static File setup() throws RuntimeException { + // First do some setup in the temporary directory (using same logic as + // FileHandler for %t pattern) + String tmpDir = System.getProperty("java.io.tmpdir"); // i.e. %t + if (tmpDir == null) { + tmpDir = System.getProperty("user.home"); + } + File tmpOrHomeDir = new File(tmpDir); + // Create a writable directory here (%t/writable-dir) + File writableDir = new File(tmpOrHomeDir, WRITABLE_DIR); + if (!createFile(writableDir, true)) { + throw new RuntimeException("Test setup failed: unable to create" + + " writable working directory " + + writableDir.getAbsolutePath() ); + } + // writableDirectory and its contents will be deleted after the test + // that uses it + + // Create a plain file which we will attempt to use as a directory + // (%t/not-a-dir) + File notAdir = new File(tmpOrHomeDir, NOT_A_DIR); + if (!createFile(notAdir, false)) { + throw new RuntimeException("Test setup failed: unable to a plain" + + " working file " + notAdir.getAbsolutePath() ); + } + notAdir.deleteOnExit(); + + // Create a non-writable directory (%t/non-writable-dir) + File nonWritableDir = new File(tmpOrHomeDir, NON_WRITABLE_DIR); + if (!createFile(nonWritableDir, true)) { + throw new RuntimeException("Test setup failed: unable to create" + + " a non-" + + "writable working directory " + + nonWritableDir.getAbsolutePath() ); + } + nonWritableDir.deleteOnExit(); + + // make it non-writable + if (!nonWritableDir.setWritable(false)) { + throw new RuntimeException("Test setup failed: unable to make" + + " working directory " + nonWritableDir.getAbsolutePath() + + " non-writable."); + } + + // make sure non-existent directory really doesn't exist + File nonExistentDir = new File(tmpOrHomeDir, NON_EXISTENT_DIR); + if (nonExistentDir.exists()) { + nonExistentDir.delete(); + } + return writableDir; + } + + /** + * @param newFile + * @return true if file already exists or creation succeeded + */ + private static boolean createFile(File newFile, boolean makeDirectory) { + if (newFile.exists()) { + return true; + } + if (makeDirectory) { + return newFile.mkdir(); + } else { + try { + return newFile.createNewFile(); + } catch (IOException ioex) { + ioex.printStackTrace(); + return false; + } + } + } + + /* + * Recursively delete all files starting at specified file + */ + private static void delete(File f) throws IOException { + if (f != null && f.isDirectory()) { + for (File c : f.listFiles()) + delete(c); + } + if (!f.delete()) + throw new FileNotFoundException("Failed to delete file: " + f); + } +} From 78ff6a33ee93ddbb3f4d521e31b64ac63b71730d Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Fri, 16 Nov 2012 10:34:14 +0800 Subject: [PATCH 235/241] 8003263: redundant cast build failure after 8003120 Reviewed-by: alanb --- .../share/classes/com/sun/naming/internal/ResourceManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java b/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java index 7443fbcf71a..bfee9dbfb39 100644 --- a/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java +++ b/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java @@ -560,8 +560,7 @@ public final class ResourceManager { } } finally { while (resources.hasMore()) { - InputStream istream = (InputStream)resources.next(); - istream.close(); + resources.next().close(); } } From 6c62e2d0f18bbdc5177b64edfd9563571b07b6aa Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Thu, 15 Nov 2012 20:17:05 -0800 Subject: [PATCH 236/241] 7199750: Loading sequence of service provider is changed Reviewed-by: okutsu --- .../provider/SPILocaleProviderAdapter.java | 26 +++++++++--------- .../CurrencyNameProviderTest.sh | 2 +- .../java/util/PluggableLocale/barprovider.jar | Bin 14629 -> 14680 bytes .../CurrencyNameProviderImpl2.java | 19 +++++++++---- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java index 1d380e38ac2..15de9f52283 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java @@ -91,7 +91,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { IllegalAccessException e) { LocaleServiceProviderPool.config(SPILocaleProviderAdapter.class, e.toString()); return null; - } + } } ((Delegate)delegate).addImpl(provider); @@ -112,7 +112,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { interface Delegate

    { public void addImpl(P impl); public P getImpl(Locale locale); -} + } /* * Obtain the real SPI implementation, using locale fallback @@ -137,7 +137,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(BreakIteratorProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -192,7 +192,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(CollatorProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -226,7 +226,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(DateFormatProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -274,7 +274,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(DateFormatSymbolsProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -308,7 +308,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(DecimalFormatSymbolsProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -342,7 +342,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(NumberFormatProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -397,7 +397,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(CalendarDataProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -438,7 +438,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(CalendarNameProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -483,7 +483,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(CurrencyNameProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -524,7 +524,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(LocaleNameProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } @@ -579,7 +579,7 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override public void addImpl(TimeZoneNameProvider impl) { for (Locale l : impl.getAvailableLocales()) { - map.put(l, impl); + map.putIfAbsent(l, impl); } } diff --git a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh index 9cfc700766a..8fb9459116c 100644 --- a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh +++ b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh @@ -23,6 +23,6 @@ #!/bin/sh # # @test -# @bug 4052440 8000997 +# @bug 4052440 7199750 8000997 # @summary CurrencyNameProvider tests # @run shell ExecTest.sh bar CurrencyNameProviderTest true diff --git a/jdk/test/java/util/PluggableLocale/barprovider.jar b/jdk/test/java/util/PluggableLocale/barprovider.jar index 7f621fa3c67efb04fdf6b540bf94461bfdb87d0c..deed5facccbba17157bb62d49f5f82c70e7bbaf6 100644 GIT binary patch delta 1909 zcmZux3pkWn82;y$VTJ~SVO+*wG^S!OW=e9aTqc){TPwGrtJ}JyHZ(4~vb4GU4BN^^ zF1wLp6nV-DZ6qWs#p)i_Ls3Lg?f?Hu?C$xW^Ze(W@BPks&-b18D~q}lCF{z^V95X; zj|X@$;n}k5G4RjP-TGO%o^pO^DI>3(wP#jEk1<+mz#COjdZMBy2F{1Pj+%@@0j_*0 z{8YQetN;K2cc{aA$p8QzfcF9)VzuDSKnzX?`CAaQ!67qc$q8jV8eWiC5O(1(TnJ%7 zP?K2Eu~=mCN@|_R-AB;pO8V#=Azia$HLWBKw^^_%H-qjZ-Cy0(xW zDWtOLH0=O)8$4S+XkL9(n4A%(klbJ>bZfzEjhwAZQO&iE;L+xaoJQJ0H z7E_Y1HmHdl5HW+qW0xAMA_HEzbzJb!d3D7sG}?b?+jw3{ zS!U*hY2eg@EtG+8eVb1iX$Ea?291h@KNNpjnW^OKMMy8IC6txyYskF+)T6V1Yf5ot z(U{PokBPIbf7!3tU-(;Ks#rTUtXO2j44Tj7l70(|g^* zG6j{pt*S*cAro$XZ=Q(D)Xa&kvYG?$D%?*v*UEk34x}FJ<**p3au**`$3xo!DsR`C zcnZ%ntzk9_Mg>9EJBRan@`oBweJY1fi+qGW&rT)uIn5nOe{7i;Zr#{-gm#y&W~o{) zC%&@rQ1dUkwna6+2ItzipS1AU^FT4)ZhyPE?p$Q0C_O$Cn2%|qJ&~TDRK#vPIYYiO z#{C(QNqvf;g(x4p%I`avuZp9xJ+fHSthzcjp9KmlMJZ3LD?`f#TF1kHhHePYa zDx^*|vfVy_c&b3>Vq#?J-l6Ish5F0;K16vDCe>y?jpek3i|=&BT^h-vU$h?+rwzZ} z9!sA-Yqlv1*Q1n`;xFIv-o;_lppHg%w{dlFZPNWiDg&0SUX~_)Pkl4f<_WO=y1eDX z=okQqTd|0Q6I2f$O*=$zw`40s-w9 zdXi337W%U~RV7_i*A>!Vr9HTof$V@We1j$|(R_CQ8bs=vST^{{m<&3i5|+&IV2242 z>_NvZt{ujlK*rZmmp`vH$fD3>V39S5G3LoawZeL_%z*aB91gq!)tkkJT^zxKTTl;* z2s3o$qtG(I64s_v>eOeOFfaoV6}WJIUjl21KAvX%-roGJVx;6w<20KZzpaYkP+^z0B@efVtO(n_#0Am?A zSr^>TT}@aT*-$fGhfSPMzm6%hf)+9PIfX!P2k(7@>Ef2SqUn2M&Z z1yQEtW$}We(hQmSut_J!L<_mYIOtLp2+>J`y6G}nB*O)q6!gj{2v$8TG$jJU6#oa? z2V-pz5Str!EdT-}K;0PXUt6gW1fqj;D23Ha^9UyZLrK^8e-^=P#K{FqR(9p%p!flR N3iMH>06-tv{vWgKjVJ&B delta 1793 zcmaJ>4K!3~7{2o(Gh-&d!*C~Qn8}zh7-qyNHYuhuB4Lm6Ta=PfYqvcaD?93(N_bA%v_KCqxhLoKN{vPS z(q64ZVGPDpwaX@`4OkQyBRfhm0(^8`weHS>vt{|E8Zs*edG76g? zv#$N}W2;jBYu7((`-HJwQG#)Rq2(Dbx>U&S6|Rc2*~jJ899~b?&!_Cl=s;r!L4O;TgUk3=UX^(qlgjfNa=u;&9{n?b;n~moP7J`A-mol zhE$$hl%INwT7>uZ3hCrY?mo(#Ig`#zsXY5sIJ5oEgJ)4kHoUo$+mUmi$X#yIBWu+i z5>@bJ=hitkJ;onesfm5(ay3x_h5Bok8r2y+HJtui9Q{Fl(R=*DrF#)O8iHoe`dRL@ zqev$_yE1bMd`Qx5H6pLgabHQ_OLKA}vTha`x20ga>f#RW!k3=3Y?F+nci*l!ucxIM z3_IlnpTD@N#JkhEEt`Bg^K|G4ogIF2BCtH}(Y%@1d!H~ST?Qq4zjWf;)Y+O7C@J6rA( zTd>77f^z>>OYzIZDyLbO*@@)Ihr;WgPBpf^^xC2F!aVz+gtDOWj|J9mUgl|(dZ~r* z10?m&Hr-U$6h10Re==#9D4{_$s~eemxS^PJU6>-^ds}-nK{g-8G=o|$6$J9hL>0$XJp~^I z9`dP}DFip2pD8qyohpE_H5gFG<$>1%G77cuVeBz10x=M#9x$GVEfJ;*4uzuyCMa_l zfwb`;(Z)d{5@N6|iWc1Dvwsp(@b<#%5`O zHhX>G>|lsO0roJ~TNi=oKnZJsKY4Rif)T?2eIS@Oyn(Q?X$VVz#xJiR*BT=iDv<&~ ztR?ZU!XVeo90c2uQR4o_eJ@&Z5OiJr-$X+Ok|;_<(;y)M*0PWQG_c;@0EMD?FxHg~ zPVy`?7L^`cbAY2-t>%inCnn~T?&{Uzy5EH&J5I4U~MDl9rAE>0v= SLk=*^b+&w0{7bdXGo| diff --git a/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java b/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java index 5ed7222f95e..80dab1715fc 100644 --- a/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java +++ b/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java @@ -32,7 +32,8 @@ import java.util.spi.*; import com.foobar.Utils; public class CurrencyNameProviderImpl2 extends CurrencyNameProvider { - static Locale[] avail = {new Locale("ja", "JP", "tokyo")}; + static Locale[] avail = {new Locale("ja", "JP", "tokyo"), + new Locale("ja", "JP", "osaka"), }; public Locale[] getAvailableLocales() { return avail; } @@ -43,8 +44,12 @@ public class CurrencyNameProviderImpl2 extends CurrencyNameProvider { throw new IllegalArgumentException("locale is not supported: "+locale); } - if (c.equals("JPY") && Utils.supportsLocale(avail[0], locale)) { - return "JPY-tokyo"; + if (c.equals("JPY")) { + if (Utils.supportsLocale(avail[0], locale)) { + return "JPY-tokyo"; + } else if (Utils.supportsLocale(avail[1], locale)) { + return "JPY-osaka"; + } } return null; } @@ -55,8 +60,12 @@ public class CurrencyNameProviderImpl2 extends CurrencyNameProvider { throw new IllegalArgumentException("locale is not supported: "+locale); } - if (c.equals("JPY") && Utils.supportsLocale(avail[0], locale)) { - return "JPY-tokyo"; + if (c.equals("JPY")) { + if (Utils.supportsLocale(avail[0], locale)) { + return "JPY-tokyo"; + } else if (Utils.supportsLocale(avail[1], locale)) { + return "JPY-osaka"; + } } return null; } From ef1950d024389cce882bb96d806f41adf8bc3f79 Mon Sep 17 00:00:00 2001 From: Kurchi Subhra Hazra Date: Fri, 16 Nov 2012 12:28:45 -0800 Subject: [PATCH 237/241] 8003518: (prefs) Tests in jdk/test/java/util/prefs should not be run concurrently Add java/util/prefs to exclusiveAccess.dirs in TEST.ROOT Reviewed-by: alanb, mchung --- jdk/test/TEST.ROOT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/test/TEST.ROOT b/jdk/test/TEST.ROOT index e8e3fda5f85..91c9dacebb2 100644 --- a/jdk/test/TEST.ROOT +++ b/jdk/test/TEST.ROOT @@ -9,4 +9,4 @@ keys=2d dnd i18n othervm.dirs=java/awt java/beans java/rmi javax/accessibility javax/imageio javax/sound javax/print javax/management com/sun/awt sun/awt sun/java2d sun/pisces sun/rmi # Tests that cannot run concurrently -exclusiveAccess.dirs=java/rmi/Naming sun/management/jmxremote sun/tools/jstatd +exclusiveAccess.dirs=java/rmi/Naming java/util/prefs sun/management/jmxremote sun/tools/jstatd From a9594cbcebcd5f839978b4748e0ca48961f59851 Mon Sep 17 00:00:00 2001 From: Brent Christian Date: Fri, 16 Nov 2012 17:01:19 -0800 Subject: [PATCH 238/241] 7178922: (props) re-visit how os.name is determined on Mac Reviewed-by: alanb, mchung, skovatch, serb --- .../native/java/lang/java_props_macosx.c | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/jdk/src/solaris/native/java/lang/java_props_macosx.c b/jdk/src/solaris/native/java/lang/java_props_macosx.c index 4afca2a2ae5..c890ea8c538 100644 --- a/jdk/src/solaris/native/java/lang/java_props_macosx.c +++ b/jdk/src/solaris/native/java/lang/java_props_macosx.c @@ -145,27 +145,22 @@ PreferredToolkit getPreferredToolkit() { return pref = HToolkit; } -void setUnknownOSAndVersion(java_props_t *sprops) { - sprops->os_name = strdup("Unknown"); - sprops->os_version = strdup("Unknown"); -} - void setOSNameAndVersion(java_props_t *sprops) { + /* Don't rely on JRSCopyOSName because there's no guarantee the value will + * remain the same, or even if the JRS functions will continue to be part of + * Mac OS X. So hardcode os_name, and fill in os_version if we can. + */ + sprops->os_name = strdup("Mac OS X"); + void *jrsFwk = getJRSFramework(); - if (jrsFwk == NULL) { - setUnknownOSAndVersion(sprops); - return; + if (jrsFwk != NULL) { + char *(*copyOSVersion)() = dlsym(jrsFwk, "JRSCopyOSVersion"); + if (copyOSVersion != NULL) { + sprops->os_version = copyOSVersion(); + return; + } } - - char *(*copyOSName)() = dlsym(jrsFwk, "JRSCopyOSName"); - char *(*copyOSVersion)() = dlsym(jrsFwk, "JRSCopyOSVersion"); - if (copyOSName == NULL || copyOSVersion == NULL) { - setUnknownOSAndVersion(sprops); - return; - } - - sprops->os_name = copyOSName(); - sprops->os_version = copyOSVersion(); + sprops->os_version = strdup("Unknown"); } From 28ca680a317f33a119a7649b6854ee5dbb3f8cfb Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Sun, 18 Nov 2012 01:31:44 -0800 Subject: [PATCH 239/241] 8003587: Warning cleanup in package javax.net.ssl Removes unnecessary imports and adds missing Override annotations Reviewed-by: xuelei --- .../classes/javax/net/ssl/HandshakeCompletedEvent.java | 1 - .../share/classes/javax/net/ssl/HostnameVerifier.java | 1 + .../share/classes/javax/net/ssl/HttpsURLConnection.java | 2 +- .../share/classes/javax/net/ssl/KeyManagerFactory.java | 1 + jdk/src/share/classes/javax/net/ssl/SSLContext.java | 1 - jdk/src/share/classes/javax/net/ssl/SSLContextSpi.java | 1 - jdk/src/share/classes/javax/net/ssl/SSLEngineResult.java | 1 + jdk/src/share/classes/javax/net/ssl/SSLParameters.java | 2 -- jdk/src/share/classes/javax/net/ssl/SSLPermission.java | 5 ----- .../classes/javax/net/ssl/SSLServerSocketFactory.java | 6 ++++++ jdk/src/share/classes/javax/net/ssl/SSLSession.java | 1 - jdk/src/share/classes/javax/net/ssl/SSLSocket.java | 3 --- .../share/classes/javax/net/ssl/SSLSocketFactory.java | 9 +++++++++ .../share/classes/javax/net/ssl/TrustManagerFactory.java | 1 + jdk/src/share/classes/javax/net/ssl/X509KeyManager.java | 1 - 15 files changed, 20 insertions(+), 16 deletions(-) diff --git a/jdk/src/share/classes/javax/net/ssl/HandshakeCompletedEvent.java b/jdk/src/share/classes/javax/net/ssl/HandshakeCompletedEvent.java index 39e802c4d86..f6abafaea85 100644 --- a/jdk/src/share/classes/javax/net/ssl/HandshakeCompletedEvent.java +++ b/jdk/src/share/classes/javax/net/ssl/HandshakeCompletedEvent.java @@ -29,7 +29,6 @@ import java.util.EventObject; import java.security.cert.Certificate; import java.security.Principal; import java.security.cert.X509Certificate; -import javax.security.auth.x500.X500Principal; /** * This event indicates that an SSL handshake completed on a given diff --git a/jdk/src/share/classes/javax/net/ssl/HostnameVerifier.java b/jdk/src/share/classes/javax/net/ssl/HostnameVerifier.java index d2f504f0576..402a8cd66a2 100644 --- a/jdk/src/share/classes/javax/net/ssl/HostnameVerifier.java +++ b/jdk/src/share/classes/javax/net/ssl/HostnameVerifier.java @@ -40,6 +40,7 @@ package javax.net.ssl; * verification fail. * * @author Brad R. Wetmore + * @see HostnameVerifierFactory * @since 1.4 */ diff --git a/jdk/src/share/classes/javax/net/ssl/HttpsURLConnection.java b/jdk/src/share/classes/javax/net/ssl/HttpsURLConnection.java index 5027b9a5788..b4c9ffe1113 100644 --- a/jdk/src/share/classes/javax/net/ssl/HttpsURLConnection.java +++ b/jdk/src/share/classes/javax/net/ssl/HttpsURLConnection.java @@ -29,7 +29,6 @@ import java.net.URL; import java.net.HttpURLConnection; import java.security.Principal; import java.security.cert.X509Certificate; -import javax.security.auth.x500.X500Principal; /** * HttpsURLConnection extends HttpURLConnection @@ -196,6 +195,7 @@ class HttpsURLConnection extends HttpURLConnection */ private static class DefaultHostnameVerifier implements HostnameVerifier { + @Override public boolean verify(String hostname, SSLSession session) { return false; } diff --git a/jdk/src/share/classes/javax/net/ssl/KeyManagerFactory.java b/jdk/src/share/classes/javax/net/ssl/KeyManagerFactory.java index e7fe89f65f1..f9611c0f1d4 100644 --- a/jdk/src/share/classes/javax/net/ssl/KeyManagerFactory.java +++ b/jdk/src/share/classes/javax/net/ssl/KeyManagerFactory.java @@ -68,6 +68,7 @@ public class KeyManagerFactory { public final static String getDefaultAlgorithm() { String type; type = AccessController.doPrivileged(new PrivilegedAction() { + @Override public String run() { return Security.getProperty( "ssl.KeyManagerFactory.algorithm"); diff --git a/jdk/src/share/classes/javax/net/ssl/SSLContext.java b/jdk/src/share/classes/javax/net/ssl/SSLContext.java index d3cb9700ba9..c40d7060c39 100644 --- a/jdk/src/share/classes/javax/net/ssl/SSLContext.java +++ b/jdk/src/share/classes/javax/net/ssl/SSLContext.java @@ -26,7 +26,6 @@ package javax.net.ssl; import java.security.*; -import java.util.*; import sun.security.jca.GetInstance; diff --git a/jdk/src/share/classes/javax/net/ssl/SSLContextSpi.java b/jdk/src/share/classes/javax/net/ssl/SSLContextSpi.java index e4def55a09e..0b06191cc5a 100644 --- a/jdk/src/share/classes/javax/net/ssl/SSLContextSpi.java +++ b/jdk/src/share/classes/javax/net/ssl/SSLContextSpi.java @@ -25,7 +25,6 @@ package javax.net.ssl; -import java.util.*; import java.security.*; /** diff --git a/jdk/src/share/classes/javax/net/ssl/SSLEngineResult.java b/jdk/src/share/classes/javax/net/ssl/SSLEngineResult.java index dd63ea4803a..45dcddbdeca 100644 --- a/jdk/src/share/classes/javax/net/ssl/SSLEngineResult.java +++ b/jdk/src/share/classes/javax/net/ssl/SSLEngineResult.java @@ -230,6 +230,7 @@ public class SSLEngineResult { /** * Returns a String representation of this object. */ + @Override public String toString() { return ("Status = " + status + " HandshakeStatus = " + handshakeStatus + diff --git a/jdk/src/share/classes/javax/net/ssl/SSLParameters.java b/jdk/src/share/classes/javax/net/ssl/SSLParameters.java index d207f6f9e6f..c499b666091 100644 --- a/jdk/src/share/classes/javax/net/ssl/SSLParameters.java +++ b/jdk/src/share/classes/javax/net/ssl/SSLParameters.java @@ -28,13 +28,11 @@ package javax.net.ssl; import java.security.AlgorithmConstraints; import java.util.Map; import java.util.List; -import java.util.HashSet; import java.util.HashMap; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; -import java.util.regex.Pattern; /** * Encapsulates parameters for an SSL/TLS connection. The parameters diff --git a/jdk/src/share/classes/javax/net/ssl/SSLPermission.java b/jdk/src/share/classes/javax/net/ssl/SSLPermission.java index f596925e0c0..04ebfe1543c 100644 --- a/jdk/src/share/classes/javax/net/ssl/SSLPermission.java +++ b/jdk/src/share/classes/javax/net/ssl/SSLPermission.java @@ -26,11 +26,6 @@ package javax.net.ssl; import java.security.*; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.StringTokenizer; -import java.security.Permissions; -import java.lang.SecurityManager; /** * This class is for various network permissions. diff --git a/jdk/src/share/classes/javax/net/ssl/SSLServerSocketFactory.java b/jdk/src/share/classes/javax/net/ssl/SSLServerSocketFactory.java index 24911295adf..8efbd41669e 100644 --- a/jdk/src/share/classes/javax/net/ssl/SSLServerSocketFactory.java +++ b/jdk/src/share/classes/javax/net/ssl/SSLServerSocketFactory.java @@ -160,23 +160,27 @@ class DefaultSSLServerSocketFactory extends SSLServerSocketFactory { new SocketException(reason.toString()).initCause(reason); } + @Override public ServerSocket createServerSocket() throws IOException { return throwException(); } + @Override public ServerSocket createServerSocket(int port) throws IOException { return throwException(); } + @Override public ServerSocket createServerSocket(int port, int backlog) throws IOException { return throwException(); } + @Override public ServerSocket createServerSocket(int port, int backlog, InetAddress ifAddress) throws IOException @@ -184,10 +188,12 @@ class DefaultSSLServerSocketFactory extends SSLServerSocketFactory { return throwException(); } + @Override public String [] getDefaultCipherSuites() { return new String[0]; } + @Override public String [] getSupportedCipherSuites() { return new String[0]; } diff --git a/jdk/src/share/classes/javax/net/ssl/SSLSession.java b/jdk/src/share/classes/javax/net/ssl/SSLSession.java index 93f066744fc..7cbcf283661 100644 --- a/jdk/src/share/classes/javax/net/ssl/SSLSession.java +++ b/jdk/src/share/classes/javax/net/ssl/SSLSession.java @@ -25,7 +25,6 @@ package javax.net.ssl; -import java.net.InetAddress; import java.security.Principal; /** diff --git a/jdk/src/share/classes/javax/net/ssl/SSLSocket.java b/jdk/src/share/classes/javax/net/ssl/SSLSocket.java index ab090130f2d..58f943ace5d 100644 --- a/jdk/src/share/classes/javax/net/ssl/SSLSocket.java +++ b/jdk/src/share/classes/javax/net/ssl/SSLSocket.java @@ -28,9 +28,6 @@ package javax.net.ssl; import java.io.IOException; import java.net.*; -import java.util.Enumeration; -import java.util.Vector; - /** * This class extends Sockets and provides secure diff --git a/jdk/src/share/classes/javax/net/ssl/SSLSocketFactory.java b/jdk/src/share/classes/javax/net/ssl/SSLSocketFactory.java index 73f48d197a4..151880d026f 100644 --- a/jdk/src/share/classes/javax/net/ssl/SSLSocketFactory.java +++ b/jdk/src/share/classes/javax/net/ssl/SSLSocketFactory.java @@ -127,6 +127,7 @@ public abstract class SSLSocketFactory extends SocketFactory static String getSecurityProperty(final String name) { return AccessController.doPrivileged(new PrivilegedAction() { + @Override public String run() { String s = java.security.Security.getProperty(name); if (s != null) { @@ -247,18 +248,21 @@ class DefaultSSLSocketFactory extends SSLSocketFactory new SocketException(reason.toString()).initCause(reason); } + @Override public Socket createSocket() throws IOException { return throwException(); } + @Override public Socket createSocket(String host, int port) throws IOException { return throwException(); } + @Override public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException @@ -266,12 +270,14 @@ class DefaultSSLSocketFactory extends SSLSocketFactory return throwException(); } + @Override public Socket createSocket(InetAddress address, int port) throws IOException { return throwException(); } + @Override public Socket createSocket(String host, int port, InetAddress clientAddress, int clientPort) throws IOException @@ -279,6 +285,7 @@ class DefaultSSLSocketFactory extends SSLSocketFactory return throwException(); } + @Override public Socket createSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort) throws IOException @@ -286,10 +293,12 @@ class DefaultSSLSocketFactory extends SSLSocketFactory return throwException(); } + @Override public String [] getDefaultCipherSuites() { return new String[0]; } + @Override public String [] getSupportedCipherSuites() { return new String[0]; } diff --git a/jdk/src/share/classes/javax/net/ssl/TrustManagerFactory.java b/jdk/src/share/classes/javax/net/ssl/TrustManagerFactory.java index b1762fc6449..91b6a0e46c1 100644 --- a/jdk/src/share/classes/javax/net/ssl/TrustManagerFactory.java +++ b/jdk/src/share/classes/javax/net/ssl/TrustManagerFactory.java @@ -65,6 +65,7 @@ public class TrustManagerFactory { public final static String getDefaultAlgorithm() { String type; type = AccessController.doPrivileged(new PrivilegedAction() { + @Override public String run() { return Security.getProperty( "ssl.TrustManagerFactory.algorithm"); diff --git a/jdk/src/share/classes/javax/net/ssl/X509KeyManager.java b/jdk/src/share/classes/javax/net/ssl/X509KeyManager.java index 3fcf2225b57..5174adfe412 100644 --- a/jdk/src/share/classes/javax/net/ssl/X509KeyManager.java +++ b/jdk/src/share/classes/javax/net/ssl/X509KeyManager.java @@ -25,7 +25,6 @@ package javax.net.ssl; -import java.security.KeyManagementException; import java.security.PrivateKey; import java.security.Principal; import java.security.cert.X509Certificate; From 2aea4cbc8c0844297d3654e542bebfd9011d1d1c Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Mon, 19 Nov 2012 11:13:08 +0800 Subject: [PATCH 240/241] 8002344: Krb5LoginModule config class does not return proper KDC list from DNS Co-authored-by: Severin Gehwolf Reviewed-by: weijun --- .../classes/sun/security/krb5/Config.java | 19 +++--- jdk/test/sun/security/krb5/config/DNS.java | 38 ++++++++++++ .../security/krb5/config/NamingManager.java | 60 +++++++++++++++++++ jdk/test/sun/security/krb5/config/dns.sh | 41 +++++++++++++ 4 files changed, 149 insertions(+), 9 deletions(-) create mode 100644 jdk/test/sun/security/krb5/config/DNS.java create mode 100644 jdk/test/sun/security/krb5/config/NamingManager.java create mode 100644 jdk/test/sun/security/krb5/config/dns.sh diff --git a/jdk/src/share/classes/sun/security/krb5/Config.java b/jdk/src/share/classes/sun/security/krb5/Config.java index 486f59f2ef2..1b63cd60295 100644 --- a/jdk/src/share/classes/sun/security/krb5/Config.java +++ b/jdk/src/share/classes/sun/security/krb5/Config.java @@ -1123,7 +1123,7 @@ public class Config { */ private String getKDCFromDNS(String realm) throws KrbException { // use DNS to locate KDC - String kdcs = null; + String kdcs = ""; String[] srvs = null; // locate DNS SRV record using UDP if (DEBUG) { @@ -1133,7 +1133,7 @@ public class Config { if (srvs == null) { // locate DNS SRV record using TCP if (DEBUG) { - System.out.println("getKDCFromDNS using UDP"); + System.out.println("getKDCFromDNS using TCP"); } srvs = KrbServiceLocator.getKerberosService(realm, "_tcp"); } @@ -1142,14 +1142,15 @@ public class Config { throw new KrbException(Krb5.KRB_ERR_GENERIC, "Unable to locate KDC for realm " + realm); } + if (srvs.length == 0) { + return null; + } for (int i = 0; i < srvs.length; i++) { - String value = srvs[i]; - for (int j = 0; j < srvs[i].length(); j++) { - // filter the KDC name - if (value.charAt(j) == ':') { - kdcs = (value.substring(0, j)).trim(); - } - } + kdcs += srvs[i].trim() + " "; + } + kdcs = kdcs.trim(); + if (kdcs.equals("")) { + return null; } return kdcs; } diff --git a/jdk/test/sun/security/krb5/config/DNS.java b/jdk/test/sun/security/krb5/config/DNS.java new file mode 100644 index 00000000000..8c574be92d5 --- /dev/null +++ b/jdk/test/sun/security/krb5/config/DNS.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// See dns.sh. +import sun.security.krb5.Config; + +public class DNS { + public static void main(String[] args) throws Exception { + System.setProperty("java.security.krb5.conf", + System.getProperty("test.src", ".") +"/nothing.conf"); + Config config = Config.getInstance(); + String kdcs = config.getKDCList("X"); + if (!kdcs.equals("a.com.:88 b.com.:99") && + !kdcs.equals("a.com. b.com.:99")) { + throw new Exception("Strange KDC: [" + kdcs + "]"); + }; + } +} diff --git a/jdk/test/sun/security/krb5/config/NamingManager.java b/jdk/test/sun/security/krb5/config/NamingManager.java new file mode 100644 index 00000000000..47f4f412deb --- /dev/null +++ b/jdk/test/sun/security/krb5/config/NamingManager.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.naming.spi; + +import com.sun.jndi.dns.DnsContext; +import java.util.Hashtable; +import javax.naming.Context; +import javax.naming.NamingException; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; +import javax.naming.directory.BasicAttribute; +import javax.naming.directory.BasicAttributes; + +/** + * A fake javax.naming.spi.NamingManager. It allows reading a DNS + * record without contacting a real server. + * + * See DNS.java and dns.sh. + */ +public class NamingManager { + NamingManager() {} + public static Context getURLContext( + String scheme, Hashtable environment) + throws NamingException { + return new DnsContext("", null, new Hashtable()) { + public Attributes getAttributes(String name, String[] attrIds) + throws NamingException { + return new BasicAttributes() { + public Attribute get(String attrID) { + BasicAttribute ba = new BasicAttribute(attrID); + ba.add("1 1 99 b.com."); + ba.add("0 0 88 a.com."); // 2nd has higher priority + return ba; + } + }; + } + }; + } +} diff --git a/jdk/test/sun/security/krb5/config/dns.sh b/jdk/test/sun/security/krb5/config/dns.sh new file mode 100644 index 00000000000..5c85f8aa776 --- /dev/null +++ b/jdk/test/sun/security/krb5/config/dns.sh @@ -0,0 +1,41 @@ +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @bug 8002344 +# @summary Krb5LoginModule config class does not return proper KDC list from DNS +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +if [ "${TESTSRC}" = "" ] ; then + TESTSRC="." +fi + +$TESTJAVA/bin/javac -d . \ + ${TESTSRC}/NamingManager.java ${TESTSRC}/DNS.java +$TESTJAVA/bin/java -Xbootclasspath/p:. DNS + From c94385feb8f42918c56882f86bc166bc82b38694 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Mon, 19 Nov 2012 13:17:40 +0000 Subject: [PATCH 241/241] 8003607: More ProblemList.txt updates (11/2012) Reviewed-by: lancea --- jdk/test/ProblemList.txt | 6 +++--- jdk/test/TEST.ROOT | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt index 80fc546756b..975a54b06c0 100644 --- a/jdk/test/ProblemList.txt +++ b/jdk/test/ProblemList.txt @@ -148,9 +148,6 @@ java/lang/management/MemoryMXBean/LowMemoryTest2.sh generic-all # 6959636 javax/management/loading/LibraryLoader/LibraryLoaderTest.java windows-all -# 7144846 -javax/management/remote/mandatory/connection/ReconnectTest.java generic-all - # 7120365 javax/management/remote/mandatory/notif/DiffHBTest.java generic-all @@ -376,6 +373,9 @@ java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java generic-all # Filed 6772009 java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java generic-all +# 8003596 +java/util/logging/CheckLockLocationTest.java windows-all + # 7041639, Solaris DSA keypair generation bug java/util/TimeZone/TimeZoneDatePermissionCheck.sh solaris-all diff --git a/jdk/test/TEST.ROOT b/jdk/test/TEST.ROOT index 91c9dacebb2..1645f6b26da 100644 --- a/jdk/test/TEST.ROOT +++ b/jdk/test/TEST.ROOT @@ -9,4 +9,4 @@ keys=2d dnd i18n othervm.dirs=java/awt java/beans java/rmi javax/accessibility javax/imageio javax/sound javax/print javax/management com/sun/awt sun/awt sun/java2d sun/pisces sun/rmi # Tests that cannot run concurrently -exclusiveAccess.dirs=java/rmi/Naming java/util/prefs sun/management/jmxremote sun/tools/jstatd +exclusiveAccess.dirs=java/rmi/Naming java/util/prefs sun/management/jmxremote sun/tools/jstatd sun/security/mscapi